Merge branch 'master' into call-it-whatever-the-fuck-i-want
@@ -21,9 +21,9 @@
|
||||
#define COCK_SIZE_MIN 1
|
||||
#define COCK_SIZE_MAX 20
|
||||
|
||||
#define COCK_GIRTH_RATIO_MAX 1.25
|
||||
#define COCK_GIRTH_RATIO_DEF 0.75
|
||||
#define COCK_GIRTH_RATIO_MIN 0.5
|
||||
#define COCK_GIRTH_RATIO_MAX 0.42
|
||||
#define COCK_GIRTH_RATIO_DEF 0.25
|
||||
#define COCK_GIRTH_RATIO_MIN 0.15
|
||||
|
||||
#define KNOT_GIRTH_RATIO_MAX 3
|
||||
#define KNOT_GIRTH_RATIO_DEF 2.1
|
||||
|
||||
@@ -63,7 +63,7 @@ require only minor tweaks.
|
||||
#define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE)
|
||||
#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE)
|
||||
#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE)
|
||||
#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 5)
|
||||
#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 1)
|
||||
#define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)
|
||||
|
||||
#define DL_NAME "name"
|
||||
|
||||
@@ -32,7 +32,10 @@
|
||||
|
||||
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
|
||||
|
||||
#define MOVESPEED_ID_TASED_STATUS "TASED"
|
||||
#define MOVESPEED_ID_TASED_STATUS "MOOD_SANITY"
|
||||
|
||||
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
|
||||
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
|
||||
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
|
||||
|
||||
#define MOVESPEED_ID_SHRUNK "SHRINK_SPEED_MODIFIER"
|
||||
#define MOVESPEED_ID_GROW "GROWTH_SPEED_MODIFIER"
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
#define TRAIT_HOLY "holy"
|
||||
#define TRAIT_DEPRESSION "depression"
|
||||
#define TRAIT_JOLLY "jolly"
|
||||
#define TRAIT_HEADPAT_SLUT "headpat_slut"
|
||||
#define TRAIT_NOCRITDAMAGE "no_crit"
|
||||
#define TRAIT_NOSLIPWATER "noslip_water"
|
||||
#define TRAIT_NOSLIPALL "noslip_all"
|
||||
|
||||
@@ -113,3 +113,8 @@
|
||||
|
||||
/datum/mood_event/happy_empath/add_effects(var/mob/happytarget)
|
||||
description = "<span class='nicegreen'>[happytarget.name]'s happiness is infectious!</span>\n"
|
||||
|
||||
/datum/mood_event/lewd_headpat
|
||||
description = "<span class='nicegreen'>I love headpats so much!</span>\n"
|
||||
mood_change = 3
|
||||
timeout = 2 MINUTES
|
||||
|
||||
@@ -203,3 +203,33 @@
|
||||
/datum/quirk/bloodpressure/remove()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.blood_ratio = 1
|
||||
|
||||
/datum/quirk/draconicspeaker
|
||||
name = "Draconic speaker"
|
||||
desc = "Due to your time spent around lizards, you can speak Draconic!"
|
||||
value = 1
|
||||
gain_text = "<span class='notice'>You feel sensitive to hissing noises and your tongue curls comfortably.</span>"
|
||||
lose_text = "<span class='notice'>You forget how to speak Draconic!</span>"
|
||||
|
||||
/datum/quirk/draconicspeaker/add()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.grant_language(/datum/language/draconic)
|
||||
|
||||
/datum/quirk/draconicspeaker/remove()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.remove_language(/datum/language/draconic)
|
||||
|
||||
/datum/quirk/slimespeaker
|
||||
name = "Slime speaker"
|
||||
desc = "Due to your time spent around slimes, you can speak Slimespeak!"
|
||||
value = 1
|
||||
gain_text = "<span class='notice'>You feel sensitive to blorbling noises, and your throat produces melodic sounds.</span>"
|
||||
lose_text = "<span class='notice'>You forget how to speak Slimespeak!</span>"
|
||||
|
||||
/datum/quirk/slimespeaker/add()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.grant_language(/datum/language/slime)
|
||||
|
||||
/datum/quirk/slimespeaker/remove()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.remove_language(/datum/language/slime)
|
||||
@@ -101,4 +101,11 @@
|
||||
value = 0
|
||||
medical_record_text = "Patient never skipped ass day."
|
||||
gain_text = "<span class='notice'>Your ass rivals those of golems.</span>"
|
||||
lose_text = "<span class='notice'>Your butt feels more squishy and slappable.</span>"
|
||||
lose_text = "<span class='notice'>Your butt feels more squishy and slappable.</span>"
|
||||
|
||||
/datum/quirk/headpat_slut
|
||||
name = "Headpat Slut"
|
||||
desc = "You like headpats, alot, maybe even a little bit too much. Headpats give you a bigger mood boost and cause arousal"
|
||||
mob_trait = TRAIT_HEADPAT_SLUT
|
||||
value = 0
|
||||
medical_record_text = "Patient seems overly affectionate"
|
||||
|
||||
@@ -308,6 +308,9 @@
|
||||
|
||||
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
|
||||
if(state_open && is_operational())
|
||||
if(istype(I, /obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>You can't quite fit that while you hold it!</span>")
|
||||
return
|
||||
if(istype(I, /obj/item/clothing/suit))
|
||||
if(suit)
|
||||
to_chat(user, "<span class='warning'>The unit already contains a suit!.</span>")
|
||||
|
||||
@@ -219,6 +219,10 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>It's too unweildy to put in this way.</span>")
|
||||
return 1
|
||||
|
||||
else if(user.a_intent != INTENT_HARM)
|
||||
|
||||
if (!state_open)
|
||||
|
||||
@@ -160,6 +160,7 @@ RLD
|
||||
var/mode = 1
|
||||
var/ranged = FALSE
|
||||
var/computer_dir = 1
|
||||
var/airlock_dir = 1
|
||||
var/airlock_type = /obj/machinery/door/airlock
|
||||
var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use
|
||||
var/window_type = /obj/structure/window/fulltile
|
||||
@@ -281,6 +282,22 @@ RLD
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/rcd/proc/change_airlock_direction(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
var/list/airlock_dirs = list(
|
||||
"North/South" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocknorthsouth"),
|
||||
"East/West" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlockeastwest")
|
||||
)
|
||||
var/airlockdirs = show_radial_menu(user, src, airlock_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(airlockdirs)
|
||||
if("North/South")
|
||||
airlock_dir = 1
|
||||
if("East/West")
|
||||
airlock_dir = 4
|
||||
|
||||
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
@@ -486,6 +503,7 @@ RLD
|
||||
if(mode == RCD_AIRLOCK)
|
||||
choices += list(
|
||||
"Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"),
|
||||
"Change Direction" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlockrotation"),
|
||||
"Change Airlock Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocktype")
|
||||
)
|
||||
else if(mode == RCD_WINDOWGRILLE)
|
||||
@@ -513,6 +531,9 @@ RLD
|
||||
if("Change Access")
|
||||
change_airlock_access(user)
|
||||
return
|
||||
if("Change Direction")
|
||||
change_airlock_direction(user)
|
||||
return
|
||||
if("Change Airlock Type")
|
||||
change_airlock_setting(user)
|
||||
return
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
name = "Keeping communications"
|
||||
icon_state = "book3"
|
||||
author = "Engineering Encyclopedia"
|
||||
title = "Keeping communications
|
||||
title = "Keeping communications"
|
||||
page_link = "Guide_to_Telecommunications"
|
||||
|
||||
/obj/item/book/manual/wiki/atmospherics
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
rad_insulation = RAD_VERY_LIGHT_INSULATION
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
|
||||
|
||||
|
||||
/obj/structure/window/examine(mob/user)
|
||||
..()
|
||||
if(reinf)
|
||||
@@ -471,11 +473,12 @@
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
@@ -503,7 +506,10 @@
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door)
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,)
|
||||
// canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile)
|
||||
glass_amount = 2
|
||||
|
||||
@@ -529,11 +535,9 @@
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
@@ -561,7 +565,13 @@
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door)
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,
|
||||
/turf/closed/indestructible/,
|
||||
/turf/closed/indestructible/riveted,
|
||||
/turf/closed/indestructible/fakeglass)
|
||||
glass_amount = 2
|
||||
|
||||
/obj/structure/window/plasma/fulltile/unanchored
|
||||
@@ -577,31 +587,12 @@
|
||||
smooth = SMOOTH_TRUE
|
||||
glass_amount = 2
|
||||
|
||||
/obj/structure/window/plasma/reinforced/fulltile/unanchored
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/window/reinforced/fulltile
|
||||
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
|
||||
icon_state = "r_window"
|
||||
dir = FULLTILE_WINDOW_DIR
|
||||
max_integrity = 100
|
||||
fulltile = TRUE
|
||||
flags_1 = PREVENT_CLICK_UNDER_1
|
||||
smooth = SMOOTH_TRUE
|
||||
canSmoothWith = list(
|
||||
/turf/closed/wall,
|
||||
/turf/closed/wall/r_wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falsewall/brass,
|
||||
/obj/structure/falsewall/reinforced,
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
@@ -629,7 +620,70 @@
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door)
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity
|
||||
)
|
||||
|
||||
/obj/structure/window/plasma/reinforced/fulltile/unanchored
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/window/reinforced/fulltile
|
||||
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
|
||||
icon_state = "r_window"
|
||||
dir = FULLTILE_WINDOW_DIR
|
||||
max_integrity = 100
|
||||
fulltile = TRUE
|
||||
flags_1 = PREVENT_CLICK_UNDER_1
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
canSmoothWith = list(
|
||||
/turf/closed/wall,
|
||||
/turf/closed/wall/r_wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falsewall/brass,
|
||||
/obj/structure/falsewall/reinforced,
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
/obj/machinery/door/airlock/medical,
|
||||
/obj/machinery/door/airlock/medical/glass,
|
||||
/obj/machinery/door/airlock/public,
|
||||
/obj/machinery/door/airlock/public/glass,
|
||||
/obj/machinery/door/airlock/research,
|
||||
/obj/machinery/door/airlock/research/glass,
|
||||
/obj/machinery/door/airlock/maintenance,
|
||||
/obj/machinery/door/airlock/maintenance/glass,
|
||||
/obj/machinery/door/airlock/command/,
|
||||
/obj/machinery/door/airlock/command/glass,
|
||||
/obj/machinery/door/airlock/engineering,
|
||||
/obj/machinery/door/airlock/engineering/glass,
|
||||
/obj/machinery/door/airlock/engineering/abandoned,
|
||||
/obj/machinery/door/airlock/security,
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/obj/machinery/door/airlock/maintenance/abandoned,
|
||||
/obj/machinery/door/poddoor/shutters/preopen,
|
||||
/obj/machinery/door/poddoor/shutters,
|
||||
/obj/machinery/door/window/eastright,
|
||||
/obj/machinery/door/window/eastleft,
|
||||
/obj/machinery/door/window/northleft,
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,)
|
||||
|
||||
level = 3
|
||||
glass_amount = 2
|
||||
@@ -654,11 +708,12 @@
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
@@ -686,8 +741,10 @@
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door)
|
||||
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,)
|
||||
//Old code left of reference
|
||||
//canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile)
|
||||
level = 3
|
||||
|
||||
@@ -86,9 +86,108 @@
|
||||
smooth = SMOOTH_TRUE
|
||||
explosion_block = INFINITY
|
||||
|
||||
canSmoothWith = list(
|
||||
/turf/closed/wall,
|
||||
/turf/closed/wall/r_wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falsewall/brass,
|
||||
/obj/structure/falsewall/reinforced,
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
/obj/machinery/door/airlock/medical,
|
||||
/obj/machinery/door/airlock/medical/glass,
|
||||
/obj/machinery/door/airlock/public,
|
||||
/obj/machinery/door/airlock/public/glass,
|
||||
/obj/machinery/door/airlock/research,
|
||||
/obj/machinery/door/airlock/research/glass,
|
||||
/obj/machinery/door/airlock/maintenance,
|
||||
/obj/machinery/door/airlock/maintenance/glass,
|
||||
/obj/machinery/door/airlock/command/,
|
||||
/obj/machinery/door/airlock/command/glass,
|
||||
/obj/machinery/door/airlock/engineering,
|
||||
/obj/machinery/door/airlock/engineering/glass,
|
||||
/obj/machinery/door/airlock/engineering/abandoned,
|
||||
/obj/machinery/door/airlock/security,
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/obj/machinery/door/airlock/maintenance/abandoned,
|
||||
/obj/machinery/door/poddoor/shutters/preopen,
|
||||
/obj/machinery/door/poddoor/shutters,
|
||||
/obj/machinery/door/window/eastright,
|
||||
/obj/machinery/door/window/eastleft,
|
||||
/obj/machinery/door/window/northleft,
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,
|
||||
/obj/machinery/door/airlock/centcom)
|
||||
|
||||
/turf/closed/indestructible/riveted/uranium
|
||||
icon = 'icons/turf/walls/uranium_wall.dmi'
|
||||
icon_state = "uranium"
|
||||
canSmoothWith = list(
|
||||
/turf/closed/wall,
|
||||
/turf/closed/wall/r_wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falsewall/brass,
|
||||
/obj/structure/falsewall/reinforced,
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
/obj/machinery/door/airlock/medical,
|
||||
/obj/machinery/door/airlock/medical/glass,
|
||||
/obj/machinery/door/airlock/public,
|
||||
/obj/machinery/door/airlock/public/glass,
|
||||
/obj/machinery/door/airlock/research,
|
||||
/obj/machinery/door/airlock/research/glass,
|
||||
/obj/machinery/door/airlock/maintenance,
|
||||
/obj/machinery/door/airlock/maintenance/glass,
|
||||
/obj/machinery/door/airlock/command/,
|
||||
/obj/machinery/door/airlock/command/glass,
|
||||
/obj/machinery/door/airlock/engineering,
|
||||
/obj/machinery/door/airlock/engineering/glass,
|
||||
/obj/machinery/door/airlock/engineering/abandoned,
|
||||
/obj/machinery/door/airlock/security,
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/obj/machinery/door/airlock/maintenance/abandoned,
|
||||
/obj/machinery/door/poddoor/shutters/preopen,
|
||||
/obj/machinery/door/poddoor/shutters,
|
||||
/obj/machinery/door/window/eastright,
|
||||
/obj/machinery/door/window/eastleft,
|
||||
/obj/machinery/door/window/northleft,
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,
|
||||
/obj/machinery/door/airlock/centcom)
|
||||
|
||||
/turf/closed/indestructible/abductor
|
||||
icon_state = "alien1"
|
||||
@@ -102,6 +201,55 @@
|
||||
opacity = 0
|
||||
smooth = SMOOTH_TRUE
|
||||
icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
|
||||
canSmoothWith = list(
|
||||
/turf/closed/wall,
|
||||
/turf/closed/wall/r_wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falsewall/brass,
|
||||
/obj/structure/falsewall/reinforced,
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
/obj/machinery/door/airlock/medical,
|
||||
/obj/machinery/door/airlock/medical/glass,
|
||||
/obj/machinery/door/airlock/public,
|
||||
/obj/machinery/door/airlock/public/glass,
|
||||
/obj/machinery/door/airlock/research,
|
||||
/obj/machinery/door/airlock/research/glass,
|
||||
/obj/machinery/door/airlock/maintenance,
|
||||
/obj/machinery/door/airlock/maintenance/glass,
|
||||
/obj/machinery/door/airlock/command/,
|
||||
/obj/machinery/door/airlock/command/glass,
|
||||
/obj/machinery/door/airlock/engineering,
|
||||
/obj/machinery/door/airlock/engineering/glass,
|
||||
/obj/machinery/door/airlock/engineering/abandoned,
|
||||
/obj/machinery/door/airlock/security,
|
||||
/obj/machinery/door/airlock/security/glass,
|
||||
/obj/machinery/door/airlock/maintenance/abandoned,
|
||||
/obj/machinery/door/poddoor/shutters/preopen,
|
||||
/obj/machinery/door/poddoor/shutters,
|
||||
/obj/machinery/door/window/eastright,
|
||||
/obj/machinery/door/window/eastleft,
|
||||
/obj/machinery/door/window/northleft,
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity,
|
||||
/obj/machinery/door/airlock/centcom)
|
||||
|
||||
/turf/closed/indestructible/fakeglass/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -253,7 +253,7 @@
|
||||
return FALSE
|
||||
to_chat(user, "<span class='notice'>You build an airlock.</span>")
|
||||
var/obj/machinery/door/airlock/A = new the_rcd.airlock_type(src)
|
||||
|
||||
A.setDir(the_rcd.airlock_dir)
|
||||
A.electronics = new/obj/item/electronics/airlock(A)
|
||||
|
||||
if(the_rcd.conf_access)
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
explosion_block = 3
|
||||
flags_1 = CAN_BE_DIRTY_1 | CHECK_RICOCHET_1
|
||||
sheet_type = /obj/item/stack/sheet/mineral/titanium
|
||||
smooth = SMOOTH_MORE|SMOOTH_DIAGONAL
|
||||
smooth = SMOOTH_MORE
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium)
|
||||
|
||||
/turf/closed/wall/mineral/titanium/nodiagonal
|
||||
|
||||
@@ -27,11 +27,14 @@
|
||||
/turf/closed/wall/rust,
|
||||
/turf/closed/wall/r_wall/rust,
|
||||
/turf/closed/wall/clockwork,
|
||||
/turf/closed/indestructible/riveted/,
|
||||
/turf/closed/indestructible/riveted/uranium,
|
||||
/obj/structure/window/fulltile,
|
||||
/obj/structure/window/reinforced/fulltile,
|
||||
/obj/structure/window/reinforced/tinted/fulltile,
|
||||
/obj/structure/window/plasma/fulltile,
|
||||
/obj/structure/window/plasma/reinforced/fulltile,
|
||||
/obj/machinery/door,
|
||||
/obj/machinery/door/airlock/,
|
||||
/obj/machinery/door/airlock/mining,
|
||||
/obj/machinery/door/airlock/mining/glass,
|
||||
@@ -59,7 +62,10 @@
|
||||
/obj/machinery/door/window/northright,
|
||||
/obj/machinery/door/airlock/external,
|
||||
/obj/machinery/door/airlock,
|
||||
/obj/machinery/door)
|
||||
/obj/machinery/door/airlock/hatch,
|
||||
/obj/machinery/door/airlock/engineering/glass/critical,
|
||||
/obj/machinery/door/airlock/atmos,
|
||||
/obj/machinery/door/airlock/highsecurity)
|
||||
|
||||
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
@@ -203,16 +203,18 @@
|
||||
name = "CentCom Commander"
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/centcom_commander
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
suit = /obj/item/clothing/suit/hooded/wintercoat/centcom
|
||||
shoes = /obj/item/clothing/shoes/combat/swat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
ears = /obj/item/radio/headset/headset_cent/commander
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
|
||||
head = /obj/item/clothing/head/centhat
|
||||
belt = /obj/item/gun/ballistic/revolver/mateba
|
||||
neck = /obj/item/clothing/neck/cloak/centcom
|
||||
belt = /obj/item/gun/ballistic/automatic/pistol/lato
|
||||
r_pocket = /obj/item/lighter
|
||||
l_pocket = /obj/item/ammo_box/a357
|
||||
l_pocket = /obj/item/ammo_box/magazine/latomag
|
||||
l_hand = /obj/item/ammo_box/magazine/latomag
|
||||
back = /obj/item/storage/backpack/satchel/leather
|
||||
id = /obj/item/card/id
|
||||
|
||||
|
||||
@@ -14,19 +14,20 @@
|
||||
icon_state = "DS-magboots0"
|
||||
magboot_state = "DS-magboots"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
alternate_worn_icon = 'icons/mob/feet.dmi'
|
||||
slowdown_active = SHOES_SLOWDOWN
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/magboots/atmos
|
||||
desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle. These are painted in the colors of an atmospheric technician."
|
||||
name = "atmospherics magboots"
|
||||
icon_state = "atmosmagboots0"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi'
|
||||
alternate_worn_icon = 'icons/mob/feet.dmi'
|
||||
magboot_state = "atmosmagboots"
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/shoes/simonshoes
|
||||
name = "Simon's Shoes"
|
||||
|
||||
@@ -55,6 +55,13 @@
|
||||
desc = "Worn by the Head of Personnel. It smells faintly of bureaucracy."
|
||||
icon_state = "hopcloak"
|
||||
|
||||
/obj/item/clothing/neck/cloak/centcom
|
||||
name = "central command's cloak"
|
||||
desc = "Worn by High-Ranking Central Command Personnel. I guess they needed one too."
|
||||
icon_state = "centcomcloak"
|
||||
armor = list("melee" = 35, "bullet" = 40, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 20, "rad" = 20, "fire" = 60, "acid" = 60)
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/goliath
|
||||
name = "goliath cloak"
|
||||
icon_state = "goliath_cloak"
|
||||
|
||||
@@ -114,13 +114,13 @@
|
||||
can_adjust = FALSE
|
||||
/obj/item/clothing/under/rank/centcom_officer
|
||||
desc = "It's a jumpsuit worn by CentCom Officers."
|
||||
name = "\improper CentCom officer's jumpsuit"
|
||||
name = "\improper CentCom officer's jumpsuit, adorned with a golden K and a star. This is not Nanotrasen."
|
||||
icon_state = "officer"
|
||||
item_state = "g_suit"
|
||||
item_color = "officer"
|
||||
alt_covers_chest = TRUE
|
||||
/obj/item/clothing/under/rank/centcom_commander
|
||||
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
|
||||
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders, adorned with a golden K and a star. This is not Nanotrasen."
|
||||
name = "\improper CentCom officer's jumpsuit"
|
||||
icon_state = "centcom"
|
||||
item_state = "dg_suit"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/datum/round_event_control/carp_migration
|
||||
name = "Carp Migration"
|
||||
typepath = /datum/round_event/carp_migration
|
||||
weight = 15
|
||||
min_players = 2
|
||||
weight = 10 //decreased weight from 15 to 10
|
||||
min_players = 5 //increased min players from 2 to 5 to reduce chances of half the crew dying in a carp breach
|
||||
earliest_start = 10 MINUTES
|
||||
max_occurrences = 6
|
||||
|
||||
|
||||
@@ -80,6 +80,9 @@ God bless America.
|
||||
I.reagents.trans_to(src, I.reagents.total_volume)
|
||||
qdel(I)
|
||||
return
|
||||
if(istype(I,/obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>This does not fit in the fryer.</span>") // TODO: Deepfrying instakills mobs, spawns a whole deep-fried mob.
|
||||
return
|
||||
if(!reagents.has_reagent("cooking_oil"))
|
||||
to_chat(user, "<span class='warning'>[src] has no cooking oil to fry with!</span>")
|
||||
return
|
||||
|
||||
@@ -187,7 +187,6 @@
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
|
||||
attack_verb = list("bashed", "whacked", "educated")
|
||||
resistance_flags = FLAMMABLE
|
||||
var/dat //Actual page content
|
||||
var/due_date = 0 //Game time in 1/10th seconds
|
||||
var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
|
||||
@@ -200,28 +199,28 @@
|
||||
to_chat(user, "<span class='warning'>As you are trying to read, you suddenly feel very stupid!</span>")
|
||||
return
|
||||
if(ismonkey(user))
|
||||
to_chat(user, "<span class='notice'>You skim through the book but can't comprehend any of it.</span>")
|
||||
to_chat(user, "<span class='notice'>You skim through the datapad but can't comprehend any of it.</span>")
|
||||
return
|
||||
if(dat)
|
||||
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
|
||||
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
|
||||
user << browse("<TT><I>Created by [author].</I></TT> <BR>" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
|
||||
user.visible_message("[user] begins reading a datapad titled \"[title]\" intently.")
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
|
||||
onclose(user, "book")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>This book is completely blank!</span>")
|
||||
to_chat(user, "<span class='notice'>This datapad is completely blank!</span>")
|
||||
|
||||
|
||||
/obj/item/book/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/pen))
|
||||
if(is_blind(user))
|
||||
to_chat(user, "<span class='warning'> As you are trying to write on the book, you suddenly feel very stupid!</span>")
|
||||
to_chat(user, "<span class='warning'> As you are trying to edit the datapad, you suddenly feel very stupid!</span>")
|
||||
return
|
||||
if(unique)
|
||||
to_chat(user, "<span class='warning'>These pages don't seem to take the ink well! Looks like you can't modify it.</span>")
|
||||
to_chat(user, "<span class='warning'>These entries don't seem to be editable! Looks like you can't modify it.</span>")
|
||||
return
|
||||
var/literate = user.is_literate()
|
||||
if(!literate)
|
||||
to_chat(user, "<span class='notice'>You scribble illegibly on the cover of [src]!</span>")
|
||||
to_chat(user, "<span class='notice'>You enter illegible text on the cover page of [src]!</span>")
|
||||
return
|
||||
var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
|
||||
if(!user.canUseTopic(src, BE_CLOSE, literate))
|
||||
@@ -232,7 +231,7 @@
|
||||
if(!user.canUseTopic(src, BE_CLOSE, literate))
|
||||
return
|
||||
if (length(newtitle) > 20)
|
||||
to_chat(user, "That title won't fit on the cover!")
|
||||
to_chat(user, "That title is too large for the datapad's memory!")
|
||||
return
|
||||
if(!newtitle)
|
||||
to_chat(user, "That title is invalid.")
|
||||
@@ -241,7 +240,7 @@
|
||||
name = newtitle
|
||||
title = newtitle
|
||||
if("Contents")
|
||||
var/content = stripped_input(user, "Write your book's contents (HTML NOT allowed):","","",8192)
|
||||
var/content = stripped_input(user, "Write your datapad's contents (HTML NOT allowed):","","",8192)
|
||||
if(!user.canUseTopic(src, BE_CLOSE, literate))
|
||||
return
|
||||
if(!content)
|
||||
@@ -250,7 +249,7 @@
|
||||
else
|
||||
dat += content
|
||||
if("Author")
|
||||
var/newauthor = stripped_input(user, "Write the author's name:")
|
||||
var/newauthor = stripped_input(user, "Enter the author's name:")
|
||||
if(!user.canUseTopic(src, BE_CLOSE, literate))
|
||||
return
|
||||
if(!newauthor)
|
||||
@@ -291,10 +290,10 @@
|
||||
scanner.computer.inventory.Add(src)
|
||||
to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
|
||||
|
||||
else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters))
|
||||
to_chat(user, "<span class='notice'>You begin to carve out [title]...</span>")
|
||||
else if(istype(I, /obj/item/multitool))
|
||||
to_chat(user, "<span class='notice'>You begin to erase the data from [title] with your PDA!...</span>")
|
||||
if(do_after(user, 30, target = src))
|
||||
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
|
||||
to_chat(user, "<span class='notice'>You erase all the page data from [title] with your PDA! You didn't want to read it anyway.</span>")
|
||||
var/obj/item/storage/book/B = new
|
||||
B.name = src.name
|
||||
B.title = src.title
|
||||
|
||||
@@ -159,22 +159,35 @@
|
||||
return
|
||||
//END OF CIT CHANGES
|
||||
|
||||
var/atom/movable/thrown_thing
|
||||
var/obj/item/I = src.get_active_held_item()
|
||||
|
||||
if(!I)
|
||||
if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
|
||||
var/mob/living/throwable_mob = pulling
|
||||
if(!throwable_mob.buckled)
|
||||
thrown_thing = throwable_mob
|
||||
var/atom/movable/thrown_thing
|
||||
var/mob/living/throwable_mob
|
||||
|
||||
if(istype(I, /obj/item/clothing/head/mob_holder))
|
||||
var/obj/item/clothing/head/mob_holder/holder = I
|
||||
if(holder.held_mob)
|
||||
throwable_mob = holder.held_mob
|
||||
holder.release()
|
||||
|
||||
if(!I || throwable_mob)
|
||||
if(!throwable_mob && pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
|
||||
throwable_mob = pulling
|
||||
|
||||
if(throwable_mob && !throwable_mob.buckled)
|
||||
thrown_thing = throwable_mob
|
||||
if(pulling)
|
||||
stop_pulling()
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
if(start_T && end_T)
|
||||
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
return
|
||||
|
||||
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
if(start_T && end_T)
|
||||
|
||||
log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]")
|
||||
|
||||
else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP))
|
||||
thrown_thing = I
|
||||
@@ -194,6 +207,8 @@
|
||||
newtonian_move(get_dir(target, src))
|
||||
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/restrained(ignore_grab)
|
||||
. = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
|
||||
|
||||
|
||||
@@ -282,10 +282,17 @@
|
||||
else if(check_zone(M.zone_selected) == "head")
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better!</span>", \
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_HEADPAT_SLUT))
|
||||
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better! They seem incredibly pleased!</span>", \
|
||||
"<span class='notice'>You give [H] a pat on the head to make [p_them()] feel better! They seem to like it way too much</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "lewd_headpat", /datum/mood_event/lewd_headpat)
|
||||
H.adjustArousalLoss(5) //Headpats are hot af
|
||||
else
|
||||
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better!</span>", \
|
||||
"<span class='notice'>You give [H] a pat on the head to make [p_them()] feel better!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
|
||||
|
||||
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
|
||||
if (mood.sanity >= SANITY_GREAT)
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
msg += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face.\n"
|
||||
if (wear_neck)
|
||||
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
|
||||
if(can_be_held)
|
||||
msg += "[t_He] looks small enough to be picked up with <b>Alt+Click</b>!\n"
|
||||
|
||||
|
||||
|
||||
for(var/obj/item/I in held_items)
|
||||
if(!(I.item_flags & ABSTRACT))
|
||||
|
||||
@@ -107,6 +107,10 @@
|
||||
//Status effects
|
||||
msg += status_effect_examines()
|
||||
|
||||
//Can be picked up?
|
||||
if(can_be_held)
|
||||
msg += "[t_He] looks small enough to be picked up with <b>Alt+Click</b>!\n"
|
||||
|
||||
//CIT CHANGES START HERE - adds genital details to examine text
|
||||
if(LAZYLEN(internal_organs))
|
||||
for(var/obj/item/organ/genital/dicc in internal_organs)
|
||||
|
||||
@@ -1098,4 +1098,10 @@
|
||||
race = /datum/species/zombie/infectious
|
||||
|
||||
/mob/living/carbon/human/species/zombie/krokodil_addict
|
||||
race = /datum/species/krokodil_addict
|
||||
race = /datum/species/krokodil_addict
|
||||
|
||||
//define holder_type on nerds we wanna commit scoop to
|
||||
/mob/living/carbon/human
|
||||
var/holder_type = /obj/item/clothing/head/mob_holder/micro
|
||||
can_be_held = "micro"
|
||||
|
||||
|
||||
@@ -65,3 +65,5 @@
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
|
||||
var/lastpuke = 0
|
||||
var/last_fire_update
|
||||
|
||||
can_be_held = "micro"
|
||||
|
||||
@@ -132,6 +132,10 @@
|
||||
pickupTarget = null
|
||||
pickupTimer = 0
|
||||
else if(ismob(pickupTarget.loc)) // in someones hand
|
||||
if(istype(pickupTarget, /obj/item/clothing/head/mob_holder/))
|
||||
var/obj/item/clothing/head/mob_holder/h = pickupTarget
|
||||
if(h && h.held_mob==src)
|
||||
return//dont let them pickpocket themselves
|
||||
var/mob/M = pickupTarget.loc
|
||||
if(!pickpocketing)
|
||||
pickpocketing = TRUE
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey,
|
||||
/obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
|
||||
hud_type = /datum/hud/monkey
|
||||
can_be_held = "monkey"
|
||||
|
||||
/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
@@ -45,6 +46,10 @@
|
||||
SSmobs.cubemonkeys -= src
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/monkey/generate_mob_holder()
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "monkey", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE)
|
||||
return holder
|
||||
|
||||
/mob/living/carbon/monkey/create_internal_organs()
|
||||
internal_organs += new /obj/item/organ/appendix
|
||||
internal_organs += new /obj/item/organ/lungs
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/mob/living/carbon/monkey/regenerate_icons()
|
||||
if(!..())
|
||||
update_body_parts()
|
||||
@@ -77,4 +76,4 @@
|
||||
/mob/living/carbon/monkey/update_hud_back(obj/item/I)
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
I.screen_loc = ui_monkey_back
|
||||
client.screen += I
|
||||
client.screen += I
|
||||
|
||||
@@ -10,10 +10,29 @@
|
||||
ntransform.TurnTo(lying_prev,lying)
|
||||
if(lying == 0) //Lying to standing
|
||||
final_pixel_y = get_standard_pixel_y_offset()
|
||||
if(size_multiplier >= 1) //if its bigger than normal
|
||||
ntransform.Translate(0,16 * (size_multiplier-1))
|
||||
else
|
||||
if(lying_prev == 90)
|
||||
ntransform.Translate(16 * (size_multiplier-1),16 * (size_multiplier-1))
|
||||
|
||||
if(lying_prev == 270)
|
||||
ntransform.Translate(-16 * (size_multiplier-1),16 * (size_multiplier-1))
|
||||
|
||||
else //if(lying != 0)
|
||||
if(lying_prev == 0) //Standing to lying
|
||||
pixel_y = get_standard_pixel_y_offset()
|
||||
final_pixel_y = get_standard_pixel_y_offset(lying)
|
||||
if(lying == 90) //Check the angle of the sprite to offset it accordingly.
|
||||
ntransform.Translate(-16 * (size_multiplier-1),0)
|
||||
if(size_multiplier < 1) //if its smaller than normal
|
||||
ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards
|
||||
|
||||
if(lying == 270) //check the angle of the sprite to offset it accordingly
|
||||
ntransform.Translate(16 * (size_multiplier-1),0)
|
||||
if(size_multiplier < 1) //if its smaller than normal
|
||||
ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards
|
||||
|
||||
if(dir & (EAST|WEST)) //Facing east or west
|
||||
final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass
|
||||
|
||||
@@ -22,11 +41,40 @@
|
||||
ntransform.Scale(resize)
|
||||
resize = RESIZE_DEFAULT_SIZE
|
||||
|
||||
//Apply size multiplier, thank NeverExisted for this
|
||||
if(size_multiplier != previous_size)
|
||||
changed++
|
||||
//now we offset the sprite
|
||||
//Scaling affects offset. There's probably a smarter and easier way to do this, but this way it works for sure (?)
|
||||
//Just to be clear. All this bullshit is needed because someone wanted to store the old transform matrix instead of using a new one each iteration
|
||||
//Winfre is currently doing a great job at coating my nuts in slobber while i code this
|
||||
if(!lying) //when standing. People of all sizes are affected equally
|
||||
ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
|
||||
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly.
|
||||
ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
|
||||
else //when lying. Macros dont get an offset, Micros do. We must also check the cases when a micro becomes a macro and viceversa
|
||||
if(previous_size <= 1 && size_multiplier <= 1) //micro stays a micro. We modify the side-offset
|
||||
ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
|
||||
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
|
||||
ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
|
||||
|
||||
if(previous_size <= 1 && size_multiplier > 1) //micro becomes a macro. We remove the side-offset
|
||||
ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
|
||||
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
|
||||
|
||||
if(previous_size > 1 && size_multiplier <= 1) //macro becomes a micro. We add an offset
|
||||
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly.
|
||||
ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
|
||||
|
||||
if(previous_size > 1 && size_multiplier > 1) //macro stays a macro. We just scale the sprite with no offset changes
|
||||
ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
|
||||
|
||||
previous_size = size_multiplier
|
||||
|
||||
if(changed)
|
||||
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
|
||||
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
|
||||
|
||||
|
||||
/mob/living/carbon
|
||||
var/list/overlays_standing[TOTAL_LAYERS]
|
||||
|
||||
|
||||
@@ -5,80 +5,125 @@
|
||||
desc = "Yell at coderbrush."
|
||||
icon = null
|
||||
icon_state = ""
|
||||
item_flags = DROPDEL
|
||||
var/mob/living/held_mob
|
||||
var/can_head = TRUE
|
||||
var/destroying = FALSE
|
||||
var/can_head = FALSE
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, head_icon, lh_icon, rh_icon, _can_head = TRUE)
|
||||
/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, alt_worn, lh_icon, rh_icon, _can_head_override = FALSE)
|
||||
. = ..()
|
||||
can_head = _can_head
|
||||
if(head_icon)
|
||||
alternate_worn_icon = head_icon
|
||||
|
||||
if(M)
|
||||
M.setDir(SOUTH)
|
||||
held_mob = M
|
||||
M.forceMove(src)
|
||||
appearance = M.appearance
|
||||
name = M.name
|
||||
desc = M.desc
|
||||
|
||||
if(_can_head_override)
|
||||
can_head = _can_head_override
|
||||
if(alt_worn)
|
||||
alternate_worn_icon = alt_worn
|
||||
if(_worn_state)
|
||||
item_state = _worn_state
|
||||
icon_state = _worn_state
|
||||
if(lh_icon)
|
||||
lefthand_file = lh_icon
|
||||
if(rh_icon)
|
||||
righthand_file = rh_icon
|
||||
if(!can_head)
|
||||
slot_flags = NONE
|
||||
deposit(M)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/Destroy()
|
||||
destroying = TRUE
|
||||
if(held_mob)
|
||||
release(FALSE)
|
||||
release()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/deposit(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
L.setDir(SOUTH)
|
||||
update_visuals(L)
|
||||
held_mob = L
|
||||
L.forceMove(src)
|
||||
name = L.name
|
||||
desc = L.desc
|
||||
return TRUE
|
||||
/obj/item/clothing/head/mob_holder/dropped()
|
||||
..()
|
||||
if(isturf(loc))//don't release on soft-drops
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/update_visuals(mob/living/L)
|
||||
appearance = L.appearance
|
||||
|
||||
/obj/item/clothing/head/mob_holder/proc/release(del_on_release = TRUE)
|
||||
if(!held_mob)
|
||||
if(del_on_release && !destroying)
|
||||
qdel(src)
|
||||
return FALSE
|
||||
/obj/item/clothing/head/mob_holder/proc/release()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='warning'>[held_mob] wriggles free!</span>")
|
||||
L.dropItemToGround(src)
|
||||
held_mob.forceMove(get_turf(held_mob))
|
||||
held_mob.reset_perspective()
|
||||
held_mob.setDir(SOUTH)
|
||||
held_mob.visible_message("<span class='warning'>[held_mob] uncurls!</span>")
|
||||
held_mob = null
|
||||
if(del_on_release && !destroying)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
if(held_mob)
|
||||
var/mob/living/m = held_mob
|
||||
m.forceMove(get_turf(m))
|
||||
m.reset_perspective()
|
||||
m.setDir(SOUTH)
|
||||
held_mob = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/relaymove(mob/user)
|
||||
release()
|
||||
return
|
||||
|
||||
/obj/item/clothing/head/mob_holder/container_resist()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
visible_message("<span class='warning'>[src] escapes [L]!</span>")
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/drone/deposit(mob/living/L)
|
||||
. = ..()
|
||||
if(!isdrone(L))
|
||||
qdel(src)
|
||||
name = "drone (hiding)"
|
||||
desc = "This drone is scared and has curled up into a ball!"
|
||||
/mob/living/proc/mob_pickup(mob/living/L)
|
||||
var/obj/item/clothing/head/mob_holder/holder = generate_mob_holder()
|
||||
if(!holder)
|
||||
return
|
||||
drop_all_held_items()
|
||||
L.put_in_hands(holder)
|
||||
return
|
||||
|
||||
/obj/item/clothing/head/mob_holder/drone/update_visuals(mob/living/L)
|
||||
var/mob/living/simple_animal/drone/D = L
|
||||
if(!D)
|
||||
return ..()
|
||||
icon = 'icons/mob/drone.dmi'
|
||||
icon_state = "[D.visualAppearence]_hat"
|
||||
/mob/living/proc/mob_try_pickup(mob/living/user)
|
||||
if(!ishuman(user) || !src.Adjacent(user) || user.incapacitated() || !can_be_held)
|
||||
return FALSE
|
||||
if(src.can_be_held == "micro")
|
||||
return FALSE
|
||||
if(user.get_active_held_item())
|
||||
to_chat(user, "<span class='warning'>Your hands are full!</span>")
|
||||
return FALSE
|
||||
if(buckled)
|
||||
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
|
||||
return FALSE
|
||||
if(src == user)
|
||||
to_chat(user, "<span class='warning'>You can't pick yourself up.</span>")
|
||||
return FALSE
|
||||
visible_message("<span class='warning'>[user] starts picking up [src].</span>", \
|
||||
"<span class='userdanger'>[user] starts picking you up!</span>")
|
||||
if(!do_after(user, 20, target = src))
|
||||
return FALSE
|
||||
|
||||
if(user.get_active_held_item()||buckled)
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='warning'>[user] picks up [src]!</span>", \
|
||||
"<span class='userdanger'>[user] picks you up!</span>")
|
||||
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
|
||||
mob_pickup(user)
|
||||
return TRUE
|
||||
|
||||
/mob/living/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(mob_try_pickup(user))
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env)
|
||||
var/atom/location = loc
|
||||
if(!loc)
|
||||
return //null
|
||||
var/turf/T = get_turf(loc)
|
||||
while(location != T)
|
||||
location = location.loc
|
||||
if(ismob(location))
|
||||
return location.loc.assume_air(env)
|
||||
return location.assume_air(env)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/remove_air(amount)
|
||||
var/atom/location = loc
|
||||
if(!loc)
|
||||
return //null
|
||||
var/turf/T = get_turf(loc)
|
||||
while(location != T)
|
||||
location = location.loc
|
||||
if(ismob(location))
|
||||
return location.loc.remove_air(amount)
|
||||
return location.remove_air(amount)
|
||||
|
||||
@@ -40,6 +40,15 @@
|
||||
QDEL_LIST(diseases)
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/proc/generate_mob_holder()
|
||||
if(ishuman(src))
|
||||
var/obj/item/clothing/head/mob_holder/micro/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi')
|
||||
return holder
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi')
|
||||
return holder
|
||||
|
||||
|
||||
/mob/living/proc/OpenCraftingMenu()
|
||||
return
|
||||
|
||||
@@ -136,6 +145,11 @@
|
||||
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
|
||||
mob_swap = 1
|
||||
if(mob_swap)
|
||||
|
||||
//handle micro bumping on help intent
|
||||
if(handle_micro_bump_helping(M))
|
||||
return 1
|
||||
|
||||
//switch our position with M
|
||||
if(loc && !loc.Adjacent(M.loc))
|
||||
return 1
|
||||
@@ -168,6 +182,11 @@
|
||||
//not if he's not CANPUSH of course
|
||||
if(!(M.status_flags & CANPUSH))
|
||||
return 1
|
||||
|
||||
//handle micro bumping on other intents
|
||||
if(handle_micro_bump_other(M))
|
||||
return 1
|
||||
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
if(HAS_TRAIT(L, TRAIT_PUSHIMMUNE))
|
||||
@@ -281,7 +300,11 @@
|
||||
var/datum/disease/D = thing
|
||||
if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
|
||||
ContactContractDisease(D)
|
||||
p
|
||||
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER))
|
||||
C.grippedby(src)
|
||||
|
||||
//mob verbs are a lot faster than object verbs
|
||||
//for more info on why this is not atom/pull, see examinate() in mob.dm
|
||||
@@ -1124,23 +1147,6 @@ p
|
||||
if(can_be_held)
|
||||
mob_try_pickup(over)
|
||||
|
||||
/mob/living/proc/mob_pickup(mob/living/L)
|
||||
return
|
||||
|
||||
/mob/living/proc/mob_try_pickup(mob/living/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(user.get_active_held_item())
|
||||
to_chat(user, "<span class='warning'>Your hands are full!</span>")
|
||||
return FALSE
|
||||
if(buckled)
|
||||
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='notice'>[user] starts trying to scoop up [src]!</span>")
|
||||
if(!do_after(user, 20, target = src))
|
||||
return FALSE
|
||||
mob_pickup(user)
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/get_static_viruses() //used when creating blood and other infective objects
|
||||
if(!LAZYLEN(diseases))
|
||||
@@ -1236,3 +1242,8 @@ p
|
||||
update_canmove()
|
||||
for(var/chem in healing_chems)
|
||||
reagents.add_reagent(chem, healing_chems[chem])
|
||||
|
||||
//retard edits below
|
||||
/mob/living
|
||||
var/size_multiplier = 1 //multiplier for the mob's icon size atm
|
||||
var/previous_size = 1
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
var/list/obj/effect/proc_holder/abilities = list()
|
||||
|
||||
var/can_be_held = FALSE //whether this can be picked up and held.
|
||||
var/can_be_held = FALSE
|
||||
|
||||
var/radiation = 0 //If the mob is irradiated.
|
||||
var/ventcrawl_layer = PIPING_LAYER_DEFAULT
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
var/mob/living/simple_animal/mouse/movement_target
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
collar_type = "cat"
|
||||
can_be_held = "cat2"
|
||||
size_multiplier = 0.5
|
||||
|
||||
do_footstep = TRUE
|
||||
|
||||
@@ -80,6 +82,7 @@
|
||||
pass_flags = PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
collar_type = "kitten"
|
||||
can_be_held = "cat"
|
||||
|
||||
//RUNTIME IS ALIVE! SQUEEEEEEEE~
|
||||
/mob/living/simple_animal/pet/cat/Runtime
|
||||
@@ -262,6 +265,7 @@
|
||||
attacked_sound = 'sound/items/eatfood.ogg'
|
||||
deathmessage = "loses its false life and collapses!"
|
||||
death_sound = "bodyfall"
|
||||
can_be_held = "cak"
|
||||
|
||||
/mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts)
|
||||
..()
|
||||
|
||||
@@ -13,8 +13,10 @@
|
||||
see_in_dark = 5
|
||||
speak_chance = 1
|
||||
turns_per_move = 10
|
||||
size_multiplier = 0.5
|
||||
|
||||
do_footstep = TRUE
|
||||
can_be_held = TRUE
|
||||
|
||||
//Corgis and pugs are now under one dog subtype
|
||||
|
||||
@@ -35,6 +37,7 @@
|
||||
var/obj/item/inventory_back
|
||||
var/shaved = FALSE
|
||||
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
|
||||
can_be_held = "corgi"
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Destroy()
|
||||
QDEL_NULL(inventory_head)
|
||||
@@ -63,6 +66,7 @@
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3)
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
collar_type = "pug"
|
||||
can_be_held = "pug"
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi
|
||||
name = "Exotic Corgi"
|
||||
@@ -360,6 +364,7 @@
|
||||
icon_dead = "old_corgi_dead"
|
||||
desc = "At a ripe old age of [record_age] Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
|
||||
turns_per_move = 20
|
||||
can_be_held = "old_corgi"
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
|
||||
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
|
||||
@@ -582,6 +587,7 @@
|
||||
unsuitable_atmos_damage = 0
|
||||
minbodytemp = TCMB
|
||||
maxbodytemp = T0C + 40
|
||||
can_be_held = "void_puppy"
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
|
||||
return 1 //Void puppies can navigate space.
|
||||
@@ -603,6 +609,7 @@
|
||||
response_harm = "kicks"
|
||||
var/turns_since_scan = 0
|
||||
var/puppies = 0
|
||||
can_be_held = "lisa"
|
||||
|
||||
//Lisa already has a cute bow!
|
||||
/mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list)
|
||||
|
||||
@@ -274,3 +274,7 @@
|
||||
|
||||
/mob/living/simple_animal/drone/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
return 0 //So they don't die trying to fix wiring
|
||||
|
||||
/mob/living/simple_animal/drone/generate_mob_holder()
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "[visualAppearence]_hat", null, null, null, TRUE)
|
||||
return holder
|
||||
|
||||
@@ -29,28 +29,11 @@
|
||||
if("Nothing")
|
||||
return
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
//picky up the drone c:
|
||||
/mob/living/simple_animal/drone/attack_hand(mob/user)
|
||||
if(ishuman(user))
|
||||
if(stat == DEAD || status_flags & GODMODE || !can_be_held)
|
||||
..()
|
||||
return
|
||||
if(user.get_active_held_item())
|
||||
to_chat(user, "<span class='warning'>Your hands are full!</span>")
|
||||
return
|
||||
visible_message("<span class='warning'>[user] starts picking up [src].</span>", \
|
||||
"<span class='userdanger'>[user] starts picking you up!</span>")
|
||||
if(!do_after(user, 20, target = src))
|
||||
return
|
||||
visible_message("<span class='warning'>[user] picks up [src]!</span>", \
|
||||
"<span class='userdanger'>[user] picks you up!</span>")
|
||||
if(buckled)
|
||||
to_chat(user, "<span class='warning'>[src] is buckled to [buckled] and cannot be picked up!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
|
||||
drop_all_held_items()
|
||||
var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src)
|
||||
user.put_in_hands(DH)
|
||||
..()
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
mob_try_pickup(user)
|
||||
|
||||
/mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user)
|
||||
var/mob/dead/observer/G = get_ghost()
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
|
||||
can_be_held = "fox"
|
||||
do_footstep = TRUE
|
||||
|
||||
//Captain fox
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption.
|
||||
can_be_held = "lizard"
|
||||
size_multiplier = 0.5
|
||||
|
||||
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
|
||||
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
|
||||
@@ -39,3 +41,7 @@
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/lizard/generate_mob_holder()
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "lizard", 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi', TRUE)
|
||||
return holder
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
var/body_color //brown, gray and white, leave blank for random
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
var/chew_probability = 1
|
||||
can_be_held = TRUE
|
||||
size_multiplier = 0.5
|
||||
|
||||
/mob/living/simple_animal/mouse/Initialize()
|
||||
. = ..()
|
||||
@@ -34,7 +36,7 @@
|
||||
icon_state = "mouse_[body_color]"
|
||||
icon_living = "mouse_[body_color]"
|
||||
icon_dead = "mouse_[body_color]_dead"
|
||||
|
||||
can_be_held = "mouse_[body_color]"
|
||||
|
||||
/mob/living/simple_animal/mouse/proc/splat()
|
||||
src.health = 0
|
||||
@@ -87,14 +89,17 @@
|
||||
/mob/living/simple_animal/mouse/white
|
||||
body_color = "white"
|
||||
icon_state = "mouse_white"
|
||||
can_be_held = "mouse_white"
|
||||
|
||||
/mob/living/simple_animal/mouse/gray
|
||||
body_color = "gray"
|
||||
icon_state = "mouse_gray"
|
||||
can_be_held = "mouse_gray"
|
||||
|
||||
/mob/living/simple_animal/mouse/brown
|
||||
body_color = "brown"
|
||||
icon_state = "mouse_brown"
|
||||
can_be_held = "mouse_brown"
|
||||
|
||||
//TOM IS ALIVE! SQUEEEEEEEE~K :)
|
||||
/mob/living/simple_animal/mouse/brown/Tom
|
||||
@@ -118,3 +123,8 @@
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/deadmouse/on_grind()
|
||||
reagents.clear_reagents()
|
||||
|
||||
/mob/living/simple_animal/mouse/generate_mob_holder()
|
||||
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, (istext(can_be_held) ? can_be_held : ""), 'icons/mob/animals_held.dmi', 'icons/mob/animals_held_lh.dmi', 'icons/mob/animals_held_rh.dmi')
|
||||
holder.w_class = WEIGHT_CLASS_TINY
|
||||
return holder
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
maxHealth = 50
|
||||
speed = 10
|
||||
glide_size = 2
|
||||
|
||||
can_be_held = "sloth" //finally oranges can be held
|
||||
size_multiplier = 0.5
|
||||
do_footstep = TRUE
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* Pens
|
||||
*/
|
||||
/obj/item/pen
|
||||
desc = "It's a normal black ink pen."
|
||||
desc = "It's a black ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
|
||||
name = "pen"
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "pen"
|
||||
@@ -33,12 +33,12 @@
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/pen/blue
|
||||
desc = "It's a normal blue ink pen."
|
||||
desc = "It's a blue ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
|
||||
icon_state = "pen_blue"
|
||||
colour = "blue"
|
||||
|
||||
/obj/item/pen/red
|
||||
desc = "It's a normal red ink pen."
|
||||
desc = "It's a red ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
|
||||
icon_state = "pen_red"
|
||||
colour = "red"
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
colour = "white"
|
||||
|
||||
/obj/item/pen/fourcolor
|
||||
desc = "It's a fancy four-color ink pen, set to black."
|
||||
desc = "It's a fancy four-color ink pen, set to black. Modified to be compatible with Nanotransen-brand Digital-Readpads™"
|
||||
name = "four-color pen"
|
||||
colour = "black"
|
||||
|
||||
|
||||
@@ -102,9 +102,17 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/disposal/proc/place_item_in_disposal(obj/item/I, mob/user)
|
||||
I.forceMove(src)
|
||||
user.visible_message("[user.name] places \the [I] into \the [src].", "<span class='notice'>You place \the [I] into \the [src].</span>")
|
||||
|
||||
if(istype(I, /obj/item/clothing/head/mob_holder))
|
||||
var/obj/item/clothing/head/mob_holder/H = I
|
||||
var/mob/living/m = H.held_mob
|
||||
H.release()
|
||||
if(m)
|
||||
user.start_pulling(m, 1)
|
||||
stuff_mob_in(m,user)
|
||||
return//you don't want this going into disposals ever
|
||||
if(user.temporarilyRemoveItemFromInventory(I)) //double-checks never hurt
|
||||
I.forceMove(src)
|
||||
user.visible_message("[user.name] places \the [I] into \the [src].", "<span class='notice'>You place \the [I] into \the [src].</span>")
|
||||
//mouse drop another mob or self
|
||||
/obj/machinery/disposal/MouseDrop_T(mob/living/target, mob/living/user)
|
||||
if(istype(target))
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/cooldown_mod = 1
|
||||
var/power_mod = 1
|
||||
var/list/spans = list("colossus","yell")
|
||||
var/speech_sound = 'sound/magic/clockwork/invoke_general.ogg'
|
||||
var/invoke_sound = 'sound/magic/clockwork/invoke_general.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/voice_of_god/can_cast(mob/user = usr)
|
||||
if(!user.can_speak())
|
||||
@@ -31,7 +31,7 @@
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/voice_of_god/cast(list/targets, mob/user = usr)
|
||||
playsound(get_turf(user), speech_sound, 300, 1, 5)
|
||||
playsound(get_turf(user), invoke_sound, 300, 1, 5)
|
||||
var/cooldown = voice_of_god(uppertext(command), user, spans, base_multiplier = power_mod)
|
||||
charge_max = (cooldown * cooldown_mod)
|
||||
|
||||
@@ -41,4 +41,4 @@
|
||||
power_mod = 0.1
|
||||
cooldown_mod = 0.5
|
||||
spans = list("clown")
|
||||
speech_sound = 'sound/spookoween/scary_horn2.ogg'
|
||||
invoke_sound = 'sound/spookoween/scary_horn2.ogg'
|
||||
@@ -0,0 +1,78 @@
|
||||
/datum/surgery/breast_augmentation
|
||||
name = "Breast augmentation"
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/augment_breasts, /datum/surgery_step/close)
|
||||
species = list(/mob/living/carbon/human)
|
||||
possible_locs = list(BODY_ZONE_CHEST)
|
||||
|
||||
/datum/surgery_step/augment_breasts
|
||||
name = "augment breasts"
|
||||
implements = list(/obj/item/scalpel = 100, /obj/item/stack/sheet/plastic = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
|
||||
/obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
|
||||
time = 32
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/surgery_step/augment_breasts/tool_check(mob/user, obj/item/tool)
|
||||
if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser))
|
||||
return FALSE
|
||||
return !tool.is_hot()
|
||||
|
||||
/datum/surgery_step/augment_breasts/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
//Patient has titties
|
||||
if(target.has_breasts())
|
||||
if(tool.is_sharp())
|
||||
display_results(user, target, "<span class='notice'>You begin to cut the excess out of [target]'s breasts, bringing them down a cup size...</span>",
|
||||
"[user] begins to augment [target]'s breasts.",
|
||||
"[user] begins to augment [target]'s breasts.")
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
display_results(user, target, "<span class='notice'>You begin to mold, shape, and then add plastic to [target]'s breasts, increasing their cup size by 1...</span>",
|
||||
"[user] begins to augment [target]'s breasts.",
|
||||
"[user] begins to augment [target]'s breasts.")
|
||||
//Patient does not have titties
|
||||
else
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
display_results(user, target, "<span class='notice'>You begin to remodel [target]'s chest, creating a new pair of breasts which are barely A cups...</span>",
|
||||
"[user] begins to perform plastic surgery on [target].",
|
||||
"[user] begins to perform plastic surgery on [target].")
|
||||
|
||||
/datum/surgery_step/augment_breasts/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/genital/breasts/B = target.getorganslot("breasts")
|
||||
//Patient has titties
|
||||
if(B)
|
||||
//Reduce their size (you fucking monster)
|
||||
if(tool.is_sharp())
|
||||
B.cached_size = B.cached_size - 1
|
||||
B.update()
|
||||
return 1
|
||||
//Increase the size (that's more like it!)
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
var/obj/item/stack/sheet/plastic/pS = tool
|
||||
pS.amount = pS.amount - 1
|
||||
if(pS.amount < 1)
|
||||
pS.Destroy()
|
||||
|
||||
B.cached_size = B.cached_size + 1
|
||||
B.update()
|
||||
return 1
|
||||
//Patient does not have titties
|
||||
else
|
||||
//Give 'em titties
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
//Makes it so no one has any weird coloured tits
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.dna.species.use_skintones)
|
||||
H.dna.features["breasts_color"] = skintone2hex(H.skin_tone)
|
||||
else
|
||||
H.dna.features["breasts_color"] = H.dna.features["mcolor"]
|
||||
|
||||
var/obj/item/stack/sheet/plastic/pS = tool
|
||||
pS.amount = pS.amount - 1
|
||||
if(pS.amount < 1)
|
||||
pS.Destroy()
|
||||
|
||||
var/obj/item/organ/genital/breasts/nB = new
|
||||
nB.size = "flat"
|
||||
nB.cached_size = 0
|
||||
nB.prev_size = 0
|
||||
nB.Insert(target)
|
||||
nB.update()
|
||||
return 1
|
||||
@@ -0,0 +1,78 @@
|
||||
/datum/surgery/penis_augmentation
|
||||
name = "Penis augmentation"
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/augment_penis, /datum/surgery_step/close)
|
||||
species = list(/mob/living/carbon/human)
|
||||
possible_locs = list(BODY_ZONE_PRECISE_GROIN)
|
||||
|
||||
/datum/surgery_step/augment_penis
|
||||
name = "augment penis"
|
||||
implements = list(/obj/item/scalpel = 100, /obj/item/stack/sheet/plastic = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
|
||||
/obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
|
||||
time = 32
|
||||
repeatable = TRUE
|
||||
|
||||
/datum/surgery_step/augment_penis/tool_check(mob/user, obj/item/tool)
|
||||
if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser))
|
||||
return FALSE
|
||||
return !tool.is_hot()
|
||||
|
||||
/datum/surgery_step/augment_penis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
//Patient has a cock
|
||||
if(target.has_penis())
|
||||
if(tool.is_sharp())
|
||||
display_results(user, target, "<span class='notice'>You begin to reshape [target]'s penis, decreasing it's length by an inch...</span>",
|
||||
"[user] begins to augment [target]'s penis.",
|
||||
"[user] begins to augment [target]'s penis.")
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
display_results(user, target, "<span class='notice'>You begin to mold, shape, and then add plastic to [target]'s penis, making it one inch bigger...</span>",
|
||||
"[user] begins to augment [target]'s penis.",
|
||||
"[user] begins to augment [target]'s penis.")
|
||||
//Patient does not have a cock
|
||||
else
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
display_results(user, target, "<span class='notice'>You begin to remodel [target]'s groin, creating a new penis of length 1 inch...</span>",
|
||||
"[user] begins to perform plastic surgery on [target].",
|
||||
"[user] begins to perform plastic surgery on [target].")
|
||||
|
||||
/datum/surgery_step/augment_penis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/obj/item/organ/genital/penis/P = target.getorganslot("penis")
|
||||
//Patient has a cock
|
||||
if(P)
|
||||
//Reduce their size
|
||||
if(tool.is_sharp())
|
||||
P.cached_length = P.cached_length - 1
|
||||
P.update()
|
||||
return 1
|
||||
//Increase the size
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
var/obj/item/stack/sheet/plastic/pS = tool
|
||||
pS.amount = pS.amount - 1
|
||||
if(pS.amount < 1)
|
||||
pS.Destroy()
|
||||
|
||||
P.cached_length = P.cached_length + 1
|
||||
P.update()
|
||||
return 1
|
||||
//Patient does not have a cock
|
||||
else
|
||||
//Give 'em a cock
|
||||
if(istype(tool, /obj/item/stack/sheet/plastic))
|
||||
//Makes it so no one has a weird coloured dick
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.dna.species.use_skintones)
|
||||
H.dna.features["penis_color"] = skintone2hex(H.skin_tone)
|
||||
else
|
||||
H.dna.features["penis_color"] = H.dna.features["mcolor"]
|
||||
|
||||
var/obj/item/stack/sheet/plastic/pS = tool
|
||||
pS.amount = pS.amount - 1
|
||||
if(pS.amount < 1)
|
||||
pS.Destroy()
|
||||
|
||||
var/obj/item/organ/genital/penis/nP = new
|
||||
nP.length = 1
|
||||
nP.cached_length = 1
|
||||
nP.prev_length = 0
|
||||
nP.Insert(target)
|
||||
nP.update()
|
||||
return 1
|
||||
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,8 @@
|
||||
/obj/item/clothing/head/maidband
|
||||
name = "maid head-band"
|
||||
desc = "To complete the maid look."
|
||||
icon_state = "maid_head"
|
||||
item_state = "maid_head"
|
||||
icon = 'hyperstation/icons/obj/clothing/head.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/head.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -0,0 +1,158 @@
|
||||
// Micro Holders - Extends /obj/item/holder... TO:DO, just use most of the already-set procs in inhand_holder.dm
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro
|
||||
name = "micro"
|
||||
desc = "Another person, small enough to fit in your hand."
|
||||
icon = null
|
||||
icon_state = ""
|
||||
slot_flags = ITEM_SLOT_FEET | ITEM_SLOT_HEAD | ITEM_SLOT_ID | ITEM_SLOT_BACK | ITEM_SLOT_NECK
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
can_head = TRUE
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/Initialize(mapload, mob/living/M, _worn_state, alt_worn, lh_icon, rh_icon, _can_head_override = FALSE)
|
||||
. = ..()
|
||||
|
||||
if(M)
|
||||
M.setDir(SOUTH)
|
||||
held_mob = M
|
||||
M.forceMove(src)
|
||||
appearance = M.appearance
|
||||
name = M.name
|
||||
desc = M.desc
|
||||
assimilate(M)
|
||||
|
||||
if(_can_head_override)
|
||||
can_head = _can_head_override
|
||||
if(alt_worn)
|
||||
alternate_worn_icon = alt_worn
|
||||
if(_worn_state)
|
||||
item_state = _worn_state
|
||||
icon_state = _worn_state
|
||||
if(lh_icon)
|
||||
lefthand_file = lh_icon
|
||||
if(rh_icon)
|
||||
righthand_file = rh_icon
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/proc/assimilate(mob/living/M)
|
||||
switch(M.mob_size)
|
||||
if(MOB_SIZE_TINY)
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
if(MOB_SIZE_SMALL)
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
if(MOB_SIZE_LARGE)
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/Destroy()
|
||||
if(held_mob)
|
||||
release()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/dropped()
|
||||
..()
|
||||
if(isturf(loc))//don't release on soft-drops
|
||||
release()
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/relaymove(mob/user)
|
||||
return
|
||||
|
||||
//TODO: add a timer to escape someone's grip dependant on size diff
|
||||
/obj/item/clothing/head/mob_holder/micro/container_resist()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
visible_message("<span class='warning'>[src] escapes [L]!</span>")
|
||||
release()
|
||||
|
||||
/mob/living/proc/mob_pickup_micro(mob/living/L)
|
||||
var/obj/item/clothing/head/mob_holder/micro/holder = generate_mob_holder()
|
||||
if(!holder)
|
||||
return
|
||||
drop_all_held_items()
|
||||
L.put_in_hands(holder)
|
||||
return
|
||||
|
||||
//shoehorned (get it?) and lazy way to do instant foot pickups cause haha funny.
|
||||
/mob/living/proc/mob_pickup_micro_feet(mob/living/L)
|
||||
var/obj/item/clothing/head/mob_holder/micro/holder = generate_mob_holder()
|
||||
if(!holder)
|
||||
return
|
||||
drop_all_held_items()
|
||||
L.equip_to_slot(holder, SLOT_SHOES)
|
||||
return
|
||||
|
||||
/mob/living/proc/mob_try_pickup_micro(mob/living/user)
|
||||
if(!ishuman(user) || !src.Adjacent(user) || user.incapacitated() || !can_be_held)
|
||||
return FALSE
|
||||
if(abs(user.get_effective_size()/src.get_effective_size()) < 2.0 )
|
||||
to_chat(user, "<span class='warning'>They're too big to pick up!</span>")
|
||||
return FALSE
|
||||
if(user.get_active_held_item())
|
||||
to_chat(user, "<span class='warning'>Your hands are full!</span>")
|
||||
return FALSE
|
||||
if(buckled)
|
||||
to_chat(user, "<span class='warning'>[src] is buckled to something!</span>")
|
||||
return FALSE
|
||||
if(src == user)
|
||||
to_chat(user, "<span class='warning'>You can't pick yourself up.</span>")
|
||||
return FALSE
|
||||
visible_message("<span class='warning'>[user] starts picking up [src].</span>", \
|
||||
"<span class='userdanger'>[user] starts picking you up!</span>")
|
||||
if(!do_after(user, 20, target = src))
|
||||
return FALSE
|
||||
|
||||
if(user.get_active_held_item()||buckled)
|
||||
return FALSE
|
||||
|
||||
visible_message("<span class='warning'>[user] picks up [src]!</span>", \
|
||||
"<span class='userdanger'>[user] picks you up!</span>")
|
||||
to_chat(user, "<span class='notice'>You pick [src] up.</span>")
|
||||
mob_pickup_micro(user)
|
||||
return TRUE
|
||||
|
||||
/mob/living/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(mob_try_pickup_micro(user))
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/assume_air(datum/gas_mixture/env)
|
||||
var/atom/location = loc
|
||||
if(!loc)
|
||||
return //null
|
||||
var/turf/T = get_turf(loc)
|
||||
while(location != T)
|
||||
location = location.loc
|
||||
if(ismob(location))
|
||||
return location.loc.assume_air(env)
|
||||
return location.assume_air(env)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/remove_air(amount)
|
||||
var/atom/location = loc
|
||||
if(!loc)
|
||||
return //null
|
||||
var/turf/T = get_turf(loc)
|
||||
while(location != T)
|
||||
location = location.loc
|
||||
if(ismob(location))
|
||||
return location.loc.remove_air(amount)
|
||||
return location.remove_air(amount)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/examine(var/mob/user)
|
||||
for(var/mob/living/M in contents)
|
||||
M.examine(user)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/MouseDrop(mob/M as mob)
|
||||
..()
|
||||
if(M != usr) return
|
||||
if(usr == src) return
|
||||
if(!Adjacent(usr)) return
|
||||
if(istype(M,/mob/living/silicon/ai)) return
|
||||
for(var/mob/living/carbon/human/O in contents)
|
||||
O.show_inv(usr)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/attack_self(var/mob/living/user)
|
||||
for(var/mob/living/carbon/human/M in contents)
|
||||
M.help_shake_act(user)
|
||||
|
||||
/obj/item/clothing/head/mob_holder/micro/attacked_by(obj/item/I, mob/living/user)
|
||||
for(var/mob/living/carbon/human/M in contents)
|
||||
M.attacked_by(I, user)
|
||||
@@ -0,0 +1,186 @@
|
||||
//I am not a coder. Please fucking tear apart my code, and insult me for how awful I am at coding. Please and thank you. -Dahlular
|
||||
var/const/RESIZE_MACRO = 6
|
||||
var/const/RESIZE_HUGE = 4
|
||||
var/const/RESIZE_BIG = 2
|
||||
var/const/RESIZE_NORMAL = 1
|
||||
var/const/RESIZE_SMALL = 0.75
|
||||
var/const/RESIZE_TINY = 0.50
|
||||
var/const/RESIZE_MICRO = 0.25
|
||||
|
||||
//averages
|
||||
var/const/RESIZE_A_MACROHUGE = (RESIZE_MACRO + RESIZE_HUGE) / 2
|
||||
var/const/RESIZE_A_HUGEBIG = (RESIZE_HUGE + RESIZE_BIG) / 2
|
||||
var/const/RESIZE_A_BIGNORMAL = (RESIZE_BIG + RESIZE_NORMAL) / 2
|
||||
var/const/RESIZE_A_NORMALSMALL = (RESIZE_NORMAL + RESIZE_SMALL) / 2
|
||||
var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
var/const/RESIZE_A_TINYMICRO = (RESIZE_TINY + RESIZE_MICRO) / 2
|
||||
|
||||
//Scale up a mob's icon by the size_multiplier
|
||||
/mob/living/update_transform()
|
||||
ASSERT(!iscarbon(src)) //the source isnt carbon should always be true
|
||||
var/matrix/M = matrix() //matrix (M) variable
|
||||
M.Scale(size_multiplier)
|
||||
M.Translate(0, 16*(size_multiplier-1)) //translate by 16 * size_multiplier - 1 on Y axis
|
||||
src.transform = M //the source of transform is M
|
||||
src.update_mobsize() //Doesn't work yet
|
||||
|
||||
/mob/proc/get_effective_size()
|
||||
return 100000
|
||||
|
||||
mob/living/get_effective_size()
|
||||
return src.size_multiplier
|
||||
|
||||
/mob/living/proc/resize(var/new_size, var/animate = TRUE)
|
||||
if(size_multiplier == new_size)
|
||||
return 1
|
||||
|
||||
size_multiplier = new_size //Change size_multiplier so that other items can interact with them
|
||||
src.update_transform() //WORK DAMN YOU
|
||||
|
||||
//handle the big steppy, except nice
|
||||
/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
//Both small.
|
||||
if(H.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY)
|
||||
now_pushing = 0
|
||||
H.forceMove(tmob.loc)
|
||||
return 1
|
||||
|
||||
//Doing messages
|
||||
if(abs(get_effective_size()/tmob.get_effective_size()) >= 2) //if the initiator is twice the size of the micro
|
||||
now_pushing = 0
|
||||
H.forceMove(tmob.loc)
|
||||
|
||||
//Smaller person being stepped on
|
||||
if(get_effective_size() > tmob.get_effective_size() && iscarbon(src))
|
||||
if(istype(H) && H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle")
|
||||
to_chat(H,"<span class='notice'>You carefully slither around [tmob].</span>")
|
||||
to_chat(tmob,"<span class='notice'>[H]'s huge tail slithers beside you!</span>")
|
||||
else
|
||||
to_chat(H,"<span class='notice'>You carefully step over [tmob].</span>")
|
||||
to_chat(tmob,"<span class='notice'>[H] steps over you carefully!</span>")
|
||||
return 1
|
||||
|
||||
//Smaller person stepping under a larger person
|
||||
if(tmob.get_effective_size() > get_effective_size())
|
||||
H.forceMove(tmob.loc)
|
||||
now_pushing = 0
|
||||
micro_step_under(tmob)
|
||||
return 1
|
||||
|
||||
//Stepping on disarm intent -- TO DO, OPTIMIZE ALL OF THIS SHIT
|
||||
/mob/living/proc/handle_micro_bump_other(var/mob/living/tmob)
|
||||
ASSERT(isliving(tmob))
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
//Both small
|
||||
if(H.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY)
|
||||
now_pushing = 0
|
||||
H.forceMove(tmob.loc)
|
||||
return 1
|
||||
|
||||
if(abs(get_effective_size()/tmob.get_effective_size()) >= 2)
|
||||
if(H.a_intent == "disarm" && H.canmove && !H.buckled)
|
||||
now_pushing = 0
|
||||
H.forceMove(tmob.loc)
|
||||
sizediffStamLoss(tmob)
|
||||
if(get_effective_size() > tmob.get_effective_size() && iscarbon(H))
|
||||
if(istype(H) && H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle")
|
||||
to_chat(H,"<span class='danger'>You carefully roll over [tmob] with your tail!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H]'s huge tail rolls over you!</span>")
|
||||
else
|
||||
to_chat(H,"<span class='danger'>You painfully but harmlessly step on [tmob]!<span>")
|
||||
to_chat(tmob,"<span class='danger'>[H] steps onto you with force!</span>")
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "harm" && H.canmove && !H.buckled)
|
||||
now_pushing = 0
|
||||
H.forceMove(tmob.loc)
|
||||
sizediffStamLoss(tmob)
|
||||
sizediffBruteloss(tmob)
|
||||
if(get_effective_size() > tmob.get_effective_size() && iscarbon(H))
|
||||
if(istype(H) && H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle")
|
||||
to_chat(H,"<span class='danger'>You grind [tmob] into the floor with your tail!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H]'s massive tail plows you into the floor!</span>")
|
||||
else
|
||||
to_chat(H,"<span class='danger'>You pound [tmob] into the floor underfoot!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H] slams you into the ground, crushing you!</span>")
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "grab" && H.canmove && !H.buckled)
|
||||
now_pushing = 0
|
||||
H.forceMove(tmob.loc)
|
||||
sizediffStamLoss(tmob)
|
||||
sizediffStun(tmob)
|
||||
if(get_effective_size() > tmob.get_effective_size() && iscarbon(H))
|
||||
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET)))
|
||||
if(feetCover)
|
||||
if(istype(H) && H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle")
|
||||
to_chat(H,"<span class='danger'>You pin [tmob] underneath your tail!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H]'s plows you into the ground, pinning you helplessly!</span>")
|
||||
else
|
||||
to_chat(H,"<span class='danger'>You pin [tmob] helplessly to the floor with your foot!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H] weightfully pins you to the ground!</span>")
|
||||
return 1
|
||||
else
|
||||
if(istype(H) && H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle")
|
||||
to_chat(H,"<span class='danger'>You curl [tmob] up in the coils of your tail!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H]'s tail winds around you and snatches you in its coils!</span>")
|
||||
tmob.mob_pickup_micro_feet(H)
|
||||
else
|
||||
to_chat(H,"<span class='danger'>You stomp your foot into [tmob], curling your toes and picking them up!</span>")
|
||||
to_chat(tmob,"<span class='danger'>[H]'s toes pin you down and curl around you, picking you up!</span>'")
|
||||
tmob.mob_pickup_micro_feet(H)
|
||||
return 1
|
||||
|
||||
if(tmob.get_effective_size() > get_effective_size())
|
||||
H.forceMove(tmob.loc)
|
||||
now_pushing = 0
|
||||
micro_step_under(tmob)
|
||||
return 1
|
||||
|
||||
//smaller person stepping under another person... TO DO, fix and allow special interactions with naga legs to be seen
|
||||
/mob/living/proc/micro_step_under(var/mob/living/tmob)
|
||||
if(istype(tmob) && istype(tmob, /datum/sprite_accessory/taur/naga))
|
||||
to_chat(src,"<span class='notice'>You jump over [tmob]'s thick tail.</span>")
|
||||
to_chat(tmob,"<span class='notice'>[src] bounds over your tail.</span>")
|
||||
else
|
||||
to_chat(src,"<span class='notice'>You run between [tmob]'s legs.</span>")
|
||||
to_chat(tmob,"<span class='notice'>[src] runs between your legs.</span>")
|
||||
|
||||
//Proc for scaling stamina damage on size difference
|
||||
/mob/living/proc/sizediffStamLoss(var/mob/living/tmob)
|
||||
var/S = (get_effective_size()/tmob.get_effective_size()*25) //macro divided by micro, times 25
|
||||
tmob.Knockdown(S) //final result in stamina knockdown
|
||||
|
||||
//Proc for scaling stuns on size difference (for grab intent)
|
||||
/mob/living/proc/sizediffStun(var/mob/living/tmob)
|
||||
var/T = (get_effective_size()/tmob.get_effective_size()*15) //Macro divided by micro, times 15
|
||||
tmob.Stun(T)
|
||||
|
||||
//Proc for scaling brute damage on size difference
|
||||
/mob/living/proc/sizediffBruteloss(var/mob/living/tmob)
|
||||
var/B = (get_effective_size()/tmob.get_effective_size()*2) //macro divided by micro, times 2
|
||||
tmob.adjustBruteLoss(B) //final result in brute loss
|
||||
|
||||
//Proc for changing mob_size to be grabbed for item weight classes
|
||||
/mob/living/proc/update_mobsize()
|
||||
if(size_multiplier <= 0.50)
|
||||
mob_size = MOB_SIZE_TINY
|
||||
if(size_multiplier <= 1)
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
if(size_multiplier >= 2)
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
//Proc for instantly grabbing valid size difference. Code optimizations soon(TM)
|
||||
/*
|
||||
/mob/living/proc/sizeinteractioncheck(var/mob/living/tmob)
|
||||
if(abs(get_effective_size()/tmob.get_effective_size())>=2.0 && get_effective_size()>tmob.get_effective_size())
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
*/
|
||||
//Clothes coming off at different sizes, and health/speed/stam changes as well
|
||||
@@ -0,0 +1,40 @@
|
||||
//Size Chemicals, now with better and less cringy names.
|
||||
|
||||
/datum/reagent/dahl/growthchem
|
||||
name = "Prospacillin"
|
||||
id = "growthchem"
|
||||
description = "A stabilized altercation of size-altering liquids, this one appears to increase cell volume."
|
||||
color = "#E70C0C"
|
||||
taste_description = "a sharp, fiery and intoxicating flavour."
|
||||
overdose_threshold = 10
|
||||
metabolization_rate = 0.25
|
||||
can_synth = FALSE //DO NOT MAKE THIS SNYTHESIZABLE, THESE CHEMS ARE SUPPOSED TO NOT BE USED COMMONLY
|
||||
|
||||
/datum/reagent/dahl/growthchem/on_mob_add(mob/living/carbon/M)
|
||||
log_game("SIZECODE: [M] ckey: [M.key] has ingested growthchem.")
|
||||
|
||||
/datum/reagent/dahl/growthchem/on_mob_life(mob/living/carbon/M)
|
||||
if(M.size_multiplier < RESIZE_MACRO)
|
||||
M.resize(M.size_multiplier+0.01)
|
||||
|
||||
return
|
||||
|
||||
/datum/reagent/dahl/shrinkchem
|
||||
name = "Diminicillin"
|
||||
id = "shrinkchem"
|
||||
description = "A stabilized altercation of size-altering liquids, this one appears to decrease cell volume."
|
||||
color = "#0C26E7"
|
||||
taste_description = "a pungent, acidic and jittery flavour."
|
||||
overdose_threshold = 10
|
||||
metabolization_rate = 0.25
|
||||
can_synth = FALSE //SAME STORY AS ABOVE
|
||||
|
||||
/datum/reagent/dahl/shrinkchem/on_mob_add(mob/living/carbon/M)
|
||||
log_game("SIZECODE: [M] ckey: [M.key] has ingested shrinkchem.")
|
||||
|
||||
/datum/reagent/dahl/shrinkchem/on_mob_life(mob/living/carbon/M)
|
||||
if(M.size_multiplier > RESIZE_MICRO)
|
||||
M.resize(M.size_multiplier-0.01)
|
||||
|
||||
return
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
/obj/item/projectile/sizelaser
|
||||
name = "sizeray laser"
|
||||
icon_state = "omnilaser"
|
||||
hitsound = null
|
||||
damage = 5
|
||||
damage_type = STAMINA
|
||||
flag = "laser"
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
/obj/item/projectile/sizelaser/shrinkray
|
||||
icon_state="bluelaser"
|
||||
|
||||
/obj/item/projectile/sizelaser/growthray
|
||||
icon_state="laser"
|
||||
|
||||
/obj/item/projectile/sizelaser/shrinkray/on_hit(var/atom/target, var/blocked = 0)
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
var/mob/living/M = target
|
||||
switch(M.size_multiplier)
|
||||
if(RESIZE_MACRO to INFINITY)
|
||||
M.resize(RESIZE_HUGE)
|
||||
if(RESIZE_HUGE to RESIZE_MACRO)
|
||||
M.resize(RESIZE_BIG)
|
||||
if(RESIZE_BIG to RESIZE_HUGE)
|
||||
M.resize(RESIZE_NORMAL)
|
||||
if(RESIZE_NORMAL to RESIZE_BIG)
|
||||
M.resize(RESIZE_SMALL)
|
||||
if(RESIZE_SMALL to RESIZE_NORMAL)
|
||||
M.resize(RESIZE_TINY)
|
||||
if(RESIZE_TINY to RESIZE_SMALL)
|
||||
M.resize(RESIZE_MICRO)
|
||||
if((0 - INFINITY) to RESIZE_NORMAL)
|
||||
M.resize(RESIZE_MICRO)
|
||||
M.update_transform()
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/sizelaser/growthray/on_hit(var/atom/target, var/blocked = 0 )
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
var/mob/living/M = target
|
||||
switch(M.size_multiplier)
|
||||
if(RESIZE_HUGE to RESIZE_MACRO)
|
||||
M.resize(RESIZE_MACRO)
|
||||
if(RESIZE_BIG to RESIZE_HUGE)
|
||||
M.resize(RESIZE_HUGE)
|
||||
if(RESIZE_NORMAL to RESIZE_BIG)
|
||||
M.resize(RESIZE_BIG)
|
||||
if(RESIZE_SMALL to RESIZE_NORMAL)
|
||||
M.resize(RESIZE_NORMAL)
|
||||
if(RESIZE_TINY to RESIZE_SMALL)
|
||||
M.resize(RESIZE_SMALL)
|
||||
if(RESIZE_MICRO to RESIZE_TINY)
|
||||
M.resize(RESIZE_TINY)
|
||||
if((0 - INFINITY) to RESIZE_MICRO)
|
||||
M.resize(RESIZE_MICRO)
|
||||
M.update_transform()
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/growthray
|
||||
projectile_type = /obj/item/projectile/sizelaser/growthray
|
||||
select_name = "Growth"
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/shrinkray
|
||||
projectile_type = /obj/item/projectile/sizelaser/shrinkray
|
||||
select_name = "Shrink"
|
||||
|
||||
//Gun
|
||||
/obj/item/gun/energy/laser/sizeray
|
||||
name = "size ray"
|
||||
icon_state = "bluetag"
|
||||
desc = "Debug size manipulator. You probably shouldn't have this!"
|
||||
item_state = null
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray, /obj/item/ammo_casing/energy/laser/growthray)
|
||||
selfcharge = EGUN_SELFCHARGE
|
||||
charge_delay = 5
|
||||
ammo_x_offset = 2
|
||||
clumsy_check = 1
|
||||
|
||||
attackby(obj/item/W, mob/user)
|
||||
if(W==src)
|
||||
if(icon_state=="bluetag")
|
||||
icon_state="redtag"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/growthray)
|
||||
else
|
||||
icon_state="bluetag"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray)
|
||||
return ..()
|
||||
@@ -43,3 +43,12 @@
|
||||
else */
|
||||
user.show_message("<span class='notice'>[src] hugs [Kisser]!</span>", 1,
|
||||
"<span class='notice'>[src] hugs [Kisser]!</span>", 0)
|
||||
|
||||
/obj/item/toy/plush/mammal/grug
|
||||
name = "Grug S. Cavemannington Plushie"
|
||||
desc = " Everybody's favorite space faring caveman in plushie form. You feel an overwhelming urge to break things while holding it."
|
||||
icon = 'hyperstation/icons/obj/plushes.dmi'
|
||||
icon_state = "grug"
|
||||
item_state = "grug"
|
||||
attack_verb = list("thomped", "ook'd", "stoned")
|
||||
squeak_override = list('sound/voice/gorillaplush.ogg' = 1)
|
||||
@@ -15,3 +15,13 @@
|
||||
item_state = "napoleonic"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
cold_protection = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/suit/shackles
|
||||
name = "Plastitanium Shackles"
|
||||
desc = "A set of heavy plastitanium shackles, there are chains still attatched"
|
||||
icon_state = "shackles"
|
||||
item_state = "shackles"
|
||||
icon = 'hyperstation/icons/mobs/rewards.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
//Jay
|
||||
//TODO: Better sprites
|
||||
//Rope
|
||||
/obj/item/restraints/handcuffs/rope/ //Fun
|
||||
name = "soft rope"
|
||||
desc = "A comfortable rope that would be easy to slip out of if you needed. Kinky."
|
||||
breakouttime = 10 //Easy to break out. It's not for gaming.
|
||||
icon = 'hyperstation/icons/obj/rope.dmi'
|
||||
icon_state = "rope"
|
||||
item_state = "rope_hands" //This sprite is in restraints.dmi until I figure out how to refrence somewhere else
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/mob/living/proc/rope_add(source) //Check to see if the rope is on, and then add effects
|
||||
var/mob/living/carbon/M = source
|
||||
if(M.handcuffed)
|
||||
var/rope_message = pick("The rope is tightly tied onto you")
|
||||
to_chat(M, "<span class='userlove'>[rope_message]</span>")
|
||||
M.min_arousal = 33
|
||||
M.arousal_rate += 2
|
||||
update_stat()
|
||||
|
||||
/mob/living/proc/rope_remove(list/sources, temp_min_arousal, temp_max_arousal, temp_arousal_rate) //Check to see it the rope is gone, and reset effects
|
||||
var/mob/living/carbon/M = sources
|
||||
if (!M.handcuffed)
|
||||
var/rope_message = pick("The rope has been removed")
|
||||
to_chat(M, "<span class='notice'>[rope_message]</span>")
|
||||
M.min_arousal = temp_min_arousal
|
||||
M.max_arousal = temp_max_arousal
|
||||
M.arousal_rate = temp_arousal_rate
|
||||
update_stat()
|
||||
|
||||
/obj/item/restraints/handcuffs/rope/attack(mob/living/carbon/C, mob/living/user)
|
||||
. = ..()
|
||||
var/temp_min_arousal = C.min_arousal //Temp variables to hold original arousal values
|
||||
var/temp_max_arousal = C.max_arousal
|
||||
var/temp_arousal_rate = C.arousal_rate
|
||||
var/datum/callback/Cback = new(user, /mob/living/proc/rope_add, C)//Put the rope on
|
||||
addtimer(Cback, 6, TIMER_UNIQUE)//We are going to call this proc six seconds after the click. The rope tying takes 5 seconds
|
||||
var/datum/callback/Cback2 = new(user, /mob/living/proc/rope_remove, C, temp_min_arousal, temp_max_arousal, temp_arousal_rate)
|
||||
while(1) //Loop until break - Because I can't figure out any better way to do it.
|
||||
var/rope_emote = pick("moan", "blush")
|
||||
sleep(50) //5 second wait
|
||||
addtimer(Cback2, 1, TIMER_UNIQUE) //Just keep calling this timer proc
|
||||
if (prob(10))
|
||||
C.emote(rope_emote)
|
||||
if (!C.handcuffed)
|
||||
return //Break when the rope is removed
|
||||
|
||||
|
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 423 B |
|
After Width: | Height: | Size: 464 B |
|
Before Width: | Height: | Size: 319 B After Width: | Height: | Size: 390 B |
|
After Width: | Height: | Size: 475 B |
|
After Width: | Height: | Size: 182 B |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 375 B |
|
After Width: | Height: | Size: 675 B |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 207 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 807 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 390 KiB After Width: | Height: | Size: 392 KiB |
|
Before Width: | Height: | Size: 401 KiB After Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 322 KiB After Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 313 KiB After Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -43,6 +43,7 @@
|
||||
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
|
||||
vend_reply = "Have fun, you shameless pervert!"
|
||||
products = list(
|
||||
/obj/item/clothing/head/maidband = 5,
|
||||
/obj/item/clothing/under/maid = 5,
|
||||
/obj/item/clothing/under/stripper_pink = 5,
|
||||
/obj/item/clothing/under/stripper_green = 5,
|
||||
|
||||
@@ -349,10 +349,17 @@
|
||||
|
||||
if(impreg)
|
||||
//Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment.
|
||||
if (rand(0,100) < L.impregchance && L.breedable == 1)
|
||||
var/obj/item/organ/genital/womb/W = L.getorganslot("womb")
|
||||
if (L.breedable == 1 && W.pregnant == 0) //Dont get pregnant again, if you are pregnant.
|
||||
log_game("Debug: [L] has been impregnated by [src]")
|
||||
var/obj/item/organ/genital/womb/W = L.getorganslot("womb")
|
||||
W.pregnant = 1
|
||||
to_chat(L, "<span class='userlove'>You feel your hormones change, and a motherly instinct take over.</span>") //leting them know magic has happened.
|
||||
W.pregnant = 1 //self insert fetish
|
||||
|
||||
var/obj/item/organ/genital/breasts/B = L.getorganslot("womb")
|
||||
|
||||
if (B.fluid_mult < 0.5 && B) //pregnancy causes mammals to produce milk faster. no point setting their fluid, lower if they are already higher.
|
||||
B.fluid_mult = 0.5
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
|
||||
|
||||
@@ -125,7 +125,9 @@
|
||||
if(!owner.has_status_effect(/datum/status_effect/chem/breast_enlarger))
|
||||
owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger)
|
||||
statuscheck = TRUE
|
||||
if(16 to INFINITY) //if Rediculous
|
||||
if(16 to 20) //if Rediculous
|
||||
size = cached_size
|
||||
if(20 to INFINITY) //if Hyper-Rediculous
|
||||
size = cached_size
|
||||
|
||||
if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this.
|
||||
@@ -146,3 +148,5 @@
|
||||
prev_size = size
|
||||
else if (cached_size >= 16)
|
||||
size = "huge"
|
||||
else if (cached_size >= 20)
|
||||
size = "massive"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
size = 2 //arbitrary value derived from length and girth for sprites.
|
||||
var/length = 6 //inches
|
||||
var/cached_length //used to detect a change in length
|
||||
var/girth = 4.38
|
||||
var/girth = 3.38
|
||||
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
|
||||
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
|
||||
var/list/dickflags = list()
|
||||
@@ -47,12 +47,12 @@
|
||||
size = 3
|
||||
if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
|
||||
o.remove_status_effect(/datum/status_effect/chem/penis_enlarger)
|
||||
if(21 to 35) //If massive and due for large effects
|
||||
if(21 to 28) //If massive and due for large effects
|
||||
length = cached_length
|
||||
size = 3
|
||||
if(!owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
|
||||
o.apply_status_effect(/datum/status_effect/chem/penis_enlarger)
|
||||
if(36 to INFINITY) //If comical
|
||||
if(28 to INFINITY) //If comical
|
||||
length = cached_length
|
||||
size = 4 //no new sprites for anything larger yet
|
||||
if(!owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
|
||||
|
||||
@@ -9,8 +9,14 @@
|
||||
|
||||
/datum/gear/testreward
|
||||
//Just so admins can test the recent rewards added.
|
||||
name = "test reward"
|
||||
name = "Plastitanium Shackles"
|
||||
category = SLOT_IN_BACKPACK
|
||||
path = /obj/item/clothing/suit/shackles
|
||||
ckeywhitelist = list("quotefox")
|
||||
|
||||
/datum/gear/testrewardtwo
|
||||
name = "Napoleonic Uniform"
|
||||
category = SLOT_W_UNIFORM
|
||||
path = /obj/item/clothing/suit/napoleonic
|
||||
ckeywhitelist = list("quotefox")
|
||||
|
||||
@@ -45,3 +51,16 @@
|
||||
path = /obj/item/clothing/suit/napoleonic
|
||||
ckeywhitelist = list("hackertdog")
|
||||
|
||||
/datum/gear/grug
|
||||
name = "Caveman Plushie"
|
||||
category = SLOT_IN_BACKPACK
|
||||
path = /obj/item/toy/plush/mammal/grug
|
||||
ckeywhitelist = list("herrdoktah")
|
||||
|
||||
|
||||
/datum/gear/hshack
|
||||
name = "Plastitanium Shackles"
|
||||
category = SLOT_W_UNIFORM
|
||||
path = /obj/item/clothing/suit/shackles
|
||||
ckeywhitelist = list("heliocintrini")
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/machinery/light
|
||||
bulb_colour = "#FFEEDD"
|
||||
bulb_power = 0.75
|
||||
bulb_power = 0.95
|
||||
|
||||
/obj/machinery/light/small
|
||||
bulb_colour = "#FFDDBB"
|
||||
bulb_power = 0.75
|
||||
bulb_power = 0.8
|
||||
|
||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 406 KiB After Width: | Height: | Size: 407 KiB |