Merge remote-tracking branch 'upstream/master' into coffee

This commit is contained in:
Hubblenaut
2016-01-13 02:19:22 +01:00
123 changed files with 823 additions and 683 deletions
+6 -2
View File
@@ -195,7 +195,8 @@ var/list/admin_verbs_debug = list(
/client/proc/Jump,
/client/proc/jumptomob,
/client/proc/jumptocoord,
/client/proc/dsay
/client/proc/dsay,
/client/proc/admin_ghost /*allows us to ghost/reenter body at will*/
)
var/list/admin_verbs_paranoid_debug = list(
@@ -303,9 +304,12 @@ var/list/admin_verbs_mod = list(
/datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
/client/proc/aooc,
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/datum/admins/proc/paralyze_mob
/datum/admins/proc/paralyze_mob,
/client/proc/cmd_admin_direct_narrate,
/client/proc/allow_character_respawn /* Allows a ghost to respawn */
)
var/list/admin_verbs_mentor = list(
+1 -1
View File
@@ -290,7 +290,7 @@
<a id='link[i]'
onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]",[is_antagonist],"\ref[M]")'
>
<span id='search><b>[i]'>[M_name] - [M_rname] - [M_key] ([M_job])</b></span>
<span id='search[i]'><b>[M_name] - [M_rname] - [M_key] ([M_job])</b></span>
</a>
<br><span id='item[i]'></span>
</td>
+2 -2
View File
@@ -3,7 +3,7 @@
set name = "AOOC"
set desc = "Antagonist OOC"
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_ADMIN|R_MOD)) return
msg = sanitize(msg)
if(!msg) return
@@ -13,7 +13,7 @@
display_name = holder.fakekey
for(var/mob/M in mob_list)
if((M.mind && M.mind.special_role && M.client) || check_rights(R_ADMIN, 0, M))
if((M.mind && M.mind.special_role && M.client) || check_rights((R_ADMIN|R_MOD), 0, M))
M << "<font color='#960018'><span class='ooc'>" + create_text_tag("aooc", "Antag-OOC:", M.client) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
log_ooc("(ANTAG) [key] : [msg]")
+3 -3
View File
@@ -123,7 +123,7 @@
set name = "Direct Narrate"
if(!holder)
src << "Only administrators may use this command."
src << "Only administrators and moderators may use this command."
return
if(!M)
@@ -256,9 +256,9 @@ Ccomp's first proc.
/client/proc/allow_character_respawn()
set category = "Special Verbs"
set name = "Allow player to respawn"
set desc = "Let's the player bypass the 30 minute wait to respawn or allow them to re-enter their corpse."
set desc = "Let's the player bypass the 15 minute wait to respawn or allow them to re-enter their corpse."
if(!holder)
src << "Only administrators may use this command."
src << "Only administrators and moderators may use this command."
var/list/ghosts= get_ghosts(1,1)
var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts
@@ -358,6 +358,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/datum/species/current_species = all_species[pref.species]
if(!current_species.has_organ["brain"])
limb_selection_list -= "Full Body"
else if(pref.organ_data[BP_TORSO] == "cyborg")
limb_selection_list |= "Head"
var/organ_tag = input(user, "Which limb do you want to change?") as null|anything in limb_selection_list
@@ -394,6 +396,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if("Right Hand")
limb = BP_R_HAND
third_limb = BP_R_ARM
if("Head")
limb = BP_HEAD
choice_options = list("Prothesis")
if("Full Body")
limb = BP_TORSO
third_limb = BP_GROIN
@@ -7,6 +7,7 @@
S["undershirt"] >> pref.undershirt
S["socks"] >> pref.socks
S["backbag"] >> pref.backbag
S["pdachoice"] >> pref.pdachoice
S["gear"] >> pref.gear
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
@@ -14,10 +15,12 @@
S["undershirt"] << pref.undershirt
S["socks"] << pref.socks
S["backbag"] << pref.backbag
S["pdachoice"] << pref.pdachoice
S["gear"] << pref.gear
/datum/category_item/player_setup_item/general/equipment/sanitize_character()
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice))
if(!islist(pref.gear)) pref.gear = list()
@@ -48,6 +51,7 @@
. += "Undershirt: <a href='?src=\ref[src];change_undershirt=1'><b>[get_key_by_value(undershirt_t,pref.undershirt)]</b></a><br>"
. += "Socks: <a href='?src=\ref[src];change_socks=1'><b>[get_key_by_value(socks_t,pref.socks)]</b></a><br>"
. += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>"
. += "PDA Type: <a href='?src=\ref[src];change_pda=1'><b>[pdachoicelist[pref.pdachoice]]</b></a><br>"
. += "<br><b>Custom Loadout:</b><br>"
var/total_cost = 0
@@ -109,6 +113,12 @@
pref.backbag = backbaglist.Find(new_backbag)
return TOPIC_REFRESH
else if(href_list["change_pda"])
var/new_pdachoice = input(user, "Choose your character's style of PDA:", "Character Preference", pdachoicelist[pref.pdachoice]) as null|anything in pdachoicelist
if(!isnull(new_pdachoice) && CanUseTopic(user))
pref.pdachoice = pdachoicelist.Find(new_pdachoice)
return TOPIC_REFRESH
else if(href_list["add_loadout"])
var/total_cost = 0
for(var/gear_name in pref.gear)
+6 -1
View File
@@ -34,6 +34,7 @@ datum/preferences
var/undershirt //undershirt type
var/socks //socks type
var/backbag = 2 //backpack type
var/pdachoice = 1 //PDA type
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
var/g_hair = 0 //Hair color
@@ -309,7 +310,7 @@ datum/preferences
character.used_skillpoints = used_skillpoints
// Destroy/cyborgize organs and limbs.
for(var/name in BP_ALL)
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/status = organ_data[name]
var/obj/item/organ/external/O = character.organs_by_name[name]
if(O)
@@ -340,6 +341,10 @@ datum/preferences
backbag = 1 //Same as above
character.backbag = backbag
if(pdachoice > 3 || pdachoice < 1)
pdachoice = 1
character.pdachoice = pdachoice
character.update_body()
/datum/preferences/proc/open_load_dialog(mob/user)
+10 -6
View File
@@ -234,13 +234,13 @@ var/global/list/gear_datums = list()
slot = slot_head
/datum/gear/santahat
display_name = "santa hat, red"
display_name = "santa hat, red (holiday)"
path = /obj/item/clothing/head/santa
cost = 1
cost = 11
slot = slot_head
/datum/gear/santahat/green
display_name = "santa hat, green"
display_name = "santa hat, green (holiday)"
path = /obj/item/clothing/head/santa/green
// This was sprited and coded specifically for Zhan-Khazan characters. Before you
@@ -345,6 +345,10 @@ var/global/list/gear_datums = list()
display_name = "bandana, red"
path = /obj/item/clothing/mask/bandana/red
/datum/gear/bandanamask/ipc_monitor
display_name = "display monitor (prosthetic head only)"
path = /obj/item/clothing/mask/monitor
/datum/gear/sterilemask
display_name = "sterile mask"
path = /obj/item/clothing/mask/surgical
@@ -502,7 +506,7 @@ var/global/list/gear_datums = list()
/datum/gear/skirt/med
display_name = "skirt, medical"
path = /obj/item/clothing/under/rank/medical/skirt
allowed_roles = list("Chief Medical Officer","Medical Doctor","Paramedic")
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
/datum/gear/skirt/sci
display_name = "skirt, scientist"
@@ -1205,14 +1209,14 @@ var/global/list/gear_datums = list()
whitelisted = "Tajara" // You do have a monopoly on a fur suit tho
/datum/gear/forensics/red
display_name = "forensics, red"
display_name = "forensics long, red"
path = /obj/item/clothing/suit/storage/forensics/red/long
cost = 2
slot = slot_wear_suit
allowed_roles = list("Detective")
/datum/gear/forensics/blue
display_name = "forensics, blue"
display_name = "forensics long, blue"
path = /obj/item/clothing/suit/storage/forensics/blue/long
cost = 2
slot = slot_wear_suit
+2
View File
@@ -516,6 +516,8 @@ BLIND // can't see anything
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
w_class = 3
show_messages = 1
var/has_sensor = 1 //For the crew computer 2 = unable to change mode
var/sensor_mode = 0
/*
+82
View File
@@ -0,0 +1,82 @@
//IPC-face object for FPB.
/obj/item/clothing/mask/monitor
name = "display monitor"
desc = "A rather clunky old CRT-style display screen, fit for mounting on an optical output."
flags_inv = HIDEFACE|HIDEEYES
body_parts_covered = FACE
dir = SOUTH
icon = 'icons/mob/monitor_icons.dmi'
icon_override = 'icons/mob/monitor_icons.dmi'
icon_state = "ipc_blank"
item_state = null
var/monitor_state_index = "blank"
var/global/list/monitor_states = list(
"blank" = "ipc_blank",
"pink" = "ipc_pink",
"red" = "ipc_red",
"green" = "ipc_green",
"blue" = "ipc_blue",
"breakout" = "ipc_breakout",
"eight" = "ipc_eight",
"goggles" = "ipc_goggles",
"heart" = "ipc_heart",
"monoeye" = "ipc_monoeye",
"nature" = "ipc_nature",
"orange" = "ipc_orange",
"purple" = "ipc_purple",
"shower" = "ipc_shower",
"static" = "ipc_static",
"yellow" = "ipc_yellow"
)
/obj/item/clothing/mask/monitor/set_dir()
dir = SOUTH
return
/obj/item/clothing/mask/monitor/equipped()
..()
var/mob/living/carbon/human/H = loc
if(istype(H) && H.wear_mask == src)
canremove = 0
H << "<span class='notice'>\The [src] connects to your display output.</span>"
/obj/item/clothing/mask/monitor/dropped()
canremove = 1
return ..()
/obj/item/clothing/mask/monitor/mob_can_equip(var/mob/living/carbon/human/user, var/slot)
if (!..())
return 0
if(istype(user))
var/obj/item/organ/external/E = user.organs_by_name[BP_HEAD]
if(istype(E) && (E.status & ORGAN_ROBOT))
return 1
user << "<span class='warning'>You must have a robotic head to install this upgrade.</span>"
return 0
/obj/item/clothing/mask/monitor/verb/set_monitor_state()
set name = "Set Monitor State"
set desc = "Choose an icon for your monitor."
set category = "IC"
set src in usr
var/mob/living/carbon/human/H = loc
if(!istype(H) || H != usr)
return
if(H.wear_mask != src)
usr << "<span class='warning'>You have not installed \the [src] yet.</span>"
return
var/choice = input("Select a screen icon.") as null|anything in monitor_states
if(choice)
monitor_state_index = choice
update_icon()
/obj/item/clothing/mask/monitor/update_icon()
if(!(monitor_state_index in monitor_states))
monitor_state_index = initial(monitor_state_index)
icon_state = monitor_states[monitor_state_index]
var/mob/living/carbon/human/H = loc
if(istype(H)) H.update_inv_wear_mask()
+1 -1
View File
@@ -59,7 +59,7 @@
//Chef
/obj/item/clothing/suit/chef/classic
name = "A classic chef's apron."
name = "classic chef's apron"
desc = "A basic, dull, white chef's apron."
icon_state = "apronchef"
item_state = "apronchef"
@@ -3,6 +3,8 @@
desc = "Used to hold things when you don't have enough hands."
icon_state = "webbing"
slot = "utility"
show_messages = 1
var/slots = 3
var/obj/item/weapon/storage/internal/hold
w_class = 3.0
+5 -5
View File
@@ -68,8 +68,8 @@
/obj/item/clothing/under/shorts/jeans/black
name = "black jeans shorts"
icon_state = "black_shorts"
worn_state = "black_shorts"
icon_state = "blackpants_shorts"
worn_state = "blackpants_shorts"
/obj/item/clothing/under/shorts/jeans/black/female
icon_state = "black_shorts_f"
@@ -78,9 +78,9 @@
/obj/item/clothing/under/shorts/khaki
name = "khaki shorts"
desc = "For that island getaway. It's five o'clock somewhere, right?"
icon_state = "khaki_shorts"
worn_state = "khaki_shorts"
icon_state = "tanpants_shorts"
worn_state = "tanpants_shorts"
/obj/item/clothing/under/shorts/khaki/female
icon_state = "khaki_shorts_f"
worn_state = "khaki_shorts_f"
worn_state = "khaki_shorts_f"
+2 -2
View File
@@ -59,7 +59,7 @@
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
message = "<b>[message]</b>"
if(sdisabilities & DEAF || ear_deaf)
if((sdisabilities & DEAF) || ear_deaf)
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
src << "<span class='warning'>You cannot hear yourself speak!</span>"
@@ -187,7 +187,7 @@
formatted = language.format_message_radio(message, verb)
else
formatted = "[verb], <span class=\"body\">\"[message]\"</span>"
if(sdisabilities & DEAF || ear_deaf)
if((sdisabilities & DEAF) || ear_deaf)
if(prob(20))
src << "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>"
else
+39 -10
View File
@@ -6,6 +6,7 @@ var/list/holder_mob_icon_cache = list()
desc = "You shouldn't ever see this."
icon = 'icons/obj/objects.dmi'
slot_flags = SLOT_HEAD | SLOT_HOLSTER
show_messages = 1
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
@@ -27,18 +28,33 @@ var/list/holder_mob_icon_cache = list()
..()
/obj/item/weapon/holder/process()
update_state()
/obj/item/weapon/holder/dropped()
..()
spawn(1)
update_state()
/obj/item/weapon/proc/update_state()
if(istype(loc,/turf) || !(contents.len))
for(var/mob/M in contents)
var/atom/movable/mob_container
mob_container = M
mob_container.forceMove(get_turf(src))
M.reset_view()
qdel(src)
/obj/item/weapon/holder/GetID()
for(var/mob/M in contents)
var/obj/item/I = M.GetIdCard()
if(I)
return I
return null
/obj/item/weapon/holder/GetAccess()
var/obj/item/I = GetID()
return I ? I.GetAccess() : ..()
/obj/item/weapon/holder/proc/sync(var/mob/living/M)
dir = 2
overlays.Cut()
@@ -79,17 +95,30 @@ var/list/holder_mob_icon_cache = list()
//Mob procs and vars for scooping up
/mob/living/var/holder_type
/mob/living/proc/get_scooped(var/mob/living/carbon/grabber)
/mob/living/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H))
get_scooped(H, (usr == src))
return
return ..()
/mob/living/proc/get_scooped(var/mob/living/carbon/grabber, var/self_grab)
if(!holder_type || buckled || pinned.len)
return
var/obj/item/weapon/holder/H = new holder_type(loc)
src.loc = H
H.name = loc.name
H.attack_hand(grabber)
var/obj/item/weapon/holder/H = new holder_type(get_turf(src))
src.forceMove(H)
grabber.put_in_hands(H)
if(self_grab)
grabber << "<span class='notice'>\The [src] clambers onto you!</span>"
src << "<span class='notice'>You climb up onto \the [grabber]!</span>"
grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
else
grabber << "<span class='notice'>You scoop up \the [src]!</span>"
src << "<span class='notice'>\The [grabber] scoops you up!</span>"
grabber << "You scoop up [src]."
src << "[grabber] scoops you up."
grabber.status_flags |= PASSEMOTES
H.sync(src)
return H
+7 -6
View File
@@ -216,19 +216,20 @@ var/list/slot_equipment_priority = list( \
wear_mask = null
update_inv_wear_mask(0)
return
/mob/proc/isEquipped(obj/item/I)
if(!I)
return 0
return get_inventory_slot(I) != 0
/mob/proc/canUnEquip(obj/item/I)
if(!I) //If there's nothing to drop, the drop is automatically successful.
return 1
var/slot = get_inventory_slot(I)
if(slot && !I.mob_can_unequip(src, slot))
return 0
drop_from_inventory(I)
return 1
return slot && I.mob_can_unequip(src, slot)
/mob/proc/get_inventory_slot(obj/item/I)
var/slot
var/slot = 0
for(var/s in slot_back to slot_tie) //kind of worries me
if(get_equipped_item(s) == I)
slot = s
+1 -13
View File
@@ -53,19 +53,7 @@
if(screwloose && prob(5)) // Make a mess
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
if(T.wet < 1)
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi', T, "wet_floor")
T.overlays += T.wet_overlay
spawn(800)
if(istype(T) && T.wet < 2)
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_floor()
if(oddbutton && prob(5)) // Make a big mess
visible_message("Something flies out of [src]. He seems to be acting oddly.")
@@ -9,6 +9,10 @@
death_msg = "expires with a pitiful chirrup..."
universal_understand = 1
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
can_pull_size = 2
can_pull_mobs = MOB_PULL_SMALLER
holder_type = /obj/item/weapon/holder/diona
var/obj/item/hat
@@ -18,19 +22,6 @@
species = all_species["Diona"]
verbs += /mob/living/carbon/alien/diona/proc/merge
/mob/living/carbon/alien/diona/start_pulling(var/atom/movable/AM)
//TODO: Collapse these checks into one proc (see pai and drone)
if(istype(AM,/obj/item))
var/obj/item/O = AM
if(O.w_class > 2)
src << "<span class='warning'>You are too small to pull that.</span>"
return
else
..()
else
src << "<span class='warning'>You are too small to pull that.</span>"
return
/mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands.
W.loc = get_turf(src)
return 1
@@ -1,17 +1,13 @@
/mob/living/carbon/alien/diona/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == "help")
if(H.species && H.species.name == "Diona" && do_merge(H))
return
get_scooped(H)
return
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
/mob/living/carbon/alien/diona/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(!istype(H) || !Adjacent(H))
return ..()
if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
hat.loc = get_turf(src)
H.put_in_hands(hat)
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
hat = null
update_icons()
updateicon()
else
return ..()
+1 -1
View File
@@ -235,8 +235,8 @@
M.visible_message("<span class='warning'>[M] tries to pat out [src]'s flames!</span>",
"<span class='warning'>You try to pat out [src]'s flames! Hot!</span>")
if(do_mob(M, src, 15))
src.fire_stacks -= 0.5
if (prob(10) && (M.fire_stacks <= 0))
src.fire_stacks -= 0.5
M.fire_stacks += 1
M.IgniteMob()
if (M.on_fire)
@@ -1370,13 +1370,6 @@
return 1
return 0
/mob/living/carbon/human/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && a_intent == "help" && istype(H) && H.a_intent == "help" && !issmall(H) && Adjacent(H))
get_scooped(H)
return
return ..()
/mob/living/carbon/human/verb/pull_punches()
set name = "Pull Punches"
set desc = "Try not to hurt them."
@@ -5,6 +5,7 @@
health = maxHealth
stat = CONSCIOUS
return
var/total_burn = 0
var/total_brute = 0
for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
@@ -13,11 +14,7 @@
total_brute += O.brute_dam
total_burn += O.burn_dam
var/oxy_l = getOxyLoss()
var/tox_l = ((species.flags & NO_POISON) ? 0 : getToxLoss())
var/clone_l = getCloneLoss()
health = maxHealth - oxy_l - tox_l - clone_l - total_burn - total_brute
health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
//TODO: fix husking
if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD)
@@ -70,7 +67,7 @@
/mob/living/carbon/human/getBruteLoss()
var/amount = 0
for(var/obj/item/organ/external/O in organs)
if(O.status & ORGAN_ROBOT)
if((O.status & ORGAN_ROBOT) && !O.vital)
continue //robot limbs don't count towards shock and crit
amount += O.brute_dam
return amount
@@ -78,7 +75,7 @@
/mob/living/carbon/human/getFireLoss()
var/amount = 0
for(var/obj/item/organ/external/O in organs)
if(O.status & ORGAN_ROBOT)
if((O.status & ORGAN_ROBOT) && !O.vital)
continue //robot limbs don't count towards shock and crit
amount += O.burn_dam
return amount
@@ -36,6 +36,7 @@
var/undershirt = 0 //Which undershirt the player wants.
var/socks = 0 //Which socks the player wants.
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old.
// General information
var/home_system = ""
@@ -43,7 +43,7 @@
E.process()
number_wounds += E.number_wounds
if (!lying && world.time - l_move_time < 15)
if (!lying && !buckled && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good
if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/I = pick(E.internal_organs)
+1 -1
View File
@@ -45,7 +45,7 @@
//blinded get reset each cycle and then get activated later in the
//code. Very ugly. I dont care. Moving this stuff here so its easy
//to find it.
blinded = null
blinded = 0
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
//TODO: seperate this out
@@ -94,7 +94,7 @@
)
var/list/cold_discomfort_strings = list(
"You feel chilly.",
"You shiver suddely.",
"You shiver suddenly.",
"Your chilly flesh stands out in goosebumps."
)
@@ -274,9 +274,6 @@
O.owner = H
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
if (target.holder_type && target.a_intent == "help" && H.a_intent == "help")
target.get_scooped(H)
return
var/t_him = "them"
switch(target.gender)
+4 -4
View File
@@ -31,7 +31,7 @@
//This line represent a significant buff to grabs...
// We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay
setClickCooldown(100)
setClickCooldown(100)
if(can_break_cuffs()) //Don't want to do a lot of logic gating here.
break_handcuffs()
@@ -58,7 +58,7 @@
)
if(do_after(src, breakouttime))
if(!handcuffed || buckled)
if(!handcuffed)
return
visible_message(
"<span class='danger'>\The [src] manages to remove \the [handcuffed]!</span>",
@@ -66,11 +66,11 @@
)
drop_from_inventory(handcuffed)
/mob/living/carbon/proc/escape_legcuffs()
/mob/living/carbon/proc/escape_legcuffs()
if(!canClick())
return
setClickCooldown(100)
setClickCooldown(100)
if(can_break_cuffs()) //Don't want to do a lot of logic gating here.
break_legcuffs()
+17 -13
View File
@@ -85,7 +85,7 @@ default behaviour is:
now_pushing = 0
return
if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around!
if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around!
var/turf/oldloc = loc
forceMove(tmob.loc)
tmob.forceMove(oldloc)
@@ -123,22 +123,26 @@ default behaviour is:
now_pushing = 0
spawn(0)
..()
if (!istype(AM, /atom/movable))
if (!istype(AM, /atom/movable) || AM.anchored)
if(confused && prob(50) && m_intent=="run")
Paralyse(1)
playsound(loc, "punch", 25, 1, -1)
visible_message("<span class='warning'>[src] [pick("ran", "slammed")] into \the [AM]!</span>")
src.take_organ_damage(5)
return
if (!now_pushing)
now_pushing = 1
if (!AM.anchored)
var/t = get_dir(src, AM)
if (istype(AM, /obj/structure/window))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
if(ishuman(AM) && AM:grabbed_by)
for(var/obj/item/weapon/grab/G in AM:grabbed_by)
step(G:assailant, get_dir(G:assailant, AM))
G.adjust_position()
var/t = get_dir(src, AM)
if (istype(AM, /obj/structure/window))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
if(ishuman(AM) && AM:grabbed_by)
for(var/obj/item/weapon/grab/G in AM:grabbed_by)
step(G:assailant, get_dir(G:assailant, AM))
G.adjust_position()
now_pushing = 0
return
return
+2 -26
View File
@@ -127,9 +127,6 @@
return 0
..()
/mob/living/silicon/pai/MouseDrop(atom/over_object)
return
/mob/living/silicon/pai/emp_act(severity)
// Silence for 2 minutes
// 20% chance to kill
@@ -396,37 +393,16 @@
resting = 0
icon_state = "[chassis]"
/mob/living/silicon/pai/start_pulling(var/atom/movable/AM)
if(istype(AM,/obj/item))
var/obj/item/O = AM
if(O.w_class == 1)
..()
else
src << "<span class='warning'>You are too small to pull that.</span>"
else
src << "<span class='warning'>You are too small to pull that.</span>"
return
// No binary for pAIs.
/mob/living/silicon/pai/binarycheck()
return 0
// Handle being picked up.
/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber)
var/obj/item/weapon/holder/H = ..()
/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber, var/self_drop)
var/obj/item/weapon/holder/H = ..(grabber, self_drop)
if(!istype(H))
return
H.icon_state = "pai-[icon_state]"
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
return H
/mob/living/silicon/pai/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == "help")
get_scooped(H)
return
else
return ..()
@@ -37,6 +37,9 @@ var/list/mob_hat_cache = list()
integrated_light_power = 3
local_transmit = 1
can_pull_size = 3
can_pull_mobs = MOB_PULL_SMALLER
mob_bump_flag = SIMPLE_ANIMAL
mob_swap_flags = SIMPLE_ANIMAL
mob_push_flags = SIMPLE_ANIMAL
@@ -49,8 +52,6 @@ var/list/mob_hat_cache = list()
var/obj/machinery/drone_fabricator/master_fabricator
var/law_type = /datum/ai_laws/drone
var/module_type = /obj/item/weapon/robot_module/drone
var/can_pull_size = 2
var/can_pull_mobs
var/obj/item/hat
var/hat_x_offset = 0
var/hat_y_offset = -13
@@ -66,10 +67,10 @@ var/list/mob_hat_cache = list()
icon_state = "constructiondrone"
law_type = /datum/ai_laws/construction_drone
module_type = /obj/item/weapon/robot_module/drone/construction
can_pull_size = 5
can_pull_mobs = 1
hat_x_offset = 1
hat_y_offset = -12
can_pull_size = 5
can_pull_mobs = MOB_PULL_SAME
/mob/living/silicon/robot/drone/New()
@@ -315,20 +316,6 @@ var/list/mob_hat_cache = list()
src << "Remember, you are <b>lawed against interference with the crew</b>. Also remember, <b>you DO NOT take orders from the AI.</b>"
src << "Use <b>say ;Hello</b> to talk to other drones and <b>say Hello</b> to speak silently to your nearby fellows."
/mob/living/silicon/robot/drone/start_pulling(var/atom/movable/AM)
if(!(istype(AM,/obj/item/pipe) || istype(AM,/obj/structure/disposalconstruct)))
if(istype(AM,/obj/item))
var/obj/item/O = AM
if(O.w_class > can_pull_size)
src << "<span class='warning'>You are too small to pull that.</span>"
return
else
if(!can_pull_mobs)
src << "<span class='warning'>You are too small to pull that.</span>"
return
..()
/mob/living/silicon/robot/drone/add_robot_verbs()
src.verbs |= silicon_subsystems
@@ -21,13 +21,11 @@
return
/mob/living/silicon/robot/drone/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == "help")
get_scooped(H)
return
else if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
/mob/living/silicon/robot/drone/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(!istype(H) || !Adjacent(H))
return ..()
if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
hat.loc = get_turf(src)
H.put_in_hands(hat)
H.visible_message("<span class='danger'>\The [H] removes \the [src]'s [hat].</span>")
@@ -114,9 +114,9 @@
src.density = !( src.lying )
if ((src.sdisabilities & BLIND))
if (src.sdisabilities & BLIND)
src.blinded = 1
if ((src.sdisabilities & DEAF))
if (src.sdisabilities & DEAF)
src.ear_deaf = 1
if (src.eye_blurry > 0)
@@ -313,6 +313,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal()
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
@@ -353,6 +354,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.emag = new /obj/item/borg/stun(src)
@@ -676,6 +678,8 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/soap(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += robot.internals
@@ -124,22 +124,6 @@
. = ..()
set_flee_target(AM.thrower? AM.thrower : src.loc)
/mob/living/simple_animal/cat/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == "help")
get_scooped(H)
return
else
return ..()
/mob/living/simple_animal/cat/get_scooped(var/mob/living/carbon/grabber)
if (stat >= DEAD)
return //since the holder icon looks like a living cat
..()
//Basic friend AI
/mob/living/simple_animal/cat/fluff
var/mob/living/carbon/human/friend
@@ -31,6 +31,9 @@
holder_type = /obj/item/weapon/holder/mouse
mob_size = MOB_MINISCULE
can_pull_size = 1
can_pull_mobs = MOB_PULL_NONE
/mob/living/simple_animal/mouse/Life()
..()
if(!stat && prob(speak_chance))
@@ -78,25 +81,6 @@
if(client)
client.time_died_as_mouse = world.time
/mob/living/simple_animal/mouse/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == "help")
get_scooped(H)
return
else
return ..()
/mob/living/simple_animal/mouse/get_scooped(var/mob/living/carbon/grabber)
if (stat >= DEAD)
return
..()
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
src << "<span class='warning'>You are too small to pull anything.</span>"
return
/mob/living/simple_animal/mouse/Crossed(AM as mob|obj)
if( ishuman(AM) )
+38 -8
View File
@@ -56,19 +56,19 @@
if(!client) return
if (type)
if(type & 1 && (sdisabilities & BLIND || blinded || paralysis) )//Vision related
if((type & 1) && ((sdisabilities & BLIND) || blinded || paralysis) )//Vision related
if (!( alt ))
return
else
msg = alt
type = alt_type
if (type & 2 && (sdisabilities & DEAF || ear_deaf))//Hearing related
if ((type & 2) && ((sdisabilities & DEAF) || ear_deaf))//Hearing related
if (!( alt ))
return
else
msg = alt
type = alt_type
if ((type & 1 && sdisabilities & BLIND))
if ((type & 1) && (sdisabilities & BLIND))
return
// Added voice muffling for Issue 41.
if(stat == UNCONSCIOUS || sleeping > 0)
@@ -88,10 +88,10 @@
for(var/I in see)
if(isobj(I))
spawn(0)
if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
O.show_message( message, 1, blind_message, 2)
//spawn(0)
//if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
O.show_message( message, 1, blind_message, 2)
else if(ismob(I))
var/mob/M = I
if(self_message && M==src)
@@ -603,20 +603,44 @@
pullin.icon_state = "pull0"
/mob/proc/start_pulling(var/atom/movable/AM)
if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
return
if (AM.anchored)
usr << "<span class='notice'>It won't budge!</span>"
src << "<span class='warning'>It won't budge!</span>"
return
var/mob/M = AM
if(ismob(AM))
if(!can_pull_mobs || !can_pull_size)
src << "<span class='warning'>It won't budge!</span>"
return
if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER))
src << "<span class='warning'>It won't budge!</span>"
return
if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER))
src << "<span class='warning'>It won't budge!</span>"
return
// If your size is larger than theirs and you have some
// kind of mob pull value AT ALL, you will be able to pull
// them, so don't bother checking that explicitly.
if(!iscarbon(src))
M.LAssailant = null
else
M.LAssailant = usr
else if(isobj(AM))
var/obj/I = AM
if(!can_pull_size || can_pull_size < I.w_class)
src << "<span class='warning'>It won't budge!</span>"
return
if(pulling)
var/pulling_old = pulling
stop_pulling()
@@ -989,6 +1013,12 @@ mob/proc/yank_out_object()
var/mob/living/carbon/human/human_user = U
human_user.bloody_hands(H)
else if(issilicon(src))
var/mob/living/silicon/robot/R = src
R.embedded -= selection
R.adjustBruteLoss(5)
R.adjustFireLoss(10)
selection.forceMove(get_turf(src))
if(!(U.l_hand && U.r_hand))
U.put_in_hands(selection)
+2
View File
@@ -149,6 +149,8 @@
var/const/deafness = 2//Carbon
var/const/muteness = 4//Carbon
var/can_pull_size = 10 // Maximum w_class the mob can pull.
var/can_pull_mobs = MOB_PULL_LARGER // Whether or not the mob can pull other mobs.
var/datum/dna/dna = null//Carbon
var/radiation = 0.0//Carbon
+19 -11
View File
@@ -11,7 +11,7 @@
return
/mob/proc/setMoveCooldown(var/timeout)
if(client)
if(client)
client.move_delay = max(world.time + timeout, client.move_delay)
/client/North()
@@ -286,7 +286,7 @@
//specific vehicle move delays are set in code\modules\vehicles\vehicle.dm
move_delay = world.time + tickcomp
//drunk driving
if(mob.confused)
if(mob.confused && prob(75))
direct = pick(cardinal)
return mob.buckled.relaymove(mob,direct)
@@ -300,15 +300,19 @@
if(istype(mob.pulledby, /obj/structure/bed/chair/wheelchair))
return mob.pulledby.relaymove(mob, direct)
else if(istype(mob.buckled, /obj/structure/bed/chair/wheelchair))
if(ishuman(mob.buckled))
var/mob/living/carbon/human/driver = mob.buckled
if(ishuman(mob))
var/mob/living/carbon/human/driver = mob
var/obj/item/organ/external/l_hand = driver.get_organ("l_hand")
var/obj/item/organ/external/r_hand = driver.get_organ("r_hand")
if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED)))
return // No hands to drive your chair? Tough luck!
//drunk wheelchair driving
if(mob.confused)
direct = pick(cardinal)
else if(mob.confused)
switch(mob.m_intent)
if("run")
if(prob(75)) direct = pick(cardinal)
if("walk")
if(prob(25)) direct = pick(cardinal)
move_delay += 2
return mob.buckled.relaymove(mob,direct)
@@ -348,7 +352,11 @@
return
else if(mob.confused)
step(mob, pick(cardinal))
switch(mob.m_intent)
if("run")
if(prob(75)) step(mob, pick(cardinal))
if("walk")
if(prob(25)) step(mob, pick(cardinal))
else
. = mob.SelfMove(n, direct)
@@ -450,8 +458,8 @@
if(!Check_Dense_Object()) //Nothing to push off of so end here
update_floating(0)
return 0
update_floating(1)
update_floating(1)
if(restrained()) //Check to see if we can do things
return 0
@@ -477,10 +485,10 @@
if(istype(turf,/turf/simulated/floor)) // Floors don't count if they don't have gravity
var/area/A = turf.loc
if(istype(A) && A.has_gravity == 0)
if(istype(A) && A.has_gravity == 0)
if(shoegrip == null)
shoegrip = Check_Shoegrip() //Shoegrip is only ever checked when a zero-gravity floor is encountered to reduce load
if(!shoegrip)
if(!shoegrip)
continue
dense_object++
@@ -435,81 +435,6 @@
name = "Bald"
icon_state = "bald"
icp_screen_pink
name = "pink IPC screen"
icon_state = "ipc_pink"
species_allowed = list("Machine")
icp_screen_red
name = "red IPC screen"
icon_state = "ipc_red"
species_allowed = list("Machine")
icp_screen_green
name = "green IPC screen"
icon_state = "ipc_green"
species_allowed = list("Machine")
icp_screen_blue
name = "blue IPC screen"
icon_state = "ipc_blue"
species_allowed = list("Machine")
icp_screen_breakout
name = "breakout IPC screen"
icon_state = "ipc_breakout"
species_allowed = list("Machine")
icp_screen_eight
name = "eight IPC screen"
icon_state = "ipc_eight"
species_allowed = list("Machine")
icp_screen_goggles
name = "goggles IPC screen"
icon_state = "ipc_goggles"
species_allowed = list("Machine")
icp_screen_heart
name = "heart IPC screen"
icon_state = "ipc_heart"
species_allowed = list("Machine")
icp_screen_monoeye
name = "monoeye IPC screen"
icon_state = "ipc_monoeye"
species_allowed = list("Machine")
icp_screen_nature
name = "nature IPC screen"
icon_state = "ipc_nature"
species_allowed = list("Machine")
icp_screen_orange
name = "orange IPC screen"
icon_state = "ipc_orange"
species_allowed = list("Machine")
icp_screen_purple
name = "purple IPC screen"
icon_state = "ipc_purple"
species_allowed = list("Machine")
icp_screen_shower
name = "shower IPC screen"
icon_state = "ipc_shower"
species_allowed = list("Machine")
icp_screen_static
name = "static IPC screen"
icon_state = "ipc_static"
species_allowed = list("Machine")
icp_screen_yellow
name = "yellow IPC screen"
icon_state = "ipc_yellow"
species_allowed = list("Machine")
/*
///////////////////////////////////
/ =---------------------------= /
+1 -1
View File
@@ -216,7 +216,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from reagents to vessel, respecting blood types compatability.
/mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount)
if(should_have_organ(O_HEART))
if(!should_have_organ(O_HEART))
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return
+5
View File
@@ -41,3 +41,8 @@ var/datum/robolimb/basic_robolimb
company = "Morpheus"
desc = "This limb is simple and functional; no effort has been made to make it look human."
icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
desc = "This limb features sleek black and white polymers."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi'
+39 -56
View File
@@ -344,68 +344,51 @@ obj/structure/cable/proc/cableColor(var/colorC)
. = list() // this will be a list of all connected power objects
var/turf/T
// Handle z-level connections.
if(d1 == 11 || d1 == 12)
// Connections below.
if(d1 == 11)
var/turf/turf = GetBelow(src)
if(turf)
. += power_list(turf, src, 12, 1)
// Connections above.
if(d1 == 12)
var/turf/turf = GetAbove(src)
if(turf)
. += power_list(turf, src, 11, 1)
//get matching cables from the first direction
else if(d1) //if not a node cable
T = get_step(src, d1)
// Handle up/down cables
if(d1 == 11 || d2 == 11)
T = GetBelow(src)
if(T)
. += power_list(T, src, turn(d1, 180), powernetless_only) //get adjacents matching cables
if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles
T = get_step(src,d1&3) // go north/south
. += power_list(T, src, 12, 1)
if(d1 == 12 || d1 == 12)
T = GetAbove(src)
if(T)
. += power_list(T, src, d1 ^ 3, powernetless_only) //get diagonally matching cables
T = get_step(src,d1&12) // go east/west
. += power_list(T, src, 11, 1)
// Handle standard cables in adjacent turfs
for(var/cable_dir in list(d1, d2))
if(cable_dir == 11 || cable_dir == 12 || cable_dir == 0)
continue
var/reverse = reverse_dir[cable_dir]
T = get_step(src, cable_dir)
if(T)
. += power_list(T, src, d1 ^ 12, powernetless_only) //get diagonally matching cables
for(var/obj/structure/cable/C in T)
if((C.d1 && C.d1 == reverse) || (C.d2 && C.d2 == reverse))
. += C
if(cable_dir & (cable_dir - 1)) // Diagonal, check for /\/\/\ style cables along cardinal directions
for(var/pair in list(NORTH|SOUTH, EAST|WEST))
T = get_step(src, cable_dir & pair)
if(T)
var/req_dir = cable_dir ^ pair
for(var/obj/structure/cable/C in T)
if((C.d1 && C.d1 == req_dir) || (C.d2 && C.d2 == req_dir))
. += C
. += power_list(loc, src, d1, powernetless_only) //get on turf matching cables
// Handle cables on the same turf as us
for(var/obj/structure/cable/C in loc)
if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) // if either of C's d1 and d2 match either of ours
. += C
if(d1 == 0)
for(var/obj/machinery/power/P in loc)
if(P.powernet == 0) continue // exclude APCs with powernet=0
if(!powernetless_only || !P.powernet)
. += P
// Second direction.
// Handle z-level connections.
if(d2 == 11 || d2 == 12)
// Connections below.
if(d2 == 11)
var/turf/turf = GetBelow(src)
if(turf)
. += power_list(turf, src, 12, 1)
// Connections above.
if(d2 == 12)
var/turf/turf = GetAbove(src)
if(turf)
. += power_list(turf, src, 11, 1)
else
//do the same on the second direction (which can't be 0)
T = get_step(src, d2)
if(T)
. += power_list(T, src, turn(d2, 180), powernetless_only) //get adjacents matching cables
if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles
T = get_step(src,d2&3) // go north/south
if(T)
. += power_list(T, src, d2 ^ 3, powernetless_only) //get diagonally matching cables
T = get_step(src,d2&12) // go east/west
if(T)
. += power_list(T, src, d2 ^ 12, powernetless_only) //get diagonally matching cables
. += power_list(loc, src, d2, powernetless_only) //get on turf matching cables
return .
// if the caller asked for powernetless cables only, dump the ones with powernets
if(powernetless_only)
for(var/obj/structure/cable/C in .)
if(C.powernet)
. -= C
//should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf.
//needed as this can, unlike other placements, disconnect cables
@@ -162,24 +162,7 @@
T.visible_message("<span class='warning'>The water sizzles as it lands on \the [T]!</span>")
else if(volume >= 10)
if(T.wet >= 1)
return
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
spawn(800) // This is terrible and needs to be changed when possible.
if(!T || !istype(T))
return
if(T.wet >= 2)
return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_floor(1)
/datum/reagent/water/touch_obj(var/obj/O)
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
@@ -123,24 +123,7 @@
qdel(hotspot)
if(volume >= 3)
if(T.wet >= 1)
return
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
spawn(800) // This is terrible and needs to be changed when possible.
if(!T || !istype(T))
return
if(T.wet >= 2)
return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_floor()
/datum/reagent/nutriment/virus_food
name = "Virus Food"
@@ -256,9 +256,13 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if(E && istype(E))
if(istype(E))
if(E.status & ORGAN_ROBOT)
return
if(E.damage > 0)
E.damage = max(E.damage - 5 * removed, 0)
if(E.damage <= 5 && E.organ_tag == O_EYES)
H.sdisabilities &= ~BLIND
/datum/reagent/peridaxon
name = "Peridaxon"
@@ -272,10 +276,13 @@
/datum/reagent/peridaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/obj/item/organ/I in H.internal_organs)
if((I.damage > 0) && !(I.status & ORGAN_ROBOT)) //Peridaxon heals only non-robotic organs
if(I.status & ORGAN_ROBOT)
continue
if(I.damage > 0) //Peridaxon heals only non-robotic organs
I.damage = max(I.damage - removed, 0)
if(I.damage <= 5 && I.organ_tag == O_EYES)
H.sdisabilities &= ~BLIND
/datum/reagent/ryetalyn
name = "Ryetalyn"
@@ -328,16 +328,7 @@
if(!istype(T))
return
if(volume >= 1)
if(T.wet >= 2)
return
T.wet = 2
spawn(800)
if(!T || !istype(T))
return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_floor(2)
/datum/reagent/silicate
name = "Silicate"
+4 -1
View File
@@ -87,6 +87,7 @@
if (!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/I in affected.internal_organs)
@@ -109,12 +110,14 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0)
if(!(I.status & ORGAN_ROBOT))
user.visible_message("<span class='notice'>[user] treats damage to [target]'s [I.name] with [tool_name].</span>", \
"<span class='notice'>You treat damage to [target]'s [I.name] with [tool_name].</span>" )
I.damage = 0
if(I.organ_tag == O_EYES)
target.sdisabilities &= ~BLIND
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+2
View File
@@ -246,6 +246,8 @@
user.visible_message("<span class='notice'>[user] repairs [target]'s [I.name] with [tool].</span>", \
"<span class='notice'>You repair [target]'s [I.name] with [tool].</span>" )
I.damage = 0
if(I.organ_tag == O_EYES)
target.sdisabilities &= ~BLIND
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)