Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit265
This commit is contained in:
@@ -159,7 +159,7 @@
|
||||
to_chat(M, "<span class='warning'>Arousal is disabled. Feature is unavailable.</span>")
|
||||
|
||||
|
||||
/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
|
||||
/mob/living/proc/mob_climax(forced_climax = FALSE)//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
|
||||
set name = "Masturbate"
|
||||
set category = "IC"
|
||||
if(canbearoused && !restrained() && !stat)
|
||||
|
||||
@@ -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 :^))
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
restricted_roles = list("Assistant")
|
||||
|
||||
/datum/gear/neetsuit
|
||||
name = "ASSU suit"
|
||||
name = "D.A.B. suit"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/assu_suit
|
||||
restricted_roles = list("Assistant")
|
||||
cost = 2
|
||||
|
||||
/datum/gear/neethelm
|
||||
name = "ASSU helmet"
|
||||
name = "D.A.B. helmet"
|
||||
category = SLOT_HEAD
|
||||
path = /obj/item/clothing/head/assu_helmet
|
||||
restricted_roles = list("Assistant")
|
||||
|
||||
@@ -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
|
||||
@@ -99,4 +89,30 @@
|
||||
/datum/gear/tape
|
||||
name = "Spare cassette tape"
|
||||
category = SLOT_IN_BACKPACK
|
||||
path = /obj/item/tape/random
|
||||
path = /obj/item/tape/random
|
||||
|
||||
/datum/gear/newspaper
|
||||
name = "Newspaper"
|
||||
category = SLOT_IN_BACKPACK
|
||||
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
|
||||
|
||||
|
||||
@@ -64,6 +64,11 @@
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat
|
||||
|
||||
/datum/gear/coat/aformal
|
||||
name = "Assistant's formal winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/aformal
|
||||
|
||||
/* Commented out until it is "balanced"
|
||||
/datum/gear/coat/sec
|
||||
name = "Security winter coat"
|
||||
@@ -77,45 +82,43 @@
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/medical
|
||||
restricted_roles = list("Chief Medical Officer", "Medical Doctor") // Reserve it to Medical Doctors and their boss, the Chief Medical Officer
|
||||
|
||||
/* Commented out until there is a Chemistry Winter Coat
|
||||
/datum/gear/coat/med/chem
|
||||
name = "Chemistry winter coat"
|
||||
|
||||
/datum/gear/coat/robotics
|
||||
name = "Robotics winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/medical/chemistry
|
||||
restricted_roles = list("Chief Medical Officer", "Chemist") // Reserve it to Chemists and their boss, the Chief Medical Officer
|
||||
*/
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/robotics
|
||||
restricted_roles = list("Research Director", "Roboticist")
|
||||
|
||||
/datum/gear/coat/sci
|
||||
name = "Science winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/science
|
||||
restricted_roles = list("Research Director", "Scientist", "Roboticist") // Reserve it to the Science Departement
|
||||
|
||||
|
||||
/datum/gear/coat/eng
|
||||
name = "Engineering winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/engineering
|
||||
restricted_roles = list("Chief Engineer", "Station Engineer") // Reserve it to Station Engineers and their boss, the Chief Engineer
|
||||
|
||||
|
||||
/datum/gear/coat/eng/atmos
|
||||
name = "Atmospherics winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
|
||||
restricted_roles = list("Chief Engineer", "Atmospheric Technician") // Reserve it to Atmos Techs and their boss, the Chief Engineer
|
||||
|
||||
|
||||
/datum/gear/coat/hydro
|
||||
name = "Hydroponics winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/hydro
|
||||
restricted_roles = list("Head of Personnel", "Botanist") // Reserve it to Botanists and their boss, the Head of Personnel
|
||||
|
||||
|
||||
/datum/gear/coat/cargo
|
||||
name = "Cargo winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/cargo
|
||||
restricted_roles = list("Quartermaster", "Cargo Technician") // Reserve it to Cargo Techs and their boss, the Quartermaster
|
||||
|
||||
|
||||
/datum/gear/coat/miner
|
||||
name = "Mining winter coat"
|
||||
category = SLOT_WEAR_SUIT
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
/mob/living/carbon/key_down(_key, client/user)
|
||||
switch(_key)
|
||||
if("C")
|
||||
toggle_combat_mode()
|
||||
return
|
||||
return ..()
|
||||
@@ -1,13 +0,0 @@
|
||||
/mob/living/carbon/human/key_down(_key, client/user)
|
||||
switch(_key)
|
||||
if("Shift")
|
||||
sprint_hotkey(TRUE)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/key_up(_key, client/user)
|
||||
switch(_key)
|
||||
if("Shift")
|
||||
sprint_hotkey(FALSE)
|
||||
return
|
||||
return ..()
|
||||
@@ -1,13 +0,0 @@
|
||||
/mob/living/silicon/robot/key_down(_key, client/user)
|
||||
switch(_key)
|
||||
if("Shift")
|
||||
sprint_hotkey(TRUE)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/robot/key_up(_key, client/user)
|
||||
switch(_key)
|
||||
if("Shift")
|
||||
sprint_hotkey(FALSE)
|
||||
return
|
||||
return ..()
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/carbon/adjustStaminaLossBuffered(amount, updating_stamina = 1)
|
||||
/mob/living/carbon/adjustStaminaLossBuffered(amount, updating_health = 1)
|
||||
if(status_flags & GODMODE)
|
||||
return 0
|
||||
if(CONFIG_GET(flag/disable_stambuffer))
|
||||
@@ -8,7 +8,7 @@
|
||||
adjustStaminaLoss(directstamloss)
|
||||
bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer)
|
||||
stambufferregentime = world.time + 10
|
||||
if(updating_stamina)
|
||||
if(updating_health)
|
||||
update_health_hud()
|
||||
|
||||
/mob/living/carbon/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE, affected_zone = BODY_ZONE_CHEST)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/proc/adjustStaminaLossBuffered(amount, updating_stamina = TRUE, forced = FALSE)
|
||||
/mob/living/proc/adjustStaminaLossBuffered(amount, updating_health = TRUE, forced = FALSE)
|
||||
return
|
||||
|
||||
/mob/living/proc/doSprintLossTiles(amount)
|
||||
|
||||
@@ -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"
|
||||
@@ -253,7 +253,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
if(!do_after(R, 50, target = target))
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
var/obj/item/stock_parts/cell.C = target
|
||||
var/obj/item/stock_parts/cell/C = target
|
||||
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
|
||||
qdel(target)
|
||||
return
|
||||
@@ -312,6 +312,42 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
target.wash_cream()
|
||||
return
|
||||
|
||||
//Nerfed tongue for flavour reasons (haha geddit?). Used for aux skins for regular borgs
|
||||
/obj/item/soap/tongue/flavour
|
||||
desc = "For giving affectionate kisses."
|
||||
|
||||
/obj/item/soap/tongue/flavour/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/soap/tongue/flavour/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(ishuman(target))
|
||||
var/mob/living/L = target
|
||||
if(status == 0 && check_zone(R.zone_selected) == "head")
|
||||
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [L]'s face!</span>", "<span class='notice'>You affectionally lick \the [L]'s face!</span>")
|
||||
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
return
|
||||
else if(status == 0)
|
||||
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [L]!</span>", "<span class='notice'>You affectionally lick \the [L]!</span>")
|
||||
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
return
|
||||
|
||||
//Same as above but for noses
|
||||
/obj/item/analyzer/nose/flavour/AltClick(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/analyzer/nose/flavour/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/analyzer/nose/flavour/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
do_attack_animation(target, null, src)
|
||||
user.visible_message("<span class='notice'>[user] [pick(attack_verb)] \the [target.name] with their nose!</span>")
|
||||
|
||||
|
||||
//Dogfood
|
||||
|
||||
/obj/item/trash/rkibble
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
mob/living/silicon
|
||||
no_vore = TRUE
|
||||
|
||||
/mob/living/silicon/robot
|
||||
var/dogborg = FALSE
|
||||
|
||||
/mob/living/silicon/robot/lay_down()
|
||||
..()
|
||||
update_canmove()
|
||||
|
||||
/mob/living/silicon/robot/update_canmove()
|
||||
..()
|
||||
if(client && stat != DEAD && dogborg == FALSE)
|
||||
if(resting)
|
||||
cut_overlays()
|
||||
icon_state = "[module.cyborg_base_icon]-rest"
|
||||
else
|
||||
icon_state = "[module.cyborg_base_icon]"
|
||||
update_icons()
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
|
||||
if(istype(cell))
|
||||
cell.charge -= amount*5
|
||||
@@ -1,466 +0,0 @@
|
||||
/mob/living/silicon/robot/modules/medihound
|
||||
set_module = /obj/item/robot_module/medihound
|
||||
|
||||
/mob/living/silicon/robot/modules/k9
|
||||
set_module = /obj/item/robot_module/k9
|
||||
|
||||
/mob/living/silicon/robot/modules/scrubpup
|
||||
set_module = /obj/item/robot_module/scrubpup
|
||||
|
||||
/mob/living/silicon/robot/modules/borgi
|
||||
set_module = /obj/item/robot_module/borgi
|
||||
|
||||
/mob/living/silicon/robot/proc/get_cit_modules()
|
||||
var/list/modulelist = list()
|
||||
modulelist["MediHound"] = /obj/item/robot_module/medihound
|
||||
if(BORG_SEC_AVAILABLE)
|
||||
modulelist["Security K-9"] = /obj/item/robot_module/k9
|
||||
modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup
|
||||
modulelist["Borgi"] = /obj/item/robot_module/borgi
|
||||
return modulelist
|
||||
|
||||
/obj/item/robot_module
|
||||
var/sleeper_overlay
|
||||
var/icon/cyborg_icon_override
|
||||
var/has_snowflake_deadsprite
|
||||
var/cyborg_pixel_offset
|
||||
var/moduleselect_alternate_icon
|
||||
var/dogborg = FALSE
|
||||
|
||||
/obj/item/robot_module/k9
|
||||
name = "Security K-9 Unit"
|
||||
basic_modules = list(
|
||||
/obj/item/restraints/handcuffs/cable/zipties,
|
||||
/obj/item/storage/bag/borgdelivery,
|
||||
/obj/item/dogborg/jaws/big,
|
||||
/obj/item/dogborg/pounce,
|
||||
/obj/item/clothing/mask/gas/sechailer/cyborg,
|
||||
/obj/item/soap/tongue,
|
||||
/obj/item/analyzer/nose,
|
||||
/obj/item/dogborg/sleeper/K9,
|
||||
/obj/item/gun/energy/disabler/cyborg,
|
||||
/obj/item/pinpointer/crew)
|
||||
emag_modules = list(/obj/item/gun/energy/laser/cyborg)
|
||||
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
|
||||
/obj/item/clockwork/weapon/ratvarian_spear)
|
||||
cyborg_base_icon = "k9"
|
||||
moduleselect_icon = "k9"
|
||||
moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
|
||||
can_be_pushed = FALSE
|
||||
hat_offset = INFINITY
|
||||
sleeper_overlay = "ksleeper"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
borghealth = 80
|
||||
|
||||
/obj/item/robot_module/k9/do_transform_animation()
|
||||
..()
|
||||
to_chat(loc,"<span class='userdanger'>While you have picked the Security K-9 module, you still have to follow your laws, NOT Space Law. \
|
||||
For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to.</span>")
|
||||
|
||||
/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/list/sechoundmodels = list("Default", "Dark", "Vale")
|
||||
if(R.client && R.client.ckey in list("nezuli"))
|
||||
sechoundmodels += "Alina"
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "k9"
|
||||
if("Alina")
|
||||
cyborg_base_icon = "alina-sec"
|
||||
special_light_key = "alina"
|
||||
sleeper_overlay = "alinasleeper"
|
||||
if("Dark")
|
||||
cyborg_base_icon = "k9dark"
|
||||
if("Vale")
|
||||
cyborg_base_icon = "valesec"
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/medihound
|
||||
name = "MediHound"
|
||||
basic_modules = list(
|
||||
/obj/item/dogborg/jaws/small,
|
||||
/obj/item/storage/bag/borgdelivery,
|
||||
/obj/item/analyzer/nose,
|
||||
/obj/item/soap/tongue,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/dogborg/sleeper/medihound,
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/reagent_containers/borghypo,
|
||||
/obj/item/twohanded/shockpaddles/cyborg/hound,
|
||||
/obj/item/stack/medical/gauze/cyborg,
|
||||
/obj/item/pinpointer/crew,
|
||||
/obj/item/sensor_device)
|
||||
emag_modules = list(/obj/item/dogborg/pounce)
|
||||
ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical,
|
||||
/obj/item/clockwork/weapon/ratvarian_spear)
|
||||
cyborg_base_icon = "medihound"
|
||||
moduleselect_icon = "medihound"
|
||||
moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
|
||||
can_be_pushed = FALSE
|
||||
hat_offset = INFINITY
|
||||
sleeper_overlay = "msleeper"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
|
||||
/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/list/medhoundmodels = list("Default", "Dark", "Vale")
|
||||
if(R.client && R.client.ckey in list("nezuli"))
|
||||
medhoundmodels += "Alina"
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "medihound"
|
||||
if("Dark")
|
||||
cyborg_base_icon = "medihounddark"
|
||||
sleeper_overlay = "mdsleeper"
|
||||
if("Vale")
|
||||
cyborg_base_icon = "valemed"
|
||||
sleeper_overlay = "valemedsleeper"
|
||||
if("Alina")
|
||||
cyborg_base_icon = "alina-med"
|
||||
special_light_key = "alina"
|
||||
sleeper_overlay = "alinasleeper"
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/scrubpup
|
||||
name = "Scrub Pup"
|
||||
basic_modules = list(
|
||||
/obj/item/dogborg/jaws/small,
|
||||
/obj/item/analyzer/nose,
|
||||
/obj/item/soap/tongue/scrubpup,
|
||||
/obj/item/lightreplacer/cyborg,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/dogborg/sleeper/compactor)
|
||||
emag_modules = list(/obj/item/dogborg/pounce)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/janitor,
|
||||
/obj/item/clockwork/replica_fabricator/cyborg)
|
||||
cyborg_base_icon = "scrubpup"
|
||||
moduleselect_icon = "janitor"
|
||||
hat_offset = INFINITY
|
||||
clean_on_move = TRUE
|
||||
sleeper_overlay = "jsleeper"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
dogborg = TRUE
|
||||
|
||||
/obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
..()
|
||||
var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules
|
||||
if(LR)
|
||||
for(var/i in 1 to coeff)
|
||||
LR.Charge(R)
|
||||
|
||||
/obj/item/robot_module/scrubpup/do_transform_animation()
|
||||
..()
|
||||
to_chat(loc,"<span class='userdanger'>As tempting as it might be, do not begin binging on important items. Eat your garbage responsibly. People are not included under Garbage.</span>")
|
||||
|
||||
/obj/item/robot_module/borgi
|
||||
name = "Borgi"
|
||||
basic_modules = list(
|
||||
/obj/item/dogborg/jaws/small,
|
||||
/obj/item/storage/bag/borgdelivery,
|
||||
/obj/item/analyzer/nose,
|
||||
/obj/item/soap/tongue,
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/borg/cyborghug)
|
||||
emag_modules = list(/obj/item/dogborg/pounce)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg,
|
||||
/obj/item/clockwork/weapon/ratvarian_spear,
|
||||
/obj/item/clockwork/replica_fabricator/cyborg)
|
||||
cyborg_base_icon = "borgi"
|
||||
moduleselect_icon = "borgi"
|
||||
moduleselect_alternate_icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
|
||||
hat_offset = INFINITY
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
|
||||
/*
|
||||
/obj/item/robot_module/orepup
|
||||
name = "Ore Pup"
|
||||
basic_modules = list(
|
||||
/obj/item/storage/bag/ore/cyborg,
|
||||
/obj/item/analyzer/nose,
|
||||
/obj/item/storage/bag/borgdelivery,
|
||||
/obj/item/dogborg/sleeper/ore,
|
||||
/obj/item/pickaxe/drill/cyborg,
|
||||
/obj/item/shovel,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/weldingtool/mini,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/t_scanner/adv_mining_scanner,
|
||||
/obj/item/gun/energy/kinetic_accelerator/cyborg,
|
||||
/obj/item/gps/cyborg)
|
||||
emag_modules = list(/obj/item/dogborg/pounce)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/miner,
|
||||
/obj/item/clockwork/weapon/ratvarian_spear,
|
||||
/obj/item/borg/sight/xray/truesight_lens)
|
||||
cyborg_base_icon = "orepup"
|
||||
moduleselect_icon = "orepup"
|
||||
sleeper_overlay = "osleeper"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
|
||||
/obj/item/robot_module/miner/do_transform_animation()
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
R.cut_overlays()
|
||||
R.setDir(SOUTH)
|
||||
flick("orepup_transform", R)
|
||||
do_transform_delay()
|
||||
R.update_headlamp()
|
||||
*/
|
||||
|
||||
/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot")
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "medical"
|
||||
if("Droid")
|
||||
cyborg_base_icon = "medical"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
hat_offset = 4
|
||||
if("Sleek")
|
||||
cyborg_base_icon = "sleekmed"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Marina")
|
||||
cyborg_base_icon = "marinamed"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Eyebot")
|
||||
cyborg_base_icon = "eyebotmed"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
cyborg_base_icon = "heavymed"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/janitor/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/list/janimodels = list("Default", "Sleek", "Marina", "Can", "Heavy")
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in janimodels
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "janitor"
|
||||
if("Marina")
|
||||
cyborg_base_icon = "marinajan"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Sleek")
|
||||
cyborg_base_icon = "sleekjan"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Can")
|
||||
cyborg_base_icon = "canjan"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
cyborg_base_icon = "heavyres"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider")
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "peace"
|
||||
if("Spider")
|
||||
cyborg_base_icon = "whitespider"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider")
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "sec"
|
||||
if("Default - Treads")
|
||||
cyborg_base_icon = "sec-tread"
|
||||
special_light_key = "sec"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Sleek")
|
||||
cyborg_base_icon = "sleeksec"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Marina")
|
||||
cyborg_base_icon = "marinasec"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Can")
|
||||
cyborg_base_icon = "cansec"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Spider")
|
||||
cyborg_base_icon = "spidersec"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
cyborg_base_icon = "heavysec"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "DarkK9", "Vale", "ValeDark")
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Waitress")
|
||||
cyborg_base_icon = "service_f"
|
||||
if("Butler")
|
||||
cyborg_base_icon = "service_m"
|
||||
if("Bro")
|
||||
cyborg_base_icon = "brobot"
|
||||
if("Kent")
|
||||
cyborg_base_icon = "kent"
|
||||
special_light_key = "medical"
|
||||
hat_offset = 3
|
||||
if("Tophat")
|
||||
cyborg_base_icon = "tophat"
|
||||
special_light_key = null
|
||||
hat_offset = INFINITY //He is already wearing a hat
|
||||
if("Sleek")
|
||||
cyborg_base_icon = "sleekserv"
|
||||
special_light_key = "sleekserv"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
cyborg_base_icon = "heavyserv"
|
||||
special_light_key = "heavyserv"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("DarkK9")
|
||||
cyborg_base_icon = "k50"
|
||||
special_light_key = "k50"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
if("Vale")
|
||||
cyborg_base_icon = "valeserv"
|
||||
special_light_key = "valeserv"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
if("ValeDark")
|
||||
cyborg_base_icon = "valeservdark"
|
||||
special_light_key = "valeservdark"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
|
||||
if(R.client && R.client.ckey in list("nezuli"))
|
||||
engymodels += "Alina"
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Default")
|
||||
cyborg_base_icon = "engineer"
|
||||
if("Default - Treads")
|
||||
cyborg_base_icon = "engi-tread"
|
||||
special_light_key = "engineer"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Loader")
|
||||
cyborg_base_icon = "loaderborg"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
if("Handy")
|
||||
cyborg_base_icon = "handyeng"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Sleek")
|
||||
cyborg_base_icon = "sleekeng"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Can")
|
||||
cyborg_base_icon = "caneng"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Marina")
|
||||
cyborg_base_icon = "marinaeng"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Spider")
|
||||
cyborg_base_icon = "spidereng"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
cyborg_base_icon = "heavyeng"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Pup Dozer")
|
||||
cyborg_base_icon = "pupdozer"
|
||||
can_be_pushed = FALSE
|
||||
hat_offset = INFINITY
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
if("Vale")
|
||||
cyborg_base_icon = "valeeng"
|
||||
can_be_pushed = FALSE
|
||||
hat_offset = INFINITY
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
if("Alina")
|
||||
cyborg_base_icon = "alina-eng"
|
||||
special_light_key = "alina"
|
||||
can_be_pushed = FALSE
|
||||
hat_offset = INFINITY
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
|
||||
has_snowflake_deadsprite = TRUE
|
||||
dogborg = TRUE
|
||||
cyborg_pixel_offset = -16
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid")
|
||||
if(!borg_icon)
|
||||
return FALSE
|
||||
switch(borg_icon)
|
||||
if("Lavaland")
|
||||
cyborg_base_icon = "miner"
|
||||
if("Asteroid")
|
||||
cyborg_base_icon = "minerOLD"
|
||||
special_light_key = "miner"
|
||||
if("Droid")
|
||||
cyborg_base_icon = "miner"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
hat_offset = 4
|
||||
if("Sleek")
|
||||
cyborg_base_icon = "sleekmin"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Can")
|
||||
cyborg_base_icon = "canmin"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Marina")
|
||||
cyborg_base_icon = "marinamin"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Spider")
|
||||
cyborg_base_icon = "spidermin"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
if("Heavy")
|
||||
cyborg_base_icon = "heavymin"
|
||||
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
|
||||
return ..()
|
||||
@@ -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.
|
||||
@@ -163,9 +163,9 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
creator = get_mob_by_key(creatorID)
|
||||
|
||||
/datum/reagent/fermi/enthrall/on_new(list/data)
|
||||
creatorID = data.["creatorID"]
|
||||
creatorGender = data.["creatorGender"]
|
||||
creatorName = data.["creatorName"]
|
||||
creatorID = data["creatorID"]
|
||||
creatorGender = data["creatorGender"]
|
||||
creatorName = data["creatorName"]
|
||||
creator = get_mob_by_key(creatorID)
|
||||
|
||||
/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
|
||||
@@ -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
|
||||
@@ -32,7 +32,7 @@
|
||||
can_synth = TRUE
|
||||
|
||||
/datum/reagent/fermi/eigenstate/on_new(list/data)
|
||||
location_created = data.["location_created"]
|
||||
location_created = data["location_created"]
|
||||
|
||||
//Main functions
|
||||
/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry!
|
||||
@@ -52,9 +52,9 @@
|
||||
|
||||
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"]
|
||||
location_created = data["location_created"]
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
|
||||
do_sparks(5,FALSE,M)
|
||||
do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg')
|
||||
@@ -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()
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
var/turf/open/location = get_turf(my_atom)
|
||||
if(location)
|
||||
E.location_created = location
|
||||
E.data.["location_created"] = location
|
||||
E.data["location_created"] = location
|
||||
|
||||
|
||||
//serum
|
||||
@@ -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:
|
||||
@@ -314,16 +312,16 @@
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='warning'>The reaction splutters and fails to react properly.</span>") //Just in case
|
||||
E.purity = 0
|
||||
if (B.data.["gender"] == "female")
|
||||
E.data.["creatorGender"] = "Mistress"
|
||||
if (B.data["gender"] == "female")
|
||||
E.data["creatorGender"] = "Mistress"
|
||||
E.creatorGender = "Mistress"
|
||||
else
|
||||
E.data.["creatorGender"] = "Master"
|
||||
E.data["creatorGender"] = "Master"
|
||||
E.creatorGender = "Master"
|
||||
E.data["creatorName"] = B.data.["real_name"]
|
||||
E.creatorName = B.data.["real_name"]
|
||||
E.data.["creatorID"] = B.data.["ckey"]
|
||||
E.creatorID = B.data.["ckey"]
|
||||
E.data["creatorName"] = B.data["real_name"]
|
||||
E.creatorName = B.data["real_name"]
|
||||
E.data["creatorID"] = B.data["ckey"]
|
||||
E.creatorID = B.data["ckey"]
|
||||
|
||||
//So slimes can play too.
|
||||
/datum/chemical_reaction/fermi/enthrall/slime
|
||||
@@ -337,16 +335,16 @@
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='warning'>The reaction splutters and fails to react.</span>") //Just in case
|
||||
E.purity = 0
|
||||
if (B.data.["gender"] == "female")
|
||||
E.data.["creatorGender"] = "Mistress"
|
||||
if (B.data["gender"] == "female")
|
||||
E.data["creatorGender"] = "Mistress"
|
||||
E.creatorGender = "Mistress"
|
||||
else
|
||||
E.data.["creatorGender"] = "Master"
|
||||
E.data["creatorGender"] = "Master"
|
||||
E.creatorGender = "Master"
|
||||
E.data["creatorName"] = B.data.["real_name"]
|
||||
E.creatorName = B.data.["real_name"]
|
||||
E.data.["creatorID"] = B.data.["ckey"]
|
||||
E.creatorID = B.data.["ckey"]
|
||||
E.data["creatorName"] = B.data["real_name"]
|
||||
E.creatorName = B.data["real_name"]
|
||||
E.data["creatorID"] = B.data["ckey"]
|
||||
E.creatorID = B.data["ckey"]
|
||||
|
||||
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
|
||||
var/turf/T = get_turf(my_atom)
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user