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

# Conflicts:
#	code/__DEFINES/flags.dm
This commit is contained in:
tigercat2000
2018-03-22 15:35:12 -07:00
280 changed files with 6565 additions and 2171 deletions
+3 -1
View File
@@ -10,7 +10,9 @@ world/IsBanned(key,address,computer_id)
var/admin = 0
var/ckey = ckey(key)
if((ckey in admin_datums) || (ckey in deadmins))
admin = 1
var/datum/admins/A = admin_datums[ckey]
if(A.rights & R_ADMIN)
admin = 1
//Guest Checking
if(!guests_allowed && IsGuestKey(key))
+2 -3
View File
@@ -887,7 +887,8 @@
else if(href_list["boot2"])
var/mob/M = locate(href_list["boot2"])
if(ismob(M))
if(!check_if_greater_rights_than(M.client))
if(M.client && M.client.holder && (M.client.holder.rights & R_BAN))
to_chat(src, "<span class='warning'>[key_name_admin(M)] cannot be kicked from the server.</span>")
return
to_chat(M, "<span class='warning'>You have been kicked from the server</span>")
log_admin("[key_name(usr)] booted [key_name(M)].")
@@ -960,8 +961,6 @@
var/mob/M = locate(href_list["newban"])
if(!ismob(M)) return
if(M.client && M.client.holder) return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
if("Yes")
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
+1 -1
View File
@@ -123,7 +123,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
T.addResponse(usr.client, msg)
else
ticketNum = globAdminTicketHolder.getTicketCounter() // ticketNum is the ticket ready to be assigned.
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] :</span> <span class='adminhelp'>[msg]</span>"
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""](<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
//Open a new adminticket and inform the user.
globAdminTicketHolder.newTicket(src, prunedmsg, msg)
for(var/client/X in modholders + adminholders)
@@ -79,3 +79,54 @@
display_name = "Nano-Mob Hunter GO! Cartridge"
path = /obj/item/weapon/cartridge/mob_hunt_game
cost = 2
//////////////////////
// Mugs //
//////////////////////
/datum/gear/mug
display_name = "random coffee mug"
description = "A randomly colored coffee mug. You'll need to supply your own beverage though."
path = /obj/item/weapon/reagent_containers/food/drinks/mug
sort_category = "Mugs"
/datum/gear/novelty_mug
display_name = "novelty coffee mug"
description = "A random novelty coffee mug. You'll need to supply your own beverage though."
path = /obj/item/weapon/reagent_containers/food/drinks/mug/novelty
cost = 2
sort_category = "Mugs"
/datum/gear/mug/department
subtype_path = /datum/gear/mug/department
sort_category = "Mugs"
subtype_cost_overlap = FALSE
/datum/gear/mug/department/eng
display_name = "engineer coffee mug"
description = "An engineer's coffee mug, emblazoned in the colors of the Engineering department."
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
path = /obj/item/weapon/reagent_containers/food/drinks/mug/eng
/datum/gear/mug/department/med
display_name = "doctor coffee mug"
description = "A doctor's coffee mug, emblazoned in the colors of the Medical department."
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Coroner")
path = /obj/item/weapon/reagent_containers/food/drinks/mug/med
/datum/gear/mug/department/sci
display_name = "scientist coffee mug"
description = "A scientist's coffee mug, emblazoned in the colors of the Science department."
allowed_roles = list("Research Director", "Scientist", "Roboticist")
path = /obj/item/weapon/reagent_containers/food/drinks/mug/sci
/datum/gear/mug/department/sec
display_name = "officer coffee mug"
description = "An officer's coffee mug, emblazoned in the colors of the Security department."
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot", "Brig Physician", "Internal Affairs Agent")
path = /obj/item/weapon/reagent_containers/food/drinks/mug/sec
/datum/gear/mug/department/serv
display_name = "crewmember coffee mug"
description = "A crewmember's coffee mug, emblazoned in the colors of the Service department."
path = /obj/item/weapon/reagent_containers/food/drinks/mug/serv
@@ -152,7 +152,3 @@
/datum/gear/hat/flowerpin
display_name = "hair flower"
path = /obj/item/clothing/head/hairflower
/datum/gear/hat/flowerpinpurp
display_name = "hair flower, purple"
path = /obj/item/clothing/head/hairflower/purple
-5
View File
@@ -14,11 +14,6 @@
desc = "Smells nice."
item_state = "hairflower"
/obj/item/clothing/head/hairflower/purple
icon_state = "hairflowerp"
item_state = "hairflowerp"
item_state = "that"
/obj/item/clothing/head/powdered_wig
name = "powdered wig"
desc = "A powdered wig."
@@ -99,8 +99,6 @@
/obj/item/rig_module/self_destruct
)
..()
/obj/item/clothing/gloves/rig/light/ninja
name = "insulated gloves"
siemens_coefficient = 0
+37 -3
View File
@@ -276,7 +276,7 @@
to_chat(target, "<span class='notice'>You comb your tail with the [src].</span>")
used = 1
/obj/item/device/fluff/desolate_coat_kit //DesolateG: Michael Smith
/obj/item/device/fluff/desolate_coat_kit //DesolateG: Micheal Smith
name = "armored jacket conversion kit"
desc = "Flaps of dark fabric, probably used to somehow modify some sort of an armored garment. Won't help with protection, though."
icon_state = "modkit"
@@ -335,7 +335,7 @@
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael Smith
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Micheal Smith
name = "stun baton conversion kit"
desc = "Some sci-fi looking parts for a stun baton."
icon = 'icons/obj/custom_items.dmi'
@@ -588,7 +588,7 @@
/obj/item/clothing/head/fluff/heather_winceworth // Regens: Heather Winceworth
name= "Heather's rose"
desc= "A beautiful purple rose for your hair."
icon= 'icons/obj/clothing/hats.dmi'
icon= 'icons/obj/custom_items.dmi'
icon_state = "hairflowerp"
item_state = "hairflowerp"
@@ -1262,3 +1262,37 @@
item_state = "victorianvest"
item_color = "victorianlightfire"
displays_id = FALSE
/obj/item/device/fluff/decemviri_spacepod_kit //Decemviri: Sylus Cain
name = "Spacepod mod kit"
desc = "a kit on tools and a blueprint detailing how to reconfigure a spacepod"
icon_state = "modkit"
/obj/item/device/fluff/decemviri_spacepod_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
if(!istype(target, /obj/spacepod))
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
return
to_chat(user, "<span class='notice'>You modify the appearance of [target] based on the kite blueprints.</span>")
var/obj/spacepod/pod = target
pod.icon = 'icons/48x48/custom_pod.dmi'
pod.icon_state = "pod_dece"
pod.name = "sleek spacepod"
pod.desc = "A modified varient of a space pod."
pod.can_paint = FALSE
used = 1
qdel(src)
/obj/item/weapon/bikehorn/fluff/pinkbikehorn //Xerdies: Squiddle Toodle
name = "Honkinator5000"
desc = "This horn may look ridiculous but is the new hot item for clowns in the Clown Empire. It has a fine print on its side reading: Property of Prince Honktertong the IV"
icon = 'icons/obj/custom_items.dmi'
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
icon_state = "teri_horn"
item_state = "teri_horn"
honk_sound = 'sound/items/teri_horn.ogg'
+24 -22
View File
@@ -481,37 +481,39 @@
eater.say("Nom")
wither()
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
if (!W || !user || !W.type)
return
user.changeNext_move(CLICK_CD_MELEE)
var/damage_to_do = W.force
if(istype(W, /obj/item/weapon/scythe))
var/obj/item/weapon/scythe/S = W
/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
var/damage_dealt = I.force
if(istype(I, /obj/item/weapon/scythe))
var/obj/item/weapon/scythe/S = I
if(S.extend) //so folded telescythes won't get damage boosts / insta-clears (they instead will instead be treated like non-scythes)
damage_to_do *= 4
damage_dealt *= 4
for(var/obj/structure/spacevine/B in range(1,src))
if(B.health > damage_to_do) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
B.health -= damage_to_do
if(B.health > damage_dealt) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
B.take_damage(damage_dealt, I.damtype, "melee", 1)
else
B.wither()
return
if(is_sharp(W))
damage_to_do *= 4
if(W && W.damtype == "fire")
damage_to_do *= 4
if(is_sharp(I))
damage_dealt *= 4
if(I.damtype == BURN)
damage_dealt *= 4
for(var/datum/spacevine_mutation/SM in mutations)
damage_to_do = SM.on_hit(src, user, W, damage_to_do) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
take_damage(damage_dealt, I.damtype, "melee", 1)
health -= damage_to_do
if(health < 1)
wither()
/obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
if(damage_amount)
playsound(src, 'sound/weapons/slash.ogg', 50, 1)
else
playsound(src, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
playsound(src, 'sound/items/welder.ogg', 100, 1)
..()
/obj/structure/spacevine/obj_destruction()
wither()
/obj/structure/spacevine/Crossed(mob/crosser)
if(isliving(crosser))
+1 -1
View File
@@ -595,7 +595,7 @@
playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
check_health()
/obj/machinery/fishtank/proc/attack_generic(mob/living/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime
/obj/machinery/fishtank/attack_generic(mob/living/user, damage = 0) //used by attack_alien, attack_animal, and attack_slime
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
cur_health -= damage
+52 -30
View File
@@ -1,35 +1,57 @@
mob/living/carbon/proc/dream()
dreaming = 1
var/list/dreams = list(
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain",
"voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness",
"light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun",
"a hat","the Cyberiad","a ruined station","a planet","plasma","air","the medical bay","the bridge","blinking lights",
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money",
"the head of personnel","the head of security","a chief engineer","a research director","a chief medical officer",
"the detective","the warden","a member of the internal affairs","a station engineer","the janitor","atmospheric technician",
"the quartermaster","a cargo technician","the botanist","a shaft miner","the psychologist","the chemist","the geneticist",
"the virologist","the roboticist","the chef","the bartender","the chaplain","the librarian", "the brig physician", "the pod pilot",
"the barber", "the mechanic", "the magistrate", "the nanotrasen representative", "the blueshield", "a mouse","an ert member",
"a beach","the holodeck","a smokey room","a voice","the cold","a mouse","an operating table","the bar","the rain","a skrell",
"a unathi","a tajaran", "a vulpkanin", "a slime", "an ipc", "a vox", "a plasmaman", "a grey", "a kidan", "a diona", "the ai core",
"the mining station","the research station", "a beaker of strange liquid"
)
spawn(0)
for(var/i = rand(1,4),i > 0, i--)
var/dream_image = pick(dreams)
dreams -= dream_image
to_chat(src, "<span class='notice'><i>... [dream_image] ...</i></span>")
sleep(rand(40,70))
if(paralysis <= 0)
dreaming = 0
return 0
dreaming = 0
return 1
///DREAMS
/mob/living/carbon/proc/dream()
var/list/dreams = custom_dreams(dream_strings, src)
for(var/obj/item/weapon/bedsheet/sheet in loc)
dreams += sheet.dream_messages
var/list/dream_images = list()
for(var/i in 1 to rand(3, rand(5, 10)))
dream_images += pick_n_take(dreams)
dreaming++
for(var/i in 1 to dream_images.len)
addtimer(src, "experience_dream", ((i - 1) * rand(30,60)), FALSE, dream_images[i], FALSE)
return TRUE
/mob/living/carbon/proc/custom_dreams(list/dreamlist, mob/user)
var/list/newlist = dreamlist.Copy()
for(var/i in 1 to newlist.len)
newlist[i] = replacetext(newlist[i], "\[DREAMER\]", "[user.name]")
return dreamlist
//NIGHTMARES
/mob/living/carbon/proc/nightmare()
var/list/nightmares = nightmare_strings.Copy()
for(var/obj/item/weapon/bedsheet/sheet in loc)
nightmares += sheet.nightmare_messages
var/list/dream_images = list()
for(var/i in 1 to rand(3, rand(5, 10)))
dream_images += pick_n_take(nightmares)
nightmare++
for(var/i in 1 to dream_images.len)
addtimer(src, "experience_dream", ((i - 1) * rand(30,60)), FALSE, nightmares[i], TRUE)
return TRUE
/mob/living/carbon/proc/handle_dreams()
if(client && !dreaming && prob(5))
dream()
else if(client && !nightmare && prob(2))
nightmare()
if(ishuman(src))
if(prob(10))
emote("writhes in their sleep.")
dir = pick(cardinal)
/mob/living/carbon/proc/experience_dream(dream_image, isNightmare)
dreaming--
nightmare--
if(stat != UNCONSCIOUS || InCritical())
return
if(isNightmare)
dream_image = "<span class='cultitalic'>[dream_image]</span>"
to_chat(src, "<span class='notice'><i>... [dream_image] ...</i></span>")
/mob/living/carbon/var/dreaming = 0
@@ -353,3 +353,16 @@
icon = 'icons/obj/lavaland/ash_flora.dmi'
icon_state = "mushroom_bowl"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/reagent_containers/food/drinks/bag
name = "Drink bag"
desc = "Normally put in wine boxes, or down pants at stadium events."
icon_state = "goonbag"
volume = 70
/obj/item/weapon/reagent_containers/food/drinks/bag/goonbag
name = "Goon from a Blue Toolbox special edition"
desc = "Wine from the land down under, where the dingos roam and the roos do wander."
icon_state = "goonbag"
list_reagents = list("wine" = 70)
@@ -0,0 +1,166 @@
/obj/item/weapon/reagent_containers/food/drinks/mug
name = "coffee mug"
desc = "A mug for sipping hot beverages out of."
icon = 'icons/obj/mugs.dmi'
icon_state = "mug"
var/novelty = FALSE
var/preset = FALSE
/obj/item/weapon/reagent_containers/food/drinks/mug/novelty
name = "novelty coffee mug"
desc = "A fun mug for your coffee or other hot beverage!"
novelty = TRUE
/datum/novelty_mug
var/name = "novelty coffee mug"
var/description = "A fun mug for your coffee or other hot beverage!"
var/state = "mug"
/datum/novelty_mug/peace
name = "peaceful mug"
description = "It's like... so peaceful, man."
state = "mug_peace"
/datum/novelty_mug/fire
name = "fire mug"
description = "Caution: contents and design may be incredibly hot."
state = "mug_fire"
/datum/novelty_mug/best
name = "best mug"
description = "By decree of this mug, you are the best!"
state = "mug_best"
/datum/novelty_mug/best/New()
var/locale = pick("Room's", "Department's", "Station's", "World's", "Sector's", "System's", "Galaxy's", "Universe's", "Multi-verse's", "Nanotrasen's", "Syndicate's")
var/what = pick("Crewmember", "Spessman", "Employee", "Coffee", "Coffee-drinker", "Survivor", "Personality", "Lifeform", "Doctor", "Scientist", "Engineer", "Officer", "Civillian", "Captain", "Agent")
name = "\"[locale] Best [what]\" mug"
/datum/novelty_mug/worst
name = "worst mug"
description = "By decree of this mug, you are the worst!"
state = "mug_worst"
/datum/novelty_mug/worst/New()
var/locale = pick("Room's", "Department's", "Station's", "World's", "Sector's", "System's", "Galaxy's", "Universe's", "Multi-verse's", "Nanotrasen's", "Syndicate's")
var/what = pick("Crewmember", "Spessman", "Employee", "Coffee", "Coffee-drinker", "Survivor", "Personality", "Lifeform", "Doctor", "Scientist", "Engineer", "Officer", "Civillian", "Captain", "Agent")
name = "\"[locale] Worst [what]\" mug"
/datum/novelty_mug/insult
name = "insulting coffee mug"
description = "How rude!"
state = "mug_insult"
/datum/novelty_mug/insult/New()
var/insult = pick("There isn't enough coffee to make you tolerable.", "I drink coffee so I can pretend to like people.", "I haven't had my coffee yet... What's your excuse?", "This coffee is more robust than you.", "Decaf is for weaklings like you.")
description = "This one says:\"[insult]\""
/datum/novelty_mug/pda
name = "PDA mug"
description = "Finally, a use for one of these!"
state = "mug_pda"
/datum/novelty_mug/rad
name = "radioactive mug"
description = "Is coffee supposed to be green... and glowing?"
state = "mug_rad"
/datum/novelty_mug/tide
name = "greytide mug"
description = "This coffee packs almost as much of a punch as a toolbox to the face!"
state = "mug_tide"
/datum/novelty_mug/happy
name = "happy mug"
description = "Even when you aren't, this mug helps you look happy around coworkers."
state = "mug_happy"
/datum/novelty_mug/pills
name = "prescription mug"
description = "Prescription: caffeine. Dosage: As much as it takes."
state = "mug_pill"
/datum/novelty_mug/rainbow
name = "rainbow mug"
description = "So mesmerizing!"
state = "mug_rainbow"
/obj/item/weapon/reagent_containers/food/drinks/mug/New()
..()
if(preset)
return
if(novelty)
var/novelty_type = pick(subtypesof(/datum/novelty_mug))
var/datum/novelty_mug/selected = new novelty_type
name = selected.name
desc = selected.description
icon_state = selected.state
else
icon_state = pick("mug_black", "mug_white", "mug_red", "mug_blue", "mug_green", "mug_pink")
/obj/item/weapon/reagent_containers/food/drinks/mug/eng
name = "engineer's mug"
desc = "A mug engineered to hold your beverage... IN SPACE!"
icon_state = "mug_eng"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/med
name = "doctor's mug"
desc = "A mug that can hold the cure for what ails you!"
icon_state = "mug_med"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/sci
name = "scientist's mug"
desc = "Nothing fuels research like a coffee mug... or grant money!"
icon_state = "mug_sci"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/sec
name = "officer's mug"
desc = "The perfect partner for a sprinkled donut or stunbaton!"
icon_state = "mug_sec"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/serv
name = "crewmember's mug"
desc = "Serve your thirst better than you serve the rest of the crew!"
icon_state = "mug_serv"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/ce
name = "chief engineer's mug"
desc = "Broken and welded back together countless times, just like the station! Probably microwave safe."
icon_state = "mug_ce"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/hos
name = "head of security's mug"
desc = "If only your officers were as robust as this coffee's flavor!"
icon_state = "mug_hos"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/rd
name = "research director's mug"
desc = "Energy tech level: 99"
icon_state = "mug_rd"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/cmo
name = "chief medical officer's mug"
desc = "Fill it with something to keep you awake while you try to keep the crew alive."
icon_state = "mug_cmo"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/hop
name = "head of personnel's mug"
desc = "Are the stains on the bottom coffee or ink?"
icon_state = "mug_hop"
preset = TRUE
/obj/item/weapon/reagent_containers/food/drinks/mug/cap
name = "captain's mug"
desc = "An inscription on the side reads \"Best Captain 2559\"... The last time the station had a worthy captain."
icon_state = "mug_cap"
preset = TRUE
+9 -1
View File
@@ -1,3 +1,4 @@
#define MAX_WEIGHT_CLASS WEIGHT_CLASS_SMALL * 2
//Food items that are eaten normally and don't leave anything behind.
/obj/item/weapon/reagent_containers/food/snacks
name = "snack"
@@ -14,6 +15,7 @@
var/dry = 0
var/cooktype[0]
var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving
var/total_w_class = 0 //for the total weight an item of food can carry
//Placeholder for effect that trigger on eating that aren't tied to reagents.
@@ -131,6 +133,10 @@
)
inaccurate = 1
else if(W.w_class <= WEIGHT_CLASS_SMALL && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
if(total_w_class > MAX_WEIGHT_CLASS)
// Nope, no bluespace slice food
to_chat(user, "<span class='warning'>Something is already in [src]!</span>")
return 1
if(!iscarbon(user))
return 1
to_chat(user, "<span class='warning'>You slip [W] inside [src].</span>")
@@ -138,6 +144,7 @@
if((user.client && user.s_active != src))
user.client.screen -= W
W.dropped(user)
total_w_class += W.w_class
add_fingerprint(user)
contents += W
return
@@ -2521,4 +2528,5 @@
icon_state = "onionrings"
list_reagents = list("nutriment" = 3)
filling_color = "#C0C9A0"
gender = PLURAL
gender = PLURAL
#undef MAX_WEIGHT_CLASS
@@ -119,6 +119,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharp = 1
var/extend = 1
var/swiping = FALSE
/obj/item/weapon/scythe/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
@@ -130,6 +131,21 @@
playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/scythe/pre_attackby(atom/A, mob/living/user, params)
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
return ..()
else
var/turf/user_turf = get_turf(user)
var/dir_to_target = get_dir(user_turf, get_turf(A))
swiping = TRUE
var/static/list/scythe_slash_angles = list(0, 45, 90, -45, -90)
for(var/i in scythe_slash_angles)
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
for(var/obj/structure/spacevine/V in T)
if(user.Adjacent(V))
melee_attack_chain(user, V)
swiping = FALSE
/obj/item/weapon/scythe/tele
icon_state = "tscythe0"
item_state = null //no sprite for folded version, like a tele-baton
@@ -335,6 +335,7 @@
friendly = "mends"
density = 0
flying = 1
obj_damage = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
mob_size = MOB_SIZE_TINY
+1 -1
View File
@@ -418,7 +418,7 @@ var/global/list/rockTurfEdgeCache = list(
return
/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob)
if(user.environment_smash >= 2)
if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS))
gets_drilled()
..()
+1
View File
@@ -23,6 +23,7 @@
maxHealth = 125
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 0
environment_smash = 0
check_friendly_fire = 1
stop_automated_movement_when_pulled = 1
+1 -1
View File
@@ -618,7 +618,7 @@
exclaim_verb = "tones"
colour = "say_quote"
key = "z"//Zwarmer...Or Zerg!
flags = RESTRICTED || HIVEMIND
flags = RESTRICTED | HIVEMIND
follow = 1
// Language handling.
@@ -24,7 +24,7 @@
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
..()
return ..()
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
if(!iscarbon(user))
@@ -24,5 +24,7 @@
var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
var/dreaming = 0 //How many dream images we have left to send
var/nightmare = 0
blood_volume = BLOOD_VOLUME_NORMAL
@@ -1668,6 +1668,41 @@
G.icon_state = "grabbed1"
G.synch()
/mob/living/carbon/human/proc/get_eyecon()
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
if(istype(species) && species.eyes)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
if(eye_implant) //Eye implants override native DNA eye colo(u)r
eyes_icon = eye_implant.generate_icon()
else if(eyes)
eyes_icon = eyes.generate_icon()
else
eyes_icon.Blend("#800000", ICON_ADD)
return eyes_icon
/mob/living/carbon/human/proc/get_eye_shine() //Referenced cult constructs for shining in the dark. Needs to be above lighting effects such as shading.
var/obj/item/organ/external/head/head_organ = get_organ("head")
var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style]
var/icon/hair = new /icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
return image(get_icon_difference(get_eyecon(), hair), layer = LIGHTING_LAYER + 1) //Cut the hair's pixels from the eyes icon so eyes covered by bangs stay hidden even while on a higher layer.
/*Used to check if eyes should shine in the dark. Returns the image of the eyes on the layer where they will appear to shine.
Eyes need to have significantly high darksight to shine unless the mob has the XRAY vision mutation. Eyes will not shine if they are covered in any way.*/
/mob/living/carbon/human/proc/eyes_shine()
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
if(!(istype(eyes) || istype(eye_implant)))
return FALSE
if(!get_location_accessible(src, "eyes"))
return FALSE
if(!(eyes.shine()) && !istype(eye_implant) && !(XRAY in mutations)) //If their eyes don't shine, they don't have other augs, nor do they have X-RAY vision
return FALSE
return TRUE
/mob/living/carbon/human/proc/gut()
set category = "Abilities"
set name = "Gut"
@@ -228,6 +228,3 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] attempted to disarm [src]!</span>")
return
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
return
@@ -176,21 +176,22 @@ emp_act
return 1
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone)
if(!I || !user)
return 0
if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == INTENT_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
newmeat.name = src.real_name + newmeat.name
newmeat.subjectname = src.real_name
newmeat.subjectjob = src.job
newmeat.reagents.add_reagent ("nutriment", (src.nutrition / 15) / 3)
src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1))
if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && stat == DEAD && user.a_intent == INTENT_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(loc))
newmeat.name = real_name + newmeat.name
newmeat.subjectname = real_name
newmeat.subjectjob = job
newmeat.reagents.add_reagent("nutriment", (nutrition / 15) / 3)
reagents.trans_to(newmeat, round((reagents.total_volume) / 3, 1))
add_mob_blood(src)
--src.meatleft
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [src.name]</span>")
if(!src.meatleft)
src.create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
--meatleft
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [name]</span>")
if(!meatleft)
create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
user.create_attack_log("Chopped up <b>[key_name(src)]</b> into meat</b>")
msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat")
if(!iscarbon(user))
@@ -214,19 +215,18 @@ emp_act
if(istype(I,/obj/item/weapon/card/emag))
emag_act(user, affecting)
if(! I.discrete)
if(I.attack_verb.len)
visible_message("<span class='combat danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</span>")
else
visible_message("<span class='combat danger'>[src] has been attacked in the [hit_area] with [I.name] by [user]!</span>")
send_item_attack_message(I, user, hit_area)
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration)
if(!I.force)
return 0 //item force is zero
var/armor = run_armor_check(affecting, "melee", "<span class='warning'>Your armour has protected your [hit_area].</span>", "<span class='warning'>Your armour has softened hit to your [hit_area].</span>", armour_penetration = I.armour_penetration)
var/weapon_sharp = is_sharp(I)
if(weapon_sharp && prob(getarmor(user.zone_sel.selecting, "melee")))
weapon_sharp = 0
if(armor >= 100) return 0
if(!I.force) return 0
if(armor >= 100)
return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
@@ -234,8 +234,6 @@ emp_act
var/bloody = 0
if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2))
I.add_mob_blood(src) //Make the weapon bloody, not the person.
// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon
// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays
if(prob(I.force * 2)) //blood spatter!
bloody = 1
var/turf/location = loc
@@ -170,9 +170,9 @@ I use this to standardize shadowling dethrall code
-- Crazylemon
*/
/mob/living/carbon/human/proc/named_organ_parent(var/organ_name)
if(!get_int_organ(organ_name))
if(!get_int_organ_tag(organ_name))
return null
var/obj/item/organ/internal/O = get_int_organ(organ_name)
var/obj/item/organ/internal/O = get_int_organ_tag(organ_name)
return O.parent_organ
/mob/living/carbon/human/has_organic_damage()
@@ -187,4 +187,4 @@ I use this to standardize shadowling dethrall code
splinted_limbs.Cut()
for(var/obj/item/organ/external/limb in bodyparts)
if(limb.status & ORGAN_SPLINTED)
splinted_limbs += limb
splinted_limbs += limb
@@ -58,6 +58,7 @@
default_headacc = "Simple"
default_headacc_colour = "#404040"
butt_sprite = "unathi"
brute_mod = 1.05
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
@@ -78,6 +79,38 @@
"is twisting their own neck!",
"is holding their breath!")
var/datum/action/innate/tail_lash/lash = new()
/datum/species/unathi/handle_post_spawn(var/mob/living/carbon/human/H)
lash.Grant(H)
..()
/datum/action/innate/tail_lash
name = "Tail lash"
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "tail"
/datum/action/innate/tail_lash/Activate()
var/mob/living/carbon/human/user = owner
if(!user.restrained() || !user.buckled)
to_chat(user, "<span class='warning'>You need freedom of movement to tail lash!</span>")
return
if(user.getStaminaLoss() >= 50)
to_chat(user, "<span class='warning'>Rest before tail lashing again!</span>")
return
for(var/mob/living/carbon/human/C in orange(1))
var/obj/item/organ/external/E = C.get_organ(pick("l_leg", "r_leg", "l_foot", "r_foot", "groin"))
if(E)
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("<span class='danger'>[src] smacks [C] in [E] with their tail! </span>", "<span class='danger'>You hit [C] in [E] with your tail!</span>")
user.adjustStaminaLoss(15)
C.apply_damage(5, BRUTE, E)
user.spin(20, 1)
playsound(user.loc, 'sound/weapons/slash.ogg', 50, 0)
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -163,6 +196,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR
dietflags = DIET_OMNI
hunger_drain = 0.11
taste_sensitivity = TASTE_SENSITIVITY_SHARP
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
@@ -551,11 +585,27 @@
var/list/mob/living/carbon/human/recolor_list = list()
var/datum/action/innate/regrow/grow = new()
species_abilities = list(
/mob/living/carbon/human/verb/toggle_recolor_verb,
/mob/living/carbon/human/proc/regrow_limbs
)
/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H)
grow.Grant(H)
..()
/datum/action/innate/regrow
name = "Regrow limbs"
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "greenglow"
/datum/action/innate/regrow/Activate()
var/mob/living/carbon/human/user = owner
user.regrow_limbs()
/datum/species/slime/handle_life(var/mob/living/carbon/human/H)
//This is allegedly for code "style". Like a plaid sweater?
#define SLIMEPERSON_COLOR_SHIFT_TRIGGER 0.1
@@ -787,7 +837,8 @@
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
clothing_flags = HAS_SOCKS
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
default_hair_colour = "#000000"
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
oxy_mod = 0
@@ -947,6 +998,8 @@
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
if(!head_organ)
return
head_organ.h_style = "Bald"
head_organ.f_style = "Shaved"
spawn(100)
@@ -105,6 +105,7 @@ Please contact me on #coderbus IRC. ~Carn x
/mob/living/carbon/human
var/list/overlays_standing[TOTAL_LAYERS]
var/list/misc_effect_overlays = list() //Overlays that are applied at a custom layer (defined in each image's .layer property) outside of standard overlay application. Updated in update_misc_effects()
var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
var/icon/skeleton
var/list/cached_standing_overlays = list() // List of everything currently in a human's actual overlays
@@ -154,6 +155,10 @@ Please contact me on #coderbus IRC. ~Carn x
I.layer = (-2 - (TOTAL_LAYERS - i)) // Highest layer gets -2, each prior layer is 1 lower
new_overlays += I
update_misc_effects()
if(misc_effect_overlays)
new_overlays += misc_effect_overlays
if(frozen) // Admin freeze overlay
new_overlays += frozen
@@ -1324,6 +1329,13 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
/mob/living/carbon/human/proc/update_misc_effects()
misc_effect_overlays.Cut()
//Begin appending miscellaneous effects.
if(eyes_shine())
misc_effect_overlays += get_eye_shine() //Image layer is specified in get_eye_shine() proc as LIGHTING_LAYER + 1.
/mob/living/carbon/human/proc/force_update_limbs()
for(var/obj/item/organ/external/O in bodyparts)
O.sync_colour_to_human(src)
+15
View File
@@ -353,6 +353,21 @@
if(..())
handle_dreams()
adjustStaminaLoss(-10)
var/comfort = 1
if(istype(buckled, /obj/structure/stool/bed))
var/obj/structure/stool/bed/bed = buckled
comfort+= bed.comfort
for(var/obj/item/weapon/bedsheet/bedsheet in range(loc,0))
if(bedsheet.loc != loc) //bedsheets in your backpack/neck don't give you comfort
continue
comfort+= bedsheet.comfort
break //Only count the first bedsheet
if(drunk)
comfort += 1 //Aren't naps SO much better when drunk?
AdjustDrunk(1-0.0015*comfort) //reduce drunkenness ~6% per two seconds, when on floor.
if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket.
adjustBruteLoss(-1*comfort)
adjustFireLoss(-1*comfort)
if(prob(10) && health && hal_screwyhud != SCREWYHUD_CRIT)
emote("snore")
// Keep SSD people asleep
+26 -36
View File
@@ -193,6 +193,12 @@
updatehealth()
return
/mob/living/carbon/slime/MouseDrop(atom/movable/A)
if(isliving(A) && A != usr)
var/mob/living/Food = A
if(Food.Adjacent(usr) && !stat && Food.stat != DEAD) //messy
Feedon(Food)
..()
/mob/living/carbon/slime/unEquip(obj/item/W as obj)
return
@@ -200,28 +206,25 @@
/mob/living/carbon/slime/attack_ui(slot)
return
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M)
if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
if(Victim) return // can't attack while eating!
if(Victim)
return // can't attack while eating!
M.do_attack_animation(src)
visible_message("<span class='danger'>[M.name] has glomped [src]!</span>", \
"<span class='userdanger'>[M.name] has glomped [src]!</span>")
var/damage = rand(1, 3)
attacked += 5
if(M.is_adult)
damage = rand(1, 6)
else
damage = rand(1, 3)
if(health > -100)
M.do_attack_animation(src)
visible_message("<span class='danger'> The [M.name] has glomped [src]!</span>", \
"<span class='userdanger'> The [M.name] has glomped [src]!</span>")
var/damage = rand(1, 3)
attacked += 5
if(M.is_adult)
damage = rand(1, 6)
else
damage = rand(1, 3)
adjustBruteLoss(damage)
updatehealth()
return
@@ -327,20 +330,6 @@
if(S.next_step(M, src))
return 1
/*
if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = M.gloves
if(G.cell)
if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
if(G.cell.charge >= 2500)
G.cell.use(2500)
visible_message("<span class='warning'>[src] has been touched with the stun gloves by [M]!</span>")
return
else
to_chat(M, "<span class='warning'>Not enough charge! </span>")
return
*/
switch(M.a_intent)
if(INTENT_HELP)
@@ -373,9 +362,9 @@
playsound(loc, "punch", 25, 1, -1)
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
"<span class='userdanger'>[M] has punched [src]!</span>")
adjustBruteLoss(damage)
updatehealth()
if(health > -100)
adjustBruteLoss(damage)
updatehealth()
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
@@ -404,13 +393,14 @@
var/damage = rand(15, 30)
if(damage >= 25)
damage = rand(20, 40)
visible_message("<span class='danger'>[M] has attacked [name]!</span>", \
"<span class='userdanger'>[M] has attacked [name]!</span>")
visible_message("<span class='danger'>[M] has slashed [name]!</span>", \
"<span class='userdanger'>[M] has slashed [name]!</span>")
else
visible_message("<span class='danger'>[M] has wounded [name]!</span>", \
"<span class='userdanger'>)[M] has wounded [name]!</span>")
adjustBruteLoss(damage)
updatehealth()
if(health > -100)
adjustBruteLoss(damage)
updatehealth()
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has attempted to lunge at [name]!</span>", \
+4 -3
View File
@@ -983,11 +983,12 @@
return 0
/mob/living/proc/attempt_harvest(obj/item/I, mob/user)
if(stat == DEAD && !isnull(butcher_results)) //can we butcher it?
if(istype(I, /obj/item/weapon/kitchen/knife))
if(user.a_intent == INTENT_HARM && stat == DEAD && butcher_results) //can we butcher it?
var/sharpness = is_sharp(I)
if(sharpness)
to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>")
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80))
if(do_mob(user, src, 80 / sharpness) && Adjacent(I))
harvest(user)
return 1
+21
View File
@@ -226,6 +226,27 @@ var/list/ai_verbs_default = list(
job = "AI"
/mob/living/silicon/ai/Stat()
..()
if(statpanel("Status"))
if(stat)
stat(null, text("Systems nonfunctional"))
return
show_borg_info()
/mob/living/silicon/ai/proc/show_borg_info()
stat(null, text("Connected cyborgs: [connected_robots.len]"))
for(var/mob/living/silicon/robot/R in connected_robots)
var/robot_status = "Nominal"
if(R.stat || !R.client)
robot_status = "OFFLINE"
else if(!R.cell || R.cell.charge <= 0)
robot_status = "DEPOWERED"
// Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies!
var/area/A = get_area(R)
stat(null, text("[R.name] | S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge] / [R.cell.maxcharge]" : "Empty"] | \
Module: [R.designation] | Loc: [sanitize(A.name)] | Status: [robot_status]"))
/mob/living/silicon/ai/rename_character(oldname, newname)
if(!..(oldname, newname))
return FALSE
@@ -567,10 +567,7 @@ var/list/robot_verbs_default = list(
return 2
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
/mob/living/silicon/robot/attackby(obj/item/weapon/W, mob/user, params)
if(opened) // Are they trying to insert something?
for(var/V in components)
var/datum/robot_component/C = components[V]
@@ -610,6 +607,7 @@ var/list/robot_verbs_default = list(
else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
user.changeNext_move(CLICK_CD_MELEE)
if(!getFireLoss())
to_chat(user, "<span class='notice'>Nothing to fix!</span>")
return
@@ -744,9 +742,13 @@ var/list/robot_verbs_default = list(
to_chat(user, "<span class='danger'>Upgrade error.</span>")
else
spark_system.start()
return ..()
/mob/living/silicon/robot/attacked_by(obj/item/I, mob/living/user, def_zone)
if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt.
spark_system.start()
..()
/mob/living/silicon/robot/emag_act(user as mob)
if(!ishuman(user) && !issilicon(user))
return
@@ -8,7 +8,7 @@
health = 100
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
obj_damage = 60
environment_smash = 2 //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
@@ -221,8 +221,9 @@
update_controls()
return
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/glass))
. = 1 //no afterattack
if(locked)
to_chat(user, "<span class='warning'>You cannot insert a beaker because the panel is locked!</span>")
return
@@ -236,7 +237,6 @@
reagent_glass = W
to_chat(user, "<span class='notice'>You insert [W].</span>")
show_controls(user)
return
else
var/current_health = health
@@ -100,6 +100,7 @@
health = 250
response_harm = "harmlessly punches"
harm_intent_damage = 0
obj_damage = 90
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "smashes their armoured gauntlet into"
@@ -181,7 +182,7 @@
/mob/living/simple_animal/hostile/construct/builder
name = "Artificer"
real_name = "Artificer"
desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies"
desc = "A bulbous construct dedicated to building and maintaining Cult armies."
icon = 'icons/mob/mob.dmi'
icon_state = "artificer"
icon_living = "artificer"
@@ -189,6 +190,7 @@
health = 50
response_harm = "viciously beats"
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 5
melee_damage_upper = 5
attacktext = "rams"
@@ -302,7 +304,7 @@
melee_damage_lower = 1
melee_damage_upper = 5
attacktext = "prods"
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
see_in_dark = 8
attack_sound = 'sound/weapons/tap.ogg'
const_type = "harvester"
@@ -9,7 +9,7 @@
health = 5
maxHealth = 5
attacktext = "bites"
attacktext = "bites"
obj_damage = 0
melee_damage_lower = 1
melee_damage_upper = 2
response_help = "pets"
@@ -14,6 +14,7 @@
maxHealth = 100
health = 100
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashes"
@@ -145,6 +146,7 @@
melee_damage_upper = 0
a_intent = INTENT_HELP
friendly = "caresses"
obj_damage = 0
environment_smash = 0
icon_state = "maid"
icon_living = "maid"
@@ -20,6 +20,7 @@
stop_automated_movement_when_pulled = 0
maxHealth = 60
health = 60
obj_damage = 60
melee_damage_lower = 20
melee_damage_upper = 30
attacktext = "mauls"
@@ -29,6 +29,7 @@
health = 10
faction = list("hostile")
move_to_delay = 0
obj_damage = 0
environment_smash = 0
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
@@ -18,6 +18,7 @@
health = 25
harm_intent_damage = 8
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "bites"
@@ -70,6 +71,6 @@
health = 65
pixel_x = -16
mob_size = MOB_SIZE_LARGE
obj_damage = 80
melee_damage_lower = 20
melee_damage_upper = 20
@@ -8,6 +8,7 @@
icon_dead = "otherthing-dead"
health = 80
maxHealth = 80
obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 50
attacktext = "chomps"
@@ -17,7 +17,7 @@
armour_penetration = 25
melee_damage_lower = 10
melee_damage_upper = 100
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
force_threshold = 15
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
@@ -12,7 +12,7 @@
speed = 0
maxHealth = 80
health = 80
obj_damage = 50
harm_intent_damage = 10
melee_damage_lower = 15
melee_damage_upper = 15
@@ -39,6 +39,7 @@
response_harm = "hits"
maxHealth = 200
health = 200
obj_damage = 60
melee_damage_lower = 15
melee_damage_upper = 20
heat_damage_per_tick = 20 //amount of damage applied if animal's body temperature is higher than maxbodytemp
@@ -16,6 +16,7 @@
faction = list("creature")
robust_searching = 1
stat_attack = 2
obj_damage = 0
environment_smash = 0
speak_emote = list("squeaks")
ventcrawler = 2
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile
faction = list("hostile")
stop_automated_movement_when_pulled = 0
obj_damage = 40
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
var/ranged = 0
@@ -241,7 +242,7 @@
if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still
if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them!
OpenFire(target)
if(environment_smash >= 2) //If we're capable of smashing through walls, forget about vision completely after finding our target
if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target
Goto(target,move_to_delay,minimum_distance)
FindHidden()
return 1
@@ -65,6 +65,7 @@
melee_damage_lower = 0
melee_damage_upper = 0
speed = -1
obj_damage = 0
environment_smash = 0
@@ -267,6 +267,7 @@ Difficulty: Medium
maxHealth = 200
health = 200
faction = list("neutral")
obj_damage = 80
melee_damage_upper = 30
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
@@ -7,7 +7,8 @@
maxHealth = 1000
a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
obj_damage = 400
luminosity = 3
faction = list("mining", "boss")
weather_immunities = list("lava","ash")
@@ -225,6 +225,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/ranged/CopyObject(obj/O, mob/living/creator, destroy_original = 0)
if(..())
emote_see = list("aims menacingly")
obj_damage = 0
environment_smash = 0 //needed? seems weird for them to do so
ranged = 1
retreat_distance = 1 //just enough to shoot
@@ -17,6 +17,7 @@
maxHealth = 75
health = 75
harm_intent_damage = 5
obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "lashes out at"
@@ -4,6 +4,7 @@
unsuitable_atmos_damage = 15
faction = list("mining")
weather_immunities = list("lava","ash")
obj_damage = 30
environment_smash = 2
minbodytemp = 0
heat_damage_per_tick = 20
@@ -65,6 +66,7 @@
maxHealth = 200
health = 200
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 12
melee_damage_upper = 12
attacktext = "bites into"
@@ -125,6 +127,7 @@
maxHealth = 300
health = 300
harm_intent_damage = 1 //Only the manliest of men can kill a Goliath with only their fists.
obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "pulverizes"
@@ -13,6 +13,7 @@
response_disarm = "gently pushes aside"
response_harm = "whacks"
harm_intent_damage = 5
obj_damage = 0
melee_damage_lower = 1
melee_damage_upper = 1
attack_same = 2
@@ -14,6 +14,7 @@
health = 100
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
attacktext = "slashes"
@@ -22,6 +22,7 @@
melee_damage_upper = 10
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
obj_damage = 0
environment_smash = 0
minbodytemp = 270
maxbodytemp = 370
@@ -19,6 +19,7 @@
healable = 0
harm_intent_damage = 35
obj_damage = 100
melee_damage_lower = 34
melee_damage_upper = 42
attacktext = "claws"
@@ -112,6 +112,7 @@
pass_flags = PASSTABLE
health = 15
maxHealth = 15
obj_damage = 0
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "cuts"
@@ -24,7 +24,7 @@
move_to_delay = 4 // faster than normal
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
loot = list(/obj/item/clothing/accessory/medal)
idle_ventcrawl_chance = 0
spider_tier = TS_TIER_3
@@ -25,7 +25,7 @@
spider_opens_doors = 2
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
idle_ventcrawl_chance = 0 // stick to the queen!
var/dcheck_counter = 0
var/queen_visible = 1
@@ -232,7 +232,7 @@
hasnested = 1
ventcrawler = 0
ai_ventcrawls = 0
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
DoQueenScreech(8, 100, 8, 100)
MassFlicker()
to_chat(src, "<span class='notice'>You have matured to your egglaying stage. You can now smash through walls, and lay eggs, but can no longer ventcrawl.</span>")
@@ -54,6 +54,7 @@
maxHealth = 50
ranged = 1
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
a_intent = INTENT_HARM
@@ -46,6 +46,7 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
var/obj_damage = 0 //how much damage this simple animal does to objects, if any
var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source
@@ -276,9 +277,6 @@
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attack_threshold_check(damage,M.melee_damage_type)
/mob/living/simple_animal/proc/attacked_by(obj/item/I, mob/living/user) // Handled in _onclick/click.dm
return
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
@@ -385,7 +383,7 @@
return
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
/mob/living/simple_animal/attackby(obj/item/O, mob/living/user)
if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
var/obj/item/clothing/accessory/petcollar/C = O
user.drop_item()
@@ -399,33 +397,7 @@
real_name = C.tagname
return
else
user.changeNext_move(CLICK_CD_MELEE)
if(attempt_harvest(O, user))
return
user.do_attack_animation(src)
if(istype(O) && istype(user) && !O.attack(src, user))
var/damage = 0
if(O.force)
if(O.force >= force_threshold)
damage = O.force
if(O.damtype == STAMINA)
damage = 0
if(O.damtype == BRUTE)
if(prob(33))
O.add_mob_blood(src)
var/turf/location = get_turf(src)
add_splatter_floor(location)
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
user.add_mob_blood(src)
visible_message("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
else
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
else
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
adjustBruteLoss(damage)
..()
/mob/living/simple_animal/movement_delay()
. = ..()
@@ -346,12 +346,12 @@
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(current_species.name == "Slime People") // whee I am part of the problem
hair_s.Blend("[s_colour]A0", ICON_ADD)
else
else if(hair_style.do_colouration)
hair_s.Blend(h_colour, ICON_ADD)
if(hair_style.secondary_theme)
var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
if(!hair_style.no_sec_colour)
if(!hair_style.no_sec_colour && hair_style.do_colouration )
hair_secondary_s.Blend(h_sec_colour, ICON_ADD)
hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
@@ -370,12 +370,12 @@
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(current_species.name == "Slime People") // whee I am part of the problem
facial_s.Blend("[s_colour]A0", ICON_ADD)
else
else if(facial_hair_style.do_colouration)
facial_s.Blend(f_colour, ICON_ADD)
if(facial_hair_style.secondary_theme)
var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
if(!facial_hair_style.no_sec_colour)
if(!facial_hair_style.no_sec_colour && facial_hair_style.do_colouration)
facial_secondary_s.Blend(f_sec_colour, ICON_ADD)
facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
@@ -1352,6 +1352,64 @@
name = "Clipped Vox Razorback"
icon_state = "vox_razor_clipped"
//DIONA: Sprites by skittles below
/datum/sprite_accessory/hair/diona
species_allowed = list("Diona")
glasses_over = 1
do_colouration = 0
/datum/sprite_accessory/hair/diona/diona_bracket
name = "Bracket"
icon_state = "diona_bracket"
/datum/sprite_accessory/hair/diona/diona_brush
name = "Brush"
icon_state = "diona_brush"
/datum/sprite_accessory/hair/diona/diona_cornflow
name = "Corn Flowers"
icon_state = "diona_cornflower"
/datum/sprite_accessory/hair/diona/diona_laur
name = "Laural"
icon_state = "diona_laurel"
/datum/sprite_accessory/hair/diona/diona_leaf
name = "Leafy"
icon_state = "diona_leafy"
/datum/sprite_accessory/hair/diona/diona_mead
name = "Meadow"
icon_state = "diona_meadow"
/datum/sprite_accessory/hair/diona/diona_oak
name = "Oak"
icon_state = "diona_oak"
/datum/sprite_accessory/hair/diona/diona_root
name = "Roots"
icon_state = "diona_root"
/datum/sprite_accessory/hair/diona/diona_rose
name = "Rose"
icon_state = "diona_rosey"
/datum/sprite_accessory/hair/diona/diona_spinner
name = "Spinners"
icon_state = "diona_spinner"
/datum/sprite_accessory/hair/diona/diona_spout
name = "Sprouts"
icon_state = "diona_sprout"
/datum/sprite_accessory/hair/diona/diona_vine
name = "Vines"
icon_state = "diona_vine"
/datum/sprite_accessory/hair/diona/diona_wildflow
name = "Wildflowers"
icon_state = "diona_wildflower"
// Apollo-specific
/datum/sprite_accessory/hair/wryn
@@ -32,7 +32,7 @@
integrity_failure = 50
max_integrity = 100
armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 0, acid = 0)
armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100)
// Important hardware (must be installed for computer to work)
@@ -1,29 +1,3 @@
/obj/item/device/modular_computer/emp_act(severity)
if(prob(20 / severity))
take_damage(obj_integrity, BURN)
..()
/obj/item/device/modular_computer/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if(prob(25))
qdel(src)
else if(prob(50))
obj_integrity = 0
if(3)
if(prob(25))
obj_integrity = 0
/obj/item/device/modular_computer/bullet_act(obj/item/projectile/P)
take_damage(P.damage, P.damage_type)
..()
/obj/item/device/modular_computer/blob_act()
if(prob(75))
take_damage(obj_integrity, BRUTE)
/obj/item/device/modular_computer/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
. = ..()
var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity))
@@ -36,17 +10,21 @@
for(var/I in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[I]
if(prob(component_probability))
H.take_damage(round(damage_amount*0.5))
H.take_damage(round(damage_amount*0.5), damage_type, damage_flag, 0)
/obj/item/device/modular_computer/proc/break_apart(damage = TRUE)
physical.visible_message("\The [src] breaks apart!")
var/turf/newloc = get_turf(src)
new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
for(var/C in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[C]
uninstall_component(H)
H.forceMove(newloc)
if(damage && prob(25))
H.take_damage(rand(10, 30))
/obj/item/device/modular_computer/deconstruct(disassembled = TRUE)
break_apart()
/obj/item/device/modular_computer/proc/break_apart()
if(can_deconstruct)
physical.visible_message("\The [src] breaks apart!")
var/turf/newloc = get_turf(src)
new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
for(var/C in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[C]
uninstall_component(H)
H.forceMove(newloc)
if(prob(25))
H.take_damage(rand(10,30), BRUTE, 0, 0)
relay_qdel()
qdel(src)
+2 -2
View File
@@ -2,8 +2,8 @@
name = "paper"
icon_state = "paper_stack"
item_state = "paper"
var copied = 0
var iscopy = 0
var/copied = 0
var/iscopy = 0
/obj/item/weapon/paper/carbon/update_icon()
+3
View File
@@ -138,6 +138,8 @@
terminal.connect_to_network()
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
if(!armor)
armor = list(melee = 20, bullet = 20, laser = 10, energy = 100, bomb = 30, bio = 100, rad = 100)
..()
apcs += src
apcs = sortAtom(apcs)
@@ -769,6 +771,7 @@
data["totalLoad"] = round(lastused_equip + lastused_light + lastused_environ)
data["coverLocked"] = coverlocked
data["siliconUser"] = istype(user, /mob/living/silicon)
data["siliconLock"] = locked
data["malfStatus"] = get_malf_status(user)
var/powerChannels[0]
+1
View File
@@ -16,6 +16,7 @@
icon_state = "tube-construct-stage1"
anchored = 1
layer = 5
armor = list(melee = 50, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
@@ -45,7 +45,6 @@ var/global/list/rad_collectors = list()
else
to_chat(user, "<span class='warning'>The controls are locked!</span>")
return
..()
/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
@@ -27,6 +27,7 @@ field_generator power level display
anchored = 0
density = 1
use_power = 0
armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
var/const/num_power_levels = 6 // Total number of power level icon has
var/power_level = 0
var/active = FG_OFFLINE
@@ -62,6 +62,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
icon_state = "none"
anchored = 0
density = 1
armor = list(melee = 30, bullet = 20, laser = 20, energy = 0, bomb = 0, bio = 0, rad = 0)
var/obj/machinery/particle_accelerator/control_box/master = null
var/construction_state = 0
var/reference = null
@@ -128,7 +128,7 @@
name = "\improper M-90gl Carbine"
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
icon_state = "m90"
item_state = "m90"
item_state = "m90-4"
origin_tech = "combat=5;materials=2;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
@@ -168,6 +168,11 @@
if(2)
overlays += "[initial(icon_state)]gren"
icon_state = "[initial(icon_state)][magazine ? "" : "-e"]"
if(magazine)
overlays += image(icon = icon, icon_state = "m90-[Ceiling(get_ammo(0)/6)*6]")
item_state = "m90-[Ceiling(get_ammo(0)/7.5)]"
else
item_state = "m90-0"
return
/obj/item/weapon/gun/projectile/automatic/m90/burst_select()
+6 -2
View File
@@ -27,7 +27,11 @@
/obj/item/projectile/magic/death/on_hit(var/mob/living/carbon/G)
. = ..()
if(isliving(G))
G.adjustFireLoss(3000)
if(G.get_species() == "Machine") //speshul snowfleks deserv speshul treetment
G.adjustFireLoss(6969) //remember - slimes love fire
else
G.death()
visible_message("<span class='danger'>[G] topples backwards as the death bolt impacts them!</span>")
/obj/item/projectile/magic/fireball/Range()
@@ -293,4 +297,4 @@ proc/wabbajack(mob/living/M)
damage_type = BURN
flag = "magic"
dismemberment = 50
nodamage = 0
nodamage = 0
@@ -23,7 +23,6 @@
reagent_state = SOLID
nutriment_factor = 15 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
taste_message = "bland food"
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
if(!(M.mind in ticker.mode.vampires))
@@ -49,7 +48,7 @@
id = "plantmatter"
description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
diet_flags = DIET_HERB | DIET_OMNI
taste_message = "plant matter"
taste_message = "vegetables"
/datum/reagent/consumable/vitamin
name = "Vitamin"
@@ -112,7 +111,7 @@
reagent_state = LIQUID
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#792300" // rgb: 121, 35, 0
taste_message = "salt"
taste_message = "soy"
/datum/reagent/consumable/ketchup
name = "Ketchup"
@@ -372,7 +371,7 @@
reagent_state = LIQUID
nutriment_factor = 5 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
taste_message = "ramen"
taste_message = "cheap ramen and memories"
/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/M)
if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
@@ -1035,3 +1035,40 @@
color = "#F5F5F5"
// This reagent's effects are handled in heart attack handling code
/datum/reagent/medicine/nanocalcium
name = "Nano-Calcium"
id = "nanocalcium"
description = "Highly advanced nanites equipped with calcium payloads designed to repair bones. Nanomachines son."
color = "#9b3401"
metabolization_rate = 0.5
/datum/reagent/medicine/nanocalcium/on_mob_life(mob/living/carbon/human/M)
switch(current_cycle)
if(1 to 19)
M.AdjustJitter(4)
if(prob(10))
to_chat(M, "<span class='warning'>Your skin feels hot and your veins are on fire!</span>")
if(20 to 43)
//If they have stimulants or stimulant drugs then just apply toxin damage instead.
if(M.reagents.has_reagent("methamphetamine") || M.reagents.has_reagent("crank") || M.reagents.has_reagent("bath_salts") || M.reagents.has_reagent("stimulative_agent") || M.reagents.has_reagent("stimulants"))
M.adjustToxLoss(10)
else //apply debilitating effects
if(prob(75))
M.AdjustConfused(5)
else
M.AdjustWeakened(5)
if(44)
to_chat(M, "<span class='warning'>Your body goes rigid, you cannot move at all!</span>")
M.AdjustWeakened(15)
if(45 to INFINITY) // Start fixing bones | If they have stimulants or stimulant drugs in their system then the nanites won't work.
if(M.reagents.has_reagent("methamphetamine") || M.reagents.has_reagent("crank") || M.reagents.has_reagent("bath_salts") || M.reagents.has_reagent("stimulative_agent") || M.reagents.has_reagent("stimulants"))
return ..()
else
for(var/obj/item/organ/external/E in M.bodyparts)
if(E.is_broken())
if(prob(50)) // Each tick has a 50% chance of repearing a bone.
to_chat(M, "<span class='notice'>You feel a burning sensation in your [E.name] as it straightens involuntarily!</span>")
E.rejuvenate() //Repair it completely.
break
..()
@@ -513,4 +513,4 @@
if(istype(O, /obj/item/clothing/shoes/galoshes))
var/t_loc = get_turf(O)
qdel(O)
new /obj/item/clothing/shoes/galoshes/dry(t_loc)
new /obj/item/clothing/shoes/galoshes/dry(t_loc)
@@ -41,7 +41,8 @@
/obj/machinery/hydroponics,
/obj/machinery/constructable_frame,
/obj/machinery/icemachine,
/obj/item/weapon/bombcore/chemical)
/obj/item/weapon/bombcore/chemical,
/obj/machinery/vending)
/obj/item/weapon/reagent_containers/glass/New()
..()
@@ -39,6 +39,8 @@
add_logs(user, M, "injected", src, "([contained])")
return TRUE
/obj/item/weapon/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
@@ -75,6 +77,7 @@
return
..()
update_icon()
return TRUE
/obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon()
if(reagents.total_volume > 0)
@@ -110,4 +113,17 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(50)
volume = 50
list_reagents = list("stimulants" = 50)
list_reagents = list("stimulants" = 50)
/obj/item/weapon/reagent_containers/hypospray/autoinjector/nanocalcium
name = "nanocalcium autoinjector"
desc = "After a short period of time the nanites will slow the body's systems and assist with bone repair. Nanomachines son."
icon_state = "bonepen"
amount_per_transfer_from_this = 30
possible_transfer_amounts = list(30)
volume = 30
list_reagents = list("nanocalcium" = 30)
/obj/item/weapon/reagent_containers/hypospray/autoinjector/nanocalcium/attack(mob/living/M, mob/user)
if(..())
playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1)
@@ -110,3 +110,9 @@
desc = "Used to treat respiratory distress."
icon_state = "pill8"
list_reagents = list("salbutamol" = 20)
/obj/item/weapon/reagent_containers/food/pill/hydrocodone
name = "Hydrocodone pill"
desc = "Used to treat extreme pain."
icon_state = "pill6"
list_reagents = list("hydrocodone" = 15)
+2
View File
@@ -15,6 +15,7 @@
anchored = 1
density = 1
on_blueprints = TRUE
armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100)
var/datum/gas_mixture/air_contents // internal reservoir
var/mode = 1 // item mode 0=off 1=charging 2=charged
var/flush = 0 // true if flush handle is pulled
@@ -659,6 +660,7 @@
var/dpdir = 0 // bitmask of pipe directions
dir = 0 // dir will contain dominant direction for junction pipes
var/health = 10 // health points 0-10
armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100)
layer = 2.3 // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
+3
View File
@@ -33,6 +33,9 @@
return QDEL_HINT_LETMELIVE
/obj/docking_port/take_damage()
return
/obj/docking_port/singularity_pull()
return
+5
View File
@@ -67,9 +67,14 @@
var/move_delay = 2
var/next_move = 0
var/can_paint = TRUE
/obj/spacepod/proc/apply_paint(mob/user as mob)
var/part_type
if(!can_paint)
to_chat(user, "<span class='warning'>You can't repaint this type of pod!</span>")
return
var/part = input(user, "Choose part", null) as null|anything in list("Lights","Rim","Paint","Windows")
switch(part)
if("Lights")
+12 -2
View File
@@ -18,6 +18,9 @@
/obj/item/organ/internal/cyberimp/eyes/insert(var/mob/living/carbon/M, var/special = 0)
..()
var/mob/living/carbon/human/H = M
if(istype(H) && eye_colour)
H.update_body() //Apply our eye colour to the target.
if(aug_message && !special)
to_chat(owner, "<span class='notice'>[aug_message]</span>")
M.update_sight()
@@ -26,6 +29,15 @@
. = ..()
M.update_sight()
/obj/item/organ/internal/cyberimp/eyes/proc/generate_icon(var/mob/living/carbon/human/HA)
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.species.eyes)
cybereyes_icon.Blend(eye_colour, ICON_ADD) // Eye implants override native DNA eye color
return cybereyes_icon
/obj/item/organ/internal/cyberimp/eyes/emp_act(severity)
if(!owner || emp_proof)
return
@@ -35,8 +47,6 @@
to_chat(owner, "<span class='warning'>Static obfuscates your vision!</span>")
owner.flash_eyes(visual = 1)
/obj/item/organ/internal/cyberimp/eyes/xray
name = "X-ray implant"
desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile."
+8
View File
@@ -337,6 +337,14 @@ I use this so that this can be made better once the organ overhaul rolls out --
return 0
return src == O.get_int_organ(organ_tag)
/obj/item/organ/proc/is_robotic(var/purist = FALSE)
if(purist && (robotic > 1 || status & (ORGAN_ROBOT))) //Only the robotiest.
return TRUE
if(robotic || status & (ORGAN_ROBOT|ORGAN_ASSISTED)) //Any tech will do.
return TRUE
return FALSE
/obj/item/organ/serialize()
var/data = ..()
if(status != 0)
@@ -692,7 +692,6 @@ Note that amputating the affected organ does in fact remove the infection from t
if(!owner)
return
var/is_robotic = status & ORGAN_ROBOT
var/mob/living/carbon/human/victim = owner
if(status & ORGAN_SPLINTED)
@@ -724,7 +723,7 @@ Note that amputating the affected organ does in fact remove the infection from t
victim.bodyparts_by_name[limb_name] = null // Remove from owner's vars.
//Robotic limbs explode if sabotaged.
if(is_robotic && sabotaged)
if(is_robotic() && sabotaged)
victim.visible_message(
"<span class='danger'>\The [victim]'s [src.name] explodes violently!</span>",\
"<span class='danger'>Your [src.name] explodes!</span>",\
+2 -10
View File
@@ -102,16 +102,8 @@ var/global/list/limb_icon_cache = list()
return
if(species.has_organ["eyes"])
var/obj/item/organ/internal/eyes/eyes = owner.get_int_organ(/obj/item/organ/internal/eyes)
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = owner.get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
if(species.eyes)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
if(eye_implant) // Eye implants override native DNA eye color
eyes_icon.Blend(eye_implant.eye_colour, ICON_ADD)
else if(eyes)
eyes_icon.Blend(eyes.eye_colour, ICON_ADD)
else
eyes_icon.Blend("#800000", ICON_ADD)
var/icon/eyes_icon = owner.get_eyecon()
if(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
@@ -305,6 +305,15 @@
/obj/item/organ/internal/eyes/proc/update_colour()
dna.write_eyes_attributes(src)
/obj/item/organ/internal/eyes/proc/generate_icon(var/mob/living/carbon/human/HA)
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.species.eyes)
eyes_icon.Blend(eye_colour, ICON_ADD)
return eyes_icon
/obj/item/organ/internal/eyes/proc/get_colourmatrix() //Returns a special colour matrix if the eyes are organic and the mob is colourblind, otherwise it uses the current one.
if(!robotic && owner.disabilities & COLOURBLIND)
return colourblind_matrix
@@ -314,6 +323,10 @@
/obj/item/organ/internal/eyes/proc/get_dark_view() //Returns dark_view (if the eyes are organic) for see_invisible handling in species.dm to be autoprocessed by life().
return dark_view
/obj/item/organ/internal/eyes/proc/shine()
if(is_robotic() || (dark_view > EYE_SHINE_THRESHOLD))
return TRUE
/obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0)
..()
if(istype(M) && eye_colour)
@@ -164,7 +164,7 @@
. = stored_mmi
if(owner.mind)
owner.mind.transfer_to(stored_mmi.brainmob)
stored_mmi.forceMove(get_turf(src))
stored_mmi.forceMove(get_turf(owner))
stored_mmi = null
..()
qdel(src)
+1
View File
@@ -8,6 +8,7 @@
anchored = 0
can_buckle = 1
buckle_lying = 0
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0)
var/keytype = null //item typepath, if non-null an item of this type is needed in your hands to drive this vehicle
var/next_vehicle_move = 0 //used for move delays
var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower