diff --git a/aurorastation.dme b/aurorastation.dme index 05290a75c80..4ec1e45295b 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1399,6 +1399,7 @@ #include "code\modules\detectivework\tools\luminol.dm" #include "code\modules\detectivework\tools\rag.dm" #include "code\modules\detectivework\tools\sample_kits.dm" +#include "code\modules\detectivework\tools\scene_cards.dm" #include "code\modules\detectivework\tools\storage.dm" #include "code\modules\detectivework\tools\swabs.dm" #include "code\modules\detectivework\tools\uvlight.dm" diff --git a/code/__defines/_macros.dm b/code/__defines/_macros.dm index 05dd7e8685e..f5dad3c6bac 100644 --- a/code/__defines/_macros.dm +++ b/code/__defines/_macros.dm @@ -22,6 +22,8 @@ #define ishuman(A) istype(A, /mob/living/carbon/human) +#define ismech(A) istype(A, /mob/living/heavy_vehicle) + #define isliving(A) istype(A, /mob/living) #define israt(A) istype(A, /mob/living/simple_animal/rat) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 6221e24bdd0..2e03f85800f 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -10,6 +10,7 @@ #define CUT "cut" #define BRUISE "bruise" #define PIERCE "pierce" +#define LASER "laser" #define DAM_LASER 1 #define DAM_BULLET 2 @@ -63,3 +64,10 @@ #define BLOOD_VOLUME_OKAY 70 #define BLOOD_VOLUME_BAD 60 #define BLOOD_VOLUME_SURVIVE 30 + +// These control the amount of blood lost from burns. The loss is calculated so +// that dealing just enough burn damage to kill the player will cause the given +// proportion of their max blood volume to be lost +// (e.g. 0.6 == 60% lost if 200 burn damage is taken). +#define FLUIDLOSS_WIDE_BURN 0.6 //for burns from heat applied over a wider area, like from fire +#define FLUIDLOSS_CONC_BURN 0.4 //for concentrated burns, like from lasers diff --git a/code/__defines/dna.dm b/code/__defines/dna.dm index 1655659da68..1be4cd0e1fa 100644 --- a/code/__defines/dna.dm +++ b/code/__defines/dna.dm @@ -11,7 +11,7 @@ #define FAT 6 #define HUSK 7 #define NOCLONE 8 -#define LASER 9 // Harm intent - click anywhere to shoot lasers from eyes. +#define LASER_EYES 9 // Harm intent - click anywhere to shoot lasers from eyes. #define HEAL 10 // Healing people with hands. #define SKELETON 29 diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm index b7cf56b65b0..ac86f23ef8a 100644 --- a/code/__defines/qdel.dm +++ b/code/__defines/qdel.dm @@ -20,3 +20,4 @@ #define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE) #define QDEL_NULL(item) qdel(item); item = null +#define QDEL_NULL_LIST(x) if(x) { for(var/y in x) { qdel(y) }}; if(x) {x.Cut(); x = null } // Second x check to handle items that LAZYREMOVE on qdel. diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index d651287eccc..5f5bba24f3b 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -209,7 +209,7 @@ */ /mob/proc/RangedAttack(var/atom/A, var/params) if(!mutations.len) return - if((LASER in mutations) && a_intent == I_HURT) + if((LASER_EYES in mutations) && a_intent == I_HURT) LaserEyes(A, params) // moved into a proc below else if(TK in mutations) switch(get_dist(src,A)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index e8a67b9bae4..a9e209f338e 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -36,7 +36,7 @@ if(!(gloves || mutations.len || glasses)) return var/obj/item/clothing/gloves/GV = gloves var/obj/item/clothing/glasses/GS = glasses - if((LASER in mutations) && a_intent == I_HURT) + if((LASER_EYES in mutations) && a_intent == I_HURT) LaserEyes(A) // moved into a proc below else if(istype(GS) && GS.Look(A,src,0)) // for goggles diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e861dfe9539..23070d38b06 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -578,6 +578,11 @@ if(L.lying) //if the perp is lying down, it's still a target but a less-important target return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + if(ismech(L)) + var/mob/living/heavy_vehicle/M = L + if(!M.pilots?.len) + return TURRET_NOT_TARGET + return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee /obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H) @@ -1131,4 +1136,4 @@ #undef TURRET_PRIORITY_TARGET #undef TURRET_SECONDARY_TARGET -#undef TURRET_NOT_TARGET \ No newline at end of file +#undef TURRET_NOT_TARGET diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 893118b1d57..80a712545d6 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -45,8 +45,8 @@ if (!(HULK in user.mutations)) user.mutations.Add(HULK) to_chat(user, "Your muscles hurt.") - if (!(LASER in user.mutations)) - user.mutations.Add(LASER) + if (!(LASER_EYES in user.mutations)) + user.mutations.Add(LASER_EYES) to_chat(user, "You feel pressure building behind your eyes.") if (!(COLD_RESISTANCE in user.mutations)) user.mutations.Add(COLD_RESISTANCE) diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm index f949fe2bb15..c01f6c8113f 100644 --- a/code/modules/cargo/random_stock/t2_uncommon.dm +++ b/code/modules/cargo/random_stock/t2_uncommon.dm @@ -74,7 +74,7 @@ STOCK_ITEM_UNCOMMON(mediumcell, 3) STOCK_ITEM_UNCOMMON(chempack, 5) var/list/chems = SSchemistry.chemical_reagents.Copy() var/list/exclusion = list("drink", "reagent", "adminordrazine", "beer2", "azoth", "elixir_life", "liquid_fire", "philosopher_stone", "undead_ichor", "love", "shapesand", "usolve",\ - "sglue", "black_matter", "lightning", "trioxin", "phoron_salt", "nanites") + "sglue", "black_matter", "lightning", "trioxin", "phoron_salt", "nanites", "nitroglycerin") chems -= exclusion for (var/i in 1 to rand(2, 6)) var/obj/item/reagent_containers/chem_disp_cartridge/C = new /obj/item/reagent_containers/chem_disp_cartridge(L) diff --git a/code/modules/detectivework/tools/crimekit.dm b/code/modules/detectivework/tools/crimekit.dm index 826a2ec6298..619fd26ebd4 100644 --- a/code/modules/detectivework/tools/crimekit.dm +++ b/code/modules/detectivework/tools/crimekit.dm @@ -8,6 +8,8 @@ storage_slots = 14 max_storage_space = 35 contained_sprite = 1 + use_sound = 'sound/items/storage/toolbox.ogg' + drop_sound = 'sound/items/drop/metalboots.ogg' /obj/item/storage/briefcase/crimekit/fill() ..() diff --git a/code/modules/detectivework/tools/scene_cards.dm b/code/modules/detectivework/tools/scene_cards.dm new file mode 100644 index 00000000000..d9ab88dbec1 --- /dev/null +++ b/code/modules/detectivework/tools/scene_cards.dm @@ -0,0 +1,58 @@ +/obj/item/storage/fancy/csi_markers + name = "crime scene markers box" + desc = "A cardboard box for crime scene marker cards." + icon = 'icons/obj/forensics.dmi' + icon_state = "markerbox" + icon_type = "marker" + w_class = 1 + storage_slots = 7 + can_hold = list(/obj/item/csi_marker) + starts_with = list( + /obj/item/csi_marker/n1 = 1, + /obj/item/csi_marker/n2 = 1, + /obj/item/csi_marker/n3 = 1, + /obj/item/csi_marker/n4 = 1, + /obj/item/csi_marker/n5 = 1, + /obj/item/csi_marker/n6 = 1, + /obj/item/csi_marker/n7 = 1 + ) + +/obj/item/csi_marker + name = "crime scene marker" + desc = "Plastic cards used to mark points of interests on the scene. Just like in the holoshows!" + icon = 'icons/obj/forensics.dmi' + icon_state = "card1" + drop_sound = 'sound/items/drop/card.ogg' + w_class = 1 + randpixel = 1 + layer = ABOVE_MOB_LAYER //so you can mark bodies + var/number = 1 + +/obj/item/csi_marker/Initialize(mapload) + . = ..() + desc += " This one is marked with a [number]." + update_icon() + +/obj/item/csi_marker/update_icon() + icon_state = "card[Clamp(number,1,7)]" + +/obj/item/csi_marker/n1 + number = 1 + +/obj/item/csi_marker/n2 + number = 2 + +/obj/item/csi_marker/n3 + number = 3 + +/obj/item/csi_marker/n4 + number = 4 + +/obj/item/csi_marker/n5 + number = 5 + +/obj/item/csi_marker/n6 + number = 6 + +/obj/item/csi_marker/n7 + number = 7 diff --git a/code/modules/detectivework/tools/swabs.dm b/code/modules/detectivework/tools/swabs.dm index f2d7cdbc3b8..3c96098db74 100644 --- a/code/modules/detectivework/tools/swabs.dm +++ b/code/modules/detectivework/tools/swabs.dm @@ -5,6 +5,7 @@ var/gsr = 0 var/list/dna var/used + drop_sound = 'sound/items/drop/glass.ogg' /obj/item/forensics/swab/proc/is_used() return used diff --git a/code/modules/ghostroles/spawner/human/ert.dm b/code/modules/ghostroles/spawner/human/ert.dm index 1e254f64e9c..791a952a923 100644 --- a/code/modules/ghostroles/spawner/human/ert.dm +++ b/code/modules/ghostroles/spawner/human/ert.dm @@ -193,7 +193,7 @@ max_count = 1 outfit = /datum/outfit/admin/ert/kataphract/klax mob_name_prefix = "Zosaa " - uses_species_whitelist = TRUE // Kataphract K'lax would be more difficult + req_species_whitelist = "Vaurca" // Kataphract K'lax would be more difficult possible_species = list("Vaurca Warrior") extra_languages = list(LANGUAGE_VAURCA) diff --git a/code/modules/heavy_vehicle/components/armour.dm b/code/modules/heavy_vehicle/components/armor.dm similarity index 76% rename from code/modules/heavy_vehicle/components/armour.dm rename to code/modules/heavy_vehicle/components/armor.dm index 60bfd987966..92ecc43eb54 100644 --- a/code/modules/heavy_vehicle/components/armour.dm +++ b/code/modules/heavy_vehicle/components/armor.dm @@ -3,24 +3,24 @@ damage_flags &= ~(DAM_SHARP | DAM_EDGE) . = ..()*/ -/obj/item/robot_parts/robot_component/armour - name = "exosuit armour plating" +/obj/item/robot_parts/robot_component/armor + name = "exosuit armor plating" armor = list(melee = 75, bullet = 33, laser = 50, energy = 10, bomb = 25, bio = 100, rad = 0) origin_tech = list(TECH_MATERIAL = 1) -/obj/item/robot_parts/robot_component/armour/radproof - name = "radiation-proof armour plating" +/obj/item/robot_parts/robot_component/armor/radproof + name = "radiation-proof armor plating" desc = "A fully enclosed radiation hardened shell designed to protect the pilot from radiation." armor = list(melee = 75, bullet = 33, laser = 50, energy = 25, bomb = 25, bio = 100, rad = 100) origin_tech = list(TECH_MATERIAL = 3) -/obj/item/robot_parts/robot_component/armour/em - name = "EM-shielded armour plating" +/obj/item/robot_parts/robot_component/armor/em + name = "EM-shielded armor plating" desc = "A shielded plating that sorrounds the eletronics and protects them from electromagnetic radiation." armor = list(melee = 65, bullet = 20, laser = 25, energy = 100, bomb = 10, bio = 100, rad = 60) origin_tech = list(TECH_MATERIAL = 3) -/obj/item/robot_parts/robot_component/armour/combat +/obj/item/robot_parts/robot_component/armor/combat name = "heavy combat plating" desc = "Plating designed to deflect incoming attacks and explosions." armor = list(melee = 85, bullet = 70, laser = 60, energy = 10, bomb = 70, bio = 100, rad = 0) diff --git a/code/modules/heavy_vehicle/components/body.dm b/code/modules/heavy_vehicle/components/body.dm index e8614cad881..ebedbf7fa85 100644 --- a/code/modules/heavy_vehicle/components/body.dm +++ b/code/modules/heavy_vehicle/components/body.dm @@ -6,7 +6,7 @@ var/mech_health = 300 var/obj/item/robot_parts/robot_component/diagnosis_unit/diagnostics var/obj/item/cell/cell - var/obj/item/robot_parts/robot_component/armour/ + var/obj/item/robot_parts/robot_component/armor/mech_armor var/obj/machinery/portable_atmospherics/canister/air_supply var/datum/gas_mixture/cockpit var/pilot_offset_x = 0 @@ -22,7 +22,7 @@ /obj/item/mech_component/chassis/update_components() diagnostics = locate() in src cell = locate() in src - armour = locate() in src + mech_armor = locate() in src air_supply = locate() in src /obj/item/mech_component/chassis/New() @@ -40,7 +40,7 @@ /obj/item/mech_component/chassis/Destroy() QDEL_NULL(cell) QDEL_NULL(diagnostics) - QDEL_NULL(armour) + QDEL_NULL(mech_armor) QDEL_NULL(air_supply) . = ..() @@ -49,7 +49,7 @@ to_chat(user, "It is missing a power cell.") if(!diagnostics) to_chat(user, "It is missing a diagnostics unit.") - if(!armour) + if(!mech_armor) to_chat(user, "It is missing armor plating.") /obj/item/mech_component/chassis/Initialize() @@ -80,7 +80,7 @@ cockpit.react() /obj/item/mech_component/chassis/ready_to_install() - return (cell && diagnostics && armour) + return (cell && diagnostics && mech_armor) /obj/item/mech_component/chassis/prebuild() diagnostics = new(src) @@ -98,12 +98,12 @@ to_chat(user, "\The [src] already has a cell installed.") return if(install_component(thing,user)) cell = thing - else if(istype(thing, /obj/item/robot_parts/robot_component/armour)) - if(armour) - to_chat(user, "\The [src] already has armour installed.") + else if(istype(thing, /obj/item/robot_parts/robot_component/armor)) + if(mech_armor) + to_chat(user, "\The [src] already has mech_armor installed.") return if(install_component(thing, user)) - armour = thing + mech_armor = thing else return ..() diff --git a/code/modules/heavy_vehicle/equipment/_equipment.dm b/code/modules/heavy_vehicle/equipment/_equipment.dm index f715c010e3b..abe9ec34820 100644 --- a/code/modules/heavy_vehicle/equipment/_equipment.dm +++ b/code/modules/heavy_vehicle/equipment/_equipment.dm @@ -77,7 +77,6 @@ if(holding) //It'd be strange for this to be called with this var unset destroyed_event.unregister(holding, src, .proc/forget_holding) holding = null - qdel(src) /obj/item/mecha_equipment/mounted_system/Initialize() . = ..() diff --git a/code/modules/heavy_vehicle/interface/screen_objectsa.dm b/code/modules/heavy_vehicle/interface/screen_objectsa.dm index ec198c59f67..a736771c9c7 100644 --- a/code/modules/heavy_vehicle/interface/screen_objectsa.dm +++ b/code/modules/heavy_vehicle/interface/screen_objectsa.dm @@ -33,6 +33,11 @@ maptext_y = 3 maptext_width = 72 +/obj/screen/movable/mecha/hardpoint/Destroy() + owner = null + holding = null + . = ..() + /obj/screen/movable/mecha/hardpoint/MouseDrop() ..() if(holding) holding.screen_loc = screen_loc diff --git a/code/modules/heavy_vehicle/mech_damage.dm b/code/modules/heavy_vehicle/mech_damage.dm index c53e63c1a80..893d320c563 100644 --- a/code/modules/heavy_vehicle/mech_damage.dm +++ b/code/modules/heavy_vehicle/mech_damage.dm @@ -22,11 +22,6 @@ return def_zone -/mob/living/heavy_vehicle/getarmor(var/def_zone, var/type) - if(body.armour) - return isnull(body.armour.armor[type]) ? 0 : body.armour.armor[type] - return 0 - /mob/living/heavy_vehicle/hitby(atom/movable/AM, speed) if(LAZYLEN(pilots) && (!hatch_closed || !prob(body.pilot_coverage))) var/mob/living/pilot = pick(pilots) @@ -34,8 +29,8 @@ . = ..() /mob/living/heavy_vehicle/getarmor(var/def_zone, var/type) - if(body && body.armour) - return isnull(body.armour.armor[type]) ? 0 : body.armour.armor[type] + if(body && body.mech_armor) + return isnull(body.mech_armor.armor[type]) ? 0 : body.mech_armor.armor[type] return 0 /mob/living/heavy_vehicle/updatehealth() @@ -73,9 +68,9 @@ //Only 2 types of damage concern mechs and vehicles switch(damagetype) if(BRUTE) - adjustBruteLoss(damage, target) + adjustBruteLoss(damage * BLOCKED_MULT(blocked), target) if(BURN) - adjustFireLoss(damage, target) + adjustFireLoss(damage * BLOCKED_MULT(blocked), target) if((damagetype == BRUTE || damagetype == BURN) && prob(25+(damage*2))) spark(src, 3) diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index 702a40577a7..8286e5cc4e7 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -294,12 +294,14 @@ playsound(src.loc,legs.mech_turn_sound,40,1) next_move = world.time + legs.turn_delay set_dir(direction) + update_icon() /mob/living/heavy_vehicle/Move() if(..() && !istype(loc, /turf/space)) if(legs && legs.mech_step_sound) playsound(src.loc,legs.mech_step_sound,40,1) get_cell().use(legs.power_use * CELLRATE) + update_icon() /mob/living/heavy_vehicle/attackby(var/obj/item/thing, var/mob/user) if(user.a_intent != I_HURT && istype(thing, /obj/item/mecha_equipment)) diff --git a/code/modules/heavy_vehicle/mecha.dm b/code/modules/heavy_vehicle/mecha.dm index 5525ea5bf24..923a7a186e2 100644 --- a/code/modules/heavy_vehicle/mecha.dm +++ b/code/modules/heavy_vehicle/mecha.dm @@ -72,13 +72,11 @@ pilot.forceMove(get_turf(src)) pilots = null - for(var/thing in hud_elements) - qdel(thing) - hud_elements.Cut() + QDEL_NULL_LIST(hud_elements) - for(var/hardpoint in hardpoints) - qdel(hardpoints[hardpoint]) - hardpoints.Cut() + hardpoint_hud_elements = null + + hardpoints = null QDEL_NULL(access_card) QDEL_NULL(arms) @@ -86,13 +84,7 @@ QDEL_NULL(head) QDEL_NULL(body) - for(var/hardpoint in hardpoint_hud_elements) - var/obj/screen/movable/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] - H.owner = null - H.holding = null - qdel(H) - hardpoint_hud_elements.Cut() - ..() + . = ..() /mob/living/heavy_vehicle/IsAdvancedToolUser() return 1 diff --git a/code/modules/heavy_vehicle/premade/combat.dm b/code/modules/heavy_vehicle/premade/combat.dm index 74e4cedff72..46dfd3f2320 100644 --- a/code/modules/heavy_vehicle/premade/combat.dm +++ b/code/modules/heavy_vehicle/premade/combat.dm @@ -66,7 +66,7 @@ /obj/item/mech_component/chassis/combat/prebuild() . = ..() - armor = new /obj/item/robot_parts/robot_component/armour/combat(src) + mech_armor = new /obj/item/robot_parts/robot_component/armor/combat(src) /obj/item/mech_component/chassis/combat/Initialize() pilot_positions = list( diff --git a/code/modules/heavy_vehicle/premade/heavy.dm b/code/modules/heavy_vehicle/premade/heavy.dm index 7ed0fc08655..2945ef0b2c6 100644 --- a/code/modules/heavy_vehicle/premade/heavy.dm +++ b/code/modules/heavy_vehicle/premade/heavy.dm @@ -68,7 +68,7 @@ /obj/item/mech_component/chassis/heavy/prebuild() . = ..() - armor = new /obj/item/robot_parts/robot_component/armour/combat(src) + mech_armor = new /obj/item/robot_parts/robot_component/armor/combat(src) /obj/item/mech_component/chassis/superheavy name = "reinforced exosuit chassis" @@ -84,7 +84,7 @@ /obj/item/mech_component/chassis/superheavy/prebuild() . = ..() cell = new /obj/item/cell/super(src) - armor = new /obj/item/robot_parts/robot_component/armour/combat(src) + mech_armor = new /obj/item/robot_parts/robot_component/armor/combat(src) /mob/living/heavy_vehicle/premade/superheavy name = "Marauder" diff --git a/code/modules/heavy_vehicle/premade/light.dm b/code/modules/heavy_vehicle/premade/light.dm index c4d1b9dd4d1..726ab03549a 100644 --- a/code/modules/heavy_vehicle/premade/light.dm +++ b/code/modules/heavy_vehicle/premade/light.dm @@ -76,7 +76,7 @@ /obj/item/mech_component/chassis/light/prebuild() . = ..() - armour = new /obj/item/robot_parts/robot_component/armour/radproof(src) + mech_armor = new /obj/item/robot_parts/robot_component/armor/radproof(src) /obj/item/mech_component/chassis/light/Initialize() pilot_positions = list( diff --git a/code/modules/heavy_vehicle/premade/powerloader.dm b/code/modules/heavy_vehicle/premade/powerloader.dm index 5a059a7d2e3..d04514e741e 100644 --- a/code/modules/heavy_vehicle/premade/powerloader.dm +++ b/code/modules/heavy_vehicle/premade/powerloader.dm @@ -16,7 +16,7 @@ body = new /obj/item/mech_component/chassis/ripley(src) body.color = "#ffdc37" - body.armour = new /obj/item/robot_parts/robot_component/armour(src) + body.armor = new /obj/item/robot_parts/robot_component/armour(src) . = ..() @@ -65,7 +65,7 @@ /obj/item/mech_component/chassis/ripley/prebuild() . = ..() - armour = new /obj/item/robot_parts/robot_component/armour(src) + armor = new /obj/item/robot_parts/robot_component/armour(src) /obj/item/mech_component/chassis/ripley/Initialize() pilot_positions = list( @@ -149,7 +149,7 @@ body = new /obj/item/mech_component/chassis/ripley(src) body.color = "#849bc1" - body.armour = new /obj/item/robot_parts/robot_component/armour/combat(src) + body.mech_armor = new /obj/item/robot_parts/robot_component/armor/combat(src) . = ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2588fcd441c..cbce4aebd47 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -241,9 +241,9 @@ if(!org.is_usable()) status += "dangling uselessly" if(status.len) - src.show_message("My [org.name] is [english_list(status)].",1) + src.show_message("My [org.name] is [english_list(status)].",1) else - src.show_message("My [org.name] is OK.",1) + src.show_message("My [org.name] is OK.",1) if((isskeleton(H)) && (!H.w_uniform) && (!H.wear_suit)) H.play_xylophone() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 8a4d49d7522..a2a68d1a460 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -463,4 +463,8 @@ This function restores all organs. if(stat == UNCONSCIOUS) traumatic_shock *= 0.6 - return max(0,traumatic_shock) \ No newline at end of file + return max(0,traumatic_shock) + +/mob/living/carbon/human/remove_blood_simple(var/blood) + if(should_have_organ(BP_HEART)) + vessel.remove_reagent("blood", blood) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 40b4eb324c6..20209c7c0f4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1154,6 +1154,8 @@ holder.icon_state = "0" // X_X else if(is_asystole()) holder.icon_state = "flatline" + else if(isFBP(src)) + holder.icon_state = "2" else holder.icon_state = "[pulse()]" hud_list[HEALTH_HUD] = holder diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 09681ca1279..cf538b678f9 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -431,7 +431,7 @@ There are several things that need to be remembered: standing.underlays += "telekinesishead[fat]_s" add_image = 1 */ - if(LASER) + if(LASER_EYES) standing.overlays += "lasereyes_s" add_image = 1 if(add_image) diff --git a/code/modules/mob/living/silicon/robot/gripper.dm b/code/modules/mob/living/silicon/robot/gripper.dm index b6efc737ec4..8e8e9fbc651 100644 --- a/code/modules/mob/living/silicon/robot/gripper.dm +++ b/code/modules/mob/living/silicon/robot/gripper.dm @@ -240,9 +240,9 @@ ) /obj/item/gripper/chemistry //A gripper designed for chemistry, to allow borgs to work efficiently in the lab - name = "chemistry gripper" + name = "medical gripper" icon_state = "gripper-sci" - desc = "A specialised grasping tool designed for working in chemistry and pharmaceutical labs" + desc = "A specialised grasping tool designed for working in medical treatment facilities and pharmaceutical labs." can_hold = list( /obj/item/reagent_containers/glass, @@ -253,7 +253,10 @@ /obj/item/storage/pill_bottle, /obj/item/hand_labeler, /obj/item/paper, - /obj/item/stack/material/phoron + /obj/item/stack/material/phoron, + /obj/item/reagent_containers/blood, + /obj/item/reagent_containers/food/drinks/sillycup, + /obj/item/reagent_containers/food/drinks/medcup ) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 31f8156fb32..dc545d10f6c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -339,6 +339,11 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH ////////////////////////////// /mob/living/simple_animal/hostile/proc/validator_living(var/mob/living/L, var/atom/current) + if(ismech(L)) + var/mob/living/heavy_vehicle/M = L + if(!M.pilots?.len) + return FALSE + if((L.faction == src.faction) && !attack_same) return FALSE if(L in friends) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 27c5e3212d5..d631c3a899d 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1269,4 +1269,7 @@ proc/is_blind(A) result[1] = asight result[2] = ainvis - return result \ No newline at end of file + return result + +/mob/proc/remove_blood_simple(var/blood) + return \ No newline at end of file diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index c7d9881fe77..98df713ef7d 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -40,18 +40,18 @@ // Check if we can actually travel a Z-level. if (!can_ztravel(direction)) - to_chat(src, "You lack means of travel in that direction.") + to_chat(src, span("warning", "You lack means of travel in that direction.")) return FALSE var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(!destination) - to_chat(src, "There is nothing of interest in this direction.") + to_chat(src, span("notice", "There is nothing of interest in this direction.")) return FALSE var/turf/start = get_turf(src) if(!start.CanZPass(src, direction)) - to_chat(src, "\The [start] is in the way.") + to_chat(src, span("warning", "\The [start] is in the way.")) return FALSE if(!destination.CanZPass(src, direction)) @@ -63,13 +63,13 @@ // If we want to move up,but the current area has gravity. Invoke CanAvoidGravity() // to check if this move is possible. if(direction == UP && area.has_gravity() && !CanAvoidGravity()) - to_chat(src, "Gravity stops you from moving upward.") + to_chat(src, span("warning", "Gravity stops you from moving upward.")) return FALSE // Check for blocking atoms at the destination. for (var/atom/A in destination) if (!A.CanPass(src, start, 1.5, 0)) - to_chat(src, "\The [A] blocks you.") + to_chat(src, span("warning", "\The [A] blocks you.")) return FALSE // Actually move. @@ -98,21 +98,21 @@ if(destination) setLoc(destination) else - to_chat(owner, "There is nothing of interest in this direction.") + to_chat(owner, span("notice", "There is nothing of interest in this direction.")) /mob/abstract/observer/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) forceMove(destination) else - to_chat(src, "There is nothing of interest in this direction.") + to_chat(src, span("notice", "There is nothing of interest in this direction.")) /mob/living/carbon/human/bst/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) forceMove(destination) else - to_chat(src, "There is nothing of interest in this direction.") + to_chat(src, span("notice", "There is nothing of interest in this direction.")) /** * An initial check for Z-level travel. Called relatively early in mob/proc/zMove. @@ -154,16 +154,16 @@ return if(destination.density) - to_chat(src, "There is something obstructing your destination!") + to_chat(src, span("notice", "There is something obstructing your destination!")) return for(var/obj/O in destination) if(O.density) - to_chat(src, "There is something obstructing your destination!") + to_chat(src, span("notice", "There is something obstructing your destination!")) return - visible_message("The [src] begins to climb [(direction == UP) ? "upwards" : "downwards"].", - "You begin to climb [(direction == UP) ? "upwards" : "downwards"].") + visible_message(span("notice", "The [src] begins to climb [(direction == UP) ? "upwards" : "downwards"]."), + span("notice", "You begin to climb [(direction == UP) ? "upwards" : "downwards"].")) var/climb_chance = 50 var/climb_speed = 45 SECONDS var/will_succeed = FALSE @@ -193,13 +193,13 @@ if(do_after(src, climb_speed, extra_checks = CALLBACK(src, .proc/climb_check, will_succeed, climb_chance, climb_speed, direction, destination))) if(will_succeed) - visible_message("\The [src] climbs [(direction == UP) ? "upwards" : "downwards"].", - "You climb [(direction == UP) ? "upwards" : "downwards"].") + visible_message(span("notice", "\The [src] climbs [(direction == UP) ? "upwards" : "downwards"]."), + span("notice", "You climb [(direction == UP) ? "upwards" : "downwards"].")) forceMove(destination) return else - visible_message("\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!", - "You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!") + visible_message(span("warning", "\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!"), + span("danger", "You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!")) if(direction == DOWN) Move(destination) fall_impact(1, damage_mod = min(1, max(0.2, ((100-climb_chance)/100) - 0.2))) @@ -208,8 +208,8 @@ if((last_special < world.time) && !success) //if you will succeed you can't fail last_special = world.time + speed/10 if(prob(100 - climb_chance)) //The worse you are the sooner you'll fail. - visible_message("\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!", - "You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!") + visible_message(span("warning", "\The [src] slips and falls as they climb [(direction == UP) ? "upwards" : "downwards"]!"), + span("danger", "You slip and fall as you climb [(direction == UP) ? "upwards" : "downwards"]!")) if(direction == DOWN) Move(destination) fall_impact(1, damage_mod = min(1, max(0.2, ((100-climb_chance)/100) - 0.2))) @@ -379,12 +379,12 @@ /mob/living/heavy_vehicle/fall_through() var/obj/structure/lattice/L = locate() in loc if (L) - visible_message("\The [src] crushes \the [L] with its weight!") + visible_message(span("danger", "\The [src] crushes \the [L] with its weight!")) qdel(L) var/obj/structure/stairs/S = locate() in loc if (S) - visible_message("\The [src] crushes \the [S] with its weight!") + visible_message(span("danger", "\The [src] crushes \the [S] with its weight!")) qdel(S) /** * Invoked when an atom has landed on a tile through which they can no longer fall. @@ -451,8 +451,8 @@ if (istype(rig)) for (var/obj/item/rig_module/actuators/A in rig.installed_modules) if (A.active && rig.check_power_cost(src, 10, A, 0)) - visible_message("\The [src] lands flawlessly with \his [rig].", - "You hear an electric *whirr* right after the slam!") + visible_message(span("notice", "\The [src] lands flawlessly with \his [rig]."), + span("notice", "You hear an electric *whirr* right after the slam!")) return FALSE var/combat_roll = 1 @@ -460,8 +460,8 @@ combat_roll = 0.7 //If you're sleeping, you take less damage because your body is less rigid. It's science 'n shit. if(!sleeping) combat_roll = 0.2 //Combat roll! - visible_message("\The [src] tucks into a roll as they hit \the [loc]!", - "You tuck into a roll as you hit \the [loc], minimizing damage!") + visible_message(span("notice", "\The [src] tucks into a roll as they hit \the [loc]!"), + span("notice", "You tuck into a roll as you hit \the [loc], minimizing damage!")) var/z_velocity = 5*(levels_fallen**2) var/damage = (((40 * species.fall_mod) + z_velocity) + rand(-20,20)) * combat_roll * damage_mod @@ -486,8 +486,30 @@ if(prob(50)) apply_damage(groin_damage, BRUTE, BP_GROIN) - visible_message("\The [src] falls and lands directly on their legs!", - "You land on your feet, and the impact brings you to your knees.") + visible_message(span("warning", "\The [src] falls and lands directly on their legs!"), + span("danger", "You land on your feet, and the impact brings you to your knees.")) + + if(prob(20)) + var/obj/item/organ/external/l_foot = get_organ("l_foot") + var/obj/item/organ/external/r_foot = get_organ("r_foot") + + if(prob(50) && l_foot) + fall_message("left ankle", "bends unnaturally") + l_foot.dislocate(TRUE) + else if(r_foot) + fall_message("right ankle", "bends unnaturally") + r_foot.dislocate(TRUE) + else if(prob(15)) + var/obj/item/organ/external/l_leg = get_organ("l_leg") + var/obj/item/organ/external/r_leg = get_organ("r_leg") + + if(prob(50) && l_leg) + fall_message("left knee", "caves in") + l_leg.dislocate(TRUE) + else if(r_leg) + fall_message("right knee", "caves in") + l_leg.dislocate(TRUE) + limb_damage = left_damage + right_damage + leftf_damage + rightf_damage + groin_damage @@ -507,14 +529,40 @@ limb_damage = left_damage + right_damage + lefth_damage + righth_damage - visible_message("\The [src] falls and lands arms first!", - "You brace your fall with your arms, hitting \the [loc] with a loud thud.", "You hear a thud!") + visible_message(span("warning", "\The [src] falls and lands arms first!"), + span("danger", "You brace your fall with your arms, hitting \the [loc] with a loud thud."), "You hear a thud!") + + if(prob(20)) + var/obj/item/organ/external/l_hand = get_organ("l_hand") + var/obj/item/organ/external/r_hand = get_organ("r_hand") + + if(prob(50) && l_hand) + fall_message("left wrist", "bends unnaturally") + l_hand.dislocate(TRUE) + else if(r_hand) + fall_message("right wrist", "bends unnaturally") + r_hand.dislocate(TRUE) + else if(prob(15)) + var/obj/item/organ/external/l_arm = get_organ("l_arm") + var/obj/item/organ/external/r_arm = get_organ("r_arm") + + if(prob(50) && l_arm) + fall_message("left elbow", "caves in") + l_arm.dislocate(TRUE) + else if(r_arm) + fall_message("right elbow", "caves in") + r_arm.dislocate(TRUE) else if(prob(30) && combat_roll >= 1)//landed on their head apply_damage(limb_damage, BRUTE, BP_HEAD) visible_message("\The [src] falls and lands on their face!", "With a loud thud, you land on your head. Hard.", "You hear a thud!") + var/obj/item/organ/external/head = get_organ("head") + if(prob(20) && head) + fall_message("jaw", "cracks loose") + head.dislocate(TRUE) + else limb_damage = 0 if(combat_roll >= 0.5) @@ -548,6 +596,10 @@ return TRUE +/mob/living/carbon/human/proc/fall_message(var/location, var/descriptor) + visible_message(span("warning", "There's a sickening popping noise as [src]'s [location] [descriptor]!"), + span("danger", "Grueling pain shoots through your mind as your [location] [descriptor]!")) + /mob/living/carbon/human/proc/post_fall_death_check() if (stat == DEAD) SSfeedback.IncrementSimpleStat("openturf_human_deaths") @@ -647,8 +699,8 @@ else L.apply_damage(damage, BRUTE) - L.visible_message("\The [L] had \the [src] fall onto \him!", - "You had \the [src] fall onto you and strike you!") + L.visible_message(span("danger", "\The [L] had \the [src] fall onto \him!"), + span("danger", "You had \the [src] fall onto you and strike you!")) admin_attack_log((ismob(src) ? src : null), L, "fell onto", "was fallen on by", "fell ontop of") @@ -660,7 +712,7 @@ . = ..() if (.) - to_chat(src, "You fell ontop of \the [.]!") + to_chat(src, span("danger", "You fell ontop of \the [.]!")) /** * Helper proc for customizing which attributes should be used in fall damage diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 0773e4ef9d0..234ae519ad7 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -252,6 +252,8 @@ brute *= brute_mod burn *= burn_mod + var/laser = (damage_flags & DAM_LASER) + add_pain(0.6*burn + 0.4*brute) if(status & ORGAN_BROKEN && prob(40) && brute) @@ -305,7 +307,10 @@ if(burn > 0 && can_inflict) //Inflict all burn damage we can - createwound(BURN, min(burn,can_inflict)) + if(laser) + createwound(LASER, min(burn, can_inflict)) + else + createwound(BURN, min(burn,can_inflict)) //How much burn damage is left to inflict spillover += max(0, burn - can_inflict) @@ -466,7 +471,8 @@ This function completely restores a damaged organ to perfect condition. /obj/item/organ/external/proc/createwound(var/type = CUT, var/damage) - if(damage == 0) return + + if(damage <= 0) return //moved this before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return) //Possibly trigger an internal wound, too. @@ -480,6 +486,15 @@ This function completely restores a damaged organ to perfect condition. if(internal_damage) owner.custom_pain("You feel something rip in your [name]!", 25) + //Burn damage can cause fluid loss due to blistering and cook-off + if((type in list(BURN, LASER)) && (damage > 5 || damage + burn_dam >= 15) && !BP_IS_ROBOTIC(src)) + var/fluid_loss_severity + switch(type) + if(BURN) fluid_loss_severity = FLUIDLOSS_WIDE_BURN + if(LASER) fluid_loss_severity = FLUIDLOSS_CONC_BURN + var/fluid_loss = (damage/(owner.maxHealth - config.health_threshold_dead)) * DEFAULT_BLOOD_AMOUNT * fluid_loss_severity + owner.remove_blood_simple(fluid_loss) + // 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) diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index bdd04260f2a..2437521ffcb 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -125,7 +125,7 @@ item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' slot_flags = SLOT_BELT|SLOT_HOLSTER - max_shots = 5 + max_shots = 7 fire_delay = 4 can_turret = 1 secondary_projectile_type = /obj/item/projectile/beam/pistol diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index bd60b79024e..c1285ea7462 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -26,7 +26,7 @@ eyeblur = 2 /obj/item/projectile/beam/pistol - damage = 30 + damage = 35 /obj/item/projectile/beam/pistol/hegemony icon_state = "hegemony" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 08739d9df8b..4adbe2151d2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -1471,10 +1471,11 @@ if(alien == IS_DIONA) return if(dose < 1) //not that effective after initial rush - M.add_chemical_effect(CE_PAINKILLER, min(20*volume, 80)) + M.add_chemical_effect(CE_PAINKILLER, min(15*volume, 35)) M.add_chemical_effect(CE_PULSE, 1) - M.add_chemical_effect(CE_PAINKILLER, min(10*volume, 20)) - M.add_chemical_effect(CE_PULSE, 2) + else + M.add_chemical_effect(CE_PAINKILLER, min(10*volume, 15)) + M.add_chemical_effect(CE_PULSE, 2) if(dose > 5) M.make_jittery(5) if(volume >= 5 && M.is_asystole()) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d8019e5d3ee..a5f085f0725 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -23,7 +23,7 @@ reagent_ids = list("bicaridine", "kelotane", "dylovene", "dexalin", "norepinephrine", "tramadol", "deltamivir", "thetamycin") /obj/item/reagent_containers/borghypo/rescue - reagent_ids = list("tricordrazine", "norepinephrine", "tramadol") + reagent_ids = list("tricordrazine", "norepinephrine", "tramadol", "adrenaline") /obj/item/reagent_containers/borghypo/Initialize() . = ..() diff --git a/code/modules/research/designs/mechfab/mechs/designs_exosuits.dm b/code/modules/research/designs/mechfab/mechs/designs_exosuits.dm index de47b38c8c3..d85b2fd8a84 100644 --- a/code/modules/research/designs/mechfab/mechs/designs_exosuits.dm +++ b/code/modules/research/designs/mechfab/mechs/designs_exosuits.dm @@ -56,7 +56,7 @@ /datum/design/item/mechfab/exosuit/radproof_armour name = "radiation-proof exosuit armour" id = "mech_armour_radproof" - build_path = /obj/item/robot_parts/robot_component/armour/radproof + build_path = /obj/item/robot_parts/robot_component/armor/radproof time = 50 req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) materials = list(DEFAULT_WALL_MATERIAL = 12500) @@ -64,15 +64,15 @@ /datum/design/item/mechfab/exosuit/em_armour name = "EM-shielded exosuit armour" id = "mech_armour_em" - build_path = /obj/item/robot_parts/robot_component/armour/em + build_path = /obj/item/robot_parts/robot_component/armor/em time = 50 req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 2) materials = list(DEFAULT_WALL_MATERIAL = 12500, "silver" = 1000) /datum/design/item/mechfab/exosuit/combat_armour - name = "Combat exosuit armour" + name = "combat exosuit armor" id = "mech_armour_combat" - build_path = /obj/item/robot_parts/robot_component/armour/combat + build_path = /obj/item/robot_parts/robot_component/armor/combat time = 50 req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 3) materials = list(DEFAULT_WALL_MATERIAL = 20000, "diamond" = 5000) diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm index 3bb69d81f33..453753e9977 100644 --- a/code/modules/spells/targeted/genetic.dm +++ b/code/modules/spells/targeted/genetic.dm @@ -73,7 +73,7 @@ code\game\dna\genes\goon_powers.dm max_targets = 1 cast_sound = 'sound/magic/Mutate.ogg' - mutations = list(LASER, HULK) + mutations = list(LASER_EYES, HULK) duration = 300 level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0) diff --git a/html/changelog.html b/html/changelog.html index 4b7a90d6955..7409502f82d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,39 +1,58 @@ -
-
Baystation 12 / Aurorastation Credit List -
+
+
+GoonStation 13 Development Team
+
+ Coders: Stuntwaffle, Showtime, Pantaloons, Nannek, Keelin, Exadv1, hobnob, Justicefries, 0staf, sniperchance, AngriestIBM, BrianOBlivion
++ Spriters: Supernorn, Haruhi, Stuntwaffle, Pantaloons, Rho, SynthOrange, I Said No + +
Some icons by Yusuke Kamiyamane. All rights reserved. Licensed under a Creative Commons Attribution 3.0 License. + |