diff --git a/.gitignore b/.gitignore index 5090fd0a..59920aca 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ maps/tgstation2.dmm.bak *.bak maps/newmedical tgstation2.dmm *.bak2 +maps/tgstation2_medbayrework_final.dmm diff --git a/aurora.dme b/aurora.dme index b0c9d37a..7a76a56c 100644 --- a/aurora.dme +++ b/aurora.dme @@ -481,7 +481,6 @@ #include "code\game\mecha\equipment\tools\medical_tools.dm" #include "code\game\mecha\equipment\tools\tools.dm" #include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\exo\exoskeleton.dm" #include "code\game\mecha\medical\medical.dm" #include "code\game\mecha\medical\odysseus.dm" #include "code\game\mecha\working\ripley.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm index 3581c9ff..7eb9c011 100644 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm +++ b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm @@ -306,7 +306,7 @@ switch(trap_type) if("sawburst") M << "\red A sawblade shoots out of the ground and strikes you!" - M.apply_damage(rand(5,10), BRUTE) + M.apply_damage(rand(5,10), BRUTE, sharp=1, edge=1) var/atom/myloc = src.loc var/image/flicker = image('code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi',"sawblade") diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm index 7be8108d..e839a5ed 100644 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm +++ b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_turfs.dm @@ -143,25 +143,25 @@ var/turf/T = get_turf(M) if(istype(T, /turf/unsimulated/jungle/water)) M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE) + M.apply_damage(rand(0,1), BRUTE, sharp=1) if(prob(50)) spawn(rand(25,50)) var/turf/T = get_turf(M) if(istype(T, /turf/unsimulated/jungle/water)) M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE) + M.apply_damage(rand(0,1), BRUTE, sharp=1) if(prob(50)) spawn(rand(25,50)) var/turf/T = get_turf(M) if(istype(T, /turf/unsimulated/jungle/water)) M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE) + M.apply_damage(rand(0,1), BRUTE, sharp=1) if(prob(50)) spawn(rand(25,50)) var/turf/T = get_turf(M) if(istype(T, /turf/unsimulated/jungle/water)) M << pick("\red Something sharp bites you!","\red Sharp teeth grab hold of you!","\red You feel something take a chunk out of your leg!") - M.apply_damage(rand(0,1), BRUTE) + M.apply_damage(rand(0,1), BRUTE, sharp=1) /turf/unsimulated/jungle/water/deep plants_spawn = 0 diff --git a/code/WorkInProgress/Ported/policetape.dm b/code/WorkInProgress/Ported/policetape.dm index 58ad2f8e..2ffb18c2 100644 --- a/code/WorkInProgress/Ported/policetape.dm +++ b/code/WorkInProgress/Ported/policetape.dm @@ -136,7 +136,7 @@ breaktape(/obj/item/weapon/wirecutters,user) /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) - if(user.a_intent == "help" && ((!is_sharp(W) && src.allowed(user)))) + if(user.a_intent == "help" && ((!can_puncture(W) && src.allowed(user)))) user << "You can't break the [src] with that!" return user.show_viewers("\blue [user] breaks the [src]!") diff --git a/code/WorkInProgress/Susan/susan_desert_turfs.dm b/code/WorkInProgress/Susan/susan_desert_turfs.dm index 947f6b67..a52f90a4 100644 --- a/code/WorkInProgress/Susan/susan_desert_turfs.dm +++ b/code/WorkInProgress/Susan/susan_desert_turfs.dm @@ -227,7 +227,7 @@ Alien plants should do something if theres a lot of poison del(src) -/obj/effect/alien/flesh/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/alien/flesh/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) health -= 5 healthcheck() diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm index e59a419c..153b094a 100644 --- a/code/WorkInProgress/buildmode.dm +++ b/code/WorkInProgress/buildmode.dm @@ -259,7 +259,8 @@ if(4) if(pa.Find("left")) - holder.throw_atom = object + if(istype(object, /atom/movable)) + holder.throw_atom = object if(pa.Find("right")) if(holder.throw_atom) holder.throw_atom.throw_at(object, 10, 1) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 74540039..fbf2338e 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -84,7 +84,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) air_contents.trace_gases.Remove(fuel) //check if there is something to combust - if(!air_contents.check_recombustability(liquid)) + if(!air_contents.check_combustability(liquid)) //del src RemoveFire() @@ -116,7 +116,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) var/datum/gas_mixture/acs = enemy_tile.return_air() var/obj/effect/decal/cleanable/liquid_fuel/liq = locate() in enemy_tile if(!acs) continue - if(!acs.check_recombustability(liq)) continue + if(!acs.check_combustability(liq)) continue //If extinguisher mist passed over the turf it's trying to spread to, don't spread and //reduce firelevel. if(enemy_tile.fire_protection > world.time-30) @@ -134,16 +134,8 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) ///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR /////////////////////////////////////////////// if(flow) - - if(flow.check_recombustability(liquid)) - //Ensure flow temperature is higher than minimum fire temperatures. - //this creates some energy ex nihilo but is necessary to get a fire started - //lets just pretend this energy comes from the ignition source and dont mention this again - //flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) - - //burn baby burn! - - flow.zburn(liquid,1) + //burn baby burn! + flow.zburn(liquid,1) //merge the air back S.assume_air(flow) @@ -275,9 +267,9 @@ datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fu if(oxygen && (toxins || fuel || liquid)) if(liquid) return 1 - if (toxins >= 0.1) + if(QUANTIZE(toxins * vsc.fire_consuption_rate) >= 0.1) return 1 - if(fuel && fuel.moles >= 0.1) + if(fuel && QUANTIZE(fuel.moles * vsc.fire_consuption_rate) >= 0.1) return 1 return 0 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index ff3a1ed8..6f4ab5a1 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1275,8 +1275,21 @@ proc/is_hot(obj/item/W as obj) return 0 -//Is this even used for anything besides balloons? Yes I took out the W:lit stuff because : really shouldnt be used. -/proc/is_sharp(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? +//Whether or not the given item counts as sharp in terms of dealing damage +/proc/is_sharp(obj/O as obj) + if (!O) return 0 + if (O.sharp) return 1 + if (O.edge) return 1 + return 0 + +//Whether or not the given item counts as cutting with an edge in terms of removing limbs +/proc/has_edge(obj/O as obj) + if (!O) return 0 + if (O.edge) return 1 + return 0 + +//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. +/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? if(!W) return 0 if(W.sharp) return 1 return ( \ diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 093899c5..147d7909 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -16,9 +16,11 @@ Note that this proc can be overridden, and is in the case of screen objects. */ /atom/Click(location,control,params) - usr.ClickOn(src, params) + if(src) + usr.ClickOn(src, params) /atom/DblClick(location,control,params) - usr.DblClickOn(src,params) + if(src) + usr.DblClickOn(src,params) /* Standard mob ClickOn() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 3d21926e..ddc78f4a 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -276,7 +276,7 @@ var/list/nicename = null var/list/tankcheck = null var/breathes = "oxygen" //default, we'll check later - var/list/contents = list() + var/list/contents = list() if(ishuman(C)) var/mob/living/carbon/human/H = C @@ -284,7 +284,7 @@ nicename = list ("suit", "back", "belt", "right hand", "left hand", "left pocket", "right pocket") tankcheck = list (H.s_store, C.back, H.belt, C.r_hand, C.l_hand, H.l_store, H.r_store) - else + else nicename = list("Right Hand", "Left Hand", "Back") tankcheck = list(C.r_hand, C.l_hand, C.back) @@ -295,14 +295,14 @@ if (!isnull(t.manipulated_by) && t.manipulated_by != C.real_name && findtext(t.desc,breathes)) contents.Add(t.air_contents.total_moles) //Someone messed with the tank and put unknown gasses continue //in it, so we're going to believe the tank is what it says it is - switch(breathes) + switch(breathes) //These tanks we're sure of their contents if("nitrogen") //So we're a bit more picky about them. - + if(t.air_contents.nitrogen && !t.air_contents.oxygen) contents.Add(t.air_contents.nitrogen) else - contents.Add(0) + contents.Add(0) if ("oxygen") if(t.air_contents.oxygen && !t.air_contents.toxins) @@ -316,9 +316,9 @@ contents.Add(t.air_contents.carbon_dioxide) else contents.Add(0) - - - else + + + else //no tank so we set contents to 0 contents.Add(0) @@ -328,19 +328,19 @@ var/bestcontents = 0 for(var/i=1, i < contents.len + 1 , ++i) if(!contents[i]) - continue + continue if(contents[i] > bestcontents) best = i bestcontents = contents[i] - - + + //We've determined the best container now we set it as our internals if(best) C << "You are now running on internals from [tankcheck[best]] on your [nicename[best]]." C.internal = tankcheck[best] - - + + if(C.internal) if(C.internals) C.internals.icon_state = "internal1" diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 9960b638..c039d862 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -146,6 +146,11 @@ proc/get_id_photo(var/mob/living/carbon/human/H) if(E.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) preview_icon.Blend(temp, ICON_OVERLAY) + + //Tail + if(H.species.tail && H.species.flags & HAS_TAIL) + temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.species.tail]_s") + preview_icon.Blend(temp, ICON_OVERLAY) // Skin tone if(H.species.flags & HAS_SKIN_TONE) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 43fd1be5..e8a72f1d 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -228,6 +228,7 @@ icon = 'icons/obj/shards.dmi' icon_state = "large" sharp = 1 + edge = 1 desc = "Could probably be used as ... a throwing weapon?" w_class = 2.0 force = 5.0 @@ -471,6 +472,8 @@ icon_state = "hatchet" flags = FPRINT | TABLEPASS | CONDUCT force = 12.0 + sharp = 1 + edge = 1 w_class = 2.0 throwforce = 15.0 throw_speed = 4 @@ -496,6 +499,8 @@ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow." force = 13.0 throwforce = 5.0 + sharp = 1 + edge = 1 throw_speed = 1 throw_range = 3 w_class = 4.0 diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 43dea8c3..882f1618 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -188,7 +188,8 @@ //message_admins("The probability of a new traitor is [traitor_prob]%") if(prob(traitor_prob)) message_admins("New traitor roll passed. Making a new Traitor.") - forge_traitor_objectives(character.mind) + if (!config.objectives_disabled) + forge_traitor_objectives(character.mind) equip_traitor(character) traitors += character.mind character << "\red You are the traitor." diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index e0d8b8c4..2189b228 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -57,7 +57,7 @@ factory.spores += src ..(loc) return - Die() + death() ..() if(factory) factory.spores -= src diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 3648d9a1..52c7602b 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -87,7 +87,7 @@ return 1 return 0 -/* temperature_expose(datum/gas_mixture/air, temperature, volume) Blob is currently fireproof +/* fire_act(datum/gas_mixture/air, temperature, volume) Blob is currently fireproof if(temperature > T0C+200) health -= 0.01 * temperature update() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index a97f178c..92256192 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -88,6 +88,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone + if (config.objectives_disabled) + return + var/datum/objective/absorb/absorb_objective = new absorb_objective.owner = changeling absorb_objective.gen_amount_goal(2, 3) diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 824c0ff7..538e63dc 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -169,7 +169,7 @@ src.visible_message("[src] stabs [T] with the proboscis!") T << "You feel a sharp stabbing pain!" var/datum/organ/external/affecting = T.get_organ(src.zone_sel.selecting) - if(affecting.take_damage(39,0,1,"large organic needle")) + if(affecting.take_damage(39,0,1,0,"large organic needle")) T:UpdateDamageIcon() continue diff --git a/code/game/gamemodes/events/biomass.dm b/code/game/gamemodes/events/biomass.dm index 4ca0d526..174866e6 100644 --- a/code/game/gamemodes/events/biomass.dm +++ b/code/game/gamemodes/events/biomass.dm @@ -154,7 +154,7 @@ return return -/obj/effect/biomass/temperature_expose(null, temp, volume) //hotspots kill biomass +/obj/effect/biomass/fire_act(null, temp, volume) //hotspots kill biomass del src diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm index d2bd2dbc..b4264f24 100644 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ b/code/game/gamemodes/events/ninja_equipment.dm @@ -1367,17 +1367,20 @@ It is possible to destroy the net by the occupant or someone else. playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1) anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) - M.loc = pick(holdingfacility)//Throw mob in to the holding facility. - M << "\red You appear in a strange place!" + if(holdingfacility.len) + M.loc = pick(holdingfacility)//Throw mob in to the holding facility. + spawn(0) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, M.loc) + spark_system.start() + playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1) + playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1) + anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir) + del(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). + else + M.loc = null - spawn(0) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, M.loc) - spark_system.start() - playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1) - anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir) - del(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). + M << "\red You appear in a strange place!" for(var/mob/O in viewers(src, 3)) O.show_message(text("[] vanished!", M), 1, text("You hear sparks flying!"), 2) diff --git a/code/game/gamemodes/events/spacevines.dm b/code/game/gamemodes/events/spacevines.dm index 96154c37..d2a98261 100644 --- a/code/game/gamemodes/events/spacevines.dm +++ b/code/game/gamemodes/events/spacevines.dm @@ -239,7 +239,7 @@ return return -/obj/effect/spacevine/temperature_expose(null, temp, volume) //hotspots kill vines +/obj/effect/spacevine/fire_act(null, temp, volume) //hotspots kill vines del src //Carn: Spacevines random event. diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 34bbcc19..b9ac22bc 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -116,8 +116,6 @@ Implants; feedback_set_details("round_start","[time2text(world.realtime)]") if(ticker && ticker.mode) feedback_set_details("game_mode","[ticker.mode]") - if(revdata) - feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") return 1 diff --git a/code/game/gamemodes/meme/meme.dm b/code/game/gamemodes/meme/meme.dm index b9f7a054..b918139f 100644 --- a/code/game/gamemodes/meme/meme.dm +++ b/code/game/gamemodes/meme/meme.dm @@ -108,6 +108,9 @@ /datum/game_mode/proc/forge_meme_objectives(var/datum/mind/meme, var/datum/mind/first_host) + if (config.objectives_disabled) + return + // meme always needs to attune X hosts var/datum/objective/meme_attune/attune_objective = new attune_objective.owner = meme diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index 42f5b69d..33810a2e 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -85,6 +85,8 @@ return 1 /datum/game_mode/ninja/proc/forge_ninja_objectives(var/datum/mind/ninja) + if (config.objectives_disabled) + return var/objective_list = list(1,2,3,4,5) for(var/i=rand(2,4),i>0,i--) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 9ff4d2fc..89b5af22 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -186,6 +186,8 @@ /datum/game_mode/proc/forge_syndicate_objectives(var/datum/mind/syndicate) + if (config.objectives_disabled) + return var/datum/objective/nuclear/syndobj = new syndobj.owner = syndicate syndicate.objectives += syndobj diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index c8a55d3e..272e80f6 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -78,6 +78,9 @@ /datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor) + if (config.objectives_disabled) + return + if(istype(traitor.current, /mob/living/silicon)) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = traitor diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index aec051de..30989912 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -64,6 +64,9 @@ /datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard) + if (config.objectives_disabled) + return + switch(rand(1,100)) if(1 to 30) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 7889a19b..50df6335 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -92,12 +92,12 @@ H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store) H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back) - else if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index e0940ef2..6a5e2491 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -71,8 +71,12 @@ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/virologist(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_vir(H), slot_back) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) if("Medical Doctor") H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) @@ -122,12 +126,12 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/chemist(H), slot_wear_suit) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back) - else if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -153,12 +157,12 @@ H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/genetics(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back) - else if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 /*/datum/job/virologist diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 6592e2a1..684e5c00 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -27,12 +27,12 @@ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) - else if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -57,12 +57,12 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) - else if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 @@ -86,12 +86,12 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit) - if(H.backbag == 3) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) - else if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + switch(H.backbag) + if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 2bce84ae..f9bb469f 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -36,8 +36,6 @@ var/list/whitelist = list() return 1 if(species == "human" || species == "Human") return 1 -// if(species == "machine" || species == "Machine") -// return 1 // if(check_rights(R_ADMIN, 0)) // return 1 if(!alien_whitelist) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 6af4d627..088770da 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -110,7 +110,7 @@ update_flag overlays += "can-o3" return -/obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/machinery/portable_atmospherics/canister/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > temperature_resistance) health -= 5 healthcheck() diff --git a/code/game/machinery/bots/farmbot.dm b/code/game/machinery/bots/farmbot.dm index b6f81984..228b5250 100644 --- a/code/game/machinery/bots/farmbot.dm +++ b/code/game/machinery/bots/farmbot.dm @@ -441,7 +441,7 @@ var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/datum/organ/external/affecting = human.get_organ(ran_zone(dam_zone)) var/armor = human.run_armor_check(affecting, "melee") - human.apply_damage(damage,BRUTE,affecting,armor) + human.apply_damage(damage,BRUTE,affecting,armor,sharp=1,edge=1) else // warning, plants infested with weeds! mode = FARMBOT_MODE_WAITING diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index fcf525cc..8c86629d 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -115,6 +115,15 @@ jobs_all += "Captain" jobs_all += "Custom" + counter = 0 + jobs_all += "Security"//Red + for(var/job in security_positions) + counter++ + if(counter >= 6) + jobs_all += "" + counter = 0 + jobs_all += "[replacetext(job, " ", " ")]" + counter = 0 jobs_all += "Engineering"//Orange for(var/job in engineering_positions) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 81c0eeb3..0074f1c0 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -107,13 +107,9 @@ /obj/machinery/computer/crew/proc/scan() - for(var/obj/item/clothing/under/C in world) - if((C.has_sensor) && (istype(C.loc, /mob/living/carbon/human))) - var/check = 0 - for(var/O in src.tracked) - if(O == C) - check = 1 - break - if(!check) - src.tracked.Add(C) + for(var/mob/living/carbon/human/H in mob_list) + if(istype(H.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/C = H.w_uniform + if (C.has_sensor) + tracked |= C return 1 \ No newline at end of file diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 264246c6..b834fddc 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -26,7 +26,7 @@ ********************/ /obj/machinery/microwave/New() - //..() //do not need this + ..() reagents = new/datum/reagents(100) reagents.my_atom = src if (!available_recipes) diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm index 041a0334..b3e26603 100644 --- a/code/game/machinery/podmen.dm +++ b/code/game/machinery/podmen.dm @@ -101,7 +101,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. * /obj/item/seeds/replicapod/proc/question(var/client/C) spawn(0) if(!C) return - var/response = alert(C, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No", "Never for this round.") + var/response = alert(C, "Someone is harvesting a diona pod. Would you like to play as a diona?", "Dionaea harvest", "Yes", "No", "Never for this round.") if(!C || ckey) return if(response == "Yes") diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index ef816a0d..48ade625 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -147,10 +147,10 @@ if(new_shoe_icon_state && new_shoe_name) for(var/obj/item/clothing/shoes/S in contents) //world << "DEBUG: YUP! FOUND IT!" -// if (S.chained == 1) -// S.chained = 0 -// S.slowdown = SHOES_SLOWDOWN -// new /obj/item/weapon/handcuffs( src ) + if (istype(S,/obj/item/clothing/shoes/orange)) + var/obj/item/clothing/shoes/orange/L = S + if (L.chained) + L.remove_cuffs() S.icon_state = new_shoe_icon_state S.item_color = wash_color S.name = new_shoe_name diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index dc821839..77238b1f 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -315,7 +315,7 @@ var/obj/item/device/assembly/mousetrap/M = AM M.secured = 1 ..() - +/* /obj/item/mecha_parts/mecha_equipment/weapon/energy/taserexo name = "Heavy Duty Exoskeleton Tasergun" icon_state = "mecha_taser" @@ -343,7 +343,7 @@ return 0 else return ..() - +*/ /obj/item/mecha_parts/mecha_equipment/handcuffs name = "handcuffs" desc = "Use this to keep prisoners in line." diff --git a/code/game/mecha/exo/exoskeleton.dm b/code/game/mecha/exo/exoskeleton.dm index 3de2c6ee..3db2291f 100644 --- a/code/game/mecha/exo/exoskeleton.dm +++ b/code/game/mecha/exo/exoskeleton.dm @@ -6,7 +6,7 @@ step_in = 2 max_temperature = 7000 // DON'T FORGET TO TEST THIS health = 200 - wreckage = /obj/effect/decal/mecha_wreckage/exoskeleton +// wreckage = /obj/effect/decal/mecha_wreckage/exoskeleton internal_damage_threshold = 35 deflect_chance = 25 step_energy_drain = 4 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index d64ce6f5..dfbca044 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -36,6 +36,7 @@ var/screen = "main" var/opened = 0 var/temp + var/output_dir = SOUTH //the direction relative to the fabber at which completed parts appear. var/list/part_sets = list( //set names must be unique "Robot"=list( /obj/item/robot_parts/robot_suit, @@ -90,19 +91,7 @@ /obj/item/mecha_parts/part/durand_right_leg, /obj/item/mecha_parts/part/durand_armour ), - -/* "Exoskeleton"=list( - /obj/item/mecha_parts/chassis/exoskeleton, - /obj/item/mecha_parts/part/exoskeletonarmor, - /obj/item/mecha_parts/part/hydraulicspack, - /obj/item/mecha_parts/part/electricalpack - - - - - ),*/ - -/* "H.O.N.K"=list( + /*"H.O.N.K"=list( /obj/item/mecha_parts/chassis/honker, /obj/item/mecha_parts/part/honker_torso, /obj/item/mecha_parts/part/honker_head, @@ -111,25 +100,6 @@ /obj/item/mecha_parts/part/honker_left_leg, /obj/item/mecha_parts/part/honker_right_leg ), */ - "Exosuit Equipment"=list( - /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, - /obj/item/mecha_parts/mecha_equipment/tool/drill, - /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, - /obj/item/mecha_parts/mecha_equipment/tool/cable_layer, - /obj/item/mecha_parts/mecha_equipment/tool/sleeper, - /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, - /obj/item/mecha_parts/chassis/firefighter, - ///obj/item/mecha_parts/mecha_equipment/repair_droid, - /obj/item/mecha_parts/mecha_equipment/generator, - ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING - /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, -// /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/mousetrap_mortar -// /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar -// /obj/item/mecha_parts/mecha_equipment/weapon/honker - /obj/item/mecha_parts/mecha_equipment/weapon/energy/laserexo, - /obj/item/mecha_parts/mecha_equipment/weapon/energy/taserexo, - ), "Robotic Upgrade Modules" = list( /obj/item/borg/upgrade/reset, @@ -392,7 +362,7 @@ src.overlays -= "fab-active" src.desc = initial(src.desc) if(being_built) - src.being_built.Move(get_step(src,SOUTH)) + src.being_built.Move(get_step(src,output_dir)) src.visible_message("\icon[src] [src] beeps, \"The following has been completed: [src.being_built] is built\".") src.being_built = null src.updateUsrDialog() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b4c954c4..ee5d1927 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -618,7 +618,7 @@ check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) return -/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/mecha/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature>src.max_temperature) src.log_message("Exposed to dangerous temperature.",1) src.take_damage(5,"fire") diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 69c4e263..245bf161 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -1372,183 +1372,4 @@ spawn_result() ..() feedback_inc("mecha_odysseus_created",1) - return -/* -/datum/construction/mecha/exoskeleton_chasis - steps = list(list("key"=/obj/item/mecha_parts/part/exoskeletonarmor),//1 - list("key"=/obj/item/mecha_parts/part/electricalpack),//2 - list("key"=/obj/item/mecha_parts/part/hydraulicspack),//3 - ) - - custom_action(step, atom/used_atom, mob/user) - user.visible_message("[user] has connected [used_atom] to [holder].", "You connect [used_atom] to [holder]") - holder.overlays += used_atom.icon_state+"+o" - del used_atom - return 1 - - action(atom/used_atom,mob/user as mob) - return check_all_steps(used_atom,user) - - spawn_result() - var/obj/item/mecha_parts/chassis/const_holder = holder - const_holder.construct = new /datum/construction/reversible/mecha/exoskeleton(const_holder) - const_holder.icon = 'icons/mecha/mech_construction.dmi' - const_holder.icon_state = "exoskeleton0" - const_holder.density = 1 - spawn() - del src - return -*/ -/* -/datum/construction/reversible/mecha/exoskeleton - result = "/obj/mecha/combat/exoskeleton" - steps = list( - //1 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=/obj/item/weapon/wrench, - "desc"="External armor is wrenched."), - //2 - list("key"=/obj/item/weapon/wrench, - "backkey"=/obj/item/weapon/crowbar, - "desc"="External armor is installed."), - //3 - list("key"=/obj/item/weapon/weldingtool, - "backkey"=/obj/item/weapon/wrench, - "desc"="Internal armor is wrenched"), - //4 - list("key"=/obj/item/weapon/wrench, - "backkey"=/obj/item/weapon/crowbar, - "desc"="Internal armor is installed"), - //5 - list("key"=/obj/item/stack/sheet/metal, - "backkey"=/obj/item/weapon/screwdriver, - "desc"="Central control module is secured"), - //6 - list("key"=/obj/item/weapon/screwdriver, - "backkey"=/obj/item/weapon/crowbar, - "desc"="Central control module is installed"), - //7 - list("key"=/obj/item/weapon/circuitboard/mecha/exoskeleton/main, - "backkey"=/obj/item/weapon/screwdriver, - "desc"="The wiring is adjusted"), - //8 - list("key"=/obj/item/weapon/wirecutters, - "backkey"=/obj/item/weapon/screwdriver, - "desc"="The wiring is added"), - //9 - list("key"=/obj/item/weapon/cable_coil, - "backkey"=/obj/item/weapon/screwdriver, - "desc"="The hydraulic systems are active."), - //11 - list("key"=/obj/item/weapon/screwdriver, - "backkey"=/obj/item/weapon/wrench, - "desc"="The hydraulic systems are connected."), - //12 - list("key"=/obj/item/weapon/wrench, - "backkey"=/obj/item/weapon/screwdriver, - "desc"="The hydraulic systems are disconnected.") - ) - - action(atom/used_atom,mob/user as mob) - return check_step(used_atom,user) - - custom_action(index, diff, atom/used_atom, mob/user) - if(!..()) - return 0 - - //TODO: better messages. - switch(index) - if(12) - user.visible_message("[user] installs [holder] hydraulics pack", "You install [holder] hydraulics pack.") - holder.icon_state = "exoskeleton1" - if(11) - if(diff==FORWARD) - user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.") - holder.icon_state = "exoskeleton2" - else - user.visible_message("[user] removes [holder] hydraulics pack", "You remove [holder] hydraulics pack.") - holder.icon_state = "exoskeleton0" - if(10) - if(diff==FORWARD) - user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.") - holder.icon_state = "exoskeleton3" - else - user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.") - holder.icon_state = "exoskeleton1" - if(9) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].") - holder.icon_state = "exoskeleton4" - else - user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.") - holder.icon_state = "exoskeleton2" - if(8) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].") - holder.icon_state = "exoskeleton5" - else - user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].") - var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder)) - coil.amount = 4 - holder.icon_state = "exoskeleton3" - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].") - del used_atom - holder.icon_state = "exoskeleton7" - else - user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].") - holder.icon_state = "exoskeleton5" - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") - holder.icon_state = "exoskeleton8" - else - user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].") - new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder)) - holder.icon_state = "exoskeleton6" - if(5) - if(diff==FORWARD) - user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") - holder.icon_state = "exoskeleton10" - else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") - var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) - MS.amount = 5 - holder.icon_state = "exoskeleton8" - if(4) - if(diff==FORWARD) - user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].") - holder.icon_state = "exoskeleton11" - else - user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "exoskeleton9" - if(3) - if(diff==FORWARD) - user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") - holder.icon_state = "exoskeleton12" - else - user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") - holder.icon_state = "exoskeleton10" - if(2) - if(diff==FORWARD) - user.visible_message("[user] secures armor layer.", "You secure the reinforced armor layer.") - holder.icon_state = "exoskeleton13" - else - user.visible_message("[user] pries the armor layer from [holder].", "You prie the armor layer from [holder].") - var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) - MS.amount = 5 - holder.icon_state = "exoskeleton11" - if(1) - if(diff==FORWARD) - user.visible_message("[user] welds the armor layer to [holder].", "You weld the armor layer to [holder].") - else - user.visible_message("[user] unfastens the armor layer.", "You unfasten the armor layer.") - holder.icon_state = "exoskeleton12" - return 1 - - spawn_result() - ..() - feedback_inc("mecha_exoskeleton_created",1) - return*/ - + return \ No newline at end of file diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 1f28823a..a92d8659 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -394,43 +394,6 @@ construction_time = 200 construction_cost = list("metal"=15000)*/ -///////// Exoskeleton -/* - -/obj/item/mecha_parts/chassis/exoskeleton - name = "Exoskeleton Chassis" - icon = 'icons/mecha/mech_construction.dmi' - icon_state = "exoskeleton0" - - New() - ..() - construct = new /datum/construction/mecha/exoskeleton_chasis(src) ///datum/construction/mecha/odysseus_chassis(src) - -/obj/item/mecha_parts/part/exoskeletonarmor - name="Exoskeleton Armor" - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "riot" - construction_time = 120 - construction_cost = list("metal"=30000) - origin_tech = "programming=3;materials=2" - -/obj/item/mecha_parts/part/hydraulicspack - name="Exoskeleton Hydraulics Pack" - icon = 'icons/obj/device.dmi' - icon_state = "modkit" - construction_time = 90 - construction_cost = list("metal"=20000,"glass"=6000) - origin_tech = "programming=3;materials=2;engineering=2" - -/obj/item/mecha_parts/part/electricalpack - name="Exoskeleton Power Generator Pack" - desc="Contains power unit and processing core for modifications." - icon = 'icons/obj/device.dmi' - icon_state = "modkit" - origin_tech = "programming=3;materials=2;engineering=2" - construction_time = 90 - construction_cost = list("metal"=25000) -*/ ///////// Circuitboards @@ -447,13 +410,6 @@ throw_speed = 3 throw_range = 15 - exoskeleton - origin_tech = "programming=4" - - exoskeleton/main - name = "Exoskeleton Circuit Board" - icon_state = "mainboard" // put something here. - ripley origin_tech = "programming=3" diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index fe0caee1..ae039b4d 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -217,8 +217,4 @@ var/part = pick(parts) welder_salvage += part parts -= part - return - -/obj/effect/decal/mecha_wreckage/exoskeleton - name = "Useless Exoskeleton" - icon_state = "exosuit-broken" \ No newline at end of file + return \ No newline at end of file diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 25edeb2d..6ff7ea15 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -287,7 +287,7 @@ Alien plants should do something if theres a lot of poison del(src) -/obj/effect/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) health -= 5 healthcheck() @@ -469,7 +469,7 @@ Alien plants should do something if theres a lot of poison if(health <= 0) Burst() -/obj/effect/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 500) health -= 5 healthcheck() diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index be6b87ca..8c147cca 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -27,24 +27,6 @@ would spawn and follow the beaker, even if it is carried or thrown. reagents.delete() return - -/obj/effect/effect/water/New() - ..() - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX - spawn( 70 ) - delete() - return - return - -/obj/effect/effect/water/Del() - //var/turf/T = src.loc - //if (istype(T, /turf)) - // T.firelevel = 0 //TODO: FIX - ..() - return - /obj/effect/effect/water/Move(turf/newloc) //var/turf/T = src.loc //if (istype(T, /turf)) @@ -559,7 +541,7 @@ steam.start() -- spawns the effect // foam disolves when heated // except metal foams -/obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/effect/foam/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!metal && prob(max(0, exposed_temperature - 475))) flick("[icon_state]-disolve", src) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 35ed5119..f9708f24 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -154,7 +154,7 @@ else return -/obj/effect/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/glowshroom/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) endurance -= 5 CheckEndurance() diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 8f920536..7fe38eca 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -137,8 +137,9 @@ OT.master = V PT.air_contents.temperature = PLASMA_FLASHPOINT - PT.air_contents.toxins = 3 - PT.air_contents.carbon_dioxide = 17 + PT.air_contents.toxins = 12 + PT.air_contents.carbon_dioxide = 8 + PT.air_contents.update_values() OT.air_contents.temperature = PLASMA_FLASHPOINT diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 48e01f55..0a65ada4 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -47,7 +47,7 @@ if(health <= 0) del(src) -/obj/effect/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) health -= 5 healthcheck() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2672a2c8..1ce4162a 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -127,6 +127,7 @@ brightness_on = 2 w_class = 1 + // the desk lamps are a bit special /obj/item/device/flashlight/lamp name = "desk lamp" diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 14804f2b..d00825cf 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -761,10 +761,10 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use continue src.channels += ch_name src.channels[ch_name] += keyslot.channels[ch_name] - + if(keyslot.syndie) src.syndie = 1 - + for (var/ch_name in src.channels) if(!radio_controller) diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 049eac7f..8a3db9ec 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -38,11 +38,11 @@ /obj/item/latexballon/bullet_act() burst() -/obj/item/latexballon/temperature_expose(datum/gas_mixture/air, temperature, volume) +/obj/item/latexballon/fire_act(datum/gas_mixture/air, temperature, volume) if(temperature > T0C+100) burst() return /obj/item/latexballon/attackby(obj/item/W as obj, mob/user as mob) - if (is_sharp(W)) + if (can_puncture(W)) burst() \ No newline at end of file diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 3d3b88f4..a37b2f5f 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -264,7 +264,10 @@ /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/device/flash)) - if(src.flash1 && src.flash2) + if(istype(user,/mob/living/silicon/robot)) + user << "\red How do you propose to do that?" + return + else if(src.flash1 && src.flash2) user << "\blue You have already inserted the eyes!" return else if(src.flash1) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 4a6e48aa..c700748c 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -117,7 +117,7 @@ //Step two - washing..... it's actually in washing machine code. //Step three - drying -/obj/item/stack/sheet/wetleather/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/item/stack/sheet/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) ..() if(exposed_temperature >= drying_threshold_temperature) wetness-- diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 091314c6..8a9093fe 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -414,7 +414,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.visible_message("After a few attempts, [user] manages to light the [src].") else user << "You burn yourself while lighting the lighter." - user.adjustFireLoss(5) + if (user.l_hand == src) + user.apply_damage(2,BURN,"l_hand") + else + user.apply_damage(2,BURN,"r_hand") user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") user.SetLuminosity(user.luminosity + 2) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 5d5266b3..6d7fe96e 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -5,6 +5,7 @@ icon_state = "d66" w_class = 1 var/sides = 6 + attack_verb = list("diced") /obj/item/weapon/dice/New() icon_state = "[name][rand(sides)]" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 81386b84..dc595239 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -123,6 +123,7 @@ W.reagents.reaction(atm) if(W.loc == my_target) break sleep(2) + W.delete() if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0)) user.inertia_dir = get_dir(target, user) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 95763034..ed161809 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -7,19 +7,21 @@ prime() ..() - for(var/obj/structure/closet/L in view(get_turf(src), null)) + for(var/obj/structure/closet/L in hear(7, get_turf(src))) if(locate(/mob/living/carbon/, L)) for(var/mob/living/carbon/M in L) bang(get_turf(src), M) - for(var/mob/living/carbon/M in viewers(get_turf(src), null)) + for(var/mob/living/carbon/M in hear(7, get_turf(src))) bang(get_turf(src), M) - for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here + for(var/obj/effect/blob/B in hear(8,get_turf(src))) //Blob damage here var/damage = round(30/(get_dist(B,get_turf(src))+1)) B.health -= damage B.update_icon() + + new/obj/effect/effect/smoke/flashbang(src.loc) del(src) return @@ -30,7 +32,7 @@ S.icon_state = "shield0" M << "\red BANG" - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) //Checking for protections var/eye_safety = 0 @@ -98,6 +100,15 @@ M << "\red Your ears start to ring!" M.update_icons() +/obj/effect/effect/smoke/flashbang + name = "illumination" + time_to_live = 10 + opacity = 0 + icon_state = "sparks" + +/obj/effect/effect/smoke/flashbang/New() + ..() + SetLuminosity(15) /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index de160213..1615c756 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -112,7 +112,7 @@ var/last_chew = 0 H.attack_log += text("\[[time_stamp()]\] [s] ([H.ckey])") log_attack("[s] ([H.ckey])") - if(O.take_damage(3,0,1,"teeth marks")) + if(O.take_damage(3,0,1,1,"teeth marks")) H:UpdateDamageIcon() last_chew = world.time diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 06258f4b..4e9d781b 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -53,6 +53,7 @@ name = "fork" desc = "Pointy." icon_state = "fork" + sharp = 1 /obj/item/weapon/kitchen/utensil/fork/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) @@ -114,6 +115,8 @@ icon_state = "knife" force = 10.0 throwforce = 10.0 + sharp = 1 + edge = 1 suicide_act(mob/user) viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \ @@ -154,6 +157,7 @@ desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come." flags = FPRINT | TABLEPASS | CONDUCT sharp = 1 + edge = 1 force = 10.0 w_class = 3.0 throwforce = 6.0 @@ -192,6 +196,8 @@ m_amt = 12000 origin_tech = "materials=1" attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharp = 1 + edge = 1 /obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index c4146854..a16dc018 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -19,6 +19,8 @@ flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS | NOBLOODY origin_tech = "combat=3" attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") + sharp = 1 + edge = 1 suicide_act(mob/user) viewers(user) << "\red [user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide." @@ -37,6 +39,8 @@ flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY origin_tech = "magnets=3;syndicate=4" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharp = 1 + edge = 1 /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" @@ -48,6 +52,8 @@ desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" force = 70.0//Normal attacks deal very high damage. + sharp = 1 + edge = 1 throwforce = 1//Throwing or dropping the item deletes it. throw_speed = 1 throw_range = 1 diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 00d2eafa..503f7b99 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -48,6 +48,8 @@ /obj/item/weapon/storage/box/gloves name = "box of latex gloves" desc = "Contains white gloves." + icon_state = "latex" + New() ..() new /obj/item/clothing/gloves/latex(src) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 4bd89f7d..245ebea7 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -379,6 +379,8 @@ LOOK FOR SURGERY.DM*/ icon_state = "scalpel" flags = FPRINT | TABLEPASS | CONDUCT force = 10.0 + sharp = 1 + edge = 1 w_class = 2.0 throwforce = 5.0 throw_speed = 3 @@ -668,6 +670,8 @@ LOOK FOR SURGERY.DM*/ g_amt = 10000 origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "slashed", "sawed", "cut") + sharp = 1 + edge = 1 /* /obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 55e04456..b8494a7b 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -106,6 +106,8 @@ m_amt = 80 origin_tech = "materials=1;engineering=1" attack_verb = list("pinched", "nipped") + sharp = 1 + edge = 1 /obj/item/weapon/wirecutters/New() if(prob(50)) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index d0092619..bb714ca9 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -109,6 +109,8 @@ name = "fire axe" desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" force = 5 + sharp = 1 + edge = 1 w_class = 4.0 slot_flags = SLOT_BACK force_unwielded = 10 @@ -154,6 +156,8 @@ flags = FPRINT | TABLEPASS | NOSHIELD origin_tech = "magnets=3;syndicate=4" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharp = 1 + edge = 1 /obj/item/weapon/twohanded/dualsaber/update_icon() icon_state = "dualsaber[wielded]" diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 58bd7933..8eb24e90 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -79,6 +79,8 @@ slot_flags = SLOT_BELT force = 2 throwforce = 1 + sharp = 1 + edge = 1 w_class = 3 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -99,6 +101,8 @@ slot_flags = SLOT_BELT force = 40 throwforce = 10 + sharp = 1 + edge = 1 w_class = 3 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -122,6 +126,8 @@ slot_flags = SLOT_BELT | SLOT_BACK force = 40 throwforce = 10 + sharp = 1 + edge = 1 w_class = 3 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") @@ -139,6 +145,7 @@ /obj/item/weapon/harpoon name = "harpoon" sharp = 1 + edge = 0 desc = "Tharr she blows!" icon_state = "harpoon" item_state = "harpoon" @@ -150,6 +157,7 @@ /obj/item/weapon/canesword name = "cane sword" sharp = 1 + edge = 1 desc = "A thin, sharp blade with an elegant handle." icon_state = "canesword" item_state = "canesword" diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 8377f883..1357510d 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -10,7 +10,8 @@ animate_movement = 2 var/throwforce = 1 var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" - var/sharp = 0 // whether this object cuts + var/sharp = 0 // whether this object cuts + var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/damtype = "brute" diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 82a8e425..b6dda25f 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -216,7 +216,7 @@ return 0 return 0 -/obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/grille/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!destroyed) if(exposed_temperature > T0C + 1500) health -= 1 diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index a0a9a913..3d21a3a2 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -110,7 +110,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(!istype(W)) return - if (is_sharp(W)) + if (can_puncture(W)) visible_message("\red [user] pierces [src] with [W]!") deflate(1) if(W.damtype == BRUTE || W.damtype == BURN) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 9ff142c6..cbd2e9b9 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -82,6 +82,7 @@ state = 1 update_icon() isSwitchingStates = 0 + update_nearby_tiles() proc/Close() isSwitchingStates = 1 @@ -93,6 +94,7 @@ state = 0 update_icon() isSwitchingStates = 0 + update_nearby_tiles() update_icon() if(state) @@ -198,7 +200,7 @@ TemperatureAct(100) ..() - temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) TemperatureAct(exposed_temperature) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 88f6cc0f..798060f8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -361,7 +361,7 @@ return -/obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/window/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > T0C + 800) hit(round(exposed_volume / 100), 0) ..() @@ -381,7 +381,7 @@ shardtype = /obj/item/weapon/shard/plasma health = 120 -/obj/structure/window/plasmabasic/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/window/phoronbasic/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > T0C + 32000) hit(round(exposed_volume / 1000), 0) ..() @@ -395,7 +395,7 @@ reinf = 1 health = 160 -/obj/structure/window/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/window/plasmareinforced/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) return /obj/structure/window/reinforced diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 1d90122a..c4ed38d2 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -144,8 +144,11 @@ for(var/obj/effect/decal/cleanable/blood/B in contents) if(!B.blood_DNA[M.dna.unique_enzymes]) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + B.virus2 = virus_copylist(M.virus2) return 1 //we bloodied the floor + + //if there isn't a blood decal already, make one. var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(src) @@ -156,6 +159,7 @@ newblood.basecolor = "#A10808" newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + newblood.virus2 = virus_copylist(M.virus2) newblood.update_icon() return 1 //we bloodied the floor diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 592773d5..4ca0d8c7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -608,22 +608,22 @@ var/list/admin_verbs_mod = list( feedback_add_details("admin_verb","GD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the disease [D].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] the disease [D].", 1) - + /client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom set category = "Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." - + var/datum/disease2/disease/D = new /datum/disease2/disease() - + var/greater = ((input("Is this a lesser or greater disease?", "Give Disease") in list("Lesser", "Greater")) == "Greater") - + D.makerandom(greater) if (!greater) D.infectionchance = 1 - + D.infectionchance = input("How virulent is this disease? (1-100)", "Give Disease", D.infectionchance) as num - + if(istype(T,/mob/living/carbon/human)) var/mob/living/carbon/human/H = T if (H.species) @@ -632,7 +632,7 @@ var/list/admin_verbs_mod = list( var/mob/living/carbon/monkey/M = T D.affected_species = list(M.greaterform) infect_virus2(T,D,1) - + feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [(greater)? "greater":"lesser"] disease2 with infection chance [D.infectionchance].", 1) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 8daf267b..e16e809a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -114,7 +114,7 @@ //play the recieving admin the adminhelp sound (if they have them enabled) //non-admins shouldn't be able to disable this - if(C.prefs.toggles & SOUND_ADMINHELP) + if(C.prefs && C.prefs.toggles & SOUND_ADMINHELP) C << 'sound/effects/adminhelp.ogg' log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 789e33f9..82d8df28 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -84,22 +84,31 @@ name = "orange shoes" icon_state = "orange" item_color = "orange" + var/obj/item/weapon/handcuffs/chained = null + +/obj/item/clothing/shoes/orange/proc/attach_cuffs(var/obj/item/weapon/handcuffs/cuffs) + if (src.chained) return + + cuffs.loc = src + src.chained = cuffs + src.slowdown = 15 + src.icon_state = "orange1" + +/obj/item/clothing/shoes/orange/proc/remove_cuffs() + if (!src.chained) return + + src.chained.loc = get_turf(src) + src.slowdown = initial(slowdown) + src.icon_state = "orange" + src.chained = null + +/obj/item/clothing/shoes/orange/attack_self(mob/user as mob) + ..() + remove_cuffs() + +/obj/item/clothing/shoes/orange/attackby(H as obj, mob/user as mob) + ..() + if (istype(H, /obj/item/weapon/handcuffs)) + attach_cuffs(H) -///obj/item/clothing/shoes/orange/attack_self(mob/user as mob) -// if (src.chained) -// src.chained = null -// src.slowdown = SHOES_SLOWDOWN -// new /obj/item/weapon/handcuffs( user.loc ) -// src.icon_state = "orange" -// return -///obj/item/clothing/shoes/orange/attackby(H as obj, loc) -// ..() -// if ((istype(H, /obj/item/weapon/handcuffs) && !( src.chained ))) -// //H = null -// if (src.icon_state != "orange") return -// del(H) -// src.chained = 1 -// src.slowdown = 15 -// src.icon_state = "orange1" -// return diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index dad2f7c2..de9ce67c 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -30,42 +30,4 @@ name = "roboticist's jumpsuit" icon_state = "robotics" item_state = "robotics" - item_color = "robotics" - -//Down below follows a partial attempt at getting the rolldown verb for jumpsuits. -//Issue: Sprites vanishing again... Hueh - Skull132 -/* -/obj/item/clothing/under/rank/verb/rolldown() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - - switch(icon_state) - if("atmos") - src.icon_state = "atmos_rd" - src.item_color = "atmos_rd" - src.item_state = "atmos_rd" - usr << "You roll down the jumpsuit." - if("atmos_rd") - src.icon_state = "atmos" - src.item_color = "atmos" - src.item_state = "atmos" - usr << "You roll the jumpsuit back up." - if("engine") - src.icon_state = "engine_rd" - src.item_color = "engine_rd" - src.item_state = "engine_rd" - usr << "You roll down the jumpsuit." - if("engine_rd") - src.icon_state = "engine" - src.item_color = "engine" - src.item_state = "engine" - usr << "You roll the jumpsuit back up." - else - usr << "You attempt to roll down your [src], before promptly realising how stupid it would be for you to expose your chest." - return - usr.update_inv_w_uniform() */ - + item_color = "robotics" \ No newline at end of file diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index c52b196d..f1bd79a9 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -4,13 +4,15 @@ //for multiple items just add mutliple entries, unless i change it to be a listlistlist //yes, it has to be an item, you can't pick up nonitems +/var/list/custom_items = list() + +/hook/startup/proc/loadCustomItems() + var/custom_items_file = file2text("config/custom_items.txt") + custom_items = text2list(custom_items_file, "\n") + return 1 /proc/EquipCustomItems(mob/living/carbon/human/M) - // load lines - var/file = file2text("config/custom_items.txt") - var/lines = text2list(file, "\n") - - for(var/line in lines) + for(var/line in custom_items) // split & clean up var/list/Entry = text2list(line, ":") for(var/i = 1 to Entry.len) @@ -25,6 +27,8 @@ var/ok = 0 // 1 if the item was placed successfully P = trim(P) var/path = text2path(P) + if(!path) continue + var/obj/item/Item = new path() if(istype(Item,/obj/item/weapon/card/id)) //id card needs to replace the original ID @@ -58,6 +62,23 @@ del(C) ok = M.equip_if_possible(I, slot_wear_id, 0) //if 1, last argument deletes on fail break +/* else if(istype(Item,/obj/item/weapon/storage/belt)) + if(M.ckey == "jakksergal" && M.real_name == "Nashi Ra'hal" && M.mind.role_alt_title && M.mind.role_alt_title != "Nurse" && M.mind.role_alt_title != "Chemist") + ok = 1 + del(Item) + goto skip + var/obj/item/weapon/storage/belt/medical/fluff/nashi_belt/I = Item + if(istype(M.belt,/obj/item/weapon/storage/belt)) + for(var/obj/item/weapon/storage/belt/B in M) + del(B) + M.belt=null + ok = M.equip_if_possible(I, slot_belt, 0) + break + if(istype(M.belt,/obj/item/device/pda)) + for(var/obj/item/device/pda/Pda in M) + M.belt=null + M.equip_if_possible(Pda, slot_l_store, 0) + ok = M.equip_if_possible(I, slot_belt, 0)*/ else if(istype(M.back,/obj/item/weapon/storage) && M.back:contents.len < M.back:storage_slots) // Try to place it in something on the mob's back Item.loc = M.back ok = 1 diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 81165e30..77cbe616 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -190,6 +190,7 @@ proc/move_mining_shuttle() attack_verb = list("hit", "pierced", "sliced", "attacked") var/drill_sound = 'sound/weapons/Genhit.ogg' var/drill_verb = "picking" + sharp = 1 var/excavation_amount = 100 diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index c9b059e6..f01d98ca 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -72,7 +72,7 @@ var/const/MAX_ACTIVE_TIME = 400 Die() return -/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/item/clothing/mask/facehugger/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) Die() return diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index a704eede..becedb1e 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -279,4 +279,4 @@ emp_damage += rand(10,20) if(3) emp_damage += rand(0,10) - ..()*/ + ..()*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 41b6e86c..d2e90b55 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -52,6 +52,7 @@ brainmob.real_name = H.real_name brainmob.dna = H.dna brainmob.timeofhostdeath = H.timeofdeath + brainmob.stat = 0 if(brainmob.mind) brainmob.mind.assigned_role = "Positronic Brain" if(H.mind) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 7785b9ea..d1beaa15 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -252,11 +252,13 @@ /mob/living/carbon/proc/throw_mode_off() src.in_throw_mode = 0 - src.throw_icon.icon_state = "act_throw_off" + if(src.throw_icon) //in case we don't have the HUD and we use the hotkey + src.throw_icon.icon_state = "act_throw_off" /mob/living/carbon/proc/throw_mode_on() src.in_throw_mode = 1 - src.throw_icon.icon_state = "act_throw_on" + if(src.throw_icon) + src.throw_icon.icon_state = "act_throw_on" /mob/proc/throw_item(atom/target) return diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 03253da1..75ebd7d7 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -111,19 +111,16 @@ return 1 if("hurt") + var/datum/unarmed_attack/attack = M.species.unarmed - M.attack_log += text("\[[time_stamp()]\] [M.species.attack_verb]ed [src.name] ([src.ckey])") - src.attack_log += text("\[[time_stamp()]\] Has been [M.species.attack_verb]ed by [M.name] ([M.ckey])") - msg_admin_attack("[key_name(M)] [M.species.attack_verb]ed [key_name(src)]") + M.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])") + src.attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [M.name] ([M.ckey])") + msg_admin_attack("[key_name(M)] [pick(attack.attack_verb)]ed [key_name(src)]") var/damage = rand(0, 5)//BS12 EDIT if(!damage) - if(M.species.attack_verb == "punch") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - - visible_message("\red [M] has attempted to [M.species.attack_verb] [src]!") + playsound(loc, attack.miss_sound, 25, 1, -1) + visible_message("\red [M] tried to [pick(attack.attack_verb)] [src]!") return 0 @@ -133,20 +130,16 @@ if(HULK in M.mutations) damage += 5 - if(M.species.attack_verb == "punch") - playsound(loc, "punch", 25, 1, -1) - else - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + playsound(loc, attack.attack_sound, 25, 1, -1) - visible_message("\red [M] has [M.species.attack_verb]ed [src]!") + visible_message("\red [M] [pick(attack.attack_verb)]ed [src]!") //Rearranged, so claws don't increase weaken chance. if(damage >= 5 && prob(50)) visible_message("\red [M] has weakened [src]!") apply_effect(2, WEAKEN, armor_block) - if(M.species.punch_damage) - damage += M.species.punch_damage - apply_damage(damage, BRUTE, affecting, armor_block) + damage += attack.damage + apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) if("disarm") diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 4fbd84b7..9748eca3 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -59,6 +59,36 @@ heal_overall_damage(0, -amount) hud_updateflag |= 1 << HEALTH_HUD +/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) + if(species && species.brute_mod) + amount = amount*species.brute_mod + + if (organ_name in organs_by_name) + var/datum/organ/external/O = get_organ(organ_name) + + if(amount > 0) + O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) + else + //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. + O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) + + hud_updateflag |= 1 << HEALTH_HUD + +/mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) + if(species && species.burn_mod) + amount = amount*species.burn_mod + + if (organ_name in organs_by_name) + var/datum/organ/external/O = get_organ(organ_name) + + if(amount > 0) + O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) + else + //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. + O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) + + hud_updateflag |= 1 << HEALTH_HUD + /mob/living/carbon/human/Stun(amount) if(HULK in mutations) return ..() @@ -138,11 +168,11 @@ //Damages ONE external organ, organ gets randomly selected from damagable ones. //It automatically updates damage overlays if necesary //It automatically updates health status -/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0) +/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0) var/list/datum/organ/external/parts = get_damageable_organs() if(!parts.len) return var/datum/organ/external/picked = pick(parts) - if(picked.take_damage(brute,burn,sharp)) + if(picked.take_damage(brute,burn,sharp,edge)) UpdateDamageIcon() hud_updateflag |= 1 << HEALTH_HUD updatehealth() @@ -172,7 +202,7 @@ if(update) UpdateDamageIcon() // damage MANY external organs, in random order -/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/used_weapon = null) +/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) if(status_flags & GODMODE) return //godmode var/list/datum/organ/external/parts = get_damageable_organs() var/update = 0 @@ -182,7 +212,7 @@ var/brute_was = picked.brute_dam var/burn_was = picked.burn_dam - update |= picked.take_damage(brute,burn,sharp,used_weapon) + update |= picked.take_damage(brute,burn,sharp,edge,used_weapon) brute -= (picked.brute_dam - brute_was) burn -= (picked.burn_dam - burn_was) @@ -227,7 +257,7 @@ This function restores all organs. zone = "head" return organs_by_name[zone] -/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/obj/used_weapon = null) +/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null) //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]") if((damagetype != BRUTE) && (damagetype != BURN)) @@ -250,11 +280,15 @@ This function restores all organs. switch(damagetype) if(BRUTE) damageoverlaytemp = 20 - if(organ.take_damage(damage, 0, sharp, used_weapon)) + if(species && species.brute_mod) + damage = damage*species.brute_mod + if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) UpdateDamageIcon() if(BURN) damageoverlaytemp = 20 - if(organ.take_damage(0, damage, sharp, used_weapon)) + if(species && species.burn_mod) + damage = damage*species.burn_mod + if(organ.take_damage(0, damage, sharp, edge, used_weapon)) UpdateDamageIcon() // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index caea7519..9d22b72a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -232,7 +232,7 @@ emp_act if(armor >= 2) return 0 if(!I.force) return 0 - apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I) + apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), has_edge(I), I) var/bloody = 0 if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2))) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 029dd3ce..b25833ea 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1488,21 +1488,21 @@ for (var/ID in virus2) var/datum/disease2/disease/V = virus2[ID] V.cure(src) + if(life_tick % 3) //don't spam checks over all objects in view every tick. + for(var/obj/effect/decal/cleanable/O in view(1,src)) + if(istype(O,/obj/effect/decal/cleanable/blood)) + var/obj/effect/decal/cleanable/blood/B = O + if(B.virus2.len) + for (var/ID in B.virus2) + var/datum/disease2/disease/V = B.virus2[ID] + infect_virus2(src,V.getcopy()) - for(var/obj/effect/decal/cleanable/O in view(1,src)) - if(istype(O,/obj/effect/decal/cleanable/blood)) - var/obj/effect/decal/cleanable/blood/B = O - if(B.virus2.len) - for (var/ID in B.virus2) - var/datum/disease2/disease/V = B.virus2[ID] - infect_virus2(src,V) - - else if(istype(O,/obj/effect/decal/cleanable/mucus)) - var/obj/effect/decal/cleanable/mucus/M = O - if(M.virus2.len) - for (var/ID in M.virus2) - var/datum/disease2/disease/V = M.virus2[ID] - infect_virus2(src,V) + else if(istype(O,/obj/effect/decal/cleanable/mucus)) + var/obj/effect/decal/cleanable/mucus/M = O + if(M.virus2.len) + for (var/ID in M.virus2) + var/datum/disease2/disease/V = M.virus2[ID] + infect_virus2(src,V.getcopy()) if(virus2.len) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 7ec30fa3..056ce003 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -184,6 +184,29 @@ /mob/living/carbon/human/proc/GetSpecialVoice() return special_voice + +/* + ***Deprecated*** + let this be handled at the hear_say or hear_radio proc + This is left in for robot speaking when humans gain binary channel access until I get around to rewriting + robot_talk() proc. + There is no language handling build into it however there is at the /mob level so we accept the call + for it but just ignore it. +*/ + +/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null) + var/verb = "says" + var/ending = copytext(message, length(message)) + if(ending=="!") + verb=pick("exclaims","shouts","yells") + else if(ending=="?") + verb="asks" + + return verb + + + + /mob/living/carbon/human/proc/handle_speech_problems(var/message) var/list/returns[3] var/verb = "says" diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm index cf1ea1cc..8e6f10df 100644 --- a/code/modules/mob/living/carbon/monkey/diona.dm +++ b/code/modules/mob/living/carbon/monkey/diona.dm @@ -10,6 +10,8 @@ icon_state = "nymph1" var/list/donors = list() var/ready_evolve = 0 + universal_understand = 0 // Dionaea do not need to speak to people + universal_speak = 0 // before becoming an adult. Use *chirp. /mob/living/carbon/monkey/diona/attack_hand(mob/living/carbon/human/M as mob) @@ -207,7 +209,7 @@ src.visible_message("\red [src] flicks out a feeler and neatly steals a sample of [M]'s blood.","\red You flick out a feeler and neatly steal a sample of [M]'s blood.") donors += M.real_name for(var/datum/language/L in M.languages) - languages += L + languages |= L spawn(25) update_progression() @@ -245,14 +247,11 @@ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - if(stat == 2) return say_dead(message) var/datum/language/speaking = null - - if(length(message) >= 2) var/channel_prefix = copytext(message, 1 ,3) if(languages.len) @@ -270,6 +269,4 @@ if(!message || stat) return - - ..(message, speaking, verb, null, null, message_range, null) diff --git a/code/modules/mob/living/carbon/monkey/npc.dm b/code/modules/mob/living/carbon/monkey/npc.dm index 34f77bc7..f8635586 100644 --- a/code/modules/mob/living/carbon/monkey/npc.dm +++ b/code/modules/mob/living/carbon/monkey/npc.dm @@ -86,14 +86,4 @@ mob/living/carbon/monkey/react_to_attack(mob/M) emote("me", 2, "whimpers fearfully!") npc_fleeing = M - fleeing_duration = 30 - - -/*/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0, var/used_weapon = null) - if(!client && !stat) - if(damage > 10) - if(prob(40) || health == 100) - emote("me", 2, pick("screams loudly!", "whimpers in pain!")) - else if(health == 100 || (damage > 0 && prob(10))) - emote("me", 1, pick("flails about wildly!", "cringes visibly!", "chimpers nervously.")) - return ..()*/ \ No newline at end of file + fleeing_duration = 30 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index f24171d9..2f8dfd97 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -12,8 +12,8 @@ var/primitive // Lesser form, if any (ie. monkey for humans) var/tail // Name of tail image in species effects icon file. var/language // Default racial language, if any. - var/attack_verb = "punch" // Empty hand hurt intent verb. - var/punch_damage = 0 // Extra empty hand attack damage. + var/unarmed //For empty hand harm-intent attack + var/unarmed_type = /datum/unarmed_attack var/mutantrace // Safeguard due to old code. var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. @@ -68,6 +68,9 @@ var/list/sprite_sheets = list() +/datum/species/New() + unarmed = new unarmed_type() + /datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. //This is a basic humanoid limb setup. H.organs = list() @@ -121,6 +124,7 @@ name = "Human" language = "Sol Common" primitive = /mob/living/carbon/monkey + unarmed_type = /datum/unarmed_attack/punch flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR @@ -133,8 +137,7 @@ deform = 'icons/mob/human_races/r_def_lizard.dmi' language = "Sinta'unathi" tail = "sogtail" - attack_verb = "scratch" - punch_damage = 5 + unarmed_type = /datum/unarmed_attack/claws primitive = /mob/living/carbon/monkey/unathi darksight = 3 @@ -156,8 +159,7 @@ deform = 'icons/mob/human_races/r_def_tajaran.dmi' language = "Siik'tajr" tail = "tajtail" - attack_verb = "scratch" - punch_damage = 5 + unarmed_type = /datum/unarmed_attack/claws darksight = 8 cold_level_1 = 200 //Default 260 @@ -180,6 +182,7 @@ deform = 'icons/mob/human_races/r_def_skrell.dmi' language = "Skrellian" primitive = /mob/living/carbon/monkey/skrell + unarmed_type = /datum/unarmed_attack/punch flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR @@ -190,6 +193,7 @@ icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' language = "Vox-pidgin" + unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. warning_low_pressure = 50 hazard_low_pressure = 0 @@ -231,7 +235,7 @@ icobase = 'icons/mob/human_races/r_armalis.dmi' deform = 'icons/mob/human_races/r_armalis.dmi' language = "Vox-pidgin" - attack_verb = "slash" + unarmed_type = /datum/unarmed_attack/claws/armalis warning_low_pressure = 50 hazard_low_pressure = 0 @@ -295,8 +299,7 @@ icobase = 'icons/mob/human_races/r_diona.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi' language = "Rootspeak" - attack_verb = "slash" - punch_damage = 5 + unarmed_type = /datum/unarmed_attack/diona primitive = /mob/living/carbon/monkey/diona warning_low_pressure = 50 @@ -341,7 +344,7 @@ icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' language = "Tradeband" - punch_damage = 2 + unarmed_type = /datum/unarmed_attack/punch eyes = "blank_eyes" brute_mod = 0.5 @@ -362,3 +365,32 @@ blood_color = "#1F181F" flesh_color = "#575757" + +//Species unarmed attacks + +/datum/unarmed_attack + var/attack_verb = list("attack") // Empty hand hurt intent verb. + var/damage = 0 // Extra empty hand attack damage. + var/attack_sound = "punch" + var/miss_sound = 'sound/weapons/punchmiss.ogg' + var/sharp = 0 + var/edge = 0 + +/datum/unarmed_attack/punch + attack_verb = list("punch") + +/datum/unarmed_attack/diona + attack_verb = list("lash", "bludgeon") + damage = 5 + +/datum/unarmed_attack/claws + attack_verb = list("scratch", "claw") + attack_sound = 'sound/weapons/slice.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + damage = 5 + sharp = 1 + edge = 1 + +/datum/unarmed_attack/claws/armalis + attack_verb = list("slash", "claw") + damage = 10 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe... diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index f76b1dc3..f216a74c 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -8,7 +8,7 @@ Returns standard 0 if fail */ -/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null) +/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0) if(!damage || (blocked >= 2)) return 0 switch(damagetype) if(BRUTE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4447c5f2..98659018 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -431,7 +431,8 @@ else stop_pulling() . = ..() - if ((s_active && !( s_active in contents ) )) + + if (s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. s_active.close(src) if(update_slimes) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 7136c09a..12614e3a 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -53,11 +53,8 @@ signaler.signal() var/absorb = run_armor_check(def_zone, P.flag) - if(absorb >= 2) - P.on_hit(src,2) - return 2 if(!P.nodamage) - apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, absorb, 0, P) + apply_damage(P.damage, P.damage_type, def_zone, absorb, 0, P, sharp=is_sharp(P), edge=has_edge(P)) P.on_hit(src, absorb, def_zone) return absorb @@ -72,7 +69,7 @@ src.visible_message("\red [src] has been hit by [O].") var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].") if(armor < 2) - apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O.sharp, O) + apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O, sharp=is_sharp(O), edge=has_edge(O)) if(!O.fingerprintslast) return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 4ba9f221..b6eedfc3 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -103,7 +103,7 @@ var/list/department_radio_keys = list( var/obj/O = I hearturfs += O.locs[1] objects |= O - + for(var/mob/M in player_list) if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) listening |= M @@ -113,7 +113,8 @@ var/list/department_radio_keys = list( for(var/obj/O in objects) spawn(0) - O.hear_talk(src, message, verb, speaking) + if(O) //It's possible that it could be deleted in the meantime. + O.hear_talk(src, message, verb, speaking) var/speech_bubble_test = say_test(message) var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0fa2b9a9..28efbfef 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -241,13 +241,13 @@ var/list/ai_list = list() for (var/area_name in alarmlist) var/datum/alarm/alarm = alarmlist[area_name] dat += "" - + var/cameratext = "" if (alarm.cameras) for (var/obj/machinery/camera/I in alarm.cameras) cameratext += text("[][]", (cameratext=="") ? "" : " | ", src, I, I.c_tag) dat += text("-- [] ([])", alarm.area.name, (cameratext)? cameratext : "No Camera") - + if (alarm.sources.len > 1) dat += text(" - [] sources", alarm.sources.len) dat += "
\n" @@ -398,23 +398,11 @@ var/list/ai_list = list() if (href_list["track"]) var/mob/target = locate(href_list["track"]) in mob_list -/* - var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list - if(A && target) - A.ai_actual_track(target) -*/ - //Strip off any "(as Derplord)". - //If there's a way to do this via a var that doesn't give the AI extra info, please let me know. - var/seeking = target.name - var/index = findtext(seeking, "(as ") - if(index) - seeking = copytext(seeking, 1, index-1) - - if(target && html_decode(href_list["trackname"]) == seeking) + if(target && (!istype(target, /mob/living/carbon/human) || html_decode(href_list["trackname"]) == target:get_face_name())) ai_actual_track(target) - else - src << "\red System error. Cannot locate [html_decode(href_list["trackname"])]." + + src << "\red System error. Cannot locate [html_decode(href_list["trackname"])]." return else if (href_list["faketrack"]) @@ -530,24 +518,24 @@ var/list/ai_list = list() /mob/living/silicon/ai/triggerAlarm(var/class, area/A, list/cameralist, var/source) if (stat == 2) return 1 - + ..() - + var/cameratext = "" for (var/obj/machinery/camera/C in cameralist) cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]" - + queueAlarm("--- [class] alarm detected in [A.name]! ([(cameratext)? cameratext : "No Camera"])", class) - + if (viewalerts) ai_alerts() /mob/living/silicon/ai/cancelAlarm(var/class, area/A as area, var/source) var/has_alarm = ..() - + if (!has_alarm) queueAlarm(text("--- [] alarm in [] has been cleared.", class, A.name), class, 0) if (viewalerts) ai_alerts() - + return has_alarm /mob/living/silicon/ai/cancel_camera() diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 4bf9f9ca..8c85447f 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -33,7 +33,7 @@ installed = -1 uninstall() -/datum/robot_component/proc/take_damage(brute, electronics, sharp) +/datum/robot_component/proc/take_damage(brute, electronics, sharp, edge) if(installed != 1) return brute_damage += brute diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 485ff99e..55270907 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -60,7 +60,6 @@ //Some tidying-up. flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" - updatename() updateicon() //Redefining some robot procs... @@ -104,15 +103,8 @@ if(copytext(message,1,2) == "*") return emote(copytext(message,2)) else if(length(message) >= 2) - if(copytext(message, 1 ,3) == ":b" || copytext(message, 1 ,3) == ":B") - if(!is_component_functioning("comms")) - src << "\red Your binary communications component isn't functional." - return - - robot_talk(trim(copytext(message,3))) - - else if(copytext(message, 1 ,3) == ":d" || copytext(message, 1 ,3) == ":D") + if(copytext(message, 1 ,3) == ":d" || copytext(message, 1 ,3) == ":D") if(!is_component_functioning("radio")) src << "\red Your radio transmitter isn't functional." @@ -329,8 +321,8 @@ full_law_reset() src << "
You are a maintenance drone, a tiny-brained robotic repair machine." src << "You have no individual will, no personality, and no drives or urges other than your laws." - src << "Use :b to talk to your fellow synthetics, :d to talk to other drones, and say to speak silently to your nearby fellows." - src << "Remember, you are lawed against interference with the crew." + src << "Use :d to talk to other drones and say to speak silently to your nearby fellows." + src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI." src << "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets." src << "If a crewmember has noticed you, you are probably breaking your third law." diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index b8d3025d..7c2dc565 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -266,10 +266,8 @@ if(!module) module = new /obj/item/weapon/robot_module/drone(src) - var/dat = "Drone modules\n" - dat += {"Close -
-
+ var/dat = "Drone modules\n" + dat += {" Activated Modules
Module 1: [module_state_1 ? "[module_state_1]" : "No Module"]
@@ -310,7 +308,7 @@ dat += resources - src << browse(dat, "window=robotmod&can_close=0") + src << browse(dat, "window=robotmod") //Putting the decompiler here to avoid doing list checks every tick. /mob/living/silicon/robot/drone/use_power() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 90973fbc..cfc0ad86 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -559,9 +559,6 @@ if(istype(WC)) C.brute_damage = WC.brute C.electronics_damage = WC.burn - else //This will nominally mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z - C.brute_damage = 0 - C.electronics_damage = 0 usr << "\blue You install the [W.name]." @@ -599,8 +596,12 @@ user << "You close the cover." opened = 0 updateicon() - else if(mmi && wiresexposed && isWireCut(1) && isWireCut(2) && isWireCut(3) && isWireCut(4) && isWireCut(5)) + else if(wiresexposed && isWireCut(1) && isWireCut(2) && isWireCut(3) && isWireCut(4) && isWireCut(5)) //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. + if(!mmi) + user << "\The [src] has no brain to remove." + return + user << "You jam the crowbar into the robot and begin levering [mmi]." sleep(30) user << "You damage some parts of the chassis, but eventually manage to rip out [mmi]!" @@ -660,6 +661,9 @@ C.installed = 1 C.wrapped = W C.install() + //This will mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z + C.brute_damage = 0 + C.electronics_damage = 0 else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) if (wiresexposed) @@ -1026,10 +1030,8 @@ if(!module) pick_module() return - var/dat = "Modules\n" - dat += {"
Close -
-
+ var/dat = "Modules\n" + dat += {" Activated Modules
Module 1: [module_state_1 ? "[module_state_1]" : "No Module"]
@@ -1057,16 +1059,11 @@ else dat += text("[obj]: \[
Activate | Deactivated\]
") */ - src << browse(dat, "window=robotmod&can_close=0") + src << browse(dat, "window=robotmod") /mob/living/silicon/robot/Topic(href, href_list) ..() - if (href_list["mach_close"]) - var/t1 = text("window=[href_list["mach_close"]]") - unset_machine() - src << browse(null, t1) - return if (href_list["showalerts"]) robot_alerts() diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index c4e15059..544992cc 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -62,7 +62,7 @@ var/datum/robot_component/picked = pick(parts) picked.heal_damage(brute,burn) -/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0) +/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/edge = 0) var/list/components = get_damageable_components() if(!components.len) return @@ -86,11 +86,11 @@ var/datum/robot_component/armour/A = get_armour() if(A) - A.take_damage(brute,burn,sharp) + A.take_damage(brute,burn,sharp,edge) return var/datum/robot_component/C = pick(components) - C.take_damage(brute,burn,sharp) + C.take_damage(brute,burn,sharp,edge) /mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn) var/list/datum/robot_component/parts = get_damaged_components(brute,burn) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 7fd3493f..ef80c631 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -23,7 +23,7 @@ if (src.client.handle_spam_prevention(message,MUTE_IC)) return - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) if (stat == 2) return say_dead(message) @@ -65,7 +65,7 @@ if(message_mode != "binary" && !R.is_component_functioning("radio")) src << "\red Your radio isn't functional at this time." return - + if(message_mode && message_mode != "general") message = trim(copytext(message,3)) @@ -73,7 +73,7 @@ switch(message_mode) if("department") switch(bot_type) - if(IS_AI) + if(IS_AI) AI.holopad_talk(message) if(IS_ROBOT) log_say("[key_name(src)] : [message]") @@ -118,9 +118,9 @@ R.radio.talk_into(src,message,message_mode,verb) if(IS_PAI) log_say("[key_name(src)] : [message]") - P.radio.talk_into(src,message,message_mode,verb) + P.radio.talk_into(src,message,message_mode,verb) return - + return ..(message,null,verb) @@ -167,14 +167,14 @@ return var/verb = say_quote(message) - + var/rendered = "Robotic Talk, [name] [verb], \"[message]\"" for (var/mob/living/S in living_mob_list) if(S.robot_talk_understand && (S.robot_talk_understand == robot_talk_understand)) // This SHOULD catch everything caught by the one below, but I'm not going to change it. if(istype(S , /mob/living/silicon/ai)) - var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\"" + var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\"" S.show_message(renderedAI, 2) else S.show_message(rendered, 2) @@ -182,14 +182,13 @@ else if (S.binarycheck()) if(istype(S , /mob/living/silicon/ai)) - var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\"" + var/renderedAI = "Robotic Talk, [name] [verb], \"[message]\"" S.show_message(renderedAI, 2) else S.show_message(rendered, 2) var/list/listening = hearers(1, src) listening -= src - listening += src var/list/heard = list() for (var/mob/M in listening) @@ -199,7 +198,7 @@ var/message_beep verb = "beeps" message_beep = "beep beep beep" - + rendered = "[voice_name] [verb], \"[message_beep]\"" for (var/mob/M in heard) diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 76e1de94..45ece9f6 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -41,7 +41,7 @@ if(worn_helmet) sting_prob -= min(worn_helmet.armor["bio"],30) // Is your helmet sealed? I can't get to 30% of your body. if( prob(sting_prob) && (M.stat == CONSCIOUS || (M.stat == UNCONSCIOUS && prob(25))) ) // Try to sting! If you're not moving, think about stinging. - M.apply_damage(min(strength,2)+mut, BRUTE) // Stinging. The more mutated I am, the harder I sting. + M.apply_damage(min(strength,2)+mut, BRUTE, sharp=1) // Stinging. The more mutated I am, the harder I sting. M.apply_damage((round(feral/10,1)*(max((round(strength/20,1)),1)))+toxic, TOX) // Bee venom based on how angry I am and how many there are of me! M << "\red You have been stung!" M.flash_pain() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index d98d5f47..03e05d57 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -34,7 +34,7 @@ for(var/spell in construct_spells) spell_list += new spell(src) -/mob/living/simple_animal/construct/Die() +/mob/living/simple_animal/construct/death() ..() new /obj/item/weapon/ectoplasm (src.loc) for(var/mob/M in viewers(src, null)) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index cd9f2ab4..6e502895 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -46,7 +46,7 @@ if(prob(50)) user << "\red \b This kills the crab." health -= 20 - Die() + death() else GetMad() get diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e44e9fb1..0621bc50 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -222,7 +222,7 @@ var/global/chicken_count = 0 pixel_y = rand(0, 10) chicken_count += 1 -/mob/living/simple_animal/chicken/Die() +/mob/living/simple_animal/chicken/death() ..() chicken_count -= 1 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index fc303349..31cda60c 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -134,7 +134,7 @@ M << 'sound/effects/mousesqueek.ogg' ..() -/mob/living/simple_animal/mouse/Die() +/mob/living/simple_animal/mouse/death() layer = MOB_LAYER if(client) client.time_died_as_mouse = world.time diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 7920580f..3321b67f 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -70,7 +70,7 @@ overlays += "aslime-:33" -/mob/living/simple_animal/slime/adult/Die() +/mob/living/simple_animal/slime/adult/death() var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc) S1.icon_state = "[src.colour] baby slime" S1.icon_living = "[src.colour] baby slime" diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 4f50ef31..007872c3 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -162,7 +162,7 @@ M.show_message("\red [src] makes an odd warbling noise, fizzles, and explodes.") explosion(get_turf(loc), -1, -1, 3, 5) eject_brain() - Die() + death() /mob/living/simple_animal/spiderbot/proc/update_icon() if(mmi) @@ -200,7 +200,7 @@ ..() -/mob/living/simple_animal/spiderbot/Die() +/mob/living/simple_animal/spiderbot/death() living_mob_list -= src dead_mob_list += src diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index f365d212..af7978b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -87,7 +87,7 @@ damage = 30 icon_state = "toxin" -/mob/living/simple_animal/hostile/alien/Die() +/mob/living/simple_animal/hostile/alien/death() ..() visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") playsound(src, 'sound/voice/hiss6.ogg', 100, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index a8c7f358..92ff94b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -135,7 +135,7 @@ var/mob/living/carbon/human/H = target_mob var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee")) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1) return H else if(isliving(target_mob)) var/mob/living/L = target_mob diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 32b77715..41f74e93 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -44,7 +44,7 @@ ranged = 1 -/mob/living/simple_animal/hostile/hivebot/Die() +/mob/living/simple_animal/hostile/hivebot/death() ..() visible_message("[src] blows apart!") new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 03c342cd..426a52a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -116,7 +116,7 @@ L += mechas_list return L -/mob/living/simple_animal/hostile/Die() +/mob/living/simple_animal/hostile/death() ..() walk(src, 0) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index d4452720..d31f0ff2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -41,7 +41,7 @@ if(.) emote("growls at [.]") -/mob/living/simple_animal/hostile/mimic/Die() +/mob/living/simple_animal/hostile/mimic/death() ..() visible_message("\red [src] stops moving!") del(src) @@ -107,7 +107,7 @@ ..() icon_state = initial(icon_state) -/mob/living/simple_animal/hostile/mimic/crate/Die() +/mob/living/simple_animal/hostile/mimic/crate/death() var/obj/structure/closet/crate/C = new(get_turf(src)) // Put loot in crate @@ -141,7 +141,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca ..(loc) CopyObject(copy, creator) -/mob/living/simple_animal/hostile/mimic/copy/Die() +/mob/living/simple_animal/hostile/mimic/copy/death() for(var/atom/movable/M in src) M.loc = get_turf(src) diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 3ea447bd..c45a511c 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -47,7 +47,7 @@ weapon1 = /obj/item/weapon/gun/energy/laser -/mob/living/simple_animal/hostile/pirate/Die() +/mob/living/simple_animal/hostile/pirate/death() ..() if(corpse) new corpse (src.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index f97e0eb8..92af76fe 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -157,7 +157,7 @@ hostile_drone = 0 walk(src,0) -/mob/living/simple_animal/hostile/retaliate/malf_drone/Die() +/mob/living/simple_animal/hostile/retaliate/malf_drone/death() src.visible_message("\blue \icon[src] [src] suddenly breaks apart.") ..() del(src) diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index a5d36ed5..8d5b6964 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -45,7 +45,7 @@ casingtype = /obj/item/ammo_casing/a357 -/mob/living/simple_animal/hostile/russian/Die() +/mob/living/simple_animal/hostile/russian/death() ..() if(corpse) new corpse (src.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 82ce2d02..2a9b8ad0 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -35,7 +35,7 @@ faction = "syndicate" status_flags = CANPUSH -/mob/living/simple_animal/hostile/syndicate/Die() +/mob/living/simple_animal/hostile/syndicate/death() ..() if(corpse) new corpse (src.loc) @@ -157,7 +157,7 @@ max_n2 = 0 minbodytemp = 0 -/mob/living/simple_animal/hostile/viscerator/Die() +/mob/living/simple_animal/hostile/viscerator/death() ..() visible_message("\red [src] is smashed into pieces!") del src diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index ae6e8633..e6b0458c 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -50,7 +50,7 @@ L.Weaken(3) L.visible_message("\the [src] knocks down \the [L]!") -/mob/living/simple_animal/hostile/tree/Die() +/mob/living/simple_animal/hostile/tree/death() ..() visible_message("\red [src] is hacked into pieces!") new /obj/item/stack/sheet/wood(loc) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index f1ab86db..df63ce83 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -101,7 +101,7 @@ /mob/living/simple_animal/parrot/proc/perch_player) -/mob/living/simple_animal/parrot/Die() +/mob/living/simple_animal/parrot/death() if(held_item) held_item.loc = src.loc held_item = null @@ -496,7 +496,7 @@ var/mob/living/carbon/human/H = parrot_interest var/datum/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone))) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee")) + H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1) emote(pick("pecks [H]'s [affecting]", "cuts [H]'s [affecting] with its talons")) else diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1d130be9..bed6a20e 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -82,7 +82,7 @@ if(health < 1) - Die() + death() if(health > maxHealth) health = maxHealth @@ -405,13 +405,11 @@ statpanel("Status") stat(null, "Health: [round((health / maxHealth) * 100)]%") -/mob/living/simple_animal/proc/Die() - living_mob_list -= src - dead_mob_list += src +/mob/living/simple_animal/death() icon_state = icon_dead stat = DEAD density = 0 - return + return ..() /mob/living/simple_animal/ex_act(severity) if(!blinded) diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm index f3354ce8..c0fda9e7 100644 --- a/code/modules/mob/living/simple_animal/vox.dm +++ b/code/modules/mob/living/simple_animal/vox.dm @@ -23,7 +23,7 @@ var/amp = null var/quills = 3 -/mob/living/simple_animal/vox/armalis/Die() +/mob/living/simple_animal/vox/armalis/death() living_mob_list -= src dead_mob_list += src diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm index 519556ab..676c29b2 100644 --- a/code/modules/mob/living/simple_animal/worm.dm +++ b/code/modules/mob/living/simple_animal/worm.dm @@ -167,7 +167,7 @@ newHead.Attach(newHeadPrevious) if(die) - newHead.Die() + newHead.death() del(src) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index c9b90f32..66c6f5ff 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -198,12 +198,7 @@ datum/preferences preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY) preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY) - for(var/name in list("l_arm","r_arm","l_leg","r_leg","l_foot","r_foot","l_hand","r_hand")) - // make sure the organ is added to the list so it's drawn - if(organ_data[name] == null) - organ_data[name] = null - - for(var/name in organ_data) + for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand")) if(organ_data[name] == "amputated") continue var/icon/temp = new /icon(icobase, "[name]") @@ -212,6 +207,11 @@ datum/preferences preview_icon.Blend(temp, ICON_OVERLAY) + //Tail + if(current_species && (current_species.flags & HAS_TAIL)) + var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s") + preview_icon.Blend(temp, ICON_OVERLAY) + // Skin color if(current_species && (current_species.flags & HAS_SKIN_COLOR)) preview_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 361b9f19..c95d3a0d 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -157,7 +157,7 @@ if(length(message) >= 2) var/channel_prefix = copytext(message, 1 ,3) return department_radio_keys[channel_prefix] - + return null //parses the language code (e.g. :j) from text, such as that supplied to say. diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e68913fd..810a7f9c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -160,12 +160,11 @@ O.gender = gender O.invisibility = 0 - if(mind) //TODO mind.transfer_to(O) if(O.mind.assigned_role == "Cyborg") O.mind.original = O - else if(mind&&mind.special_role) + else if(mind && mind.special_role) O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") else O.key = key @@ -175,11 +174,12 @@ if(O.mind.assigned_role == "Cyborg") if(O.mind.role_alt_title == "Android") O.mmi = new /obj/item/device/mmi/posibrain(O) - if(O.mind.role_alt_title == "Robot") - O.mmi = new /obj/item/device/mmi/posibrain(O) //Ravensdale wants a circuit based brain for another robot class, this is a placeholder. - else - O.mmi = new /obj/item/device/mmi(O) - O.mmi.transfer_identity(src)//Does not transfer key/client. + else if(O.mind.role_alt_title == "Robot") + O.mmi = null //Robots do not have removable brains. + else + O.mmi = new /obj/item/device/mmi(O) + + if(O.mmi) O.mmi.transfer_identity(src) //Does not transfer key/client. O.Namepick() diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index c100e747..e9f1563c 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -159,6 +159,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 this.icon_state = pick(iconL) this.blood_DNA = list() this.blood_DNA[dna.unique_enzymes] = dna.b_type + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + this.virus2[ID] = V.getcopy() if (species) this.basecolor = species.blood_color this.update_icon() diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 72b26c93..c51d5167 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -70,9 +70,9 @@ if(prob(probability)) droplimb(1) else - take_damage(damage, 0, 1, used_weapon = "EMP") + take_damage(damage, 0, 1, 1, used_weapon = "EMP") -/datum/organ/external/proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) +/datum/organ/external/proc/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) if((brute <= 0) && (burn <= 0)) return 0 @@ -95,7 +95,7 @@ //If limb took enough damage, try to cut or tear it off if(body_part != UPPER_TORSO && body_part != LOWER_TORSO) //as hilarious as it is, getting hit on the chest too much shouldn't effectively gib you. if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) - if( (sharp && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) ) + if( (edge && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) ) droplimb(1) return @@ -159,7 +159,7 @@ if(possible_points.len) //And pass the pain around var/datum/organ/external/target = pick(possible_points) - target.take_damage(brute, burn, sharp, used_weapon, forbidden_limbs + src) + target.take_damage(brute, burn, sharp, edge, used_weapon, forbidden_limbs + src) // sync the organ's damage with its wounds src.update_damages() @@ -223,35 +223,7 @@ This function completely restores a damaged organ to perfect condition. /datum/organ/external/proc/createwound(var/type = CUT, var/damage) if(damage == 0) return - // first check whether we can widen an existing wound - if(wounds.len > 0 && prob(max(50+owner.number_wounds*10,100))) - if((type == CUT || type == BRUISE) && damage >= 5) - var/datum/wound/W = pick(wounds) - if(W.amount == 1 && W.started_healing()) - W.open_wound(damage) - if(prob(25)) - owner.visible_message("\red The wound on [owner.name]'s [display_name] widens with a nasty ripping voice.",\ - "\red The wound on your [display_name] widens with a nasty ripping voice.",\ - "You hear a nasty ripping noise, as if flesh is being torn apart.") - return - - //Creating wound - var/datum/wound/W - var/size = min( max( 1, damage/10 ) , 6) - //Possible types of wound - var/list/size_names = list() - switch(type) - if(CUT) - size_names = typesof(/datum/wound/cut/) - /datum/wound/cut/ - if(BRUISE) - size_names = typesof(/datum/wound/bruise/) - /datum/wound/bruise/ - if(BURN) - size_names = typesof(/datum/wound/burn/) - /datum/wound/burn/ - - size = min(size,size_names.len) - var/wound_type = size_names[size] - W = new wound_type(damage) - + //moved this before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage //Possibly trigger an internal wound, too. var/local_damage = brute_dam + burn_dam + damage if(damage > 15 && type != BURN && local_damage > 30 && prob(damage) && !(status & ORGAN_ROBOT)) @@ -259,16 +231,58 @@ This function completely restores a damaged organ to perfect condition. wounds += I owner.custom_pain("You feel something rip in your [display_name]!", 1) - //Check whether we can add the wound to an existing wound - for(var/datum/wound/other in wounds) - if(other.desc == W.desc) - // okay, add it! - other.damage += W.damage - other.amount += 1 - W = null // to signify that the wound was added - break - if(W) - wounds += W + // first check whether we can widen an existing wound + if(wounds.len > 0 && prob(max(50+(number_wounds-1)*10,90))) + if((type == CUT || type == BRUISE) && damage >= 5) + //we need to make sure that the wound we are going to worsen is compatible with the type of damage... + var/list/compatible_wounds = list() + for (var/datum/wound/W in wounds) + if (W.can_worsen(type, damage)) + compatible_wounds += W + + if(compatible_wounds.len) + var/datum/wound/W = pick(compatible_wounds) + W.open_wound(damage) + if(prob(25)) + //maybe have a separate message for BRUISE type damage? + owner.visible_message("\red The wound on [owner.name]'s [display_name] widens with a nasty ripping voice.",\ + "\red The wound on your [display_name] widens with a nasty ripping voice.",\ + "You hear a nasty ripping noise, as if flesh is being torn apart.") + return + + //Creating wound + var/wound_type = get_wound_type(type, damage) + + if(wound_type) + var/datum/wound/W = new wound_type(damage) + + //Check whether we can add the wound to an existing wound + for(var/datum/wound/other in wounds) + if(other.can_merge(W)) + other.merge_wound(W) + W = null // to signify that the wound was added + break + if(W) + wounds += W + +/datum/organ/external/proc/get_wound_type(var/type = CUT, var/damage) + //if you look a the names in the wound's stages list for each wound type you will see the logic behind these values + switch(type) + if(CUT) + if (damage <= 5) return /datum/wound/cut/small + if (damage <= 15) return /datum/wound/cut/deep + if (damage <= 25) return /datum/wound/cut/flesh + if (damage <= 50) return /datum/wound/cut/gaping + if (damage <= 60) return /datum/wound/cut/gaping_big + return /datum/wound/cut/massive + if(BRUISE) + return /datum/wound/bruise + if(BURN) + if (damage <= 5) return /datum/wound/burn/moderate + if (damage <= 15) return /datum/wound/burn/large + if (damage <= 30) return /datum/wound/burn/severe + if (damage <= 40) return /datum/wound/burn/deep + return /datum/wound/burn/carbonised /**************************************************** PROCESSING & UPDATING @@ -388,15 +402,12 @@ This function completely restores a damaged organ to perfect condition. if(prob(1 * wound_update_accuracy)) owner.custom_pain("You feel a stabbing pain in your [display_name]!",1) - // slow healing var/heal_amt = 0 - if (W.damage < 15) //this thing's edges are not in day's travel of each other, what healing? - heal_amt += 0.2 - - if(W.is_treated() && W.damage < 50) //whoa, not even magical band aid can hold it together - heal_amt += 0.3 + // if damage >= 50 AFTER treatment then it's probably too severe to heal within the timeframe of a round. + if (W.is_treated() && W.wound_damage() < 50) + heal_amt += 0.5 //we only update wounds once in [wound_update_accuracy] ticks so have to emulate realtime heal_amt = heal_amt * wound_update_accuracy @@ -800,8 +811,8 @@ This function completely restores a damaged organ to perfect condition. else . = new /icon(owner.race_icon, "[icon_name]_[g]") -/datum/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) - ..(brute, burn, sharp, used_weapon, forbidden_limbs) +/datum/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) + ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) if (!disfigured) if (brute_dam > 40) if (prob(50)) diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 3df9e206..a7892486 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -3,8 +3,6 @@ WOUNDS ****************************************************/ /datum/wound - // stages such as "cut", "deep cut", etc. - var/list/stages // number representing the current stage var/current_stage = 0 @@ -18,38 +16,42 @@ // amount of damage the current wound type requires(less means we need to apply the next healing stage) var/min_damage = 0 - // one of CUT, BRUISE, BURN - var/damage_type = CUT - - // whether this wound needs a bandage/salve to heal at all - var/needs_treatment = 0 - // is the wound bandaged? - var/tmp/bandaged = 0 + var/bandaged = 0 // Similar to bandaged, but works differently - var/tmp/clamped = 0 + var/clamped = 0 // is the wound salved? - var/tmp/salved = 0 + var/salved = 0 // is the wound disinfected? - var/tmp/disinfected = 0 - var/tmp/created = 0 - + var/disinfected = 0 + var/created = 0 // number of wounds of this type - var/tmp/amount = 1 + var/amount = 1 + // amount of germs in the wound + var/germ_level = 0 + /* These are defined by the wound type and should not be changed */ + + // stages such as "cut", "deep cut", etc. + var/list/stages + // internal wounds can only be fixed through surgery + var/internal = 0 // maximum stage at which bleeding should still happen, counted from the right rather than the left of the list // 1 means all stages except the last should bleed var/max_bleeding_stage = 1 + // one of CUT, BRUISE, BURN + var/damage_type = CUT + // whether this wound needs a bandage/salve to heal at all + // the maximum amount of damage that this wound can have and still autoheal + var/autoheal_cutoff = 15 + - // internal wounds can only be fixed through surgery - var/internal = 0 - // amount of germs in the wound - var/germ_level = 0 // helper lists var/tmp/list/desc_list = list() var/tmp/list/damage_list = list() + New(var/damage) created = world.time @@ -62,42 +64,58 @@ src.damage = damage - // initialize with the first stage - next_stage() - - // this will ensure the size of the wound matches the damage - src.heal_damage(0) - - // make the max_bleeding_stage count from the end of the list rather than the start - // this is more robust to changes to the list max_bleeding_stage = src.desc_list.len - max_bleeding_stage + + // initialize with the appropriate stage + src.init_stage(damage) bleed_timer += damage // returns 1 if there's a next stage, 0 otherwise - proc/next_stage() - if(current_stage + 1 > src.desc_list.len) - return 0 - - current_stage++ + proc/init_stage(var/initial_damage) + current_stage = stages.len + + while(src.current_stage > 1 && src.damage_list[current_stage-1] <= initial_damage / src.amount) + src.current_stage-- src.min_damage = damage_list[current_stage] src.desc = desc_list[current_stage] - return 1 - - // returns 1 if the wound has started healing - proc/started_healing() - return (current_stage > 1) + // the amount of damage per wound + proc/wound_damage() + return src.damage / src.amount + // checks whether the wound has been appropriately treated - // always returns 1 for wounds that don't need to be treated + // always returns 1 for wounds that are too minor to need treatment proc/is_treated() - if(!needs_treatment) return 1 + if(src.wound_damage() <= autoheal_cutoff) + return 1 if(damage_type == BRUISE || damage_type == CUT) return bandaged else if(damage_type == BURN) return salved + + + // Checks whether other other can be merged into src. + proc/can_merge(var/datum/wound/other) + if (other.type != src.type) return 0 + if (other.current_stage != src.current_stage) return 0 + if (other.damage_type != src.damage_type) return 0 + if (!(other.is_treated()) != !(src.is_treated())) return 0 + if (!(other.bandaged) != !(src.bandaged)) return 0 + if (!(other.clamped) != !(src.clamped)) return 0 + if (!(other.salved) != !(src.salved)) return 0 + if (!(other.disinfected) != !(src.disinfected)) return 0 + //if (other.germ_level != src.germ_level) return 0 + return 1 + + proc/merge_wound(var/datum/wound/other) + src.damage += other.damage + src.amount += other.amount + src.bleed_timer += other.bleed_timer + src.germ_level = max(src.germ_level, other.germ_level) + src.created = max(src.created, other.created) //take the newer created time // checks if wound is considered open for external infections // untreated cuts (and bleeding bruises) and burns are possibly infectable, chance higher if wound is bigger @@ -128,7 +146,7 @@ amount -= healed_damage src.damage -= healed_damage - while(src.damage / src.amount < damage_list[current_stage] && current_stage < src.desc_list.len) + while(src.wound_damage() < damage_list[current_stage] && current_stage < src.desc_list.len) current_stage++ desc = desc_list[current_stage] src.min_damage = damage_list[current_stage] @@ -141,118 +159,98 @@ src.damage += damage bleed_timer += damage - while(src.current_stage > 1 && src.damage_list[current_stage-1] <= src.damage) + while(src.current_stage > 1 && src.damage_list[current_stage-1] <= src.damage / src.amount) src.current_stage-- src.desc = desc_list[current_stage] src.min_damage = damage_list[current_stage] + // returns whether this wound can absorb the given amount of damage. + // this will prevent large amounts of damage being trapped in less severe wound types + proc/can_worsen(damage_type, damage) + if (src.damage_type != damage_type) + return 0 //incompatible damage types + + if (src.amount > 1) + return 0 + + //with 1.5*, a shallow cut will be able to carry at most 30 damage, + //37.5 for a deep cut + //52.5 for a flesh wound, etc. + var/max_wound_damage = 1.5*src.damage_list[1] + if (src.damage + damage > max_wound_damage) + return 0 + + return 1 + + proc/bleeding() // internal wounds don't bleed in the sense of this function - return ((damage > 30 || bleed_timer > 0) && !(bandaged||clamped) && (damage_type == BRUISE && damage >= 20 || damage_type == CUT && damage >= 5) && current_stage <= max_bleeding_stage && !src.internal) + return ((wound_damage() > 30 || bleed_timer > 0) && !(bandaged||clamped) && (damage_type == BRUISE && wound_damage() >= 20 || damage_type == CUT && wound_damage() >= 5) && current_stage <= max_bleeding_stage && !src.internal) /** CUTS **/ /datum/wound/cut/small // link wound descriptions to amounts of damage max_bleeding_stage = 2 stages = list("ugly ripped cut" = 20, "ripped cut" = 10, "cut" = 5, "healing cut" = 2, "small scab" = 0) + damage_type = CUT /datum/wound/cut/deep max_bleeding_stage = 3 stages = list("ugly deep ripped cut" = 25, "deep ripped cut" = 20, "deep cut" = 15, "clotted cut" = 8, "scab" = 2, "fresh skin" = 0) + damage_type = CUT /datum/wound/cut/flesh max_bleeding_stage = 3 stages = list("ugly ripped flesh wound" = 35, "ugly flesh wound" = 30, "flesh wound" = 25, "blood soaked clot" = 15, "large scab" = 5, "fresh skin" = 0) + damage_type = CUT /datum/wound/cut/gaping max_bleeding_stage = 2 - stages = list("gaping wound" = 50, "large blood soaked clot" = 25, "large clot" = 15, "small angry scar" = 5, \ - "small straight scar" = 0) + stages = list("gaping wound" = 50, "large blood soaked clot" = 25, "large clot" = 15, "small angry scar" = 5, "small straight scar" = 0) + damage_type = CUT /datum/wound/cut/gaping_big max_bleeding_stage = 2 stages = list("big gaping wound" = 60, "healing gaping wound" = 40, "large angry scar" = 10, "large straight scar" = 0) - - needs_treatment = 1 // this only heals when bandaged + damage_type = CUT datum/wound/cut/massive max_bleeding_stage = 2 stages = list("massive wound" = 70, "massive healing wound" = 50, "massive angry scar" = 10, "massive jagged scar" = 0) - - needs_treatment = 1 // this only heals when bandaged + damage_type = CUT /** BRUISES **/ /datum/wound/bruise stages = list("monumental bruise" = 80, "huge bruise" = 50, "large bruise" = 30,\ "moderate bruise" = 20, "small bruise" = 10, "tiny bruise" = 5) - - needs_treatment = 1 // this only heals when bandaged + max_bleeding_stage = 3 + autoheal_cutoff = 30 damage_type = BRUISE -/datum/wound/bruise/monumental - -// implement sub-paths by starting at a later stage - -/datum/wound/bruise/tiny - current_stage = 5 - needs_treatment = 0 - -/datum/wound/bruise/small - current_stage = 4 - needs_treatment = 0 - -/datum/wound/bruise/moderate - current_stage = 3 - needs_treatment = 0 - -/datum/wound/bruise/large - current_stage = 2 - -/datum/wound/bruise/huge - current_stage = 1 - /** BURNS **/ /datum/wound/burn/moderate stages = list("ripped burn" = 10, "moderate burn" = 5, "moderate salved burn" = 2, "fresh skin" = 0) - - needs_treatment = 1 // this only heals when bandaged - damage_type = BURN /datum/wound/burn/large stages = list("ripped large burn" = 20, "large burn" = 15, "large salved burn" = 5, "fresh skin" = 0) - - needs_treatment = 1 // this only heals when bandaged - damage_type = BURN /datum/wound/burn/severe stages = list("ripped severe burn" = 35, "severe burn" = 30, "severe salved burn" = 10, "burn scar" = 0) - - needs_treatment = 1 // this only heals when bandaged - damage_type = BURN /datum/wound/burn/deep stages = list("ripped deep burn" = 45, "deep burn" = 40, "deep salved burn" = 15, "large burn scar" = 0) - - needs_treatment = 1 // this only heals when bandaged - damage_type = BURN - /datum/wound/burn/carbonised stages = list("carbonised area" = 50, "treated carbonised area" = 20, "massive burn scar" = 0) - - needs_treatment = 1 // this only heals when bandaged - damage_type = BURN /datum/wound/internal_bleeding internal = 1 - stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5) - max_bleeding_stage = 0 - - needs_treatment = 1 + autoheal_cutoff = 5 + max_bleeding_stage = 0 //all stages bleed. It's called internal bleeding after all. diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index da9a3e15..0143b595 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -61,7 +61,10 @@ usr << browse("", "window=[name]") //Closes the dialog P = src[page] P.attackby(W, user) + + update_icon() + attack_self(usr) //Update the browsed page. add_fingerprint(usr) return diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 8d8fd5f3..357f3587 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -618,7 +618,7 @@ // called when on fire -/obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/machinery/light/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C broken() @@ -750,5 +750,6 @@ src.visible_message("\red [name] shatters.","\red You hear a small glass object shatter.") status = LIGHT_BROKEN force = 5 + sharp = 1 playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) update() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0aa2d463..ce22fb3c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -201,7 +201,7 @@ in_chamber.on_hit(M) if (in_chamber.damage_type != HALLOSS) - user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]") + user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() else user << "Ow..." diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 1a2889e0..6aa16bc0 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -5,6 +5,7 @@ name = "alloy spike" desc = "It's about a foot of weird silver metal with a wicked point." sharp = 1 + edge = 0 throwforce = 5 w_class = 2 icon = 'icons/obj/weapons.dmi' diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 3d80063a..912b5f2f 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -9,6 +9,7 @@ throwforce = 8 w_class = 3.0 sharp = 1 + edge = 0 /obj/item/weapon/arrow/proc/removed() //Helper for metal rods falling apart. return diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index f0d63824..e3fad9d7 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -191,7 +191,7 @@ playsound(user, fire_sound, 50, 1) user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") if(!P.nodamage) - user.apply_damage(300, BRUTE, affecting) // You are dead, dead, dead. + user.apply_damage(300, BRUTE, affecting, sharp=1) // You are dead, dead, dead. return ..() diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index c8a591ca..d1d783da 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -6,6 +6,7 @@ nodamage = 0 flag = "bullet" embed = 1 + sharp = 1 on_hit(var/atom/target, var/blocked = 0) if (..(target, blocked)) @@ -17,6 +18,7 @@ stun = 5 weaken = 5 embed = 0 + sharp = 0 /obj/item/projectile/bullet/weakbullet/beanbag //because beanbags are not bullets name = "beanbag" @@ -47,6 +49,8 @@ /obj/item/projectile/bullet/burstbullet//I think this one needs something for the on hit name = "exploding bullet" damage = 20 + embed = 0 + edge = 1 /obj/item/projectile/bullet/stunshot @@ -56,6 +60,7 @@ weaken = 10 stutter = 10 embed = 0 + sharp = 0 /obj/item/projectile/bullet/a762 damage = 25 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index ad5e8c7c..82c9e1b8 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -17,7 +17,8 @@ icon_state= "bolter" damage = 50 flag = "bullet" - + sharp = 1 + edge = 1 on_hit(var/atom/target, var/blocked = 0) explosion(target, -1, 0, 2) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index b472e46d..cabb0b7c 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -293,6 +293,7 @@ var/max_pill_count = 20 /obj/machinery/chem_master/New() + ..() var/datum/reagents/R = new/datum/reagents(100) reagents = R R.my_atom = src diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index da146d73..502b1992 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -118,10 +118,15 @@ datum else //injected M.contract_disease(D, 1, 0) if(self.data && self.data["virus2"] && istype(M, /mob/living/carbon))//infecting... - if(method == TOUCH) - infect_virus2(M,self.data["virus2"]) - else - infect_virus2(M,self.data["virus2"],1) //injected, force infection! + var/list/vlist = self.data["virus2"] + if (vlist.len) + for (var/ID in vlist) + var/datum/disease2/disease/V = vlist[ID] + + if(method == TOUCH) + infect_virus2(M,V.getcopy()) + else + infect_virus2(M,V.getcopy(),1) //injected, force infection! if(self.data && self.data["antibodies"] && istype(M, /mob/living/carbon))//... and curing var/mob/living/carbon/C = M C.antibodies |= self.data["antibodies"] @@ -146,6 +151,9 @@ datum blood_prop.viruses += newVirus newVirus.holder = blood_prop + if(self.data["virus2"]) + blood_prop.virus2 = virus_copylist(self.data["virus2"]) + else if(istype(self.data["donor"], /mob/living/carbon/monkey)) var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T @@ -778,6 +786,8 @@ datum on_mob_life(var/mob/living/M as mob) if (volume > overdose) M.hallucination = max(M.hallucination, 2) + ..() + return tramadol name = "Tramadol" @@ -790,6 +800,8 @@ datum on_mob_life(var/mob/living/M as mob) if (volume > overdose) M.hallucination = max(M.hallucination, 2) + ..() + return oxycodone name = "Oxycodone" @@ -803,6 +815,8 @@ datum if (volume > overdose) M.druggy = max(M.druggy, 10) M.hallucination = max(M.hallucination, 3) + ..() + return virus_food @@ -1574,14 +1588,14 @@ datum var/turf/the_turf = get_turf(O) var/datum/gas_mixture/napalm = new var/datum/gas/volatile_fuel/fuel = new - fuel.moles = 5 + fuel.moles = volume napalm.trace_gases += fuel the_turf.assume_air(napalm) reaction_turf(var/turf/T, var/volume) src = null var/datum/gas_mixture/napalm = new var/datum/gas/volatile_fuel/fuel = new - fuel.moles = 5 + fuel.moles = volume napalm.trace_gases += fuel T.assume_air(napalm) return diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 004298dd..0def51ea 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -77,7 +77,7 @@ armor_duration /= 10 //Apply the damage! - target.apply_damage(force, BRUTE, affecting, armor_block) + target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0) // You are going to knock someone out for longer if they are not wearing a helmet. if(affecting == "head" && istype(target, /mob/living/carbon/)) @@ -125,6 +125,8 @@ throw_range = 5 item_state = "beer" attack_verb = list("stabbed", "slashed", "attacked") + sharp = 1 + edge = 0 var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") /obj/item/weapon/broken_bottle/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 47a038ad..2fb1e3eb 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -16,6 +16,7 @@ possible_transfer_amounts = null //list(5,10,15) volume = 15 w_class = 1 + sharp = 1 var/mode = SYRINGE_DRAW on_reagent_change() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 60c34f61..830ea767 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -166,7 +166,7 @@ if(src) del(src) -/obj/structure/reagent_dispensers/fueltank/temperature_expose(datum/gas_mixture/air, temperature, volume) +/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) if(temperature > T0C+500) explode() return ..() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 1f8264be..5f72368e 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -234,20 +234,8 @@ flush() flushing = 1 flick("intake-closing", src) - var/deliveryCheck = 0 var/obj/structure/disposalholder/H = new() // virtual holder object which actually // travels through the pipes. - for(var/obj/structure/bigDelivery/O in src) - deliveryCheck = 1 - if(O.sortTag == 0) - O.sortTag = 1 - for(var/obj/item/smallDelivery/O in src) - deliveryCheck = 1 - if (O.sortTag == 0) - O.sortTag = 1 - if(deliveryCheck == 0) - H.destinationTag = 1 - air_contents = new() // new empty gas resv. sleep(10) diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm index 67d56c6e..4d5ee1a6 100644 --- a/code/modules/research/xenoarchaeology/geosample.dm +++ b/code/modules/research/xenoarchaeology/geosample.dm @@ -20,6 +20,7 @@ icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "sliver1" //0-4 w_class = 1 + sharp = 1 //item_state = "electronic" var/source_rock = "/turf/simulated/mineral/" var/datum/geosample/geological_data diff --git a/code/modules/surgery/appendix.dm b/code/modules/surgery/appendix.dm index ede75704..91332eab 100644 --- a/code/modules/surgery/appendix.dm +++ b/code/modules/surgery/appendix.dm @@ -8,6 +8,8 @@ can_infect = 1 blood_level = 1 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 if (target_zone != "groin") return 0 var/datum/organ/external/groin = target.get_organ("groin") diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index d0d30cfd..0bc14075 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -15,6 +15,8 @@ max_duration = 60 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 var/datum/organ/external/affected = target.get_organ(target_zone) return affected.open == 2 && affected.stage == 0 @@ -47,6 +49,8 @@ max_duration = 70 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 var/datum/organ/external/affected = target.get_organ(target_zone) return affected.name != "head" && affected.open == 2 && affected.stage == 1 @@ -84,6 +88,8 @@ max_duration = 70 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 var/datum/organ/external/affected = target.get_organ(target_zone) return affected.name == "head" && affected.open == 2 && affected.stage == 1 @@ -118,6 +124,8 @@ max_duration = 60 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return 0 var/datum/organ/external/affected = target.get_organ(target_zone) return affected.open == 2 && affected.stage == 2 diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index 767cef71..b89c4827 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -62,7 +62,7 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \ "\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!") - target.apply_damage(50, BRUTE, "head", 1) + target.apply_damage(50, BRUTE, "head", 1, sharp=1) /datum/surgery_step/brain/saw_spine allowed_tools = list( @@ -114,7 +114,7 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \ "\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!") - target.apply_damage(30, BRUTE, "head", 1) + target.apply_damage(30, BRUTE, "head", 1, sharp=1) if (ishuman(user)) user:bloody_body(target) user:bloody_hands(target, 0) @@ -151,7 +151,7 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, jabbing \the [tool] in [target]'s brain!", \ "\red Your hand slips, jabbing \the [tool] in [target]'s brain!") - target.apply_damage(30, BRUTE, "head", 1) + target.apply_damage(30, BRUTE, "head", 1, sharp=1) /datum/surgery_step/brain/hematoma allowed_tools = list( @@ -181,7 +181,7 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, bruising [target]'s brain with \the [tool]!", \ "\red Your hand slips, bruising [target]'s brain with \the [tool]!") - target.apply_damage(20, BRUTE, "head", 1) + target.apply_damage(20, BRUTE, "head", 1, sharp=1) ////////////////////////////////////////////////////////////////// // SLIME CORE EXTRACTION // diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index b65aaf96..9977271c 100644 --- a/code/modules/surgery/eye.dm +++ b/code/modules/surgery/eye.dm @@ -104,7 +104,7 @@ var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \ "\red Your hand slips, stabbing \the [tool] into [target]'s eye!") - target.apply_damage(10, BRUTE, affected) + target.apply_damage(10, BRUTE, affected, sharp=1) eyes.take_damage(5, 0) /datum/surgery_step/eye/cauterize diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index b3569b08..7c04800f 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -98,7 +98,7 @@ var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \ "\red Your hand slips, tearing skin on [target]'s face with \the [tool]!") - target.apply_damage(10, BRUTE, affected) + target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1) /datum/surgery_step/face/cauterize allowed_tools = list( diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 1ee3408b..5109b72e 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -35,8 +35,9 @@ max_duration = 110 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 0 && target_zone != "mouth" + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 0 && target_zone != "mouth" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -74,8 +75,9 @@ max_duration = 120 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 0 && target_zone != "mouth" + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 0 && target_zone != "mouth" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -114,10 +116,9 @@ max_duration = 110 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if(isslime(target)) - return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 0 && target_zone != "mouth" + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 0 && target_zone != "mouth" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -153,8 +154,9 @@ max_duration = 60 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open && (affected.status & ORGAN_BLEEDING) + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open && (affected.status & ORGAN_BLEEDING) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -187,8 +189,9 @@ max_duration = 40 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 1 && !(affected.status & ORGAN_BLEEDING) + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 1 && !(affected.status & ORGAN_BLEEDING) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -228,7 +231,7 @@ msg = "\red [user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]" self_msg = "\red Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!" user.visible_message(msg, self_msg) - target.apply_damage(12, BRUTE, affected) + target.apply_damage(12, BRUTE, affected, sharp=1) /datum/surgery_step/generic/cauterize allowed_tools = list( @@ -242,8 +245,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open && target_zone != "mouth" + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open && target_zone != "mouth" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm index eb5c6964..17db2c30 100644 --- a/code/modules/surgery/headreattach.dm +++ b/code/modules/surgery/headreattach.dm @@ -28,8 +28,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && !(affected.status & ORGAN_CUT_AWAY) + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return !(affected.status & ORGAN_CUT_AWAY) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts peeling back tattered flesh where [target]'s head used to be with \the [tool].", \ @@ -61,8 +62,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.status & ORGAN_CUT_AWAY && affected.open < 3 && !(affected.status & ORGAN_ATTACHABLE) + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.status & ORGAN_CUT_AWAY && affected.open < 3 && !(affected.status & ORGAN_ATTACHABLE) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -94,8 +96,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 3 + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 3 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] is stapling and suturing flesh into place in [target]'s esophagal and vocal region with \the [tool].", \ @@ -128,8 +131,9 @@ max_duration = 70 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 4 + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 4 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts adjusting area around [target]'s neck with \the [tool].", \ @@ -162,8 +166,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/head = target.get_organ(target_zone) - return ..() && head.status & ORGAN_ATTACHABLE + if(..()) + var/datum/organ/external/head = target.get_organ(target_zone) + return head.status & ORGAN_ATTACHABLE begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts attaching [tool] to [target]'s reshaped neck.", \ @@ -189,4 +194,4 @@ var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s neck!", \ "\red Your hand slips, damaging connectors on [target]'s neck!") - target.apply_damage(10, BRUTE, affected) + target.apply_damage(10, BRUTE, affected, sharp=1) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index a57d1d89..c3f4f329 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -7,6 +7,8 @@ /datum/surgery_step/cavity priority = 1 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!hasorgans(target)) + return 0 var/datum/organ/external/affected = target.get_organ(target_zone) return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) && (target_zone != "chest" || target.op_stage.ribcage == 2) @@ -41,8 +43,9 @@ max_duration = 80 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && !affected.cavity && !affected.hidden + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return !affected.cavity && !affected.hidden begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -76,8 +79,9 @@ max_duration = 80 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.cavity + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.cavity begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -106,11 +110,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if(isslime(target)) - return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) - var/can_fit = !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected) - return ..() && can_fit + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -185,7 +187,7 @@ affected.implants -= obj target.hud_updateflag |= 1 << IMPLOYAL_HUD - + //Handle possessive brain borers. if(istype(obj,/mob/living/simple_animal/borer)) var/mob/living/simple_animal/borer/worm = obj diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 55fc59dd..bd1002b0 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -17,6 +17,9 @@ max_duration = 90 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!hasorgans(target)) + return 0 + var/datum/organ/external/affected = target.get_organ(target_zone) var/internal_bleeding = 0 diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 7515fa05..7bbad9b5 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -19,7 +19,7 @@ max_duration = 70 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (!istype(target)) + if (!hasorgans(target)) return var/datum/organ/external/affected = target.get_organ(target_zone) return ..() && target.op_stage.ribcage == 0 && affected.open >= 2 @@ -197,6 +197,9 @@ max_duration = 90 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!hasorgans(target)) + return 0 + var/is_chest_organ_damaged = 0 var/datum/organ/external/chest/chest = target.get_organ("chest") for(var/datum/organ/internal/I in chest.internal_organs) if(I.damage > 0) @@ -278,6 +281,9 @@ max_duration = 90 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!hasorgans(target)) + return 0 + var/is_chest_organ_damaged = 0 var/datum/organ/internal/heart/heart = target.internal_organs["heart"] var/datum/organ/external/chest/chest = target.get_organ("chest") diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index 3be16401..354b4483 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -30,8 +30,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && !(affected.status & ORGAN_CUT_AWAY) + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return !(affected.status & ORGAN_CUT_AWAY) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -64,8 +65,9 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.status & ORGAN_CUT_AWAY && affected.open < 3 && !(affected.status & ORGAN_ATTACHABLE) + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.status & ORGAN_CUT_AWAY && affected.open < 3 && !(affected.status & ORGAN_ATTACHABLE) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -85,7 +87,7 @@ affected = affected.parent user.visible_message("\red [user]'s hand slips, tearing flesh on [target]'s [affected.display_name]!", \ "\red Your hand slips, tearing flesh on [target]'s [affected.display_name]!") - target.apply_damage(10, BRUTE, affected) + target.apply_damage(10, BRUTE, affected, sharp=1) /datum/surgery_step/limb/prepare @@ -100,8 +102,9 @@ max_duration = 70 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.open == 3 + if(..()) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 3 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -134,12 +137,13 @@ max_duration = 100 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/robot_parts/p = tool - if (p.part) - if (!(target_zone in p.part)) - return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.status & ORGAN_ATTACHABLE + if(..()) + var/obj/item/robot_parts/p = tool + if (p.part) + if (!(target_zone in p.part)) + return 0 + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.status & ORGAN_ATTACHABLE begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -166,4 +170,4 @@ var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!") - target.apply_damage(10, BRUTE, affected) + target.apply_damage(10, BRUTE, affected, sharp=1) diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 93acbd6e..f9cb07b7 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -68,7 +68,7 @@ proc/airborne_can_reach(turf/source, turf/target) if ("[disease.uniqueID]" in M.virus2) return // if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect - if(M.antibodies & disease.antigen != 0) + if((M.antibodies & disease.antigen) != 0) return if(M.reagents.has_reagent("spaceacillin")) return diff --git a/code/setup.dm b/code/setup.dm index b585db7a..70a91b6d 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -552,15 +552,6 @@ var/list/liftable_structures = list(\ //some arbitrary defines to be used by self-pruning global lists. (see master_controller) #define PROCESS_KILL 26 //Used to trigger removal from a processing list -// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to -// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages -// tagged for the Cargo Bay. -var/list/TAGGERLOCATIONS = list("Disposals", - "Cargo Bay", "QM Office", "Engineering", "CE Office", - "Atmospherics", "Security", "HoS Office", "Medbay", - "CMO Office", "Chemistry", "Research", "RD Office", - "Robotics", "HoP Office", "Library", "Chapel", "Theatre", - "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics","Drone Fabrication") #define HOSTILE_STANCE_IDLE 1 #define HOSTILE_STANCE_ALERT 2 diff --git a/code/world.dm b/code/world.dm index 66c66ea6..95b6cb5c 100644 --- a/code/world.dm +++ b/code/world.dm @@ -108,7 +108,6 @@ var/world_topic_spam_protect_time = world.timeofday n++ s["players"] = n - if(revdata) s["revision"] = revdata.revision s["admins"] = admins return list2params(s) diff --git a/html/AddToChangelog.exe b/html/AddToChangelog.exe index a4fe303f..3625bd27 100644 Binary files a/html/AddToChangelog.exe and b/html/AddToChangelog.exe differ diff --git a/icons/mob/human_races/robotic.dmi b/icons/mob/human_races/robotic.dmi index cf7767f4..4bd119b6 100644 Binary files a/icons/mob/human_races/robotic.dmi and b/icons/mob/human_races/robotic.dmi differ diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 3a2dff64..088f1cec 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -380,10 +380,10 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{:~string('{1}%', aircontents.carbon_dioxide > 5 ? 'bad' : 'good' , aircontents.carbon_dioxide)}}
- Plasma: + Phoron:
- {{:~string('{1}%', aircontents.plasma > 0 ? 'bad' : 'good' , aircontents.plasma)}} + {{:~string('{1}%', aircontents.phoron > 0 ? 'bad' : 'good' , aircontents.phoron)}}
{{if aircontents.other > 0}} diff --git a/tools/AddToChangelog/AddToChangelog/Form1.cs b/tools/AddToChangelog/AddToChangelog/Form1.cs index acaa5ffe..567c1fb3 100644 --- a/tools/AddToChangelog/AddToChangelog/Form1.cs +++ b/tools/AddToChangelog/AddToChangelog/Form1.cs @@ -190,7 +190,7 @@ namespace AddToChangelog string[] changelogFile = null; - changelogFile = editBox.Text.Split('\n'); + changelogFile = Regex.Split(editBox.Text, "\r\n"); if (changelogFile != null) { @@ -218,7 +218,7 @@ namespace AddToChangelog } else { - editBox.Text = String.Join("\n", changelogFile); + editBox.Text = String.Join("\r\n", changelogFile); ScrollToMarker(); } diff --git a/tools/mapmerge/clean_map_git.sh b/tools/mapmerge/clean_map_git.sh index 6ff986e0..0a5f4cc7 100644 --- a/tools/mapmerge/clean_map_git.sh +++ b/tools/mapmerge/clean_map_git.sh @@ -1,9 +1,7 @@ #!/bin/sh -MAPFILE='tgstation.2.1.3.dmm' +MAPFILE='tgstation2.dmm' -git show HEAD:_maps/map_files/$MAPFILE > tmp.dmm -java -jar MapPatcher.jar -clean tmp.dmm '../../_maps/map_files/'$MAPFILE '../../_maps/map_files/'$MAPFILE -dos2unix -U '../../_maps/map_files/'$MAPFILE +git show HEAD:maps/$MAPFILE > tmp.dmm +java -jar MapPatcher.jar -clean tmp.dmm '../../maps/'$MAPFILE '../../maps/'$MAPFILE rm tmp.dmm -