diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 808e3580f7..16a0a6bcd5 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -12,6 +12,9 @@ var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called +/obj/machinery/atmospherics/pipe/drain_power() + return -1 + /obj/machinery/atmospherics/pipe/New() ..() //so pipes under walls are hidden diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 906069b876..479e097251 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -131,7 +131,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC || H.species.insulated) + if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) return var/power = max(0,min(10,(powerlevel+rand(0,3)))) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b9dc5db81f..a92712af50 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -777,7 +777,7 @@ datum/mind ticker.mode.greet_syndicate(src) log_admin("[key_name_admin(usr)] has merc'd [current].") if("lair") - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + current.loc = pick(synd_spawn) if("dressup") del(H.belt) del(H.back) @@ -1065,7 +1065,7 @@ datum/mind ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + current.loc = pick(synd_spawn) var/mob/living/carbon/human/H = current del(H.belt) diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index d353c77ad0..d8568c8f60 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -149,7 +149,7 @@ src << "We do not know how to parse this creature's DNA!" return - if(NOCLONE in T.mutations) + if(HUSK in T.mutations) src << "This creature's DNA is ruined beyond useability!" return @@ -176,7 +176,6 @@ var/datum/organ/external/affecting = T.get_organ(src.zone_sel.selecting) if(affecting.take_damage(39,0,1,0,"large organic needle")) T:UpdateDamageIcon() - continue feedback_add_details("changeling_powers","A[stage]") if(!do_mob(src, T, 150)) diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index d2b54fe5ba..9c1b30bc89 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -121,7 +121,7 @@ blocks_assigned[G.block]=assignedToBlock //testing("DNA2: Gene [G.name] assigned to block [G.block].") - testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]") + //testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]") // HIDDEN MUTATIONS / SUPERPOWERS INITIALIZTION diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 5219bd22b7..3e91d70f6c 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -19,6 +19,9 @@ var/release_log = "" var/update_flag = 0 +/obj/machinery/portable_atmospherics/canister/drain_power() + return -1 + /obj/machinery/portable_atmospherics/canister/sleeping_agent name = "Canister: \[N2O\]" icon_state = "redws" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 866e2c1b9f..d5c8ae93e2 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -30,6 +30,20 @@ var/secured_wires = 0 var/datum/wires/airlock/wires = null +/obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= 10) + if(src.density) + visible_message("\The [user] forces \the [src] open!") + open() + else + visible_message("\The [user] forces \the [src] closed!") + close() + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + /obj/machinery/door/airlock/command name = "Airlock" icon = 'icons/obj/doors/Doorcom.dmi' diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 306af92f37..f771c16c24 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -37,6 +37,13 @@ dir = EAST var/width = 1 +/obj/machinery/door/attack_generic(var/mob/user, var/damage) + if(damage >= 10) + visible_message("\The [user] smashes into the [src]!") + take_damage(damage) + else + visible_message("\The [user] bonks \the [src] harmlessly.") + /obj/machinery/door/New() . = ..() if(density) @@ -187,7 +194,7 @@ user = null if(!src.requiresID()) user = null - + if(istype(I, /obj/item/stack/sheet/metal)) if(stat & BROKEN) user << "It looks like \the [src] is pretty busted. It's going to need more than just patching up now." @@ -198,11 +205,11 @@ if(!density) user << "\The [src] must be closed before you can repair it." return - + //figure out how much metal we need - var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT + var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc? - + var/obj/item/stack/sheet/metal/metalstack = I var/transfer if (repairing) @@ -214,17 +221,17 @@ if (repairing) repairing.loc = src transfer = repairing.amount - + if (transfer) user << "You fit [transfer] [metalstack.singular_name]\s to damaged and broken parts on \the [src]." - + return if(repairing && istype(I, /obj/item/weapon/weldingtool)) if(!density) user << "\The [src] must be closed before you can repair it." return - + var/obj/item/weapon/weldingtool/welder = I if(welder.remove_fuel(0,user)) user << "You start to fix dents and weld \the [repairing] into place." @@ -249,7 +256,7 @@ open() operating = -1 return 1 - + //psa to whoever coded this, there are plenty of objects that need to call attack() on doors without bludgeoning them. if(src.density && istype(I, /obj/item/weapon) && user.a_intent == "hurt" && !istype(I, /obj/item/weapon/card)) var/obj/item/weapon/W = I @@ -261,7 +268,7 @@ playsound(src.loc, hitsound, 100, 1) take_damage(W.force) return - + if(src.allowed(user) && operable()) if(src.density) open() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 28affd94a8..4bf1c07abc 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -330,6 +330,7 @@ for(i=0,i<4,i++) sleep(50) if(src.OCCUPANT) + OCCUPANT.radiation += 50 var/datum/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs if (!rad_organ) if(src.issuperUV) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index cf6bb1e7dc..c5df032d64 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -26,7 +26,7 @@ var/obj/item/stack/sheet/metal/M = O if (M.use(1)) use(1) - new/obj/item/stack/tile/light(user.loc) + new/obj/item/stack/tile/light(get_turf(user)) user << "You make a light tile." else user << "You need one metal sheet to finish the light tile." diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 8bd126584c..a57463eee7 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -76,17 +76,18 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC || H.species.insulated) + if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin. return if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) ) var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) if(affecting.status & ORGAN_ROBOT) return - H.Weaken(3) if(affecting.take_damage(5, 0)) H.UpdateDamageIcon() H.updatehealth() + if(!(H.species & NO_PAIN)) + H.Weaken(3) ..() // Shrapnel diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 608bd782dc..cd55637b35 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -157,8 +157,11 @@ /obj/structure/window/attack_generic(var/mob/user, var/damage) if(!damage) return - user.visible_message("[user] smashes into [src]!") - take_damage(damage) + if(damage >= 10) + visible_message("[user] smashes into [src]!") + take_damage(damage) + else + visible_message("\The [user] bonks \the [src] harmlessly.") return 1 /obj/structure/window/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 601d889b90..38b60890c0 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -23,9 +23,8 @@ return 0 if(species_restricted && istype(M,/mob/living/carbon/human)) - - var/wearable = null var/exclusive = null + var/wearable = null var/mob/living/carbon/human/H = M if("exclude" in species_restricted) @@ -39,10 +38,9 @@ if(H.species.name in species_restricted) wearable = 1 - if(!wearable && (slot != 15 && slot != 16)) //Pockets. - M << "\red Your species cannot wear [src]." + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + H << "Your species cannot wear [src]." return 0 - return 1 /obj/item/clothing/proc/refit_for_species(var/target_species) @@ -352,6 +350,7 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN + force = 2 species_restricted = list("exclude","Unathi","Tajara") sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi') diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 287d3ed748..637a84e765 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -3,6 +3,7 @@ name = "magboots" icon_state = "magboots0" species_restricted = null + force = 3 var/magpulse = 0 var/icon_base = "magboots" icon_action_button = "action_blank" @@ -13,12 +14,14 @@ flags &= ~NOSLIP slowdown = SHOES_SLOWDOWN magpulse = 0 + force = 3 if(icon_base) icon_state = "[icon_base]0" user << "You disable the mag-pulse traction system." else flags |= NOSLIP slowdown = 2 magpulse = 1 + force = 5 if(icon_base) icon_state = "[icon_base]1" user << "You enable the mag-pulse traction system." user.update_inv_shoes() //so our mob-overlays update diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 13e2aac284..e52b2fce8c 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -19,6 +19,7 @@ name = "\improper SWAT shoes" desc = "When you want to turn up the heat." icon_state = "swat" + force = 3 armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) flags = NOSLIP siemens_coefficient = 0.6 @@ -27,6 +28,7 @@ name = "combat boots" desc = "When you REALLY want to turn up the heat" icon_state = "swat" + force = 5 armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) flags = NOSLIP siemens_coefficient = 0.6 @@ -65,6 +67,7 @@ item_state = "clown_shoes" slowdown = SHOES_SLOWDOWN+1 item_color = "clown" + force = 0 var/footstep = 1 //used for squeeks whilst walking species_restricted = null @@ -74,6 +77,7 @@ icon_state = "jackboots" item_state = "jackboots" item_color = "hosred" + force = 3 siemens_coefficient = 0.7 /obj/item/clothing/shoes/cult @@ -82,6 +86,7 @@ icon_state = "cult" item_state = "cult" item_color = "cult" + force = 2 siemens_coefficient = 0.7 cold_protection = FEET @@ -100,6 +105,7 @@ desc = "Fluffy!" icon_state = "slippers" item_state = "slippers" + force = 0 species_restricted = null w_class = 2 @@ -108,6 +114,7 @@ desc = "Fluffy..." icon_state = "slippers_worn" item_state = "slippers_worn" + force = 0 w_class = 2 /obj/item/clothing/shoes/laceup diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index c45fdd7fd3..f8457375cc 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -142,6 +142,7 @@ toggleable = 1 use_power_cost = 50 active_power_cost = 5 + passive_power_cost = 0 gun_type = /obj/item/weapon/gun/energy/crossbow/ninja @@ -152,7 +153,7 @@ deactivate() return 0 - ..() + return ..() /obj/item/rig_module/mounted/energy_blade/activate() diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 63231dcd95..12ea8e7fb2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -172,14 +172,14 @@ engage() /obj/item/rig_module/self_destruct/engage() - explosion(get_turf(src), 0, 0, 3, 4) + explosion(get_turf(src), 1, 2, 4, 5) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) del(holder) del(src) /obj/item/rig_module/self_destruct/small/engage() - explosion(get_turf(src), 0, 0, 1, 2) + explosion(get_turf(src), 0, 0, 3, 4) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) del(holder) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 196d3d5d76..ba6096b1b4 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -22,6 +22,7 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.1 permeability_coefficient = 0.1 + unacidable = 1 var/interface_path = "hardsuit.tmpl" var/ai_interface_path = "hardsuit.tmpl" @@ -141,6 +142,7 @@ piece.max_heat_protection_temperature = max_heat_protection_temperature piece.siemens_coefficient = siemens_coefficient piece.permeability_coefficient = permeability_coefficient + piece.unacidable = unacidable update_icon(1) diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 1b54b8f1ee..061973c137 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -117,7 +117,10 @@ user << "There is not tank to remove." return - user.put_in_hands(air_supply) + if(user.r_hand && user.l_hand) + air_supply.loc = get_turf(user) + else + user.put_in_hands(air_supply) user << "You detach and remove \the [air_supply]." air_supply = null return @@ -146,7 +149,10 @@ user << "You detatch \the [cell] from \the [src]'s battery mount." for(var/obj/item/rig_module/module in installed_modules) module.deactivate() - cell.loc = user.put_in_hands(cell) + if(user.r_hand && user.l_hand) + cell.loc = get_turf(user) + else + cell.loc = user.put_in_hands(cell) cell = null else user << "There is nothing loaded in that mount." diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index d6510a1f8a..4191a8d140 100755 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -61,7 +61,9 @@ var/ending = copytext(scrambled_text, length(scrambled_text)) if(ending == ".") scrambled_text = copytext(scrambled_text,1,length(scrambled_text)-1) - scrambled_text += copytext(input, length(input)) + var/input_ending = copytext(input, input_size) + if(input_ending in list("!","?",".")) + scrambled_text += input_ending return scrambled_text /datum/language/proc/format_message(message, verb) @@ -251,11 +253,11 @@ space_chance = 100 syllables = list("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", - "magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud", - "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo", - "consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in", - "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla", - "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt", + "magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud", + "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo", + "consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in", + "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla", + "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt", "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum") /datum/language/gutter diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 42de429752..b1170468d8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -90,9 +90,8 @@ return 0 src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") - playsound(loc, "sparks", 50, 1, -1) - if (shock_damage > 10) + if (shock_damage > 15) src.visible_message( "\red [src] was shocked by the [source]!", \ "\red You feel a powerful shock course through your body!", \ @@ -200,7 +199,7 @@ if (istype(src,/mob/living/carbon/human) && src:w_uniform) var/mob/living/carbon/human/H = src H.w_uniform.add_fingerprint(M) - + if(player_logged) M.visible_message("[M] shakes [src] trying to wake [t_him] up!", \ "You shake [src], but they do not respond... Maybe they have S.S.D?") diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index ef0a507c20..9ed050b5ae 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -84,7 +84,7 @@ /mob/living/carbon/human/proc/Drain() ChangeToHusk() - //mutations |= NOCLONE + mutations |= HUSK return /mob/living/carbon/human/proc/ChangeToSkeleton() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 070084a471..bb02aee5e0 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -184,7 +184,7 @@ return 0 var/real_damage = rand_damage - real_damage += attack.damage // Adding species attack base damage + real_damage += attack.get_unarmed_damage(H) real_damage *= damage_multiplier rand_damage *= damage_multiplier if(HULK in H.mutations) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index cd91d77cf3..3cefdc836d 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -77,8 +77,8 @@ emp_act if (affected.status & ORGAN_ROBOT) emote("me", 1, "drops what they were holding, their [affected.display_name] malfunctioning!") else - var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and") - emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [affected.display_name]!") + var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") + emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [affected.display_name]!") ..(stun_amount, agony_amount, def_zone) @@ -107,7 +107,7 @@ emp_act if (!def_zone) return 1.0 - var/siemens_coefficient = 1.0 + var/siemens_coefficient = species.siemens_coefficient var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking? for(var/obj/item/clothing/C in clothing_items) @@ -282,7 +282,7 @@ emp_act forcesay(hit_appends) //forcesay checks stat already //Melee weapon embedded object code. - if (I.damtype == BRUTE && !I.is_robot_module()) + if (I && I.damtype == BRUTE && !I.is_robot_module()) var/damage = I.force if (armor) damage /= armor+1 diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 9996efc8b6..13dd13413e 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -98,7 +98,7 @@ T.Weaken(5) //Only official cool kids get the grab and no self-prone. - if(src.mind && !src.mind.special_role) + if(!(src.mind && src.mind.special_role)) src.Weaken(5) return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 808025cf5f..194050bc26 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -280,6 +280,7 @@ radiation -= rads nutrition += rads adjustBruteLoss(-(rads)) + adjustFireLoss(-(rads)) adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) updatehealth() @@ -949,10 +950,11 @@ traumatic_shock -= light_amount if(species.flags & IS_PLANT) - if(nutrition > 500) - nutrition = 500 + if(nutrition > 450) + nutrition = 450 if(light_amount >= 3) //if there's enough light, heal - adjustBruteLoss(-(light_amount)) + adjustBruteLoss(-(round(light_amount/2))) + adjustFireLoss(-(round(light_amount/2))) adjustToxLoss(-(light_amount)) adjustOxyLoss(-(light_amount)) //TODO: heal wounds, heal broken limbs. @@ -995,7 +997,7 @@ proc/handle_regular_status_updates() if(status_flags & GODMODE) return 0 - + //SSD check, if a logged player is awake put them back to sleep! if(player_logged && sleeping < 2) sleeping = 2 @@ -1055,7 +1057,7 @@ adjustHalLoss(-3) if (mind) //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar. - if(player_logged) + if(player_logged) sleeping = max(sleeping-1, 2) else sleeping = max(sleeping-1, 0) diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm index e9584143ee..fa40f8ee00 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm @@ -10,6 +10,7 @@ light_dam = 2 darksight = 8 has_organ = list() + siemens_coefficient = 0 blood_color = "#CCCCCC" flesh_color = "#AAAAAA" diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index 3c44fbd5c6..bf007450e3 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -28,7 +28,7 @@ breath_type = "nitrogen" poison_type = "oxygen" - insulated = 1 + siemens_coefficient = 0.2 flags = IS_WHITELISTED | NO_SCAN | HAS_EYE_COLOR diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 119e624550..64783251ef 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -72,7 +72,7 @@ // Body/form vars. var/list/inherent_verbs // Species-specific verbs. var/has_fine_manipulation = 1 // Can use small items. - var/insulated // Immune to electrocution and glass shards to the feet. + var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation. var/darksight = 2 // Native darksight distance. var/flags = 0 // Various specific features. var/slowdown = 0 // Passive movement speed malus (or boost, if negative) diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 4ebfb91092..fe5eac0f07 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -1,87 +1,3 @@ -//Species unarmed attacks -/datum/unarmed_attack - var/attack_verb = list("attack") // Empty hand hurt intent verb. - var/attack_noun = list("fist") - var/damage = 0 // Extra empty hand attack damage. - var/attack_sound = "punch" - var/miss_sound = 'sound/weapons/punchmiss.ogg' - var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent. - var/sharp = 0 - var/edge = 0 - -/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user) - if(user.restrained()) - return 0 - - // Check if they have a functioning hand. - var/datum/organ/external/E = user.organs_by_name["l_hand"] - if(E && !(E.status & ORGAN_DESTROYED)) - return 1 - - E = user.organs_by_name["r_hand"] - if(E && !(E.status & ORGAN_DESTROYED)) - return 1 - - return 0 - -/datum/unarmed_attack/proc/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone) - - var/stun_chance = rand(0, 100) - - if(attack_damage >= 5 && armour < 2 && !(target == user) && stun_chance <= attack_damage * 5) // 25% standard chance - switch(zone) // strong punches can have effects depending on where they hit - if("head", "mouth", "eyes") - // Induce blurriness - target.visible_message("[target] looks dazed.", "You see stars.") - target.apply_effect(attack_damage*2, EYE_BLUR, armour) - if("l_arm", "l_hand") - if (target.l_hand) - // Disarm left hand - target.visible_message("[src] [pick("dropped", "let go off")] \the [target.l_hand][pick("", " with a scream")]!") - target.drop_l_hand() - if("r_arm", "r_hand") - if (target.r_hand) - // Disarm right hand - target.visible_message("[src] [pick("dropped", "let go off")] \the [target.r_hand][pick("", " with a scream")]!") - target.drop_r_hand() - if("chest") - if(!target.lying) - var/turf/T = get_step(get_turf(target), get_dir(get_turf(user), get_turf(target))) - if(!T.density) - step(target, get_dir(get_turf(user), get_turf(target))) - target.visible_message("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]") - else - target.visible_message("[target] slams into [T]!") - if(prob(50)) - target.set_dir(reverse_dir[target.dir]) - target.apply_effect(attack_damage * 0.4, WEAKEN, armour) - if("groin") - target.visible_message("[target] looks like \he is in pain!", "[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]") - target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour) - if("l_leg", "l_foot", "r_leg", "r_foot") - if(!target.lying) - target.visible_message("[src] gives way slightly.") - target.apply_effect(attack_damage*3, AGONY, armour) - else if(attack_damage >= 5 && !(target == user) && (stun_chance + attack_damage * 5 >= 100) && armour < 2) // Chance to get the usual throwdown as well (25% standard chance) - if(!target.lying) - target.visible_message("[target] [pick("slumps", "falls", "drops")] down to the ground!") - else - target.visible_message("[target] has been weakened!") - target.apply_effect(3, WEAKEN, armour) - -/datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - var/datum/organ/external/affecting = target.get_organ(zone) - user.visible_message("[user] [pick(attack_verb)] [target] in the [affecting.display_name]!") - playsound(user.loc, attack_sound, 25, 1, -1) - -/datum/unarmed_attack/bite - attack_verb = list("bit") - attack_sound = 'sound/weapons/bite.ogg' - shredding = 0 - damage = 0 - sharp = 0 - edge = 0 - /datum/unarmed_attack/bite/sharp //eye teeth attack_verb = list("bit", "chomped on") attack_sound = 'sound/weapons/bite.ogg' @@ -90,120 +6,6 @@ sharp = 1 edge = 1 -/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) - if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) - return 0 - if (user == target && (zone == "head" || zone == "eyes" || zone == "mouth")) - return 0 - return 1 - -/datum/unarmed_attack/punch - attack_verb = list("punched") - attack_noun = list("fist") - damage = 0 - -/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - var/datum/organ/external/affecting = target.get_organ(zone) - var/organ = affecting.display_name - - attack_damage = Clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case. - - if(target == user) - user.visible_message("[user] [pick(attack_verb)] \himself in the [organ]!") - return 0 - - if(!target.lying) - switch(zone) - if("head", "mouth", "eyes") - // ----- HEAD ----- // - switch(attack_damage) - if(1 to 2) user.visible_message("[user] slapped [target] across \his cheek!") - if(3 to 4) user.visible_message("[user] struck [target] in the head[pick("", " with a closed fist")]!") - if(5) user.visible_message("[user] gave [target] a resounding slap to the face!") - if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_let", "l_foot", "r_foot") - // ----- BODY ----- // - switch(attack_damage) - if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!") - if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") - if(5) user.visible_message("[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!") - else - user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!") - -/datum/unarmed_attack/kick - attack_verb = list("kicked", "kneed") - attack_noun = list("kick") - attack_sound = "swing_hit" - damage = 1 - -/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) - if (target.legcuffed) - return 0 - - if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin"))) - return 0 - - var/datum/organ/external/E = user.organs_by_name["l_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) - return 1 - - E = user.organs_by_name["r_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) - return 1 - - return 0 - -/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - var/datum/organ/external/affecting = target.get_organ(zone) - var/organ = affecting.display_name - - attack_damage = Clamp(attack_damage, 1, 5) - - switch(zone) - if("groin", "l_leg", "r_leg") - // -- LOWER BODY -- // - switch(attack_damage) - if(1 to 2) user.visible_message("[user] gave [target] a light [pick(attack_noun)] to the [organ]!") - if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") - if(5) user.visible_message("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!") - if("l_foot", "r_foot") - // ----- FEET ----- // - switch(attack_damage) - if(1 to 4) user.visible_message("[user] kicked [target] in \his [organ]!") - if(5) user.visible_message("[user] stomped down hard on [target]'s [organ]!") - -/datum/unarmed_attack/stomp - attack_verb = null - attack_noun = list("kick") - attack_sound = "swing_hit" - damage = 3 - -/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) - if (target.legcuffed) - return 0 - - if (target.lying && !user.lying) - var/datum/organ/external/E = user.organs_by_name["l_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) - return 1 - - E = user.organs_by_name["r_foot"] - if(E && !(E.status & ORGAN_DESTROYED)) - return 1 - - return 0 - -/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - var/datum/organ/external/affecting = target.get_organ(zone) - var/organ = affecting.display_name - - attack_damage = Clamp(attack_damage, 1, 5) - - switch(attack_damage) - if(1 to 3) - user.visible_message("[user] [pick("gave a kick against", "kicked against", "stomped down on", "slammed their foot into")] [target]'s [organ]!") - if(4 to 5) - user.visible_message("[user] [pick("landed a strong kick against", "kicked against", "stomped down hard on", "rammed their foot into")] [target]'s [organ]!") - /datum/unarmed_attack/diona attack_verb = list("lashed", "bludgeoned") attack_noun = list("tendril") diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm index 7a041691b1..b7b05f48c9 100644 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -6,7 +6,7 @@ var/has_pressure = 1 // Draw the pressure indicator. var/has_nutrition = 1 // Draw the nutrition indicator. var/has_bodytemp = 1 // Draw the bodytemp indicator. - var/has_hands = 1 // Set to draw shand. + var/has_hands = 1 // Set to draw hands. var/has_drop = 1 // Set to draw drop button. var/has_throw = 1 // Set to draw throw button. var/has_resist = 1 // Set to draw resist button. @@ -18,8 +18,8 @@ // unless you know exactly what it does. var/list/gear = list( "i_clothing" = list("loc" = ui_iclothing, "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), - "o_clothing" = list("loc" = ui_oclothing, "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), - "mask" = list("loc" = ui_mask, "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), + "o_clothing" = list("loc" = ui_oclothing, "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), + "mask" = list("loc" = ui_mask, "slot" = slot_wear_mask, "state" = "equip", "toggle" = 1, "dir" = NORTH), "gloves" = list("loc" = ui_gloves, "slot" = slot_gloves, "state" = "gloves", "toggle" = 1), "eyes" = list("loc" = ui_glasses, "slot" = slot_glasses, "state" = "glasses","toggle" = 1), "l_ear" = list("loc" = ui_l_ear, "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), @@ -51,3 +51,18 @@ equip_slots |= slot_tie equip_slots |= slot_legcuffed + +/datum/hud_data/diona + has_internals = 0 + gear = list( + "i_clothing" = list("loc" = ui_iclothing, "slot" = slot_w_uniform, "state" = "center", "toggle" = 1, "dir" = SOUTH), + "o_clothing" = list("loc" = ui_shoes, "slot" = slot_wear_suit, "state" = "equip", "toggle" = 1, "dir" = SOUTH), + "l_ear" = list("loc" = ui_gloves, "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), + "head" = list("loc" = ui_oclothing, "slot" = slot_head, "state" = "hair", "toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "slot" = slot_s_store, "state" = "belt", "dir" = 8), + "back" = list("loc" = ui_back, "slot" = slot_back, "state" = "back", "dir" = NORTH), + "id" = list("loc" = ui_id, "slot" = slot_wear_id, "state" = "id", "dir" = NORTH), + "storage1" = list("loc" = ui_storage1, "slot" = slot_l_store, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "slot" = slot_r_store, "state" = "pocket"), + "belt" = list("loc" = ui_belt, "slot" = slot_belt, "state" = "belt") + ) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index 137472a23a..7d7b364f5d 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -8,6 +8,7 @@ language = "Sol Common" //todo? unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch) flags = IS_RESTRICTED | NO_BREATHE | NO_PAIN | NO_BLOOD | IS_SYNTHETIC | NO_SCAN | NO_POISON + siemens_coefficient = 0 breath_type = null poison_type = null diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm index 9fc44f7e30..d573558143 100644 --- a/code/modules/mob/living/carbon/human/species/station/slime.dm +++ b/code/modules/mob/living/carbon/human/species/station/slime.dm @@ -8,17 +8,23 @@ language = "Sol Common" //todo? unarmed_types = list(/datum/unarmed_attack/slime_glomp) flags = IS_RESTRICTED | NO_BLOOD | NO_SCAN | NO_SLIP | NO_BREATHE + siemens_coefficient = 3 darksight = 3 blood_color = "#05FF9B" flesh_color = "#05FFFB" + remains_type = /obj/effect/decal/cleanable/ash + death_message = "rapidly loses cohesion, splattering across the ground..." + has_organ = list( "brain" = /datum/organ/internal/brain/slime ) - inherent_verbs = list( - ) - breath_type = null - poison_type = null \ No newline at end of file + poison_type = null + +/datum/species/slime/handle_death(var/mob/living/carbon/human/H) + spawn(1) + if(H) + H.gib() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 83fa48e48f..91852a83d7 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -107,6 +107,9 @@ primitive = /mob/living/carbon/alien/diona slowdown = 7 rarity_value = 3 + hud_type = /datum/hud_data/diona + siemens_coefficient = 0.3 + blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \ diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 51e466f176..5159dba0fa 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -10,7 +10,7 @@ rarity_value = 3 has_fine_manipulation = 0 - insulated = 1 + siemens_coefficient = 0 gluttonous = 2 eyes = "blank_eyes" diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index e69de29bb2..ca3d955109 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -0,0 +1,204 @@ +//Species unarmed attacks +/datum/unarmed_attack + var/attack_verb = list("attack") // Empty hand hurt intent verb. + var/attack_noun = list("fist") + var/damage = 0 // Extra empty hand attack damage. + var/attack_sound = "punch" + var/miss_sound = 'sound/weapons/punchmiss.ogg' + var/shredding = 0 // Calls the old attack_alien() behavior on objects/mobs when on harm intent. + var/sharp = 0 + var/edge = 0 + +/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user) + if(user.restrained()) + return 0 + + // Check if they have a functioning hand. + var/datum/organ/external/E = user.organs_by_name["l_hand"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + E = user.organs_by_name["r_hand"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + return 0 + +/datum/unarmed_attack/proc/get_unarmed_damage() + return damage + +/datum/unarmed_attack/proc/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone) + + var/stun_chance = rand(0, 100) + + if(attack_damage >= 5 && armour < 2 && !(target == user) && stun_chance <= attack_damage * 5) // 25% standard chance + switch(zone) // strong punches can have effects depending on where they hit + if("head", "mouth", "eyes") + // Induce blurriness + target.visible_message("[target] looks dazed.", "You see stars.") + target.apply_effect(attack_damage*2, EYE_BLUR, armour) + if("l_arm", "l_hand") + if (target.l_hand) + // Disarm left hand + target.visible_message("[src] [pick("dropped", "let go off")] \the [target.l_hand][pick("", " with a scream")]!") + target.drop_l_hand() + if("r_arm", "r_hand") + if (target.r_hand) + // Disarm right hand + target.visible_message("[src] [pick("dropped", "let go off")] \the [target.r_hand][pick("", " with a scream")]!") + target.drop_r_hand() + if("chest") + if(!target.lying) + var/turf/T = get_step(get_turf(target), get_dir(get_turf(user), get_turf(target))) + if(!T.density) + step(target, get_dir(get_turf(user), get_turf(target))) + target.visible_message("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]") + else + target.visible_message("[target] slams into [T]!") + if(prob(50)) + target.set_dir(reverse_dir[target.dir]) + target.apply_effect(attack_damage * 0.4, WEAKEN, armour) + if("groin") + target.visible_message("[target] looks like \he is in pain!", "[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]") + target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour) + if("l_leg", "l_foot", "r_leg", "r_foot") + if(!target.lying) + target.visible_message("[src] gives way slightly.") + target.apply_effect(attack_damage*3, AGONY, armour) + else if(attack_damage >= 5 && !(target == user) && (stun_chance + attack_damage * 5 >= 100) && armour < 2) // Chance to get the usual throwdown as well (25% standard chance) + if(!target.lying) + target.visible_message("[target] [pick("slumps", "falls", "drops")] down to the ground!") + else + target.visible_message("[target] has been weakened!") + target.apply_effect(3, WEAKEN, armour) + +/datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/datum/organ/external/affecting = target.get_organ(zone) + user.visible_message("[user] [pick(attack_verb)] [target] in the [affecting.display_name]!") + playsound(user.loc, attack_sound, 25, 1, -1) + +/datum/unarmed_attack/bite + attack_verb = list("bit") + attack_sound = 'sound/weapons/bite.ogg' + shredding = 0 + damage = 0 + sharp = 0 + edge = 0 + +/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) + if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) + return 0 + if (user == target && (zone == "head" || zone == "eyes" || zone == "mouth")) + return 0 + return 1 + +/datum/unarmed_attack/punch + attack_verb = list("punched") + attack_noun = list("fist") + damage = 0 + +/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/datum/organ/external/affecting = target.get_organ(zone) + var/organ = affecting.display_name + + attack_damage = Clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case. + + if(target == user) + user.visible_message("[user] [pick(attack_verb)] \himself in the [organ]!") + return 0 + + if(!target.lying) + switch(zone) + if("head", "mouth", "eyes") + // ----- HEAD ----- // + switch(attack_damage) + if(1 to 2) user.visible_message("[user] slapped [target] across \his cheek!") + if(3 to 4) user.visible_message("[user] struck [target] in the head[pick("", " with a closed fist")]!") + if(5) user.visible_message("[user] gave [target] a resounding slap to the face!") + if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_let", "l_foot", "r_foot") + // ----- BODY ----- // + switch(attack_damage) + if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!") + if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") + if(5) user.visible_message("[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!") + else + user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!") + +/datum/unarmed_attack/kick + attack_verb = list("kicked", "kneed") + attack_noun = list("kick", "knee strike") + attack_sound = "swing_hit" + damage = 0 + +/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) + if (user.legcuffed) + return 0 + + if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin"))) + return 0 + + var/datum/organ/external/E = user.organs_by_name["l_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + E = user.organs_by_name["r_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + return 0 + +/datum/unarmed_attack/kick/get_unarmed_damage(var/mob/living/carbon/human/user) + var/obj/item/clothing/shoes = user.shoes + if(!istype(shoes)) + return damage + return damage + (shoes ? shoes.force : 0) + +/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/datum/organ/external/affecting = target.get_organ(zone) + var/organ = affecting.display_name + + attack_damage = Clamp(attack_damage, 1, 5) + + switch(attack_damage) + if(1 to 2) user.visible_message("[user] gave [target] a light [pick(attack_noun)] to the [organ]!") + if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") + if(5) user.visible_message("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!") + +/datum/unarmed_attack/stomp + attack_verb = null + attack_noun = list("kick") + attack_sound = "swing_hit" + damage = 0 + +/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) + if (user.legcuffed) + return 0 + + if (!user.lying && (target.lying || zone in list("l_foot", "r_foot"))) + if(target.grabbed_by == user && target.lying) + return 0 + var/datum/organ/external/E = user.organs_by_name["l_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + E = user.organs_by_name["r_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + return 0 + +/datum/unarmed_attack/stomp/get_unarmed_damage(var/mob/living/carbon/human/user) + var/obj/item/clothing/shoes = user.shoes + return damage + (shoes ? shoes.force : 0) + +/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/datum/organ/external/affecting = target.get_organ(zone) + var/organ = affecting.display_name + var/obj/item/clothing/shoes = user.shoes + + attack_damage = Clamp(attack_damage, 1, 5) + + switch(attack_damage) + if(1 to 2) user.visible_message("[user] [pick("clomped on", "treaded on")] [target]'s [organ]!") + if(3 to 4) user.visible_message("[pick("[user] stomped down on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") + if(5) user.visible_message("[pick("[user] landed a devastating stomp on", "[user] stomped down hard on", "[user] slammed \his [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 88000af9eb..cc053f219d 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -388,9 +388,6 @@ proc/get_damage_icon_part(damage_state, body_part) //tail update_tail_showing(0) - - - //HAIR OVERLAY /mob/living/carbon/human/proc/update_hair(var/update_icons=1) //Reset our hair @@ -411,7 +408,7 @@ proc/get_damage_icon_part(damage_state, body_part) if(f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style && facial_hair_style.species_allowed && src.species.name in facial_hair_style.species_allowed) + if(facial_hair_style && facial_hair_style.species_allowed && (src.species.name in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index e340909790..f6d5de69cb 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -829,8 +829,8 @@ Note that amputating the affected organ does in fact remove the infection from t if(is_broken()) owner.u_equip(c_hand) - var/emote_scream = pick("screams in pain and", "lets out a sharp cry and", "cries out and") - owner.emote("me", 1, "[(owner.species && owner.species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [hand_name]!") + var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") + owner.emote("me", 1, "[(owner.species && owner.species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [hand_name]!") if(is_malfunctioning()) owner.u_equip(c_hand) owner.emote("me", 1, "drops what they were holding, their [hand_name] malfunctioning!") diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 7b9c9f5847..76b712d4cb 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -301,10 +301,11 @@ if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M + if(H.species.siemens_coefficient == 0) + return if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on - var/area/source_area if(istype(power_source,/area)) source_area = power_source diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 9c30e31102..87d214f067 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -91,7 +91,6 @@ if(AC.BB) in_chamber = AC.BB //Load projectile into chamber. - AC.BB.loc = src //Set projectile loc to gun. return 1 return 0 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 7e11d25f9a..bd2e5001e4 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1594,7 +1594,7 @@ datum id = "phoron" description = "Phoron in its liquid form." reagent_state = LIQUID - color = "#E71B00" // rgb: 231, 27, 0 + color = "#9D14DB" toxpwr = 3 on_mob_life(var/mob/living/M as mob)