From 251297a2bae19dc5615ab5bc92bd6e32f3efac95 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Thu, 8 Feb 2018 12:58:17 -0800 Subject: [PATCH] Promethean Balancing, Lore-compliant Modification of Security Equipment (#4722) * Works on Balancing Prometheans * Reorganize from Master Merge * Tries to fix that gun conflict that the DMI merger apparently did fine? --- .../crates_lockers/closets/l3closet.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 10 ++- .../mob/living/carbon/human/human_powers.dm | 62 +++++++++++------- .../living/carbon/human/species/species.dm | 1 + .../human/species/station/prometheans.dm | 4 +- .../silicon/robot/robot_modules/station.dm | 1 + code/modules/xenobio/items/weapons.dm | 32 ++++++--- icons/obj/gun.dmi | Bin 84933 -> 85637 bytes 8 files changed, 76 insertions(+), 36 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 7c54614aa7..4074230d8d 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -38,7 +38,7 @@ ..() new /obj/item/clothing/suit/bio_suit/security(src) new /obj/item/clothing/head/bio_hood/security(src) - + new /obj/item/weapon/gun/energy/taser/xeno/sec(src) /obj/structure/closet/l3closet/janitor icon_state = "bio_janitor" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a8c12ed082..c28580fe6f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -17,6 +17,8 @@ var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics. var/hiding = 0 // If the mob is hiding or not. Makes them appear under tables and the like. + var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm + var/active_regen_delay = 300 /mob/living/carbon/human/New(var/new_loc, var/new_species = null) @@ -1343,7 +1345,13 @@ return 0 /mob/living/carbon/human/slip(var/slipped_on, stun_duration=8) - if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP))) + var/list/equipment = list(src.w_uniform,src.wear_suit,src.shoes) + var/footcoverage_check = FALSE + for(var/obj/item/clothing/C in equipment) + if(C.body_parts_covered & FEET) + footcoverage_check = TRUE + break + if((species.flags & NO_SLIP && !footcoverage_check) || (shoes && (shoes.item_flags & NOSLIP))) //Footwear negates a species' natural traction. return 0 if(..(slipped_on,stun_duration)) return 1 diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index f1ece7f6e7..445d06a802 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -235,36 +235,50 @@ /mob/living/carbon/human/proc/regenerate() set name = "Regenerate" - set desc = "Allows you to regrow limbs and heal organs." + set desc = "Allows you to regrow limbs and heal organs after a period of rest." set category = "Abilities" if(nutrition < 250) - to_chat(src, "You lack the biomass regrow anything!") + to_chat(src, "You lack the biomass to begin regeneration!") return - nutrition -= 200 + if(active_regen) + to_chat(src, "You are already regenerating tissue!") + return + else + active_regen = TRUE + src.visible_message("[src]'s flesh begins to mend...") - for(var/obj/item/organ/I in internal_organs) - if(I.damage > 0) - I.damage = 0 - to_chat(src, "You feel a soothing sensation within your [I.name]...") + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(src,delay_length)) + nutrition -= 200 - // Replace completely missing limbs. - for(var/limb_type in src.species.has_limbs) - var/obj/item/organ/external/E = src.organs_by_name[limb_type] - if(E && E.disfigured) - E.disfigured = 0 - if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) - E.removed() - qdel(E) - E = null - if(!E) - var/list/organ_data = src.species.has_limbs[limb_type] - var/limb_path = organ_data["path"] - var/obj/item/organ/O = new limb_path(src) - organ_data["descriptor"] = O.name - to_chat(src, "You feel a slithering sensation as your [O.name] reform.") - update_icons_all() + for(var/obj/item/organ/I in internal_organs) + if(I.damage > 0) + I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ. + to_chat(src, "You feel a soothing sensation within your [I.name]...") + + // Replace completely missing limbs. + for(var/limb_type in src.species.has_limbs) + var/obj/item/organ/external/E = src.organs_by_name[limb_type] + if(E && E.disfigured) + E.disfigured = 0 + if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) + E.removed() + qdel(E) + E = null + if(!E) + var/list/organ_data = src.species.has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(src) + organ_data["descriptor"] = O.name + to_chat(src, "You feel a slithering sensation as your [O.name] reform.") + update_icons_all() + active_regen = FALSE + else + to_chat(src, "Your regeneration is interrupted!") + nutrition -= 75 + active_regen = FALSE /mob/living/carbon/human/proc/hide_humanoid() set name = "Hide" @@ -281,4 +295,4 @@ else layer = MOB_LAYER hiding = 0 - to_chat(src, "You have stopped hiding.") \ No newline at end of file + to_chat(src, "You have stopped hiding.") diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 1986b8416a..f91633f22a 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -42,6 +42,7 @@ var/blood_volume = 560 // Initial blood volume. var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster var/hunger_factor = 0.05 // Multiplier for hunger. + var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes. diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 3704b2f912..3eb801dc9d 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -39,7 +39,7 @@ var/datum/species/shapeshifter/promethean/prometheans virus_immune = 1 blood_volume = 560 min_age = 1 - max_age = 5 + max_age = 10 brute_mod = 0.75 burn_mod = 2 oxy_mod = 0 @@ -56,7 +56,7 @@ var/datum/species/shapeshifter/promethean/prometheans body_temperature = 310.15 - siemens_coefficient = 0.3 + siemens_coefficient = 0.4 rarity_value = 5 genders = list(MALE, FEMALE, NEUTER, PLURAL) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 17e6fe252c..96fee9bb51 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -511,6 +511,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/handcuffs/cyborg(src) src.modules += new /obj/item/weapon/melee/baton/robot(src) src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) + src.modules += new /obj/item/weapon/gun/energy/taser/xeno/sec/robot(src) src.modules += new /obj/item/taperoll/police(src) src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src) src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) diff --git a/code/modules/xenobio/items/weapons.dm b/code/modules/xenobio/items/weapons.dm index a1aba76dab..d06ab9fdd3 100644 --- a/code/modules/xenobio/items/weapons.dm +++ b/code/modules/xenobio/items/weapons.dm @@ -56,20 +56,33 @@ name = "xeno taser gun" desc = "Straight out of NT's testing laboratories, this small gun is used to subdue non-humanoid xeno life forms. \ While marketed towards handling slimes, it may be useful for other creatures." - desc = "An easy to use weapon designed by NanoTrasen, for NanoTrasen. This weapon is designed to subdue lesser \ - xeno lifeforms at a distance. It is ineffective at stunning larger lifeforms such as humanoids." icon_state = "taserold" fire_sound = 'sound/weapons/taser2.ogg' charge_cost = 120 // Twice as many shots. projectile_type = /obj/item/projectile/beam/stun/xeno accuracy = 2 // Make it a bit easier to hit the slimes. description_info = "This gun will stun a slime or other lesser lifeform for about two seconds, if hit with the projectile it fires." + description_fluff = "An easy to use weapon designed by NanoTrasen, for NanoTrasen. This weapon is designed to subdue lesser \ + xeno lifeforms at a distance. It is ineffective at stunning larger lifeforms such as humanoids." /obj/item/weapon/gun/energy/taser/xeno/robot // Borg version self_recharge = 1 use_external_power = 1 recharge_time = 3 +/obj/item/weapon/gun/energy/taser/xeno/sec //NT's corner-cutting option for their on-station security. + desc = "An NT Mk30 NL retrofitted to fire beams for subduing non-humanoid xeno life forms." + icon_state = "taserblue" + item_state = "taser" + projectile_type = /obj/item/projectile/beam/stun/xeno/weak + charge_cost = 240 + accuracy = 0 //Same accuracy as a normal Sec taser. + description_fluff = "An NT Mk30 NL retrofitted after the events that occurred aboard the NRS Prometheus." + +/obj/item/weapon/gun/energy/taser/xeno/sec/robot //Cyborg variant of the security xeno-taser. + self_recharge = 1 + use_external_power = 1 + recharge_time = 3 /obj/item/projectile/beam/stun/xeno icon_state = "omni" @@ -83,7 +96,10 @@ tracer_type = /obj/effect/projectile/laser_omni/tracer impact_type = /obj/effect/projectile/laser_omni/impact -/obj/item/projectile/beam/stun/xeno/on_hit(var/atom/target, var/blocked = 0) +/obj/item/projectile/beam/stun/xeno/weak //Weaker variant for non-research equipment, turrets, or rapid fire types. + agony = 3 + +/obj/item/projectile/beam/stun/xeno/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) if(istype(target, /mob/living)) var/mob/living/L = target @@ -91,15 +107,15 @@ if(istype(L, /mob/living/simple_animal/slime)) var/mob/living/simple_animal/SA = L if(SA.intelligence_level <= SA_ANIMAL) // So it doesn't stun hivebots or syndies. - SA.Weaken(2) // Less powerful since its ranged, and therefore safer. + SA.Weaken(round(agony/2)) // Less powerful since its ranged, and therefore safer. if(isslime(SA)) var/mob/living/simple_animal/slime/S = SA - S.adjust_discipline(2) + S.adjust_discipline(round(agony/2)) // Prometheans. if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.species && H.species.name == "Promethean") - var/agony_to_apply = 60 - agony - H.apply_damage(agony_to_apply, HALLOSS) - ..() \ No newline at end of file + if(agony == initial(agony)) + agony = round((14 * agony) - agony) //60-4 = 56, 56 / 4 = 14. Prior was flat 60 - agony of the beam to equate to 60. + ..() diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 4bb7b955a0d63f24e227762615f3854e215babb8..06490a3cb4db875bd16a5eb467fabd863636bc87 100644 GIT binary patch delta 6944 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�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