Merge branch 'master' into call-it-whatever-the-fuck-i-want

This commit is contained in:
Dahlular
2020-06-09 20:54:12 -06:00
committed by GitHub
120 changed files with 6433 additions and 178836 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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"
+5 -2
View File
@@ -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"
+1
View File
@@ -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
+30
View File
@@ -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)
+8 -1
View File
@@ -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"
+3
View File
@@ -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>")
+4
View File
@@ -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)
+21
View File
@@ -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
+1 -1
View File
@@ -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
+89 -32
View File
@@ -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
+148
View File
@@ -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()
. = ..()
+1 -1
View File
@@ -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
+7 -1
View File
@@ -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
+6 -4
View File
@@ -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
+5 -4
View File
@@ -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"
+7
View File
@@ -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"
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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
+13 -14
View File
@@ -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
+28 -13
View File
@@ -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
+49 -1
View File
@@ -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]
+95 -50
View File
@@ -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)
+29 -18
View File
@@ -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
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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"
+11 -3
View File
@@ -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
Binary file not shown.

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 ..()
+9
View File
@@ -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)
+10
View File
@@ -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
+49
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 B

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 807 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 KiB

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 KiB

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 KiB

After

Width:  |  Height:  |  Size: 407 KiB

Some files were not shown because too many files have changed in this diff Show More