Merge branch 'master' into upstream-merge-32249

This commit is contained in:
deathride58
2017-12-04 23:15:38 +00:00
committed by GitHub
112 changed files with 1764 additions and 717 deletions
+1
View File
@@ -545,6 +545,7 @@
H.set_heartattack(FALSE)
H.revive()
H.emote("gasp")
H.Jitter(100)
if(tplus > tloss)
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
add_logs(user, H, "revived", defib)
+8 -6
View File
@@ -155,15 +155,17 @@ GLOBAL_LIST_EMPTY(PDAs)
return
/obj/item/device/pda/attack_self(mob/user)
if(!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
. = ..()
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/pda)
assets.send(user)
user.set_machine(src)
if(hidden_uplink && hidden_uplink.active)
hidden_uplink.interact(user)
return
var/dat = "<!DOCTYPE html><html><head><title>Personal Data Assistant</title><link href=\"https://fonts.googleapis.com/css?family=Orbitron|Share+Tech+Mono|VT323\" rel=\"stylesheet\"></head><body bgcolor=\"" + background_color + "\"><style>body{" + font_mode + "}ul,ol{list-style-type: none;}a, a:link, a:visited, a:active, a:hover { color: #000000;text-decoration:none; }img {border-style:none;}a img{padding-right: 9px;}</style>"
@@ -496,7 +498,9 @@ GLOBAL_LIST_EMPTY(PDAs)
if("Ringtone")
var/t = input(U, "Please enter new ringtone", name, ttone) as text
if(in_range(src, U) && loc == U && t)
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
if(hidden_uplink && (trim(lowertext(t)) == trim(lowertext(lock_code))))
hidden_uplink.locked = FALSE
hidden_uplink.interact(U)
to_chat(U, "The PDA softly beeps.")
U << browse(null, "window=pda")
@@ -822,8 +826,6 @@ GLOBAL_LIST_EMPTY(PDAs)
var/obj/item/photo/P = C
photo = P.img
to_chat(user, "<span class='notice'>You scan \the [C].</span>")
else if(hidden_uplink && hidden_uplink.active)
hidden_uplink.attackby(C, user, params)
else
return ..()
@@ -7,7 +7,7 @@
/obj/item/cartridge/virus/message_header()
return "<b>[charges] viral files left.</b><HR>"
/obj/item/cartridge/virus/message_special(obj/item/device/pda/target)
if (!istype(loc, /obj/item/device/pda))
return "" //Sanity check, this shouldn't be possible.
@@ -67,11 +67,12 @@
var/difficulty = 0
if(target.cartridge)
difficulty += BitCount(target.cartridge.access&(CART_MEDICAL | CART_SECURITY | CART_ENGINE | CART_CLOWN | CART_JANITOR | CART_MANIFEST))
if(target.cartridge.access & CART_MANIFEST)
if(target.cartridge.access & CART_MANIFEST)
difficulty++ //if cartridge has manifest access it has extra snowflake difficulty
else
difficulty += 2
if(!target.detonatable || prob(difficulty * 15) || (target.hidden_uplink))
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target)
if(!target.detonatable || prob(difficulty * 15) || (hidden_uplink))
U.show_message("<span class='danger'>An error flashes on your [src].</span>", 1)
else
U.show_message("<span class='notice'>Success!</span>", 1)
@@ -92,14 +93,14 @@
charges--
var/lock_code = "[rand(100,999)] [pick(GLOB.phonetic_alphabet)]"
to_chat(U, "<span class='notice'>Virus Sent! The unlock code to the target is: [lock_code]</span>")
if(!target.hidden_uplink)
var/obj/item/device/uplink/uplink = new(target)
target.hidden_uplink = uplink
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, target)
if(!hidden_uplink)
hidden_uplink = target.LoadComponent(/datum/component/uplink)
target.lock_code = lock_code
else
target.hidden_uplink.hidden_crystals += target.hidden_uplink.telecrystals //Temporarially hide the PDA's crystals, so you can't steal telecrystals.
target.hidden_uplink.telecrystals = telecrystals
hidden_uplink.hidden_crystals += hidden_uplink.telecrystals //Temporarially hide the PDA's crystals, so you can't steal telecrystals.
hidden_uplink.telecrystals = telecrystals
telecrystals = 0
target.hidden_uplink.active = TRUE
hidden_uplink.active = TRUE
else
to_chat(U, "PDA not found.")
@@ -155,7 +155,9 @@
if(.)
frequency = sanitize_frequency(tune, freerange)
set_frequency(frequency)
if(frequency == traitor_frequency && hidden_uplink)
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
if(hidden_uplink && (frequency == traitor_frequency))
hidden_uplink.locked = FALSE
hidden_uplink.interact(usr)
ui.close()
if("listen")
@@ -0,0 +1,31 @@
// A collection of pre-set uplinks, for admin spawns.
/obj/item/device/radio/uplink/Initialize(mapload, _owner, _tc_amount = 20)
. = ..()
icon_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
LoadComponent(/datum/component/uplink, _owner, FALSE, TRUE, null, _tc_amount)
/obj/item/device/radio/uplink/nuclear/Initialize()
. = ..()
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
/obj/item/device/multitool/uplink/Initialize(mapload, _owner, _tc_amount = 20)
. = ..()
LoadComponent(/datum/component/uplink, _owner, FALSE, TRUE, null, _tc_amount)
/obj/item/pen/uplink/Initialize(mapload, _owner, _tc_amount = 20)
. = ..()
LoadComponent(/datum/component/uplink)
traitor_unlock_degrees = 360
/obj/item/device/radio/uplink/old
name = "dusty radio"
desc = "A dusty looking radio."
/obj/item/device/radio/uplink/old/Initialize(mapload, _owner, _tc_amount = 10)
. = ..()
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
hidden_uplink.name = "dusty radio"
@@ -1,42 +1,48 @@
/obj/item/implant/uplink
name = "uplink implant"
desc = "Sneeki breeki."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
origin_tech = "materials=4;magnets=4;programming=4;biotech=4;syndicate=5;bluespace=5"
var/starting_tc = 0
/obj/item/implant/uplink/New()
hidden_uplink = new(src)
hidden_uplink.telecrystals = starting_tc
..()
/obj/item/implant/uplink/implant(mob/living/target, mob/user, silent = 0)
for(var/X in target.implants)
if(istype(X, type))
var/obj/item/implant/imp_e = X
imp_e.hidden_uplink.telecrystals += hidden_uplink.telecrystals
qdel(src)
return 1
if(..())
hidden_uplink.owner = "[user.key]"
return 1
return 0
/obj/item/implant/uplink/activate()
if(hidden_uplink)
hidden_uplink.interact(usr)
/obj/item/implanter/uplink
name = "implanter (uplink)"
imp_type = /obj/item/implant/uplink
/obj/item/implanter/uplink/precharged
name = "implanter (precharged uplink)"
imp_type = /obj/item/implant/uplink/precharged
/obj/item/implant/uplink/precharged
starting_tc = 10
/obj/item/implant/uplink
name = "uplink implant"
desc = "Sneeki breeki."
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
var/starting_tc = 0
/obj/item/implant/uplink/Initialize(mapload, _owner)
. = ..()
LoadComponent(/datum/component/uplink, _owner, TRUE, FALSE, null, starting_tc)
/obj/item/implant/uplink/implant(mob/living/target, mob/user, silent = 0)
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
if(hidden_uplink)
for(var/X in target.implants)
if(istype(X, type))
var/obj/item/implant/imp_e = X
GET_COMPONENT_FROM(their_hidden_uplink, /datum/component/uplink, imp_e)
if(their_hidden_uplink)
their_hidden_uplink.telecrystals += hidden_uplink.telecrystals
qdel(src)
return TRUE
else
qdel(imp_e) //INFERIOR AND EMPTY!
if(..())
if(hidden_uplink)
hidden_uplink.owner = "[user.key]"
return TRUE
return FALSE
/obj/item/implant/uplink/activate()
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
if(hidden_uplink)
hidden_uplink.interact(usr)
/obj/item/implanter/uplink
name = "implanter (uplink)"
imp_type = /obj/item/implant/uplink
/obj/item/implanter/uplink/precharged
name = "implanter (precharged uplink)"
imp_type = /obj/item/implant/uplink/precharged
/obj/item/implant/uplink/precharged
starting_tc = 10
+296 -2
View File
@@ -9,13 +9,91 @@
var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this
var/stuffed = TRUE //If the plushie has stuffing in it
var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses*
//--love ~<3--
gender = NEUTER
var/obj/item/toy/plush/lover
var/obj/item/toy/plush/partner
var/obj/item/toy/plush/plush_child
var/obj/item/toy/plush/paternal_parent //who initiated creation
var/obj/item/toy/plush/maternal_parent //who owns, see love()
var/list/scorned = list() //who the plush hates
var/list/scorned_by = list() //who hates the plush, to remove external references on Destroy()
var/heartbroken = FALSE
var/vowbroken = FALSE
var/young = FALSE
var/mood_message
var/list/love_message
var/list/partner_message
var/list/heartbroken_message
var/list/vowbroken_message
var/list/parent_message
var/normal_desc
//--end of love :'(--
/obj/item/toy/plush/Initialize()
. = ..()
AddComponent(/datum/component/squeak, squeak_override)
//have we decided if Pinocchio goes in the blue or pink aisle yet?
if(gender == NEUTER)
if(prob(50))
gender = FEMALE
else
gender = MALE
love_message = list("\n[src] is so happy, \he could rip a seam!")
partner_message = list("\n[src] has a ring on \his finger! It says bound to my dear [partner].")
heartbroken_message = list("\n[src] looks so sad.")
vowbroken_message = list("\n[src] lost \his ring...")
parent_message = list("\n[src] can't remember what sleep is.")
normal_desc = desc
/obj/item/toy/plush/Destroy()
QDEL_NULL(grenade)
//inform next of kin and... acquaintances
if(partner)
partner.bad_news(src)
partner = null
lover = null
else if(lover)
lover.bad_news(src)
lover = null
if(paternal_parent)
paternal_parent.bad_news(src)
paternal_parent = null
if(maternal_parent)
maternal_parent.bad_news(src)
maternal_parent = null
if(plush_child)
plush_child.bad_news(src)
plush_child = null
var/i
var/obj/item/toy/plush/P
for(i=1, i<=scorned.len, i++)
P = scorned[i]
P.bad_news(src)
scorned = null
for(i=1, i<=scorned_by.len, i++)
P = scorned_by[i]
P.bad_news(src)
scorned_by = null
//null remaining lists
squeak_override = null
love_message = null
partner_message = null
heartbroken_message = null
vowbroken_message = null
parent_message = null
return ..()
/obj/item/toy/plush/handle_atom_del(atom/A)
@@ -66,8 +144,221 @@
var/turf/T = get_turf(user)
log_game("[key_name(user)] added a grenade ([I.name]) to [src] at [COORD(T)].")
return
if(istype(I, /obj/item/toy/plush))
love(I, user)
return
return ..()
/obj/item/toy/plush/proc/love(obj/item/toy/plush/Kisser, mob/living/user) //~<3
var/chance = 100 //to steal a kiss, surely there's a 100% chance no-one would reject a plush such as I?
var/concern = 20 //perhaps something might cloud true love with doubt
var/loyalty = 30 //why should another get between us?
var/duty = 50 //conquering another's is what I live for
//we are not catholic
if(young == TRUE || Kisser.young == TRUE)
user.show_message("<span class='notice'>[src] plays tag with [Kisser].</span>", 1,
"<span class='notice'>They're happy.</span>", 0)
Kisser.cheer_up()
cheer_up()
//never again
else if(Kisser in scorned)
//message, visible, alternate message, neither visible nor audible
user.show_message("<span class='notice'>[src] rejects the advances of [Kisser]!</span>", 1,
"<span class='notice'>That didn't feel like it worked.</span>", 0)
else if(src in Kisser.scorned)
user.show_message("<span class='notice'>[Kisser] realises who [src] is and turns away.</span>", 1,
"<span class='notice'>That didn't feel like it worked.</span>", 0)
//first comes love
else if(Kisser.lover != src && Kisser.partner != src) //cannot be lovers or married
if(Kisser.lover) //if the initiator has a lover
Kisser.lover.heartbreak(Kisser) //the old lover can get over the kiss-and-run whilst the kisser has some fun
chance -= concern //one heart already broken, what does another mean?
if(lover) //if the recipient has a lover
chance -= loyalty //mustn't... but those lips
if(partner) //if the recipient has a partner
chance -= duty //do we mate for life?
if(prob(chance)) //did we bag a date?
user.visible_message("<span class='notice'>[user] makes [Kisser] kiss [src]!</span>",
"<span class='notice'>You make [Kisser] kiss [src]!</span>")
if(lover) //who cares for the past, we live in the present
lover.heartbreak(src)
new_lover(Kisser)
Kisser.new_lover(src)
else
user.show_message("<span class='notice'>[src] rejects the advances of [Kisser], maybe next time?</span>", 1,
"<span class='notice'>That didn't feel like it worked, this time.</span>", 0)
//then comes marriage
else if(Kisser.lover == src && Kisser.partner != src) //need to be lovers (assumes loving is a two way street) but not married (also assumes similar)
user.visible_message("<span class='notice'>[user] pronounces [Kisser] and [src] married! D'aw.</span>",
"<span class='notice'>You pronounce [Kisser] and [src] married!</span>")
new_partner(Kisser)
Kisser.new_partner(src)
//then comes a baby in a baby's carriage, or an adoption in an adoption's orphanage
else if(Kisser.partner == src && !plush_child) //the one advancing does not take ownership of the child and we have a one child policy in the toyshop
user.visible_message("<span class='notice'>[user] is going to break [Kisser] and [src] by bashing them like that.</span>",
"<span class='notice'>[Kisser] passionately embraces [src] in your hands. Look away you perv!</span>")
plop(Kisser)
user.visible_message("<span class='notice'>Something drops at the feet of [user].</span>",
"<span class='notice'>The miracle of oh god did that just come out of [src]?!</span>")
//then comes protection, or abstinence if we are catholic
else if(Kisser.partner == src && plush_child)
user.visible_message("<span class='notice'>[user] makes [Kisser] nuzzle [src]!</span>",
"<span class='notice'>You make [Kisser] nuzzle [src]!</span>")
//then oh fuck something unexpected happened
else
user.show_message("<span class='warning'>[Kisser] and [src] don't know what to do with one another.</span>", 0)
/obj/item/toy/plush/proc/heartbreak(obj/item/toy/plush/Brutus)
if(lover != Brutus)
to_chat(world, "lover != Brutus")
return //why are we considering someone we don't love?
scorned.Add(Brutus)
Brutus.scorned_by(src)
lover = null
Brutus.lover = null //feeling's mutual
heartbroken = TRUE
mood_message = pick(heartbroken_message)
if(partner == Brutus) //oh dear...
partner = null
Brutus.partner = null //it'd be weird otherwise
vowbroken = TRUE
mood_message = pick(vowbroken_message)
update_desc()
/obj/item/toy/plush/proc/scorned_by(obj/item/toy/plush/Outmoded)
scorned_by.Add(Outmoded)
/obj/item/toy/plush/proc/new_lover(obj/item/toy/plush/Juliet)
if(lover == Juliet)
return //nice try
lover = Juliet
cheer_up()
lover.cheer_up()
mood_message = pick(love_message)
update_desc()
if(partner) //who?
partner = null //more like who cares
/obj/item/toy/plush/proc/new_partner(obj/item/toy/plush/Apple_of_my_eye)
if(partner == Apple_of_my_eye)
return //double marriage is just insecurity
if(lover != Apple_of_my_eye)
return //union not born out of love will falter
partner = Apple_of_my_eye
heal_memories()
partner.heal_memories()
mood_message = pick(partner_message)
update_desc()
/obj/item/toy/plush/proc/plop(obj/item/toy/plush/Daddy)
if(partner != Daddy)
return //we do not have bastards in our toyshop
if(prob(50)) //it has my eyes
plush_child = new type(get_turf(loc))
else //it has your eyes
plush_child = new Daddy.type(get_turf(loc))
plush_child.make_young(src, Daddy)
/obj/item/toy/plush/proc/make_young(obj/item/toy/plush/Mama, obj/item/toy/plush/Dada)
if(Mama == Dada)
return //cloning is reserved for plants and spacemen
maternal_parent = Mama
paternal_parent = Dada
young = TRUE
name = "[Mama] Jr" //Icelandic naming convention pending
normal_desc = "[src] is a little baby of [maternal_parent] and [paternal_parent]!" //original desc won't be used so the child can have moods
update_desc()
Mama.mood_message = pick(Mama.parent_message)
Mama.update_desc()
Dada.mood_message = pick(Dada.parent_message)
Dada.update_desc()
/obj/item/toy/plush/proc/bad_news(obj/item/toy/plush/Deceased) //cotton to cotton, sawdust to sawdust
var/is_that_letter_for_me = FALSE
if(partner == Deceased) //covers marriage
is_that_letter_for_me = TRUE
partner = null
lover = null
else if(lover == Deceased) //covers lovers
is_that_letter_for_me = TRUE
lover = null
//covers children
if(maternal_parent == Deceased)
is_that_letter_for_me = TRUE
maternal_parent = null
if(paternal_parent == Deceased)
is_that_letter_for_me = TRUE
paternal_parent = null
//covers parents
if(plush_child == Deceased)
is_that_letter_for_me = TRUE
plush_child = null
//covers bad memories
if(Deceased in scorned)
scorned.Remove(Deceased)
cheer_up() //what cold button eyes you have
if(Deceased in scorned_by)
scorned_by.Remove(Deceased)
//all references to the departed should be cleaned up by now
if(is_that_letter_for_me)
heartbroken = TRUE
mood_message = pick(heartbroken_message)
update_desc()
/obj/item/toy/plush/proc/cheer_up() //it'll be all right
if(!heartbroken)
return //you cannot make smile what is already
if(vowbroken)
return //it's a pretty big deal
heartbroken = !heartbroken
if(mood_message in heartbroken_message)
mood_message = null
update_desc()
/obj/item/toy/plush/proc/heal_memories() //time fixes all wounds
if(!vowbroken)
vowbroken = !vowbroken
if(mood_message in vowbroken_message)
mood_message = null
cheer_up()
/obj/item/toy/plush/proc/update_desc()
desc = normal_desc
if(mood_message)
desc += mood_message
/obj/item/toy/plush/carpplushie
name = "space carp plushie"
desc = "An adorable stuffed toy that resembles a space carp."
@@ -88,6 +379,7 @@
desc = "An adorable plushie of the clockwork justiciar himself with new and improved spring arm action."
icon_state = "plushvar"
var/obj/item/toy/plush/narplush/clash_target
gender = MALE //he's a boy, right?
/obj/item/toy/plush/plushvar/Moved()
. = ..()
@@ -173,6 +465,7 @@
desc = "A small stuffed doll of the elder god nar'sie. Who thought this was a good children's toy?"
icon_state = "narplush"
var/clashing
gender = FEMALE //it's canon if the toy is
/obj/item/toy/plush/narplush/Moved()
. = ..()
@@ -198,7 +491,7 @@
/obj/item/toy/plush/nukeplushie
name = "operative plushie"
desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
icon_state = "plushie_nuke"
item_state = "plushie_nuke"
attack_verb = list("shot", "nuked", "detonated")
@@ -210,4 +503,5 @@
icon_state = "plushie_slime"
item_state = "plushie_slime"
attack_verb = list("blorbled", "slimed", "absorbed")
squeak_override = list('sound/effects/blobattack.ogg' = 1)
squeak_override = list('sound/effects/blobattack.ogg' = 1)
gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy
+10 -10
View File
@@ -13,18 +13,16 @@
if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not.
for(var/obj/item/implant/uplink/I in target)
if(I && I.imp_in)
I.hidden_uplink.telecrystals += amount
use(amount)
to_chat(user, "<span class='notice'>You press [src] onto yourself and charge your hidden uplink.</span>")
GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, I)
if(hidden_uplink)
hidden_uplink.telecrystals += amount
use(amount)
to_chat(user, "<span class='notice'>You press [src] onto yourself and charge your hidden uplink.</span>")
else
return ..()
/obj/item/stack/telecrystal/afterattack(obj/item/I, mob/user, proximity)
if(!proximity)
return
if(isitem(I) && I.hidden_uplink && I.hidden_uplink.active) //No metagaming by using this on every PDA around just to see if it gets used up.
I.hidden_uplink.telecrystals += amount
use(amount)
to_chat(user, "<span class='notice'>You slot [src] into [I] and charge its internal uplink.</span>")
else if(istype(I, /obj/item/cartridge/virus/frame))
if(istype(I, /obj/item/cartridge/virus/frame))
var/obj/item/cartridge/virus/frame/cart = I
if(!cart.charges)
to_chat(user, "<span class='notice'>[cart] is out of charges, it's refusing to accept [src].</span>")
@@ -32,6 +30,8 @@
cart.telecrystals += amount
use(amount)
to_chat(user, "<span class='notice'>You slot [src] into [cart]. The next time it's used, it will also give telecrystals.</span>")
else
return ..()
/obj/item/stack/telecrystal/five
amount = 5