April sync (#360)

* Maps and things no code/icons

* helpers defines globalvars

* Onclick world.dm orphaned_procs

* subsystems

Round vote and shuttle autocall done here too

* datums

* Game folder

* Admin - chatter modules

* clothing - mining

* modular computers - zambies

* client

* mob level 1

* mob stage 2 + simple_animal

* silicons n brains

* mob stage 3 + Alien/Monkey

* human mobs

* icons updated

* some sounds

* emitter y u no commit

* update tgstation.dme

* compile fixes

* travis fixes

Also removes Fast digest mode, because reasons.

* tweaks for travis Mentors are broke again

Also fixes Sizeray guns

* oxygen loss fix for vore code.

* removes unused code

* some code updates

* bulk fixes

* further fixes

* outside things

* whoops.

* Maint bar ported

* GLOBs.
This commit is contained in:
Poojawa
2017-04-13 23:37:00 -05:00
committed by GitHub
parent cdc32c98fa
commit 7e9b96a00f
1322 changed files with 174827 additions and 23888 deletions

View File

@@ -20,9 +20,6 @@
user.visible_message("[user] severs [L]'s [parse_zone(target_zone)]!", "<span class='notice'>You sever [L]'s [parse_zone(target_zone)].</span>")
if(surgery.operated_bodypart)
var/obj/item/bodypart/target_limb = surgery.operated_bodypart
var/obj/item/held_item = L.get_item_for_held_index(target_limb.held_index)
target_limb.drop_limb()
if(held_item && held_item.flags & NODROP)
qdel(target_limb) // arm is ruined
return 1

View File

@@ -20,6 +20,7 @@
var/max_damage = 0
var/list/embedded_objects = list()
var/held_index = 0 //are we a hand? if so, which one!
var/is_pseudopart = FALSE //For limbs that don't really exist, eg chainsaws
//Coloring and proper item icon update
var/skin_tone = ""
@@ -554,4 +555,4 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "severedtail"
color = "#161"
var/markings = "Smooth"
var/markings = "Smooth"

View File

@@ -30,7 +30,7 @@
var/turf/location = C.loc
if(istype(location))
C.add_splatter_floor(location)
var/direction = pick(cardinal)
var/direction = pick(GLOB.cardinal)
var/t_range = rand(2,max(throw_range/2, 2))
var/turf/target_turf = get_turf(src)
for(var/i in 1 to t_range-1)
@@ -86,6 +86,7 @@
var/mob/living/carbon/C = owner
update_limb(1)
C.bodyparts -= src
if(held_index)
C.dropItemToGround(owner.get_item_for_held_index(held_index), 1)
C.hand_bodyparts[held_index] = null
@@ -125,6 +126,9 @@
C.update_body()
C.update_hair()
C.update_canmove()
if(is_pseudopart)
drop_organs(C) //Psuedoparts shouldn't have organs, but just in case
qdel(src)
//when a limb is dropped, the internal organs are removed from the mob and put into the limb

View File

@@ -126,7 +126,7 @@
if(status != BODYPART_ROBOTIC) //having a robotic head hides certain features.
//facial hair
if(facial_hair_style)
S = facial_hair_styles_list[facial_hair_style]
S = GLOB.facial_hair_styles_list[facial_hair_style]
if(S)
var/image/img_facial = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER, "dir"=SOUTH)
img_facial.color = "#" + facial_hair_color
@@ -143,7 +143,7 @@
standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER, "dir"=SOUTH)
else
if(hair_style)
S = hair_styles_list[hair_style]
S = GLOB.hair_styles_list[hair_style]
if(S)
var/image/img_hair = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER, "dir"=SOUTH)
img_hair.color = "#" + hair_color

View File

@@ -1,3 +1,5 @@
/obj/item/bodypart/l_arm/robot
name = "cyborg left arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
@@ -186,4 +188,4 @@
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/surplus_augments.dmi'
icon_state = "surplus_r_leg"
max_damage = 20
max_damage = 20

View File

@@ -20,7 +20,7 @@
current_surgery = S
if(!current_surgery)
var/list/all_surgeries = surgeries_list.Copy()
var/list/all_surgeries = GLOB.surgeries_list.Copy()
var/list/available_surgeries = list()
for(var/datum/surgery/S in all_surgeries)
@@ -31,6 +31,8 @@
continue
if(S.requires_organic_bodypart && affecting.status == BODYPART_ROBOTIC)
continue
if(S.requires_real_bodypart && affecting.is_pseudopart)
continue
else if(C && S.requires_bodypart) //mob with no limb in surgery zone when we need a limb
continue
if(!S.can_start(user, M))

View File

@@ -1,3 +1,4 @@
/////AUGMENTATION SURGERIES//////
@@ -42,6 +43,7 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/add_limb)
species = list(/mob/living/carbon/human)
possible_locs = list("r_arm","l_arm","r_leg","l_leg","chest","head")
requires_real_bodypart = TRUE
//SURGERY STEP SUCCESSES
@@ -58,4 +60,4 @@
add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
to_chat(user, "<span class='warning'>[target] has no organic [parse_zone(target_zone)] there!</span>")
return 1
return 1

View File

@@ -4,7 +4,8 @@
/datum/surgery_step/incise, /datum/surgery_step/manipulate_organs)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list("chest", "head")
requires_organic_bodypart = 0
requires_organic_bodypart = FALSE
requires_real_bodypart = TRUE
/datum/surgery/organ_manipulation/soft
possible_locs = list("groin", "eyes", "mouth", "l_arm", "r_arm")

View File

@@ -17,13 +17,13 @@
/obj/item/organ/cyberimp/eyes/hud/Insert(var/mob/living/carbon/M, var/special = 0)
..()
if(HUD_type)
var/datum/atom_hud/H = huds[HUD_type]
var/datum/atom_hud/H = GLOB.huds[HUD_type]
H.add_hud_to(M)
M.permanent_huds |= H
/obj/item/organ/cyberimp/eyes/hud/Remove(var/mob/living/carbon/M, var/special = 0)
if(HUD_type)
var/datum/atom_hud/H = huds[HUD_type]
var/datum/atom_hud/H = GLOB.huds[HUD_type]
M.permanent_huds ^= H
H.remove_hud_from(M)
..()

View File

@@ -117,6 +117,7 @@
return
crit_fail = TRUE
addtimer(CALLBACK(src, .proc/reboot), 90 / severity)
..()
/obj/item/organ/cyberimp/brain/anti_stun/proc/reboot()
crit_fail = FALSE
@@ -144,28 +145,19 @@
//BOX O' IMPLANTS
/obj/item/weapon/storage/box/cyber_implants
name = "boxed cybernetic implant"
name = "boxed cybernetic implants"
desc = "A sleek, sturdy box."
icon_state = "cyber_implants"
/obj/item/weapon/storage/box/cyber_implants/New(loc, implant)
..()
new /obj/item/device/autoimplanter(src)
if(ispath(implant))
new implant(src)
/obj/item/weapon/storage/box/cyber_implants/bundle
name = "boxed cybernetic implants"
var/list/boxed = list(
/obj/item/organ/eyes/robotic/xray,
/obj/item/organ/eyes/robotic/thermals,
/obj/item/organ/cyberimp/brain/anti_stun,
/obj/item/organ/cyberimp/chest/reviver)
/obj/item/device/autosurgeon/thermal_eyes,
/obj/item/device/autosurgeon/xray_eyes,
/obj/item/device/autosurgeon/anti_stun,
/obj/item/device/autosurgeon/reviver)
var/amount = 5
/obj/item/weapon/storage/box/cyber_implants/bundle/New()
..()
var/implant
while(contents.len <= amount + 1) // +1 for the autoimplanter.
while(contents.len <= amount)
implant = pick(boxed)
new implant(src)

View File

@@ -0,0 +1,84 @@
#define INFINITE -1
/obj/item/device/autosurgeon
name = "autosurgeon"
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert implants/organs and a screwdriver slot for removing accidentally added items."
icon_state = "autoimplanter"
item_state = "walkietalkie"//left as this so as to intentionally not have inhands
w_class = WEIGHT_CLASS_SMALL
var/obj/item/organ/storedorgan
var/organ_type = /obj/item/organ
var/uses = INFINITE
var/starting_organ
/obj/item/device/autosurgeon/Initialize(mapload)
..()
if(starting_organ)
insert_organ(new starting_organ(src))
/obj/item/device/autosurgeon/proc/insert_organ(var/obj/item/I)
storedorgan = I
I.forceMove(src)
name = "[initial(name)] ([storedorgan.name])"
/obj/item/device/autosurgeon/attack_self(mob/user)//when the object it used...
if(!uses)
to_chat(user, "<span class='warning'>[src] has already been used. The tools are dull and won't reactivate.</span>")
return
else if(!storedorgan)
to_chat(user, "<span class='notice'>[src] currently has no implant stored.</span>")
return
storedorgan.Insert(user)//insert stored organ into the user
user.visible_message("<span class='notice'>[user] presses a button on [src], and you hear a short mechanical noise.</span>", "<span class='notice'>You feel a sharp sting as [src] plunges into your body.</span>")
playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, 1)
storedorgan = null
name = initial(name)
if(uses != INFINITE)
uses--
if(!uses)
desc = "[initial(desc)] Looks like it's been used up."
/obj/item/device/autosurgeon/attackby(obj/item/I, mob/user, params)
if(istype(I, organ_type))
if(storedorgan)
to_chat(user, "<span class='notice'>[src] already has an implant stored.</span>")
return
else if(!uses)
to_chat(user, "<span class='notice'>[src] has already been used up.</span>")
return
if(!user.drop_item())
return
I.forceMove(src)
storedorgan = I
to_chat(user, "<span class='notice'>You insert the [I] into [src].</span>")
else if(istype(I, /obj/item/weapon/screwdriver))
if(!storedorgan)
to_chat(user, "<span class='notice'>There's no implant in [src] for you to remove.</span>")
else
var/turf/open/floorloc = get_turf(user)
floorloc.contents += contents
to_chat(user, "<span class='notice'>You remove the [storedorgan] from [src].</span>")
playsound(get_turf(user), I.usesound, 50, 1)
storedorgan = null
if(uses != INFINITE)
uses--
if(!uses)
desc = "[initial(desc)] Looks like it's been used up."
/obj/item/device/autosurgeon/cmo
desc = "A single use autosurgeon that contains a medical heads-up display augment. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/cyberimp/eyes/hud/medical
/obj/item/device/autosurgeon/thermal_eyes
starting_organ = /obj/item/organ/eyes/robotic/thermals
/obj/item/device/autosurgeon/xray_eyes
starting_organ = /obj/item/organ/eyes/robotic/xray
/obj/item/device/autosurgeon/anti_stun
starting_organ = /obj/item/organ/cyberimp/brain/anti_stun
/obj/item/device/autosurgeon/reviver
starting_organ = /obj/item/organ/cyberimp/chest/reviver

View File

@@ -12,13 +12,17 @@
var/vital = 0
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0)
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
if(!iscarbon(M) || owner == M)
return
var/obj/item/organ/replaced = M.getorganslot(slot)
if(replaced)
replaced.Remove(M, special = 1)
if(drop_if_replaced)
replaced.forceMove(get_turf(src))
else
qdel(replaced)
owner = M
M.internal_organs |= src
@@ -62,7 +66,6 @@
S.icon_state = icon_state
S.origin_tech = origin_tech
S.w_class = w_class
S.color = color
return S
@@ -227,7 +230,7 @@
colour = "red"
#define HUMAN_MAX_OXYLOSS 3
#define HUMAN_CRIT_MAX_OXYLOSS (SSmob.wait/30)
#define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30)
#define HEAT_GAS_DAMAGE_LEVEL_1 2
#define HEAT_GAS_DAMAGE_LEVEL_2 4
#define HEAT_GAS_DAMAGE_LEVEL_3 8
@@ -454,7 +457,7 @@
if(H && H.dna && H.dna.species && H.dna.species.species_traits)
species_traits = H.dna.species.species_traits
if(!(mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
if(!(GLOB.mutations_list[COLDRES] in H.dna.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
switch(breath.temperature)
if(-INFINITY to 120)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head")
@@ -509,9 +512,18 @@
zone = "mouth"
slot = "tongue"
attack_verb = list("licked", "slobbered", "slapped", "frenched", "tongued")
var/list/languages_possible
var/say_mod = null
var/taste_sensitivity = 15 // lower is more sensitive.
/obj/item/organ/tongue/Initialize(mapload)
..()
languages_possible = typecacheof(list(
/datum/language/common,
/datum/language/monkey,
/datum/language/ratvar
))
/obj/item/organ/tongue/get_spans()
return list()
@@ -528,6 +540,9 @@
if(say_mod && M.dna && M.dna.species)
M.dna.species.say_mod = initial(M.dna.species.say_mod)
/obj/item/organ/tongue/can_speak_in_language(datum/language/dt)
. = is_type_in_typecache(dt, languages_possible)
/obj/item/organ/tongue/lizard
name = "forked tongue"
desc = "A thin and long muscle typically found in reptilian races, apparently moonlights as a nose."
@@ -569,7 +584,7 @@
//Hacks
var/mob/living/carbon/human/user = usr
var/rendered = "<span class='abductor'><b>[user.name]:</b> [message]</span>"
for(var/mob/living/carbon/human/H in living_mob_list)
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
var/obj/item/organ/tongue/T = H.getorganslot("tongue")
if(!T || T.type != type)
continue
@@ -579,7 +594,7 @@
if(Ayy.team != Byy.team)
continue
to_chat(H, rendered)
for(var/mob/M in dead_mob_list)
for(var/mob/M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [rendered]")
return ""
@@ -614,6 +629,14 @@
say_mod = "hisses"
taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED
/obj/item/organ/tongue/alien/Initialize(mapload)
..()
languages_possible = typecacheof(list(
/datum/language/xenocommon,
/datum/language/common,
/datum/language/ratvar,
/datum/language/monkey))
/obj/item/organ/tongue/alien/TongueSpeech(var/message)
playsound(owner, "hiss", 25, 1, 1)
return message
@@ -652,10 +675,6 @@
if("papyrus")
. |= SPAN_PAPYRUS
/obj/item/organ/tongue/bone/chatter
name = "chattering bone \"tongue\""
chattering = TRUE
/obj/item/organ/tongue/robot
name = "robotic voicebox"
desc = "A voice synthesizer that can interface with organic lifeforms."
@@ -665,6 +684,17 @@
attack_verb = list("beeped", "booped")
taste_sensitivity = 25 // not as good as an organic tongue
/obj/item/organ/tongue/robot/Initialize(mapload)
..()
languages_possible = typecacheof(list(
/datum/language/xenocommon,
/datum/language/common,
/datum/language/ratvar,
/datum/language/monkey,
/datum/language/drone,
/datum/language/machine,
/datum/language/swarmer))
/obj/item/organ/tongue/robot/get_spans()
return ..() | SPAN_ROBOT
@@ -754,6 +784,7 @@
var/old_eye_color = "fff"
var/flash_protect = 0
var/see_invisible = SEE_INVISIBLE_LIVING
var/lighting_alpha
/obj/item/organ/eyes/Insert(mob/living/carbon/M, special = 0)
..()
@@ -781,26 +812,27 @@
name = "shadow eyes"
desc = "A spooky set of eyes that can see in the dark."
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
actions_types = list(/datum/action/item_action/organ_action/use)
var/night_vision = TRUE
/obj/item/organ/eyes/night_vision/ui_action_click()
if(night_vision)
see_in_dark = 4
see_invisible = SEE_INVISIBLE_LIVING
night_vision = FALSE
else
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
night_vision = TRUE
switch(lighting_alpha)
if (LIGHTING_PLANE_ALPHA_VISIBLE)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
else
lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
owner.update_sight()
/obj/item/organ/eyes/night_vision/alien
name = "alien eyes"
desc = "It turned out they had them after all!"
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
sight_flags = SEE_MOBS
@@ -834,7 +866,7 @@
eye_color = "FC0"
origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1"
sight_flags = SEE_MOBS
see_invisible = SEE_INVISIBLE_MINIMUM
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
flash_protect = -1
see_in_dark = 8

View File

@@ -1,48 +1,3 @@
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
var/static/regex/weaken_words = regex("drop|fall|trip|weaken")
var/static/regex/sleep_words = regex("sleep|slumber")
var/static/regex/vomit_words = regex("vomit|throw up")
var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush")
var/static/regex/hallucinate_words = regex("see the truth|hallucinate")
var/static/regex/wakeup_words = regex("wake up|awaken")
var/static/regex/heal_words = regex("live|heal|survive|mend|heroes never die")
var/static/regex/hurt_words = regex("die|suffer|hurt|pain")
var/static/regex/bleed_words = regex("bleed|there will be blood")
var/static/regex/burn_words = regex("burn|ignite")
var/static/regex/hot_words = regex("heat|hot|hell")
var/static/regex/cold_words = regex("cold|cool down|chill|freeze")
var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah|get away|repulse")
var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify")
var/static/regex/saymyname_words = regex("say my name|who am i|whoami")
var/static/regex/knockknock_words = regex("knock knock")
var/static/regex/statelaws_words = regex("state laws|state your laws")
var/static/regex/move_words = regex("move|walk")
var/static/regex/left_words = regex("left|west|port")
var/static/regex/right_words = regex("right|east|starboard")
var/static/regex/up_words = regex("up|north|fore")
var/static/regex/down_words = regex("down|south|aft")
var/static/regex/walk_words = regex("slow down")
var/static/regex/run_words = regex("run")
var/static/regex/helpintent_words = regex("help|hug")
var/static/regex/disarmintent_words = regex("disarm")
var/static/regex/grabintent_words = regex("grab")
var/static/regex/harmintent_words = regex("harm|fight|punch")
var/static/regex/throwmode_words = regex("throw|catch")
var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault")
var/static/regex/speak_words = regex("speak|say something")
var/static/regex/rest_words = regex("rest")
var/static/regex/getup_words = regex("get up")
var/static/regex/sit_words = regex("sit")
var/static/regex/stand_words = regex("stand")
var/static/regex/dance_words = regex("dance")
var/static/regex/jump_words = regex("jump")
var/static/regex/salute_words = regex("salute")
var/static/regex/deathgasp_words = regex("play dead")
var/static/regex/clap_words = regex("clap|applaud")
var/static/regex/honk_words = regex("ho+nk") //hooooooonk
var/static/regex/multispin_words = regex("like a record baby|right round")
#define COOLDOWN_STUN 1200
#define COOLDOWN_DAMAGE 600
#define COOLDOWN_MEME 300
@@ -170,7 +125,7 @@ var/static/regex/multispin_words = regex("like a record baby|right round")
if(user.mind.assigned_role == "Chaplain")
power_multiplier *= 2
//Command staff has authority
if(user.mind.assigned_role in command_positions)
if(user.mind.assigned_role in GLOB.command_positions)
power_multiplier *= 1.4
//Why are you speaking
if(user.mind.assigned_role == "Mime")
@@ -218,6 +173,51 @@ var/static/regex/multispin_words = regex("like a record baby|right round")
power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on
message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1)
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
var/static/regex/weaken_words = regex("drop|fall|trip|weaken")
var/static/regex/sleep_words = regex("sleep|slumber")
var/static/regex/vomit_words = regex("vomit|throw up")
var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush")
var/static/regex/hallucinate_words = regex("see the truth|hallucinate")
var/static/regex/wakeup_words = regex("wake up|awaken")
var/static/regex/heal_words = regex("live|heal|survive|mend|heroes never die")
var/static/regex/hurt_words = regex("die|suffer|hurt|pain")
var/static/regex/bleed_words = regex("bleed|there will be blood")
var/static/regex/burn_words = regex("burn|ignite")
var/static/regex/hot_words = regex("heat|hot|hell")
var/static/regex/cold_words = regex("cold|cool down|chill|freeze")
var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah|get away|repulse")
var/static/regex/attract_words = regex("come here|come to me|get over here|attract")
var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify")
var/static/regex/saymyname_words = regex("say my name|who am i|whoami")
var/static/regex/knockknock_words = regex("knock knock")
var/static/regex/statelaws_words = regex("state laws|state your laws")
var/static/regex/move_words = regex("move|walk")
var/static/regex/left_words = regex("left|west|port")
var/static/regex/right_words = regex("right|east|starboard")
var/static/regex/up_words = regex("up|north|fore")
var/static/regex/down_words = regex("down|south|aft")
var/static/regex/walk_words = regex("slow down")
var/static/regex/run_words = regex("run")
var/static/regex/helpintent_words = regex("help|hug")
var/static/regex/disarmintent_words = regex("disarm")
var/static/regex/grabintent_words = regex("grab")
var/static/regex/harmintent_words = regex("harm|fight|punch")
var/static/regex/throwmode_words = regex("throw|catch")
var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault")
var/static/regex/speak_words = regex("speak|say something")
var/static/regex/rest_words = regex("rest")
var/static/regex/getup_words = regex("get up")
var/static/regex/sit_words = regex("sit")
var/static/regex/stand_words = regex("stand")
var/static/regex/dance_words = regex("dance")
var/static/regex/jump_words = regex("jump")
var/static/regex/salute_words = regex("salute")
var/static/regex/deathgasp_words = regex("play dead")
var/static/regex/clap_words = regex("clap|applaud")
var/static/regex/honk_words = regex("ho+nk") //hooooooonk
var/static/regex/multispin_words = regex("like a record baby|right round")
//STUN
if(findtext(message, stun_words))
cooldown = COOLDOWN_STUN
@@ -371,7 +371,7 @@ var/static/regex/multispin_words = regex("like a record baby|right round")
for(var/i=1, i<=(5*power_multiplier), i++)
for(var/V in listeners)
var/mob/living/L = V
step(L, direction ? direction : pick(cardinal))
step(L, direction ? direction : pick(GLOB.cardinal))
sleep(10)
//WALK

View File

@@ -59,6 +59,8 @@
return 1
else
target.regenerate_limb(target_zone)
var/obj/item/bodypart/L = target.get_bodypart(target_zone)
L.is_pseudopart = TRUE
user.visible_message("[user] finishes attaching [tool]!", "<span class='notice'>You attach [tool].</span>")
qdel(tool)
if(istype(tool, /obj/item/weapon/twohanded/required/chainsaw))

View File

@@ -13,7 +13,7 @@
var/obj/item/bodypart/operated_bodypart //Operable body part
var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing.
var/success_multiplier = 0 //Step success propability multiplier
var/requires_real_bodypart = 0 //Some surgeries don't work on limbs that don't really exist
/datum/surgery/New(surgery_target, surgery_location, surgery_bodypart)
..()
@@ -54,7 +54,7 @@
return new step_type
/datum/surgery/proc/complete()
feedback_add_details("surgeries_completed", type)
feedback_add_details("surgeries_completed", "[type]")
qdel(src)
@@ -94,4 +94,4 @@
//RESOLVED ISSUES //"Todo" jobs that have been completed
//combine hands/feet into the arms - Hands/feet were removed - RR
//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0
//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0