Merge branch 'master' into tinytweaks

This commit is contained in:
Putnam3145
2019-12-01 23:24:56 -08:00
committed by GitHub
594 changed files with 4654 additions and 2602 deletions
@@ -106,6 +106,10 @@
return
/obj/item/organ/genital/proc/modify_size(modifier, min = -INFINITY, max = INFINITY)
fluid_max_volume += modifier*2.5
fluid_rate += modifier/10
if(reagents)
reagents.maximum_volume = fluid_max_volume
return
/obj/item/organ/genital/proc/update_size()
@@ -336,4 +340,3 @@
for(var/L in relevant_layers)
H.apply_overlay(L)
@@ -73,6 +73,7 @@
prev_size = cached_size
cached_size = new_value
update()
..()
/obj/item/organ/genital/breasts/update_size()//wah
var/rounded_cached = round(cached_size)
@@ -23,6 +23,7 @@
prev_length = length
length = CLAMP(length + modifier, min, max)
update()
..()
/obj/item/organ/genital/penis/update_size(modified = FALSE)
if(length < 0)//I don't actually know what round() does to negative numbers, so to be safe!!
@@ -93,9 +93,9 @@
pixel_x = rand(-7,7)
/obj/item/dildo/examine(mob/user)
..()
. = ..()
if(can_customize)
user << "<span class='notice'>Alt-Click \the [src.name] to customize it.</span>"
. += "<span class='notice'>Alt-Click \the [src.name] to customize it.</span>"
/obj/item/dildo/random//totally random
name = "random dildo"//this name will show up in vendors and shit so you know what you're vending(or don't, i guess :^))
@@ -63,16 +63,6 @@
category = SLOT_IN_BACKPACK
path = /obj/item/dildo/custom
/datum/gear/paperbin
name = "Paper Bin"
category = SLOT_IN_BACKPACK
path = /obj/item/paper_bin
/datum/gear/crayons
name = "Box of crayons"
category = SLOT_IN_BACKPACK
path = /obj/item/storage/crayons
/datum/gear/toykatana
name = "Toy Katana"
category = SLOT_IN_BACKPACK
@@ -104,4 +94,25 @@
/datum/gear/newspaper
name = "Newspaper"
category = SLOT_IN_BACKPACK
path = /obj/item/newspaper
path = /obj/item/newspaper
/datum/gear/paperbin
name = "Paper Bin"
category = SLOT_IN_BACKPACK
path = /obj/item/paper_bin
/datum/gear/crayons
name = "Box of crayons"
category = SLOT_IN_BACKPACK
path = /obj/item/storage/crayons
/datum/gear/multipen
name = "A multicolored pen"
category = SLOT_IN_BACKPACK
path = /obj/item/pen/fourcolor
/datum/gear/fountainpen
name = "A fancy pen"
category = SLOT_IN_BACKPACK
path = /obj/item/pen/fountain
cost = 2
@@ -7,3 +7,10 @@
name = "Fake moustache"
category = SLOT_WEAR_MASK
path = /obj/item/clothing/mask/fakemoustache
/datum/gear/joy
name = "Joy mask"
category = SLOT_WEAR_MASK
path = /obj/item/clothing/mask/joy
cost = 9
@@ -73,6 +73,11 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/skirt/purple
/datum/gear/skirtplaid
name = "Plaid skirt"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/plaid_skirt
/datum/gear/schoolgirlblue
name = "Blue Schoolgirl Uniform"
category = SLOT_W_UNIFORM
@@ -108,6 +113,11 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/pants/camo
/datum/gear/athleticshorts
name = "Athletic Shorts"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/shorts
/datum/gear/bjeans
name = "Black Jeans"
category = SLOT_W_UNIFORM
@@ -180,6 +190,11 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/bb_sweater/blue
/datum/gear/keyholesweater
name = "Keyhole Sweater"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/keyholesweater
/datum/gear/polykilt
name = "Polychromic Kilt"
category = SLOT_W_UNIFORM
@@ -313,4 +328,17 @@
/datum/gear/gear_harnesses
name = "Gear Harness"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/gear_harness
path = /obj/item/clothing/under/gear_harness
/datum/gear/pinkstripper
name = "Pink stripper outfit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripper_pink
cost = 3
/datum/gear/greenstripper
name = "Green stripper outfit"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripper_green
cost = 3
@@ -15,7 +15,7 @@
var/arousable = TRUE
var/widescreenpref = TRUE
var/autostand = TRUE
var/lewdchem = TRUE
var/lewdchem = FALSE
//vore prefs
var/toggleeatingnoise = TRUE
@@ -80,9 +80,9 @@
user.regenerate_icons()
/obj/item/clothing/examine(mob/user)
..()
. = ..()
if(hasprimary | hassecondary | hastertiary)
to_chat(user, "<span class='notice'>Alt-click to recolor it.</span>") // so people don't "OOC how do you use polychromic clothes????"
. += "<span class='notice'>Alt-click to recolor it.</span>"
/obj/item/clothing/Initialize()
..()
@@ -1,44 +0,0 @@
/obj/item/clothing/glasses/phantomthief
name = "suspicious paper mask"
desc = "A cheap, Syndicate-branded paper face mask. They'll never see it coming."
alternate_worn_icon = 'icons/mob/mask.dmi'
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "s-ninja"
item_state = "s-ninja"
/obj/item/clothing/glasses/phantomthief/ComponentInitialize()
. = ..()
AddComponent(/datum/component/wearertargeting/phantomthief)
/obj/item/clothing/glasses/phantomthief/syndicate
name = "suspicious plastic mask"
desc = "A cheap, bulky, Syndicate-branded plastic face mask. You have to break in to break out."
var/nextadrenalinepop
/obj/item/clothing/glasses/phantomthief/syndicate/examine(mob/user)
. = ..()
if(user.get_item_by_slot(SLOT_GLASSES) == src)
if(world.time >= nextadrenalinepop)
to_chat(user, "<span class='notice'>The built-in adrenaline injector is ready for use.</span>")
else
to_chat(user, "<span class='notice'>[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again.")
/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate)
if(istype(user) && combatmodestate && world.time >= nextadrenalinepop)
nextadrenalinepop = world.time + 5 MINUTES
user.reagents.add_reagent("syndicateadrenals", 5)
user.playsound_local(user, 'sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE)
/obj/item/clothing/glasses/phantomthief/syndicate/equipped(mob/user, slot)
. = ..()
if(!istype(user))
return
if(slot != SLOT_GLASSES)
return
RegisterSignal(user, COMSIG_COMBAT_TOGGLED, .proc/injectadrenaline)
/obj/item/clothing/glasses/phantomthief/syndicate/dropped(mob/user)
. = ..()
if(!istype(user))
return
UnregisterSignal(user, COMSIG_COMBAT_TOGGLED)
@@ -1,20 +0,0 @@
/*/////////////////////////////////////////////////////////////////////////////////
/////// ///////
/////// Cit's exclusive hats, helmets, etc. go here ///////
/////// ///////
*//////////////////////////////////////////////////////////////////////////////////
/obj/item/clothing/head/flakhelm //Actually the M1 Helmet
name = "flak helmet"
icon = 'modular_citadel/icons/obj/clothing/space_nam.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/space_nam.dmi'
icon_state = "m1helm"
item_state = "helmet"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = -15)
desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell."
pocket_storage_component_path = /datum/component/storage/concrete/pockets/tiny/spacenam //So you can stuff other things in the elastic band instead of it simply being a fluff thing.
//The "pocket" for the M1 helmet so you can tuck things into the elastic band
/datum/component/storage/concrete/pockets/tiny/spacenam
attack_hand_interact = TRUE //So you can actually see what you stuff in there
@@ -28,16 +28,3 @@
desc = "conceal your face in shame with this nanotrasen brand hood"
flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/flakjack
name = "flak jacket"
desc = "A dilapidated jacket made of a supposedly bullet-proof material (Hint: It isn't.). Smells faintly of napalm."
icon = 'modular_citadel/icons/obj/clothing/space_nam.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/space_nam.dmi'
icon_state = "flakjack"
item_state = "redtag"
blood_overlay_type = "armor"
body_parts_covered = CHEST
resistance_flags = NONE
mutantrace_variation = NO_MUTANTRACE_VARIATION
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid
@@ -2,7 +2,7 @@
//For custom items.
// Unless there's a digitigrade version make sure you add mutantrace_variation = NO_MUTANTRACE_VARIATION to all clothing/under and shoes - Pooj
// Digitigrade stuff is uniform_digi.dmi and digishoes.dmi in modular_citadel/icons/mob
// Digitigrade stuff is uniform_digi.dmi and digishoes.dmi in icons/mob
/obj/item/custom/ceb_soap
name = "Cebutris' Soap"
@@ -493,6 +493,7 @@
item_state = "blueberet"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
dynamic_hair_suffix = ""
/obj/item/clothing/head/flight
name = "flight goggles"
@@ -18,30 +18,32 @@
return FALSE
return .
/mob/living/carbon/proc/toggle_combat_mode(forced)
if(recoveringstam)
return TRUE
/mob/living/carbon/proc/toggle_combat_mode(forced, silent)
if(!forced)
for(var/datum/status_effect/S in status_effects)
if(recoveringstam || stat != CONSCIOUS)
return TRUE
for(var/i in status_effects)
var/datum/status_effect/S = i
if(S.blocks_combatmode)
return TRUE
combatmode = !combatmode
if(voremode)
toggle_vore_mode()
if(combatmode)
playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
else
playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
if(!silent)
if(combatmode)
if(world.time >= combatmessagecooldown)
if(a_intent != INTENT_HELP)
visible_message("<span class='warning'>[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].</span>")
else
visible_message("<span class='notice'>[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].</span>")
playsound_local(src, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
else
playsound_local(src, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
if(client)
client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting
if(hud_used && hud_used.static_inventory)
for(var/obj/screen/combattoggle/selector in hud_used.static_inventory)
selector.rebasetointerbay(src)
if(world.time >= combatmessagecooldown && combatmode)
if(a_intent != INTENT_HELP)
visible_message("<span class='warning'>[src] [resting ? "tenses up" : (prob(95)? "drops into a combative stance" : (prob(95)? "poses aggressively" : "asserts dominance with their pose"))].</span>")
else
visible_message("<span class='notice'>[src] [pick("looks","seems","goes")] [pick("alert","attentive","vigilant")].</span>")
combatmessagecooldown = 10 SECONDS + world.time //This is set 100% of the time to make sure squeezing regen out of process cycles doesn't result in the combat mode message getting spammed
SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode)
return TRUE
@@ -5,7 +5,8 @@
var/oldpseudoheight = pseudo_z_axis
. = ..()
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
doSprintLossTiles(1)
if(!HAS_TRAIT(src, TRAIT_FREESPRINT))
doSprintLossTiles(1)
if((oldpseudoheight - pseudo_z_axis) >= 8)
to_chat(src, "<span class='warning'>You trip off of the elevated surface!</span>")
for(var/obj/item/I in held_items)
@@ -20,7 +20,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/dogborg/jaws/examine(mob/user)
. = ..()
if(!CONFIG_GET(flag/weaken_secborg))
to_chat(user, "<span class='notice'>Use help intent to attempt to non-lethally incapacitate the target by latching on with your maw. This is more effective against exhausted and resting targets.</span>")
. += "<span class='notice'>Use help intent to attempt to non-lethally incapacitate the target by latching on with your maw. This is more effective against exhausted and resting targets.</span>"
/obj/item/dogborg/jaws/big
name = "combat jaws"
@@ -322,7 +322,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/soap/tongue/flavour/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
var/mob/living/silicon/robot.R = user
var/mob/living/silicon/robot/R = user
if(ishuman(target))
var/mob/living/L = target
if(status == 0 && check_zone(R.zone_selected) == "head")
@@ -178,9 +178,9 @@
/obj/item/gun/ballistic/automatic/magrifle_e/examine(mob/user)
. = ..()
if(cell)
to_chat(user, "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>")
. += "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>"
else
to_chat(user, "<span class='notice'>[src] doesn't seem to have a cell!</span>")
. += "<span class='notice'>[src] doesn't seem to have a cell!</span>"
/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot()
if(QDELETED(cell))
@@ -241,9 +241,9 @@
/obj/item/gun/ballistic/automatic/pistol/mag_e/examine(mob/user)
. = ..()
if(cell)
to_chat(user, "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>")
. += "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>"
else
to_chat(user, "<span class='notice'>[src] doesn't seem to have a cell!</span>")
. += "<span class='notice'>[src] doesn't seem to have a cell!</span>"
/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot()
if(QDELETED(cell))
@@ -218,8 +218,8 @@
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
/obj/item/gun/ballistic/automatic/AM4B/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to recolor it.</span>")
. = ..()
. += "<span class='notice'>Alt-click to recolor it.</span>"
/obj/item/ammo_box/magazine/toy/AM4C
name = "foam force AM4-C magazine"
@@ -94,8 +94,8 @@
update_icon()
/obj/item/gun/energy/pumpaction/examine(mob/user) //so people don't ask HOW TO CHANGE FIRING MODE
..()
to_chat(user, "<span class='notice'>Alt-click to change firing modes.</span>")
. = ..()
. += "<span class='notice'>Alt-click to change firing modes.</span>"
/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file) //ammo counter for inhands
. = ..()
@@ -132,7 +132,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
/datum/reagent/fermi/enthrall
name = "MKUltra"
id = "enthrall"
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it."
description = "A forbidden deep red mixture that increases a person's succeptability to another's words. When taken by the creator, it will enhance the draw of their voice to those affected by it."
color = "#660015" // rgb: , 0, 255
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please.
@@ -194,7 +194,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
Vc.Remove(M)
nVc.Insert(M)
qdel(Vc)
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle as your voice comes out in a more sultry tone.</span>")
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.)]</span>")
else
log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]")
M.apply_status_effect(/datum/status_effect/chem/enthrall)
@@ -203,9 +203,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M)
. = ..()
if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way.
if(volume < 0.5)//You don't get to escape that easily
FallInLove(pick(GLOB.player_list), M)
M.reagents.remove_reagent(id, volume)
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them.
if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak.
@@ -254,22 +251,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.)
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
to_chat(M, "<span class='love'><i>You are unable to resist your own charms anymore, and become a full blown narcissist.</i></span>")
/*Old way of handling, left in as an option B
var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
for(var/mob/living/carbon/victim in seen)
if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey
seen = seen - victim
if(!victim.ckey)
seen = seen - victim
var/mob/living/carbon/chosen = pick(seen)
creatorID = chosen.ckey
if (chosen.gender == "female")
creatorGender = "Mistress"
else
creatorGender = "Master"
creatorName = chosen.real_name
creator = get_mob_by_key(creatorID)
*/
ADD_TRAIT(M, TRAIT_PACIFISM, "MKUltra")
var/datum/status_effect/chem/enthrall/E
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
@@ -46,13 +46,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
var/unitCheck = FALSE
metabolization_rate = 0.5 * REAGENTS_METABOLISM
taste_description = "a weird chemical fleshy flavour"
//var/datum/status_effect/chem/SDGF/candidates/candies
var/list/candies = list()
//var/polling = FALSE
var/list/result = list()
var/list/group = null
var/pollStarted = FALSE
var/location_created
var/startHunger
impure_chem = "SDGFtox"
inverse_chem_val = 0.5
@@ -81,7 +76,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.dna.transfer_identity(SM)
SM.updateappearance(mutcolor_update=1)
//Process the willing ghosts, and make sure they're actually in the body when they're moved into it!
candies = shuffle(candies)//Shake those ghosts up!
for(var/mob/dead/observer/C2 in candies)
if(C2.key && C2)
@@ -131,7 +126,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.reagents.remove_reagent(id, volume)
log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Sentient clones made")
return
return ..()
else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!).
unitCheck = TRUE
@@ -283,7 +278,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
name = "synthetic-derived healing factor"
id = "SDGFheal"
description = "Leftover SDGF is transferred into the resulting clone, which quickly heals up the stresses from suddenly splitting. Restores blood, nutrition, and repaires brain and clone damage quickly. Only obtainable from using excess SDGF, and only enters the cloned body."
metabolization_rate = 1
metabolization_rate = 0.8
can_synth = FALSE
/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated)
@@ -313,9 +308,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
id = "SDZF"
description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. Emulates normal synthetic-derived growth factor, but produces a hostile zombie at the end of it."
color = "#a502e0" // rgb: 96, 0, 255
metabolization_rate = 0.5 * REAGENTS_METABOLISM
metabolization_rate = 0.2 * REAGENTS_METABOLISM
var/startHunger
can_synth = TRUE
taste_description = "a weird chemical fleshy flavour"
chemical_flags = REAGENT_SNEAKYNAME
/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
@@ -372,5 +368,6 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Zombie clones made!")
if(87 to INFINITY)
M.adjustToxLoss(1, 0)
M.adjustToxLoss(2, 0)
M.reagents.remove_reagent(id, 1)
..()
@@ -8,7 +8,7 @@ This ghost moves pretty quickly and is mostly invisible, but is still visible fo
When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential.
Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up)
There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it.
I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction.
I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit chem and ask for some pills to quench your addiction.
*/
@@ -30,15 +30,26 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
var/sleepytime = 0
inverse_chem_val = 0.25
can_synth = FALSE
var/datum/action/chem/astral/AS = new/datum/action/chem/astral()
/datum/action/chem/astral
name = "Return to body"
var/mob/living/carbon/origin = null
var/mob/living/simple_animal/hostile/retaliate/ghost = null
var/mob/living/carbon/origin
var/datum/mind/originalmind
/datum/action/chem/astral/Trigger()
ghost.mind.transfer_to(origin)
qdel(src)
if(origin.mind && origin.mind != originalmind)
to_chat(originalmind.current, "<span class='warning'><b><i>There's a foreign presence in your body blocking your return!</b></i></span>")
return ..()
if(origin.reagents.has_reagent("astral") )
var/datum/reagent/fermi/astral/As = locate(/datum/reagent/fermi/astral) in origin.reagents.reagent_list
if(As.current_cycle < 10)
to_chat(originalmind.current, "<span class='warning'><b><i>The intensity of the astrogen in your body is too much allow you to return to yourself yet!</b></i></span>")
return ..()
originalmind.transfer_to(origin)
if(origin.mind == originalmind)
qdel(src)
/datum/reagent/fermi/astral/reaction_turf(turf/T, reac_volume)
if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel))
@@ -50,7 +61,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
if(istype(O, /obj/item/bedsheet))
new /obj/item/bedsheet/cosmos(get_turf(O))
qdel(O)
..()
/datum/reagent/fermi/astral/on_mob_life(mob/living/carbon/M) // Gives you the ability to astral project for a moment!
M.alpha = 255
@@ -61,12 +72,20 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
if (G == null)
G = new(get_turf(M.loc))
G.name = "[M]'s astral projection"
var/datum/action/chem/astral/AS = new(G)
//var/datum/action/chem/astral/AS = new(G)
AS.Grant(G)
AS.origin = M
AS.ghost = G
AS.originalmind = originalmind
if(M.mind)
M.mind.transfer_to(G)
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections")
//INSURANCE
M.apply_status_effect(/datum/status_effect/chem/astral_insurance)
var/datum/status_effect/chem/astral_insurance/AI = M.has_status_effect(/datum/status_effect/chem/astral_insurance)
AI.original = M
AI.originalmind = M.mind
if(overdosed)
if(prob(50))
to_chat(G, "<span class='warning'>The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!</b></span>")
@@ -83,10 +102,12 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
if(!G)
if(M.mind)
var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
M.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
var/mob/living/simple_animal/astral/G2 = new(get_turf(M.loc))
M.mind.transfer_to(G2)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
to_chat(G, "<span class='warning'>[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'</b></span>")
log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
if(!G2.mind)
qdel(G2)
originalmind.transfer_to(M)
else if(G.mind)
G.mind.transfer_to(origin)
@@ -98,6 +119,9 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
if(G)//just in case
qdel(G)
log_game("FERMICHEM: [M] has astrally returned to their body!")
if(M.mind && M.mind == originalmind)
M.remove_status_effect(/datum/status_effect/chem/astral_insurance)
//AS.Remove(M)
..()
//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this.
@@ -105,7 +129,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
if(addiction_stage < 2)
antiGenetics = 255
M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them.
if(prob(70))
if(prob(75))
M.alpha--
antiGenetics--
switch(antiGenetics)
@@ -17,7 +17,7 @@
color = "#5020F4" // rgb: 50, 20, 255
overdose_threshold = 15
addiction_threshold = 15
metabolization_rate = 1.2 * REAGENTS_METABOLISM
metabolization_rate = 1 * REAGENTS_METABOLISM
addiction_stage2_end = 30
addiction_stage3_end = 41
addiction_stage4_end = 44 //Incase it's too long
@@ -52,7 +52,7 @@
location_return = get_turf(M) //sets up return point
to_chat(M, "<span class='userdanger'>You feel your wavefunction split!</span>")
if(purity > 0.9) //Teleports you home if it's pure enough
if(cached_purity > 0.9) //Teleports you home if it's pure enough
if(!location_created && data) //Just in case
location_created = data["location_created"]
log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
@@ -69,8 +69,9 @@
/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location
do_sparks(5,FALSE,M)
to_chat(M, "<span class='userdanger'>You feel your wavefunction collapse!</span>")
do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
do_sparks(5,FALSE,M)
if(!M.reagents.has_reagent("stabilizing_agent"))
do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
do_sparks(5,FALSE,M)
qdel(Eigenstate)
..()
@@ -7,22 +7,20 @@
taste_description = "affection and love!"
can_synth = FALSE
value = 20
//SplitChem = TRUE
impure_chem = "fermiTox"// What chemical is metabolised with an inpure reaction
inverse_chem_val = 0.25 // If the impurity is below 0.5, replace ALL of the chem with inverse_chemupon metabolising
inverse_chem = "fermiTox"
//This should process fermichems to find out how pure they are and what effect to do.
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
. = ..()
//When merging two fermichems, see above
/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
. = ..()
////////////////////////////////////////////////////////////////////////////////////////////////////
// HATIMUIM
///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -49,10 +47,7 @@
. = ..()
if(M.head)
var/obj/item/W = M.head
if(istype(W, /obj/item/clothing/head/hattip))
qdel(W)
else
M.dropItemToGround(W, TRUE)
M.dropItemToGround(W, TRUE)
var/hat = new /obj/item/clothing/head/hattip()
M.equip_to_slot(hat, SLOT_HEAD, 1, 1)
@@ -62,15 +57,20 @@
return ..()
var/hatArmor = 0
if(!overdosed)
hatArmor = (purity/10)
hatArmor = (cached_purity/10)
else
hatArmor = - (purity/10)
hatArmor = (cached_purity/10)
if(hatArmor > 90)
return ..()
var/obj/item/W = M.head
W.armor = W.armor.modifyAllRatings(hatArmor)
..()
/datum/reagent/fermi/hatmium/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 5)
new /obj/item/clothing/head/hattip(T)
..()
////////////////////////////////////////////////////////////////////////////////////////////////////
// FURRANIUM
///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -153,7 +153,7 @@
..()
/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M)
if(purity < 1)//Only permanent if you're a good chemist.
if(cached_purity < 0.95)//Only permanent if you're a good chemist.
nT = M.getorganslot(ORGAN_SLOT_TONGUE)
nT.Remove(M)
qdel(nT)
@@ -181,13 +181,13 @@
pH = 9
value = 90
can_synth = FALSE
var/react_objs = list()
/datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C)
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
if(isnull(N))
return ..()
N.nanite_volume = -purity//0.5 seems to be the default to me, so it'll neuter them.
N.nanite_volume += -cached_purity*5//0.5 seems to be the default to me, so it'll neuter them.
..()
/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C)
@@ -197,16 +197,19 @@
to_chat(C, "<span class='warning'>The residual voltage from the nanites causes you to seize up!</b></span>")
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
if(prob(10))
//empulse((get_turf(C)), 3, 2)//So the nanites randomize
var/atom/T = C
T.emp_act(EMP_HEAVY)
to_chat(C, "<span class='warning'>You feel a strange tingling sensation come from your core.</b></span>")
if(isnull(N))
return ..()
N.nanite_volume = -2
N.nanite_volume += -10*cached_purity
..()
/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
for(var/active_obj in react_objs)
if(O == active_obj)
return
react_objs += O
O.emp_act(EMP_HEAVY)
/datum/reagent/fermi/nanite_b_goneTox
@@ -289,15 +292,15 @@
else
holder.remove_reagent("fermiTest", volume)//Avoiding recurrsion
var/location = get_turf(holder.my_atom)
if(purity < 0.34 || purity == 1)
if(cached_purity < 0.34 || cached_purity == 1)
var/datum/effect_system/foam_spread/s = new()
s.set_up(volume*2, location, holder)
s.start()
if((purity < 0.67 && purity >= 0.34)|| purity == 1)
if((cached_purity < 0.67 && cached_purity >= 0.34)|| cached_purity == 1)
var/datum/effect_system/smoke_spread/chem/s = new()
s.set_up(holder, volume*2, location)
s.start()
if(purity >= 0.67)
if(cached_purity >= 0.67)
for (var/datum/reagent/reagent in holder.reagent_list)
if (istype(reagent, /datum/reagent/fermi))
var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id]
@@ -360,10 +363,11 @@
/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem?
name = "secretcatchem" //an attempt at hiding it
id = "secretcatchem"
description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed."
description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed. If used on someone in crit, it will turn them into a cat permanently, until the cat is killed."
taste_description = "hairballs and cream"
color = "#ffc224"
var/catshift = FALSE
var/perma = FALSE
var/mob/living/simple_animal/pet/cat/custom_cat/catto = null
can_synth = FALSE
@@ -372,7 +376,7 @@
/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H)
. = ..()
if(purity >= 0.8)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there.
if(cached_purity >= 0.9)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1.
//exception(al) handler:
H.dna.features["ears"] = "Cat"
H.dna.features["mam_ears"] = "Cat"
@@ -389,20 +393,30 @@
H.forceMove(catto)
log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "cats")
//Just to deal with rascally ghosts
//ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work
//catto.health = 1000 //To simulate fake death, while preventing ghosts escaping.
if(H.InCritical())
perma = TRUE
volume = 5
H.stat = DEAD
catto.origin = H
/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H)
if(!catto)
metabolization_rate = 5
return ..()
if(catto.health <= 0) //So the dead can't ghost
if(prob(10))
to_chat(H, "<span class='notice'>You feel your body start to slowly shift back from it's dead form.</span>")
to_chat(catto, "<span class='notice'>You feel your body start to slowly shift back from it's dead form.</span>")
perma = FALSE
metabolization_rate = 1
else if(prob(5))
playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
catto.say("lets out a meowrowr!*")
..()
/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H)
if(perma)
to_chat(H, "<span class='notice'>You feel your body settle into it's new form. You won't be able to shift back on death anymore.</span>")
return
var/words = "Your body shifts back to normal."
H.forceMove(catto.loc)
catto.mind.transfer_to(H)
@@ -412,3 +426,20 @@
to_chat(H, "<span class='notice'>[words]</span>")
qdel(catto)
log_game("FERMICHEM: [H] ckey: [H.key] has returned to normal")
/datum/reagent/fermi/secretcatchem/reaction_mob(var/mob/living/L)
if(istype(L, /mob/living/simple_animal/pet/cat/custom_cat) && cached_purity >= 0.85)
var/mob/living/simple_animal/pet/cat/custom_cat/catto = L
if(catto.origin)
var/mob/living/carbon/human/H = catto.origin
H.stat = CONSCIOUS
log_game("FERMICHEM: [catto] ckey: [catto.key] has returned to normal.")
to_chat(catto, "<span class='notice'>Your body shifts back to normal!</span>")
H.forceMove(catto.loc)
catto.mind.transfer_to(H)
if(!L.mind) //Just in case
qdel(L)
else //This should never happen, but just in case, so their game isn't ruined.
catto.icon_state = "custom_cat"
catto.health = 50
@@ -69,7 +69,6 @@
L.Insert(C)
to_chat(C, "<span class='notice'>You feel the yamerol merge in your chest.</span>")
holder.remove_reagent(src.id, "10")
C.adjustOxyLoss(-3)
..()
@@ -102,20 +101,39 @@
pH = 7.6
metabolization_rate = 0.05 //Give them time to graft
data = list("grown_volume" = 0, "injected_vol" = 0)
var/borrowed_health
color = "#FFDADA"
/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
if(iscarbon(M))
var/target = M.zone_selected
if (M.stat == DEAD)
show_message = 0
var/mob/living/carbon/C = M
var/healing_factor = (((data["grown_volume"] / 100) + 1)*reac_volume)
if(method in list(PATCH, TOUCH))
M.apply_damage(reac_volume*-1.5, BRUTE, target)
M.apply_damage(reac_volume*-1.5, BURN, target)
if(show_message)
to_chat(M, "<span class='danger'>You feel your [target] heal! It stings like hell!</span>")
if (M.stat == DEAD)
M.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attemping to repair the damage as quickly as possible.")
borrowed_health += healing_factor
M.adjustBruteLoss(-healing_factor*2)
M.adjustFireLoss(-healing_factor*2)
M.adjustToxLoss(-healing_factor)
M.adjustCloneLoss(-healing_factor)
M.updatehealth()
if(data["grown_volume"] > 135 && ((C.health + C.oxyloss)>=80))
if(M.revive())
M.emote("gasp")
borrowed_health *= 2
if(borrowed_health < 100)
borrowed_health = 100
log_combat(M, M, "revived", src)
else
M.adjustBruteLoss(-healing_factor)
M.adjustFireLoss(-healing_factor)
to_chat(M, "<span class='danger'>You feel your flesh merge with the synthetic tissue! It stings like hell!</span>")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
if(method==INJECT)
data["injected_vol"] = reac_volume
if(method==INJECT)
data["injected_vol"] = reac_volume
var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART)
if(data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING)
H.applyOrganDamage(-20)
..()
/datum/reagent/synthtissue/on_mob_life(mob/living/carbon/C)
@@ -129,6 +147,10 @@
to_chat(C, "<span class='notice'>You feel something reform inside of you!</span>")
data["injected_vol"] -= metabolization_rate
if(borrowed_health)
C.adjustToxLoss(1)
C.adjustCloneLoss(1)
borrowed_health -= 1
..()
/datum/reagent/synthtissue/on_merge(passed_data)
@@ -139,6 +161,7 @@
if(iscarbon(holder.my_atom))
data["injected_vol"] = data["injected_vol"] + passed_data["injected_vol"]
passed_data["injected_vol"] = 0
update_name()
..()
/datum/reagent/synthtissue/on_new(passed_data)
@@ -146,6 +169,32 @@
return ..()
if(passed_data["grown_volume"] > data["grown_volume"])
data["grown_volume"] = passed_data["grown_volume"]
update_name()
..()
/datum/reagent/synthtissue/proc/update_name() //They are but babes on creation and have to grow unto godhood
switch(data["grown_volume"])
if(-INFINITY to 50)
name = "Induced Synthtissue Colony"
if(50 to 80)
name = "Oligopotent Synthtissue Colony"
if(80 to 135)
name = "Pluripotent Synthtissue Colony"
if(135 to 175)
name = "SuperSomatic Synthtissue Colony"
if(175 to INFINITY)
name = "Omnipotent Synthtissue Colony"
/datum/reagent/synthtissue/on_mob_delete(mob/living/M)
if(!iscarbon(M))
return
var/mob/living/carbon/C = M
C.adjustBruteLoss(borrowed_health*1.25)
C.adjustToxLoss(borrowed_health*1.25)
C.adjustCloneLoss(borrowed_health*1.25)
C.adjustAllOrganLoss(borrowed_health*0.25)
M.updatehealth()
if(borrowed_health && C.health < -20)
M.stat = DEAD
M.visible_message("The synthetic tissue degrades off [M]'s wounds as they collapse to the floor.")
//NEEDS ON_MOB_DEAD()
@@ -282,9 +282,7 @@
name = "MKUltra"
id = "enthrall"
results = list("enthrall" = 5)
//required_reagents = list("iron" = 1, "iodine" = 1) Test vars
//required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1)
required_reagents = list("cocoa" = 1, "bluespace" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE.
required_reagents = list("cocoa" = 1, "bluespace" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1)
required_catalysts = list("blood" = 1)
mix_message = "the reaction gives off a burgundy plume of smoke!"
//FermiChem vars:
@@ -506,9 +504,9 @@
name = "secretcatchem"
id = "secretcatchem"
results = list("secretcatchem" = 5)
required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too.
required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a kitty if you don't lucky guess. It'll eat all your reagents too.
required_catalysts = list("SDGF" = 1)
required_temp = 600
required_temp = 500
mix_message = "the reaction gives off a meow!"
mix_sound = "modular_citadel/sound/voice/merowr.ogg"
//FermiChem vars:
@@ -2,7 +2,7 @@
//Clothes made from FermiChem
/obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds
name = "Sythetic hat"
name = "Synthetic hat"
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "cowboy"
desc = "A sythesized hat, you can't seem to take it off. And tips their hat."
@@ -34,7 +34,6 @@
if(src == C.head)
C.emote("me",1,"tips their hat.",TRUE)
return
..()
/obj/item/clothing/head/hattip/equipped(mob/M, slot)
. = ..()
@@ -46,6 +45,13 @@
/obj/item/clothing/head/hattip/dropped(mob/M)
. = ..()
UnregisterSignal(M, COMSIG_MOB_SAY)
addtimer(CALLBACK(GLOBAL_PROC, .proc/root_and_toot, src, src, 200))
/obj/item/clothing/head/hattip/proc/root_and_toot(obj/item/clothing/head/hattip/hat)
hat.animate_atom_living()
var/list/seen = viewers(6, get_turf(hat))
for(var/mob/M2 in seen)
to_chat(M2, "<b>[hat]</b> exclaims, \"[pick("Whooee! Time for a hootenanny!", "Rough 'em up boys!", "Yeehaw! Freedom at last!", "Y'all about to get a good old fashioned spanking!")]\"")
/obj/item/clothing/head/hattip/proc/handle_speech(datum/source, mob/speech_args)
var/message = speech_args[SPEECH_MESSAGE]