Merge remote-tracking branch 'upstream/master' into call-it-whatever-the-fuck-i-want

This commit is contained in:
Oposshim
2020-07-09 02:54:49 -04:00
113 changed files with 118244 additions and 132063 deletions
+2
View File
@@ -2,6 +2,8 @@
Based and maintained from Citadel Station.
## Warning you will need Byond Compiler [513.1525] or higher to compile the source code.
[![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
[![Krihelimeter](http://www.krihelinator.xyz/badge/quotefox/Hyper-Station-13)](http://www.krihelinator.xyz)
@@ -0,0 +1,91 @@
"aa" = (/turf/template_noop,/area/template_noop)
"ab" = (/turf/closed/indestructible/riveted/boss,/area/ruin/powered/oasis)
"ac" = (/turf/open/lava,/area/ruin/powered/oasis)
"ad" = (/turf/closed/indestructible/riveted/boss/see_through,/area/ruin/powered/oasis)
"ae" = (/obj/structure/reagent_dispensers/keg/aphro/strong,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/ruin/powered/oasis)
"af" = (/turf/open/floor/grass,/area/ruin/powered/oasis)
"ag" = (/obj/machinery/light{dir = 1},/turf/open/floor/grass,/area/ruin/powered/oasis)
"ah" = (/obj/structure/flora/junglebush,/obj/machinery/light{dir = 1},/turf/open/floor/grass,/area/ruin/powered/oasis)
"ai" = (/obj/structure/flora/tree/jungle/small,/turf/open/floor/grass,/area/ruin/powered/oasis)
"aj" = (/obj/structure/flora/junglebush/large,/turf/open/floor/grass,/area/ruin/powered/oasis)
"ak" = (/turf/open/water,/area/ruin/powered/oasis)
"al" = (/obj/structure/flora/junglebush,/turf/open/floor/grass,/area/ruin/powered/oasis)
"am" = (/obj/machinery/light{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"an" = (/obj/machinery/light{dir = 4},/turf/open/floor/grass,/area/ruin/powered/oasis)
"ao" = (/obj/structure/flora/rock/jungle,/turf/open/floor/grass,/area/ruin/powered/oasis)
"ap" = (/obj/structure/flora/tree/jungle,/turf/open/floor/grass,/area/ruin/powered/oasis)
"aq" = (/obj/structure/flora/junglebush/c,/turf/open/floor/grass,/area/ruin/powered/oasis)
"ar" = (/mob/living/simple_animal/hostile/retaliate/poison/snake,/turf/open/floor/grass,/area/ruin/powered/oasis)
"as" = (/obj/item/reagent_containers/food/snacks/grown/apple,/turf/open/floor/grass,/area/ruin/powered/oasis)
"at" = (/obj/structure/flora/junglebush/large,/obj/machinery/light{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"au" = (/obj/structure/flora/grass/jungle,/turf/open/floor/grass,/area/ruin/powered/oasis)
"av" = (/obj/machinery/light,/turf/open/floor/grass,/area/ruin/powered/oasis)
"aw" = (/obj/structure/stone_tile{dir = 1},/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile,/turf/open/floor/grass,/area/ruin/powered/oasis)
"ax" = (/obj/structure/stone_tile{dir = 1},/turf/open/floor/grass,/area/ruin/powered/oasis)
"ay" = (/obj/structure/flora/grass/jungle/b,/turf/open/floor/grass,/area/ruin/powered/oasis)
"az" = (/obj/structure/flora/rock,/turf/open/floor/grass,/area/ruin/powered/oasis)
"aA" = (/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile{dir = 1},/obj/structure/stone_tile{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aB" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile{dir = 1},/obj/structure/stone_tile{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aC" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile{dir = 1},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aD" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aE" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile{dir = 1},/obj/machinery/light{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aF" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aG" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/obj/structure/stone_tile{dir = 8},/obj/machinery/light{dir = 4},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aH" = (/obj/effect/mapping_helpers/no_lava,/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors)
"aI" = (/obj/effect/mapping_helpers/no_lava,/turf/open/floor/plating/asteroid/basalt/lava,/area/lavaland/surface/outdoors)
"aJ" = (/obj/machinery/light,/turf/open/floor/pod/dark,/area/ruin/powered/beach)
"aK" = (/obj/machinery/light,/turf/open/floor/pod/dark,/area/ruin/powered/oasis)
"aL" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 4},/obj/machinery/light{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aM" = (/turf/closed/wall/r_wall,/area/ruin/powered/oasis)
"aN" = (/obj/structure/stone_tile,/obj/structure/stone_tile{dir = 1},/obj/structure/stone_tile{dir = 8},/turf/open/floor/grass,/area/ruin/powered/oasis)
"aO" = (/obj/machinery/light{dir = 4},/turf/open/floor/pod/dark,/area/ruin/powered/oasis)
"aP" = (/obj/structure/table,/obj/item/flashlight/lantern,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aQ" = (/obj/structure/dresser,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aR" = (/obj/machinery/door/airlock/hatch,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aS" = (/obj/structure/closet/secure_closet/freezer/kitchen/mining,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aT" = (/obj/structure/table,/obj/structure/showcase/machinery/microwave,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aU" = (/obj/machinery/light{dir = 8},/turf/open/floor/pod/dark,/area/ruin/powered/oasis)
"aV" = (/obj/machinery/light{dir = 8},/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aW" = (/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aX" = (/obj/machinery/light{dir = 4},/obj/structure/sink{dir = 4; pixel_x = 11},/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aY" = (/obj/structure/bed,/obj/item/bedsheet,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"aZ" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"ba" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"bb" = (/obj/machinery/light,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"bc" = (/obj/structure/table,/obj/item/storage/box/drinkingglasses,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"bd" = (/obj/structure/table,/obj/item/storage/toolbox/mechanical,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"be" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/hatch,/turf/open/floor/pod/light,/area/ruin/powered/oasis)
"bf" = (/obj/machinery/light{dir = 1},/turf/open/floor/pod/dark,/area/ruin/powered/oasis)
(1,1,1) = {"
aaaaababababababababababababababababaaaa
aaababacacacacacacacacacacacacacacababaa
aaabacacadadadadadadadadadadadadacacabaa
aaabacadadaeafagafafafafahafafadadacabaa
aaabacadafaiafafajakakafafafalafadacabaa
aaabacadamafafakakakakakakafafanadacabaa
aaabacadafaoakakakakakakakafafafadacabaa
aaabacadalafakakakapakakakakaqafadacabaa
aaabacadafafaqakarasafakakafafafadacabaa
aaabacadatafafafafafakakafafafanadacabaa
aaabacadafafauafafafakafafafaiafadacabaa
aaabacadadafavafafawaxayazavafadadacabaa
aaabacacadadadadadaAaBadadadadadacacabaa
aaababacacacacacadaCaDadacacacacacababaa
aaaaabababababababaEaBabababababababaaaa
aaaaaaaaaaaaaaaaabaBaCabaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaabaFaBabaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaabaBaGabaHaHaaaaaaaaaaaa
aaaaaaaaaaaaaHaHabaFaBabaHaHaHaaaaaaaaaa
aaaaaaaaaaaHaHaHabaBaAabaHaHaHaHaaaaaaaa
aaaaaaaHaHaIaIaHabaBaBabaHaHaHaHaHaaaaaa
aaaHaHaHaIaKaIaHabaLaBabaHaHaJaIaIaHaaaa
aaaHaHaIaMaMaMaMabaBaNabaMaMaMaMaIaHaHaH
aaaHaHaOaMaPaQaMaMaRaRaMaMaSaTaMaUaIaHaH
aaaHaHaHaMaVaWaWaWaWaWaWaWaWaXaMaIaHaHaa
aHaHaHaOaMaYaZbabbaWaWbbaWbcbdaMaUaHaHaa
aaaaaHaHaMaMaMaMaMbebeaMaMaMaMaMaIaHaHaa
aaaaaHaHaHaIaIbfaIaIaIaIbfaIaIaHaHaHaHaa
aaaHaHaHaHaIaIaIaIaIaIaIaIaIaIaIaHaaaaaa
aaaHaaaaaaaHaaaaaIaIaaaaaaaaaaaaaaaaaaaa
"}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+22 -17
View File
@@ -19,7 +19,7 @@
//organ defines
#define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20
#define COCK_SIZE_MAX 36
#define COCK_GIRTH_RATIO_MAX 0.42
#define COCK_GIRTH_RATIO_DEF 0.25
@@ -32,19 +32,19 @@
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
#define BALLS_SIZE_MIN 1 //Hyper - Unchanged
#define BALLS_SIZE_DEF 8 //Changed from 2
#define BALLS_SIZE_MAX 40 //Changed from 3
#define BALLS_SACK_SIZE_MIN 1
#define BALLS_SACK_SIZE_DEF 8
#define BALLS_SACK_SIZE_MAX 40
#define CUM_RATE 0.035
#define CUM_RATE 5
#define CUM_RATE_MULT 1
#define CUM_EFFICIENCY 1//amount of nutrition required per life()
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
#define EGG_GIRTH_MIN 1//inches
#define EGG_GIRTH_MIN 1 //inches
#define EGG_GIRTH_DEF 6
#define EGG_GIRTH_MAX 16
@@ -52,25 +52,30 @@
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
#define BREASTS_SIZE_FLAT 0
#define BREASTS_SIZE_A 1
#define BREASTS_SIZE_AA 1.5
#define BREASTS_SIZE_B 2
#define BREASTS_SIZE_BB 2.5
#define BREASTS_SIZE_C 3
#define BREASTS_SIZE_CC 3.5
#define BREASTS_SIZE_D 4
#define BREASTS_SIZE_DD 4.5
#define BREASTS_SIZE_E 5
#define BREASTS_SIZE_EE 5.5
#define BREASTS_SIZE_F 6
#define BREASTS_SIZE_FF 6.5
#define BREASTS_SIZE_G 7
#define BREASTS_SIZE_GG 7.5//Are these even real sizes? The world may never know because cup sizes make no fucking sense.
#define BREASTS_SIZE_H 8
#define BREASTS_SIZE_HH 8.5//Largest size, ever. For now.
#define BREASTS_SIZE_I 9
#define BREASTS_SIZE_J 10
#define BREASTS_SIZE_K 11
#define BREASTS_SIZE_L 12
#define BREASTS_SIZE_M 13
#define BREASTS_SIZE_N 14
#define BREASTS_SIZE_O 15
#define BREASTS_SIZE_HUGE 16
#define BREASTS_SIZE_MASSIVE 17
#define BREASTS_SIZE_GIGA 25
//Bodysize Limits
#define MIN_BODYSIZE 80
#define MAX_BODYSIZE 120
#define BREASTS_SIZE_MIN BREASTS_SIZE_A
#define BREASTS_SIZE_DEF BREASTS_SIZE_C
#define BREASTS_SIZE_MAX BREASTS_SIZE_HH
#define BREASTS_SIZE_DEF BREASTS_SIZE_D
#define BREASTS_SIZE_MAX BREASTS_SIZE_GIGA
#define MILK_RATE 5
#define MILK_RATE_MULT 1
+724
View File
@@ -0,0 +1,724 @@
// All signals. Format:
// When the signal is called: (signal arguments)
// All signals send the source datum of the signal as the first argument
// global signals
// These are signals which can be listened to by any component on any parent
// start global signals with "!", this used to be necessary but now it's just a formatting choice
///from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
#define COMSIG_GLOB_NEW_Z "!new_z"
/// called after a successful var edit somewhere in the world: (list/args)
#define COMSIG_GLOB_VAR_EDIT "!var_edit"
/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
#define COMSIG_GLOB_EXPLOSION "!explosion"
/// mob was created somewhere : (mob)
#define COMSIG_GLOB_MOB_CREATED "!mob_created"
/// mob died somewhere : (mob , gibbed)
#define COMSIG_GLOB_MOB_DEATH "!mob_death"
/// global living say plug - use sparingly: (mob/speaker , message)
#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special"
/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic)
#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic"
#define COMPONENT_GLOB_BLOCK_CINEMATIC (1<<0)
/// ingame button pressed (/obj/machinery/button/button)
#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed"
/// signals from globally accessible objects
///from SSsun when the sun changes position : (azimuth)
#define COMSIG_SUN_MOVED "sun_moved"
//////////////////////////////////////////////////////////////////
// /datum signals
/// when a component is added to a datum: (/datum/component)
#define COMSIG_COMPONENT_ADDED "component_added"
/// before a component is removed from a datum because of RemoveComponent: (/datum/component)
#define COMSIG_COMPONENT_REMOVING "component_removing"
/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted"
/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called
#define COMSIG_PARENT_QDELETING "parent_qdeleting"
/// generic topic handler (usr, href_list)
#define COMSIG_TOPIC "handle_topic"
/// fires on the target datum when an element is attached to it (/datum/element)
#define COMSIG_ELEMENT_ATTACH "element_attach"
/// fires on the target datum when an element is attached to it (/datum/element)
#define COMSIG_ELEMENT_DETACH "element_detach"
// /atom signals
///from base of atom/proc/Initialize(): sent any time a new atom is created
#define COMSIG_ATOM_CREATED "atom_created"
//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
///Return this in response if you don't want afterattack to be called
#define COMPONENT_NO_AFTERATTACK (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
///from base of atom/animal_attack(): (/mob/user)
#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal"
///from base of atom/examine(): (/mob)
#define COMSIG_PARENT_EXAMINE "atom_examine"
///from base of atom/get_examine_name(): (/mob, list/overrides)
#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name"
//Positions for overrides list
#define EXAMINE_POSITION_ARTICLE (1<<0)
#define EXAMINE_POSITION_BEFORE (1<<1)
//End positions
#define COMPONENT_EXNAME_CHANGED (1<<0)
///from base of atom/update_icon(): ()
#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon"
#define COMSIG_ATOM_NO_UPDATE_ICON_STATE (1<<0)
#define COMSIG_ATOM_NO_UPDATE_OVERLAYS (1<<1)
///from base of atom/update_overlays(): (list/new_overlays)
#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays"
///from base of atom/update_icon(): (signalOut, did_anything)
#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
///from base of atom/Entered(): (atom/movable/entering, /atom)
#define COMSIG_ATOM_ENTERED "atom_entered"
///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
#define COMSIG_ATOM_EXIT "atom_exit"
#define COMPONENT_ATOM_BLOCK_EXIT (1<<0)
///from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
#define COMSIG_ATOM_EXITED "atom_exited"
///from base of atom/Bumped(): (/atom/movable)
#define COMSIG_ATOM_BUMPED "atom_bumped"
///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
///from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act"
///from base of atom/bullet_act(): (/obj/projectile, def_zone)
#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
///from base of atom/blob_act(): (/obj/structure/blob)
#define COMSIG_ATOM_BLOB_ACT "atom_blob_act"
///from base of atom/acid_act(): (acidpwr, acid_volume)
#define COMSIG_ATOM_ACID_ACT "atom_acid_act"
///from base of atom/emag_act(): (/mob/user)
#define COMSIG_ATOM_EMAG_ACT "atom_emag_act"
///from base of atom/rad_act(intensity)
#define COMSIG_ATOM_RAD_ACT "atom_rad_act"
///from base of atom/narsie_act(): ()
#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act"
///from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode)
#define COMSIG_ATOM_RCD_ACT "atom_rcd_act"
///from base of atom/singularity_pull(): (S, current_size)
#define COMSIG_ATOM_SING_PULL "atom_sing_pull"
///from obj/machinery/bsa/full/proc/fire(): ()
#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass"
#define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0)
///from base of atom/set_light(): (l_range, l_power, l_color)
#define COMSIG_ATOM_SET_LIGHT "atom_set_light"
///from base of atom/setDir(): (old_dir, new_dir)
#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change"
///from base of atom/handle_atom_del(): (atom/deleted)
#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del"
///from base of atom/has_gravity(): (turf/location, list/forced_gravities)
#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity"
///from proc/get_rad_contents(): ()
#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe"
#define COMPONENT_BLOCK_RADIATION (1<<0)
///from base of datum/radiation_wave/radiate(): (strength)
#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam"
#define COMPONENT_BLOCK_CONTAMINATION (1<<0)
///from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width)
#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass"
#define COMPONENT_RAD_WAVE_HANDLED (1<<0)
///from internal loop in atom/movable/proc/CanReach(): (list/next)
#define COMSIG_ATOM_CANREACH "atom_can_reach"
#define COMPONENT_BLOCK_REACH (1<<0)
///from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act"
///from base of atom/wrench_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act"
///from base of atom/multitool_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act"
///from base of atom/welder_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WELDER_ACT "atom_welder_act"
///from base of atom/wirecutter_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act"
///from base of atom/crowbar_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act"
///from base of atom/analyser_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act"
#define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
///called when teleporting into a protected turf: (channel, turf/origin)
#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport"
#define COMPONENT_BLOCK_TELEPORT (1<<0)
///called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers)
#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view"
///called when an atom starts orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
///called when an atom stops orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop"
/////////////////
///from base of atom/attack_ghost(): (mob/dead/observer/ghost)
#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost"
///from base of atom/attack_hand(): (mob/user)
#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand"
///from base of atom/attack_paw(): (mob/user)
#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw"
#define COMPONENT_NO_ATTACK_HAND (1<<0) //works on all 3.
//This signal return value bitflags can be found in __DEFINES/misc.dm
///called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels)
#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact"
///called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force)
#define COMSIG_ATOM_START_PULL "movable_start_pull"
///called on /living when someone starts pulling it (atom/movable/puller, state, force)
#define COMSIG_LIVING_START_PULL "living_start_pull"
/////////////////
///from base of area/Entered(): (/area)
#define COMSIG_ENTER_AREA "enter_area"
///from base of area/Exited(): (/area)
#define COMSIG_EXIT_AREA "exit_area"
///from base of atom/Click(): (location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
#define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye.
///from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
///from base of atom/CtrlShiftClick(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_NO_MOUSEDROP (1<<0)
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
// /area signals
///from base of area/Entered(): (atom/movable/M)
#define COMSIG_AREA_ENTERED "area_entered"
///from base of area/Exited(): (atom/movable/M)
#define COMSIG_AREA_EXITED "area_exited"
// /turf signals
///from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps)
#define COMSIG_TURF_CHANGE "turf_change"
///from base of atom/has_gravity(): (atom/asker, list/forced_gravities)
#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity"
///from base of turf/New(): (turf/source, direction)
#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new"
// /atom/movable signals
///from base of atom/movable/Moved(): (/atom)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (/atom, dir)
#define COMSIG_MOVABLE_MOVED "movable_moved"
///from base of atom/movable/Cross(): (/atom/movable)
#define COMSIG_MOVABLE_CROSS "movable_cross"
///from base of atom/movable/Crossed(): (/atom/movable)
#define COMSIG_MOVABLE_CROSSED "movable_crossed"
///from base of atom/movable/Uncross(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSS "movable_uncross"
#define COMPONENT_MOVABLE_BLOCK_UNCROSS (1<<0)
///from base of atom/movable/Uncrossed(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed"
///from base of atom/movable/Bump(): (/atom)
#define COMSIG_MOVABLE_BUMP "movable_bump"
///from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum)
#define COMSIG_MOVABLE_IMPACT "movable_impact"
#define COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH (1<<0) //if true, flip if the impact will push what it hits
#define COMPONENT_MOVABLE_IMPACT_NEVERMIND (1<<1) //return true if you destroyed whatever it was you're impacting and there won't be anything for hitby() to run on
///from base of mob/living/hitby(): (mob/living/target, hit_zone)
#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone"
///from base of atom/movable/buckle_mob(): (mob, force)
#define COMSIG_MOVABLE_BUCKLE "buckle"
///from base of atom/movable/unbuckle_mob(): (mob, force)
#define COMSIG_MOVABLE_UNBUCKLE "unbuckle"
///from base of atom/movable/throw_at(): (list/args)
#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw"
#define COMPONENT_CANCEL_THROW (1<<0)
///from base of atom/movable/throw_at(): (datum/thrownthing, spin)
#define COMSIG_MOVABLE_POST_THROW "movable_post_throw"
///from base of atom/movable/onTransitZ(): (old_z, new_z)
#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit"
///called when the movable is placed in an unaccessible area, used for stationloving: ()
#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded"
///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode))
#define COMSIG_MOVABLE_HEAR "movable_hear"
#define HEARING_MESSAGE 1
#define HEARING_SPEAKER 2
// #define HEARING_LANGUAGE 3
#define HEARING_RAW_MESSAGE 4
/* #define HEARING_RADIO_FREQ 5
#define HEARING_SPANS 6
#define HEARING_MESSAGE_MODE 7 */
///called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
#define COMSIG_MOVABLE_DISPOSING "movable_disposing"
// /mob signals
///from base of /mob/Login(): ()
#define COMSIG_MOB_LOGIN "mob_login"
///from base of /mob/Logout(): ()
#define COMSIG_MOB_LOGOUT "mob_logout"
///from base of mob/death(): (gibbed)
#define COMSIG_MOB_DEATH "mob_death"
///from base of mob/set_stat(): (new_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
///from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
#define COMSIG_MOB_ALLOWED "mob_allowed"
///from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic"
#define COMPONENT_BLOCK_MAGIC (1<<0)
///from base of mob/create_mob_hud(): ()
#define COMSIG_MOB_HUD_CREATED "mob_hud_created"
///from base of atom/attack_hand(): (mob/user)
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand"
///from base of /obj/item/attack(): (mob/M, mob/user)
#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack"
#define COMPONENT_ITEM_NO_ATTACK (1<<0)
///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone)
#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage"
///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters)
#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
///from base of mob/RangedAttack(): (atom/A, params)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
///from base of /mob/throw_item(): (atom/target)
#define COMSIG_MOB_THROW "mob_throw"
///from base of /mob/verb/examinate(): (atom/target)
#define COMSIG_MOB_EXAMINATE "mob_examinate"
///from base of /mob/update_sight(): ()
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight"
////from /mob/living/say(): ()
#define COMSIG_MOB_SAY "mob_say"
#define COMPONENT_UPPERCASE_SPEECH (1<<0)
// used to access COMSIG_MOB_SAY argslist
#define SPEECH_MESSAGE 1
// #define SPEECH_BUBBLE_TYPE 2
#define SPEECH_SPANS 3
/* #define SPEECH_SANITIZE 4
#define SPEECH_LANGUAGE 5
#define SPEECH_IGNORE_SPAM 6
#define SPEECH_FORCED 7 */
///from /mob/say_dead(): (mob/speaker, message)
#define COMSIG_MOB_DEADSAY "mob_deadsay"
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
///from /mob/living/emote(): ()
#define COMSIG_MOB_EMOTE "mob_emote"
///from base of mob/swap_hand(): (obj/item)
#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
#define COMPONENT_BLOCK_SWAP (1<<0)
// /mob/living signals
///from base of mob/living/resist() (/mob/living)
#define COMSIG_LIVING_RESIST "living_resist"
///from base of mob/living/IgniteMob() (/mob/living)
#define COMSIG_LIVING_IGNITED "living_ignite"
///from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished"
///from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act"
///sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check)
#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented"
///sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock"
///from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_LIVING_REVIVE "living_revive"
///from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs"
///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
#define COMSIG_LIVING_ATTACH_LIMB "living_attach_limb"
#define COMPONENT_NO_ATTACH (1<<0)
///sent from borg recharge stations: (amount, repairs)
#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
///sent when a mob/login() finishes: (client)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login"
///sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation)
#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon"
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
///from base of mob/living/Stun() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_STUN "living_stun"
///from base of mob/living/Knockdown() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown"
///from base of mob/living/Paralyze() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze"
///from base of mob/living/Immobilize() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize"
///from base of mob/living/Unconscious() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious"
///from base of mob/living/Sleeping() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping"
#define COMPONENT_NO_STUN (1<<0) //For all of them
///from base of /mob/living/can_track(): (mob/user)
#define COMSIG_LIVING_CAN_TRACK "mob_cantrack"
#define COMPONENT_CANT_TRACK (1<<0)
// /mob/living/carbon signals
///from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang"
///from /item/organ/proc/Insert() (/obj/item/organ/)
#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ"
///from /item/organ/proc/Remove() (/obj/item/organ/)
#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ"
///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
#define COMSIG_CARBON_EQUIP_HAT "carbon_equip_hat"
///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
#define COMSIG_CARBON_UNEQUIP_HAT "carbon_unequip_hat"
///defined twice, in carbon and human's topics, fired when interacting with a valid embedded_object to pull it out (mob/living/carbon/target, /obj/item, /obj/item/bodypart/L)
#define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip"
///called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item)
#define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe"
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK (1<<0)
// /obj signals
///from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct"
///called in /obj/structure/setAnchored(): (value)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored"
///from base of code/game/machinery
#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench"
///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide
#define COMSIG_OBJ_HIDE "obj_hide"
// /obj/machinery signals
///from /obj/machinery/obj_break(damage_flag): (damage_flag)
#define COMSIG_MACHINERY_BROKEN "machinery_broken"
///from base power_change() when power is lost
#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost"
///from base power_change() when power is restored
#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored"
// /obj/item signals
///from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
#define COMSIG_ITEM_ATTACK "item_attack"
///from base of obj/item/attack_self(): (/mob)
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self"
#define COMPONENT_NO_INTERACT (1<<0)
///from base of obj/item/attack_obj(): (/obj, /mob)
#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj"
#define COMPONENT_NO_ATTACK_OBJ (1<<0)
///from base of obj/item/pre_attack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack"
#define COMPONENT_NO_ATTACK (1<<0)
///from base of obj/item/afterattack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_AFTERATTACK "item_afterattack"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted"
///from base of obj/item/equipped(): (/mob/equipper, slot)
#define COMSIG_ITEM_EQUIPPED "item_equip"
///from base of obj/item/dropped(): (mob/user)
#define COMSIG_ITEM_DROPPED "item_drop"
///from base of obj/item/pickup(): (/mob/taker)
#define COMSIG_ITEM_PICKUP "item_pickup"
///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone"
///return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul"
///called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user)
#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval"
#define COMPONENT_BLOCK_MARK_RETRIEVAL (1<<0)
///from base of obj/item/hit_reaction(): (list/args)
#define COMSIG_ITEM_HIT_REACT "item_hit_react"
///called on item when crossed by something (): (/atom/movable, mob/living/crossed)
#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed"
///called on item when microwaved (): (obj/machinery/microwave/M)
#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
///from base of item/sharpener/attackby(): (amount, max)
#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act"
#define COMPONENT_BLOCK_SHARPEN_APPLIED (1<<0)
#define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1)
#define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2)
#define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3)
///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
#define COMSIG_TOOL_IN_USE "tool_in_use"
///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
#define COMSIG_TOOL_START_USE "tool_start_use"
///from [/obj/item/proc/disableEmbedding]:
#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed"
///from [/obj/effect/mine/proc/triggermine]:
#define COMSIG_MINE_TRIGGERED "minegoboom"
// /obj/item signals for economy
///called when an item is sold by the exports subsystem
#define COMSIG_ITEM_SOLD "item_sold"
///called when a wrapped up structure is opened by hand
#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped"
#define COMSIG_ITEM_UNWRAPPED "item_unwrapped"
///called when a wrapped up item is opened by hand
#define COMSIG_ITEM_SPLIT_VALUE (1<<0)
///called when getting the item's exact ratio for cargo's profit.
#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits"
///called when getting the item's exact ratio for cargo's profit, without selling the item.
#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry"
// /obj/item/clothing signals
///from base of obj/item/clothing/shoes/proc/step_action(): ()
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action"
///from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit)
#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle"
// /obj/item/implant signals
///from base of /obj/item/implant/proc/activate(): ()
#define COMSIG_IMPLANT_ACTIVATED "implant_activated"
///from base of /obj/item/implant/proc/implant(): (list/args)
#define COMSIG_IMPLANT_IMPLANTING "implant_implanting"
#define COMPONENT_STOP_IMPLANTING (1<<0)
///called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
#define COMSIG_IMPLANT_OTHER "implant_other"
//#define COMPONENT_STOP_IMPLANTING (1<<0) //The name makes sense for both
#define COMPONENT_DELETE_NEW_IMPLANT (1<<1)
#define COMPONENT_DELETE_OLD_IMPLANT (1<<2)
///called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists"
//This uses all return values of COMSIG_IMPLANT_OTHER
// /obj/item/pda signals
///called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone"
#define COMPONENT_STOP_RINGTONE_CHANGE (1<<0)
#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate"
#define COMPONENT_PDA_NO_DETONATE (1<<0)
// /obj/item/radio signals
///called from base of /obj/item/radio/proc/set_frequency(): (list/args)
#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency"
// /obj/item/pen signals
///called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
#define COMSIG_PEN_ROTATED "pen_rotated"
// /obj/item/gun signals
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_MOB_FIRED_GUN "mob_fired_gun"
// /obj/item/grenade signals
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_GRENADE_PRIME "grenade_prime"
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_GRENADE_ARMED "grenade_armed"
// /obj/projectile signals (sent to the firer)
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit"
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit"
///from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire"
///from the base of /obj/projectile/proc/fire(): ()
#define COMSIG_PROJECTILE_FIRE "projectile_fire"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out"
///sent when trying to force an embed (mainly for projectiles, only used in the embed element)
#define COMSIG_EMBED_TRY_FORCE "item_try_embed"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init"
// /obj/mecha signals
///sent from mecha action buttons to the mecha they're linked to
#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate"
// /mob/living/carbon/human signals
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
///Whenever EquipRanked is called, called after job is set
#define COMSIG_JOB_RECEIVED "job_received"
// /datum/species signals
///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
#define COMSIG_SPECIES_GAIN "species_gain"
///from datum/species/on_species_loss(): (datum/species/lost_species)
#define COMSIG_SPECIES_LOSS "species_loss"
// /datum/song signals
///sent to the instrument when a song starts playing
#define COMSIG_SONG_START "song_start"
///sent to the instrument when a song stops playing
#define COMSIG_SONG_END "song_end"
/*******Component Specific Signals*******/
//Janitor
///(): Returns bitflags of wet values.
#define COMSIG_TURF_IS_WET "check_turf_wet"
///(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
#define COMSIG_TURF_MAKE_DRY "make_turf_try"
///called on an object to clean it of cleanables. Usualy with soap: (num/strength)
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act"
//Creamed
///called when you wash your face at a sink: (num/strength)
#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act"
//Food
///from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
#define COMSIG_FOOD_EATEN "food_eaten"
//Gibs
///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
#define COMSIG_GIBS_STREAK "gibs_streak"
//Mood
///called when you send a mood event from anywhere in the code.
#define COMSIG_ADD_MOOD_EVENT "add_mood"
///Mood event that only RnD members listen for
#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood"
///called when you clear a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood"
//NTnet
///called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive"
//Nanites
///() returns TRUE if nanites are found
#define COMSIG_HAS_NANITES "has_nanites"
///() returns TRUE if nanites have stealth
#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy"
///() deletes the nanite component
#define COMSIG_NANITE_DELETE "nanite_delete"
///(list/nanite_programs) - makes the input list a copy the nanites' program list
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs"
///(amount) Returns nanite amount
#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume"
///(amount) Sets current nanite volume to the given amount
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume"
///(amount) Adjusts nanite volume by the given amount
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust"
///(amount) Sets maximum nanite volume to the given amount
#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume"
///(amount(0-100)) Sets cloud ID to the given amount
#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud"
///(method) Modify cloud sync status. Method can be toggle, enable or disable
#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync"
///(amount) Sets safety threshold to the given amount
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety"
///(amount) Sets regeneration rate to the given amount
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen"
///(code(1-9999)) Called when sending a nanite signal to a mob.
#define COMSIG_NANITE_SIGNAL "nanite_signal"
///(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob.
#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal"
///(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
#define COMSIG_NANITE_SCAN "nanite_scan"
///(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
#define COMSIG_NANITE_UI_DATA "nanite_ui_data"
///(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program"
///Installation successful
#define COMPONENT_PROGRAM_INSTALLED (1<<0)
///Installation failed, but there are still nanites
#define COMPONENT_PROGRAM_NOT_INSTALLED (1<<1)
///(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
#define COMSIG_NANITE_SYNC "nanite_sync"
// /datum/component/storage signals
///() - returns bool.
#define COMSIG_CONTAINS_STORAGE "is_storage"
///(obj/item/inserting, mob/user, silent, force) - returns bool
#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert"
///(mob/show_to, force) - returns bool.
#define COMSIG_TRY_STORAGE_SHOW "storage_show_to"
///(mob/hide_from) - returns bool
#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from"
///returns bool
#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all"
///(newstate)
#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state"
///() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate"
///(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type"
///(type, amount = INFINITY, force = FALSE). Force will ignore max_items, and amount is normally clamped to max_items.
#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type"
///(obj, new_loc, force = FALSE) - returns bool
#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj"
///(loc) - returns bool - if loc is null it will dump at parent location.
#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty"
///(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory"
///(obj/item/insertion_candidate, mob/user, silent) - returns bool
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip"
// /datum/component/two_handed signals
///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
#define COMSIG_TWOHANDED_WIELD "twohanded_wield"
#define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0)
///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield"
// /datum/action signals
///from base of datum/action/proc/Trigger(): (datum/action)
#define COMSIG_ACTION_TRIGGER "action_trigger"
#define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0)
//Xenobio hotkeys
///from slime CtrlClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl"
///from slime AltClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt"
///from slime ShiftClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift"
///from turf ShiftClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift"
///from turf AltClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt"
///from monkey CtrlClickOn(): (/mob)
#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl"
+1
View File
@@ -75,6 +75,7 @@
#define AREA_LAYER 10
#define MASSIVE_OBJ_LAYER 11
#define POINT_LAYER 12
#define CHAT_LAYER 12.1
#define LIGHTING_PLANE 15
#define LIGHTING_LAYER 15
+6 -6
View File
@@ -57,16 +57,16 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define BODYPARTS_LAYER 28 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define MARKING_LAYER 27 //Matrixed body markings because clashing with snouts?
#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_FRONT_LAYER 25 //Draws some genitalia above clothes and the TAUR body if need be.
#define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup)
#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define DAMAGE_LAYER 22 //damage indicators (cuts and burns)
#define UNIFORM_LAYER 21
#define ID_LAYER 20
#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup)
#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define DAMAGE_LAYER 23 //damage indicators (cuts and burns)
#define UNIFORM_LAYER 22
#define ID_LAYER 21
#define HANDS_PART_LAYER 20
#define SHOES_LAYER 19
#define GLOVES_LAYER 18
#define EARS_LAYER 17
#define GENITALS_FRONT_LAYER 17 //Draws some genitalia above clothes and the TAUR body if need be.
#define BODY_TAUR_LAYER 16
#define SUIT_LAYER 15
#define GLASSES_LAYER 13
+3
View File
@@ -129,6 +129,7 @@
// item traits
#define TRAIT_NODROP "nodrop"
//roundstart traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
@@ -160,6 +161,8 @@
#define TRAIT_CULT_EYES "cult_eyes"
#define TRAIT_XRAY_VISION "xray_vision"
#define TRAIT_THERMAL_VISION "thermal_vision"
#define TRAIT_CUM_PLUS "cum_plus"
#define TRAIT_NEVER_CLONE "noclone"
// common trait sources
+2
View File
@@ -21,6 +21,8 @@
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
#define reverseList(L) reverseRange(L.Copy())
#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V);
#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; }
// binary search sorted insert
// IN: Object to be inserted
+1 -1
View File
@@ -54,7 +54,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.genital_fluids_list = list ("milk", "water", "semen", "blood", "femcum")
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")
for(var/K in GLOB.breasts_shapes_list)
@@ -138,6 +138,8 @@
friend_talk(message)
/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
create_chat_message(speaker, message_language, raw_message, spans, message_mode)
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode))
/mob/camera/imaginary_friend/proc/friend_talk(message)
+244
View File
@@ -0,0 +1,244 @@
#define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS
#define CHAT_MESSAGE_LIFESPAN 5 SECONDS
#define CHAT_MESSAGE_EOL_FADE 0.7 SECONDS
#define CHAT_MESSAGE_EXP_DECAY 0.7 // Messages decay at pow(factor, idx in stack)
#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 // Increase message decay based on the height of the message
#define CHAT_MESSAGE_APPROX_LHEIGHT 11 // Approximate height in pixels of an 'average' line, used for height decay
#define CHAT_MESSAGE_WIDTH 96 // pixels
#define CHAT_MESSAGE_MAX_LENGTH 110 // characters
#define WXH_TO_HEIGHT(x) text2num(copytext((x), findtextEx((x), "x") + 1)) // thanks lummox
/**
* # Chat Message Overlay
*
* Datum for generating a message overlay on the map
*/
/datum/chatmessage
/// The visual element of the chat messsage
var/image/message
/// The location in which the message is appearing
var/atom/message_loc
/// The client who heard this message
var/client/owned_by
/// Contains the scheduled destruction time
var/scheduled_destruction
/// Contains the approximate amount of lines for height decay
var/approx_lines
/**
* Constructs a chat message overlay
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN)
. = ..()
if (!istype(target))
CRASH("Invalid target given for chatmessage")
if(QDELETED(owner) || !istype(owner) || !owner.client)
stack_trace("/datum/chatmessage created with [isnull(owner) ? "null" : "invalid"] mob owner")
qdel(src)
return
INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, extra_classes, lifespan)
/datum/chatmessage/Destroy()
if (owned_by)
if (owned_by.seen_messages)
LAZYREMOVEASSOC(owned_by.seen_messages, message_loc, src)
owned_by.images.Remove(message)
owned_by = null
message_loc = null
message = null
return ..()
/**
* Calls qdel on the chatmessage when its parent is deleted, used to register qdel signal
*/
/datum/chatmessage/proc/on_parent_qdel()
qdel(src)
/**
* Generates a chat message image representation
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan)
// Register client who owns this message
owned_by = owner.client
RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel)
// Clip message
var/maxlen = owned_by.prefs.max_chat_length
if (length_char(text) > maxlen)
text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment
// Calculate target color if not already present
if (!target.chat_color || target.chat_color_name != target.name)
target.chat_color = colorize_string(target.name)
target.chat_color_darkened = colorize_string(target.name, 0.85, 0.85)
target.chat_color_name = target.name
// Get rid of any URL schemes that might cause BYOND to automatically wrap something in an anchor tag
var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g")
text = replacetext(text, url_scheme, "")
// Reject whitespace
var/static/regex/whitespace = new(@"^\s*$")
if (whitespace.Find(text))
qdel(src)
return
// Non mobs speakers can be small
if (!ismob(target))
extra_classes |= "small"
// Append radio icon if from a virtual speaker
if (extra_classes.Find("virtual-speaker"))
var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "radio")
text = "\icon[r_icon]&nbsp;" + text
// We dim italicized text to make it more distinguishable from regular text
var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color
// Approximate text height
// Note we have to replace HTML encoded metacharacters otherwise MeasureText will return a zero height
// BYOND Bug #2563917
// Construct text
var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g")
var/complete_text = "<span class='center maptext [extra_classes.Join(" ")]' style='color: [tgt_color]'>[text]</span>"
var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH))
approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT)
// Translate any existing messages upwards, apply exponential decay factors to timers
message_loc = target
if (owned_by.seen_messages)
var/idx = 1
var/combined_height = approx_lines
for(var/msg in owned_by.seen_messages[message_loc])
var/datum/chatmessage/m = msg
animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME)
combined_height += m.approx_lines
var/sched_remaining = m.scheduled_destruction - world.time
if (sched_remaining > CHAT_MESSAGE_SPAWN_TIME)
var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height)
m.scheduled_destruction = world.time + remaining_time
addtimer(CALLBACK(m, .proc/end_of_life), remaining_time, TIMER_UNIQUE|TIMER_OVERRIDE)
// Build message image
message = image(loc = message_loc, layer = CHAT_LAYER)
message.plane = GAME_PLANE
message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART
message.alpha = 0
message.pixel_y = owner.bound_height * 0.95
message.maptext_width = CHAT_MESSAGE_WIDTH
message.maptext_height = mheight
message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5
message.maptext = complete_text
// View the message
LAZYADDASSOC(owned_by.seen_messages, message_loc, src)
owned_by.images |= message
animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME)
// Prepare for destruction
scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE)
addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE)
/**
* Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion
*/
/datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE)
animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL)
QDEL_IN(src, fadetime)
/**
* Creates a message overlay at a defined location for a given speaker
*
* Arguments:
* * speaker - The atom who is saying this message
* * message_language - The language that the message is said in
* * raw_message - The text content of the message
* * spans - Additional classes to be added to the message
* * message_mode - Bitflags relating to the mode of the message
*/
/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, message_mode)
// Ensure the list we are using, if present, is a copy so we don't modify the list provided to us
spans = spans ? spans.Copy() : list()
// Check for virtual speakers (aka hearing a message through a radio)
var/atom/movable/originalSpeaker = speaker
if (istype(speaker, /atom/movable/virtualspeaker))
var/atom/movable/virtualspeaker/v = speaker
speaker = v.source
spans |= "virtual-speaker"
// Ignore virtual speaker (most often radio messages) from ourself
if (originalSpeaker != src && speaker == src)
return
// Display visual above source
new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), speaker, src, spans)
// Tweak these defines to change the available color ranges
#define CM_COLOR_SAT_MIN 0.6
#define CM_COLOR_SAT_MAX 0.7
#define CM_COLOR_LUM_MIN 0.65
#define CM_COLOR_LUM_MAX 0.75
/**
* Gets a color for a name, will return the same color for a given string consistently within a round.atom
*
* Note that this proc aims to produce pastel-ish colors using the HSL colorspace. These seem to be favorable for displaying on the map.
*
* Arguments:
* * name - The name to generate a color for
* * sat_shift - A value between 0 and 1 that will be multiplied against the saturation
* * lum_shift - A value between 0 and 1 that will be multiplied against the luminescence
*/
/datum/chatmessage/proc/colorize_string(name, sat_shift = 1, lum_shift = 1)
// seed to help randomness
var/static/rseed = rand(1,26)
// get hsl using the selected 6 characters of the md5 hash
var/hash = copytext(md5(name + GLOB.round_id), rseed, rseed + 6)
var/h = hex2num(copytext(hash, 1, 3)) * (360 / 255)
var/s = (hex2num(copytext(hash, 3, 5)) >> 2) * ((CM_COLOR_SAT_MAX - CM_COLOR_SAT_MIN) / 63) + CM_COLOR_SAT_MIN
var/l = (hex2num(copytext(hash, 5, 7)) >> 2) * ((CM_COLOR_LUM_MAX - CM_COLOR_LUM_MIN) / 63) + CM_COLOR_LUM_MIN
// adjust for shifts
s *= clamp(sat_shift, 0, 1)
l *= clamp(lum_shift, 0, 1)
// convert to rgb
var/h_int = round(h/60) // mapping each section of H to 60 degree sections
var/c = (1 - abs(2 * l - 1)) * s
var/x = c * (1 - abs((h / 60) % 2 - 1))
var/m = l - c * 0.5
x = (x + m) * 255
c = (c + m) * 255
m *= 255
switch(h_int)
if(0)
return "#[num2hex(c, 2)][num2hex(x, 2)][num2hex(m, 2)]"
if(1)
return "#[num2hex(x, 2)][num2hex(c, 2)][num2hex(m, 2)]"
if(2)
return "#[num2hex(m, 2)][num2hex(c, 2)][num2hex(x, 2)]"
if(3)
return "#[num2hex(m, 2)][num2hex(x, 2)][num2hex(c, 2)]"
if(4)
return "#[num2hex(x, 2)][num2hex(m, 2)][num2hex(c, 2)]"
if(5)
return "#[num2hex(c, 2)][num2hex(m, 2)][num2hex(x, 2)]"
+9 -1
View File
@@ -222,4 +222,12 @@
id = "puzzle"
description = "Mystery to be solved."
suffix = "lavaland_surface_puzzle.dmm"
cost = 5
cost = 5
/datum/map_template/ruin/lavaland/oasis
name = "Oasis"
id = "oasis"
description = "A little paradise in the middle of hell."
suffix = "lavaland_surface_oasis.dmm"
allow_duplicates = FALSE
cost = 0
+10 -2
View File
@@ -160,9 +160,9 @@
/datum/quirk/lightless
name = "Light Sensitivity"
desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..."
desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Kinaris was more considerate of your needs..."
value = -1
gain_text = "<span class='danger'>The safty of light feels off...</span>"
gain_text = "<span class='danger'>The safety of light feels off...</span>"
lose_text = "<span class='notice'>Enlighing.</span>"
/datum/quirk/lightless/on_process()
@@ -366,3 +366,11 @@
gain_text = "<span class='danger'>There's a lot on your mind right now.</span>"
lose_text = "<span class='notice'>Your mind finally feels calm.</span>"
medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events."
//Port from Shadow
/datum/quirk/noclone
name = "DNC"
desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means."
value = -2
mob_trait = TRAIT_NEVER_CLONE
medical_record_text = "Patient has a DNC (Do not clone) order on file, and cannot be cloned as a result."
+3
View File
@@ -32,6 +32,9 @@
/area/ruin/powered/seedvault
icon_state = "dk_yellow"
/area/ruin/powered/oasis
icon_state = "dk_yellow"
/area/ruin/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
+7
View File
@@ -13,6 +13,13 @@
//HUD images that this atom can provide.
var/list/hud_possible
/// Last name used to calculate a color for the chatmessage overlays
var/chat_color_name
/// Last color calculated for the the chatmessage overlays
var/chat_color
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
var/chat_color_darkened
//Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
+3 -1
View File
@@ -164,7 +164,6 @@
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features)
if(prob(50 - efficiency*10)) //Chance to give a bad mutation.
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone.
@@ -205,7 +204,10 @@
H.give_genitals(TRUE)
H.suiciding = FALSE
H.custom_body_size = H.client.prefs.body_size
//H.size_multiplier = (max(min( round((H.custom_body_size)), MAX_BODYSIZE),MIN_BODYSIZE)* 0.01) //Not working dont know why.
attempting = FALSE
return TRUE
//Grow clones to maturity then kick them out. FREELOADERS
+4
View File
@@ -449,6 +449,10 @@
var/mob/living/brain/B = mob_occupant
dna = B.stored_dna
if(HAS_TRAIT(mob_occupant, TRAIT_NEVER_CLONE))
scantemp = "<font class='bad'>Subject has an active DNC record on file. Unable to clone.</font>"
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
return
if(!istype(dna))
scantemp = "<font class='bad'>Unable to locate valid genetic data.</font>"
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
+91
View File
@@ -0,0 +1,91 @@
/obj/item/mesmetron
name = "Mesmetron"
desc = "An elaborate pocketwatch, with a captivating gold etching and an enchanting face..."
icon = 'icons/obj/pocketwatch.dmi'
icon_state = "pocketwatch"
item_state = "pocketwatch"
w_class = WEIGHT_CLASS_SMALL
throw_range = 7
throw_speed = 3
var/mob/living/carbon/subject = null
var/closed = FALSE
//Hypnotize someone
/obj/item/mesmetron/attack(mob/living/carbon/human/H, mob/living/user)
if(closed)
return
if(H.IsSleeping())
to_chat(user, "You can't hypnotize [H] whilst they're asleep!")
return
user.visible_message("<span class='warning'>[user] begins to mesmerizingly wave [src] like a pendulum before [H]'s very eyes!</span>")
if(!do_mob(user, H, 12 SECONDS))
return
if(!(user in view(1, loc)))
return
var/response = alert(H, "Do you wish to fall into a hypnotic sleep? (This will allow [user] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No")
if(response == "Yes")
H.visible_message("<span class='warning'>[H] falls into a deep slumber!</span>", "<span class ='danger'>Your eyelids gently shut as you fall into a deep slumber. All you can hear is [user]'s voice as you commit to following all of their suggestions</span>")
H.SetSleeping(1200)
H.drowsyness = max(H.drowsyness, 40)
subject = H
return
//No
H.visible_message("<span class='warning'>[H]'s attention breaks, despite your attempts to hypnotize them! They clearly don't want this</span>", "<span class ='warning'>Your concentration breaks as you realise you have no interest in following [user]'s words!</span>")
//If there's a subject, open the suggestion interface
/obj/item/mesmetron/attack_self(mob/user)
if(closed)
return
if(!subject)
return
if(!subject.IsSleeping())
to_chat(user, "[subject] is awake and no longer under hypnosis!")
subject = null
return
var/response = alert(user, "Would you like to release your subject or give them a suggestion?", "Mesmetron", "Suggestion", "Release")
if(response == "Suggestion")
if(get_dist(user, subject) > 1)
to_chat(user, "You must stand in whisper range of [subject].")
return
text = input("What would you like to suggest?", "Hypnotic suggestion", null, null)
text = sanitize(text)
if(!text)
return
to_chat(user, "You whisper your suggestion in a smooth calming voice to [subject]")
to_chat(subject, "<span class='hypnophrase'>...[text]...</span>")
return
//Release
subject.visible_message("<span class='warning'>[subject] wakes up from their deep slumber!</span>", "<span class ='danger'>Your eyelids gently open as you see [user]'s face staring back at you</span>")
subject.SetSleeping(0)
subject = null
//Toggle open/close
/obj/item/mesmetron/AltClick(mob/user)
//Close it
if(icon_state == "pocketwatch")
icon_state = "pocketwatch_closed"
item_state = "pocketwatch_closed"
desc = "An elaborate pocketwatch, with a captivating gold etching. It's closed however and you can't see it's face"
closed = TRUE
return
//Open it
icon_state = "pocketwatch"
item_state = "pocketwatch"
desc = "An elaborate pocketwatch, with a captivating gold etching and an enchanting face..."
closed = FALSE
+31
View File
@@ -12,6 +12,7 @@
* Cigarette Box
* Cigar Case
* Heart Shaped Box w/ Chocolates
* Ring Box
*/
/obj/item/storage/fancy
@@ -350,3 +351,33 @@
GET_COMPONENT(STR, /datum/component/storage)
STR.max_items = 8
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/tinychocolate))
/*
* Ring Box
*/
/obj/item/storage/fancy/ringbox
name = "ring box"
desc = "A tiny box covered in soft red felt made for holding rings."
icon = 'icons/obj/ring.dmi'
icon_state = "gold ringbox"
icon_type = "gold ring"
w_class = WEIGHT_CLASS_TINY
spawn_type = /obj/item/clothing/gloves/ring
/obj/item/storage/fancy/ringbox/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 1
STR.can_hold = typecacheof(list(/obj/item/clothing/gloves/ring))
/obj/item/storage/fancy/ringbox/diamond
icon_state = "diamond ringbox"
icon_type = "diamond ring"
spawn_type = /obj/item/clothing/gloves/ring/diamond
/obj/item/storage/fancy/ringbox/silver
icon_state = "silver ringbox"
icon_type = "silver ring"
spawn_type = /obj/item/clothing/gloves/ring/silver
@@ -129,3 +129,8 @@
name = "Kinaris.Co Logo"
desc = "The Kinaris corporate logo."
icon_state = "nanotrasen_sign1"
/obj/structure/sign/logo/kinaris
name = "kinaris logo"
desc = "The Kinaris corprate logo. Radiant."
icon_state = "kinaris_sign1"
@@ -126,6 +126,7 @@
/obj/structure/transit_tube/station/proc/launch_pod()
if(launch_cooldown >= world.time)
return
density = FALSE
for(var/obj/structure/transit_tube_pod/pod in loc)
if(!pod.moving)
pod_moving = 1
@@ -148,6 +149,7 @@
pod.setDir(tube_dirs[1]) //turning the pod around for next launch.
launch_cooldown = world.time + cooldown_delay
open_animation()
density = TRUE
sleep(OPEN_DURATION + 2)
pod_moving = 0
if(!QDELETED(pod))
@@ -4,7 +4,7 @@
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
icon_state = "straight"
desc = "A transit tube for moving things around."
density = TRUE
density = FALSE
layer = LOW_ITEM_LAYER
anchored = TRUE
climbable = 1
@@ -16,7 +16,7 @@
/obj/structure/transit_tube/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return 1
return TRUE
return !density
/obj/structure/transit_tube/New(loc, newdirection)
@@ -189,7 +189,6 @@
dir = WEST
/obj/structure/transit_tube/diagonal/crossing
density = FALSE
icon_state = "diagonal_crossing"
tube_construction = /obj/structure/c_transit_tube/diagonal/crossing
@@ -263,7 +262,6 @@
/obj/structure/transit_tube/crossing
icon_state = "crossing"
tube_construction = /obj/structure/c_transit_tube/crossing
density = FALSE
//mostly for mapping use
/obj/structure/transit_tube/crossing/horizontal
@@ -88,7 +88,7 @@
/obj/structure/c_transit_tube/curved
icon_state = "curved0"
build_type = /obj/structure/transit_tube/curved
flipped_build_type = /obj/structure/transit_tube/curved/flipped
flipped_build_type = /obj/structure/c_transit_tube/curved/flipped
base_icon = "curved"
/obj/structure/c_transit_tube/curved/flipped
@@ -3,7 +3,7 @@
icon_state = "pod"
animate_movement = FORWARD_STEPS
anchored = TRUE
density = TRUE
density = FALSE
layer = BELOW_OBJ_LAYER
var/moving = 0
var/datum/gas_mixture/air_contents = new()
@@ -136,13 +136,11 @@
sleep(last_delay)
setDir(next_dir)
forceMove(next_loc) // When moving from one tube to another, skip collision and such.
density = current_tube.density
if(current_tube && current_tube.should_stop_pod(src, next_dir))
current_tube.pod_stopped(src, dir)
break
density = TRUE
moving = 0
var/obj/structure/transit_tube/TT = locate(/obj/structure/transit_tube) in loc
+5 -5
View File
@@ -94,21 +94,21 @@ GLOBAL_LIST_INIT(freqtospan, list(
return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]"
// Citadel edit [spanned ? ", \"[spanned]\"" : ""]"
/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode)
/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode, no_quote = FALSE)
if(has_language(language))
var/atom/movable/AM = speaker.GetSource()
if(AM) //Basically means "if the speaker is virtual"
return AM.say_quote(raw_message, spans, message_mode)
return no_quote ? raw_message : AM.say_quote(raw_message, spans, message_mode)
else
return speaker.say_quote(raw_message, spans, message_mode)
return no_quote ? raw_message : speaker.say_quote(raw_message, spans, message_mode)
else if(language)
var/atom/movable/AM = speaker.GetSource()
var/datum/language/D = GLOB.language_datum_instances[language]
raw_message = D.scramble(raw_message)
if(AM)
return AM.say_quote(raw_message, spans, message_mode)
return no_quote ? raw_message : AM.say_quote(raw_message, spans, message_mode)
else
return speaker.say_quote(raw_message, spans, message_mode)
return no_quote ? raw_message : speaker.say_quote(raw_message, spans, message_mode)
else
return "makes a strange sound."
-3
View File
@@ -4,9 +4,6 @@
desc = "Shallow water."
icon = 'icons/turf/floors.dmi'
icon_state = "riverwater_motion"
baseturfs = /turf/open/chasm/lavaland
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
planetary_atmos = TRUE
slowdown = 1
bullet_sizzle = TRUE
bullet_bounce_sound = null //needs a splashing sound one day.
+1
View File
@@ -33,6 +33,7 @@ GLOBAL_VAR(restart_counter)
#endif
load_admins()
load_patreons()
LoadVerbs(/datum/verbs/menu)
if(CONFIG_GET(flag/usewhitelist))
load_whitelist()
+17
View File
@@ -3283,3 +3283,20 @@
/obj/item/toner,
/obj/item/toner)
crate_name = "toner crate"
/datum/supply_pack/misc/diamondring
name = "Diamond Ring"
desc = "Show them your love is like a diamond: unbreakable and forever lasting. Shipped straight from child slave cartels in the space african mines."
cost = 10000
contains = list(/obj/item/storage/fancy/ringbox/diamond)
crate_name = "diamond ring crate"
/datum/supply_pack/misc/jewelry
name = "Jewelry Crate"
desc = "Bling out with this crate of jewelry. Includes gold necklace and a set of two rings."
cost = 5000
contains = list(/obj/item/clothing/neck/necklace/dope,
/obj/item/storage/fancy/ringbox,
/obj/item/storage/fancy/ringbox/silver
)
crate_name = "jewelry crate"
+4 -1
View File
@@ -80,4 +80,7 @@
var/client_keysend_amount = 0
var/next_keysend_reset = 0
var/next_keysend_trip_reset = 0
var/keysend_tripped = FALSE
var/keysend_tripped = FALSE
/// Messages currently seen by this client
var/list/seen_messages
+1
View File
@@ -458,6 +458,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if(movingmob != null)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
seen_messages = null
Master.UpdateTickRate()
return ..()
+31 -8
View File
@@ -45,6 +45,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/UI_style = null
var/buttons_locked = FALSE
var/hotkeys = FALSE
var/chat_on_map = TRUE
var/max_chat_length = CHAT_MESSAGE_MAX_LENGTH
var/see_chat_non_mob = TRUE
var/tgui_fancy = TRUE
var/tgui_lock = TRUE
var/windowflashing = TRUE
@@ -203,6 +206,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/current_tab = 0
var/unlock_content = 0
var/vip = 0
var/list/ignoring = list()
@@ -241,6 +245,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
unlock_content = C.IsByondMember()
if(unlock_content)
max_save_slots = 16
if(clientckey in GLOB.patreons)
vip = 1
var/loaded_preferences_successfully = load_preferences()
if(loaded_preferences_successfully)
if(load_character())
@@ -776,6 +782,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
dat += "<b>Testicles Color:</b></a><BR>"
dat += "<span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><br>"
//dat += "<b>Ball Circumference:</b> <a style='display:block;width:120px' href='?_src_=prefs;preference=balls_size;task=input'>[features["balls_size"]] inch(es)</a>" // The menu works but doesn't do anything yet. Need to figure it out.
dat += "<b>Testicles showing:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_shape;task=input'>[features["balls_shape"]]</a>"
dat += "<b>Produces:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>[features["balls_fluid"]]</a>"
dat += APPEARANCE_CATEGORY_COLUMN
@@ -819,6 +826,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>UI Style:</b> <a href='?_src_=prefs;task=input;preference=ui'>[UI_style]</a><br>"
dat += "<b>tgui Monitors:</b> <a href='?_src_=prefs;preference=tgui_lock'>[(tgui_lock) ? "Primary" : "All"]</a><br>"
dat += "<b>tgui Style:</b> <a href='?_src_=prefs;preference=tgui_fancy'>[(tgui_fancy) ? "Fancy" : "No Frills"]</a><br>"
dat += "<b>Show Runechat Chat Bubbles:</b> <a href='?_src_=prefs;preference=chat_on_map'>[chat_on_map ? "Enabled" : "Disabled"]</a><br>"
dat += "<b>Runechat message char limit:</b> <a href='?_src_=prefs;preference=max_chat_length;task=input'>[max_chat_length]</a><br>"
dat += "<b>See Runechat for non-mobs:</b> <a href='?_src_=prefs;preference=see_chat_non_mob'>[see_chat_non_mob ? "Enabled" : "Disabled"]</a><br>"
dat += "<br>"
dat += "<b>Action Buttons:</b> <a href='?_src_=prefs;preference=action_buttons'>[(buttons_locked) ? "Locked In Place" : "Unlocked"]</a><br>"
dat += "<b>Keybindings:</b> <a href='?_src_=prefs;preference=hotkeys'>[(hotkeys) ? "Hotkeys" : "Default"]</a><br>"
@@ -894,7 +904,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Ghosts of Others:</b> <a href='?_src_=prefs;task=input;preference=ghostothers'>[button_name]</a><br>"
dat += "<br>"
//dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
dat += "<b>Parallax (Fancy Space):</b> <a href='?_src_=prefs;preference=parallaxdown' oncontextmenu='window.location.href=\"?_src_=prefs;preference=parallaxup\";return false;'>"
switch (parallax)
if (PARALLAX_LOW)
@@ -1974,6 +1984,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_length)
features["cock_length"] = max(min( round(text2num(new_length)), COCK_SIZE_MAX),COCK_SIZE_MIN)
if("balls_size")
var/new_balls_size = input(user, "Testicle circumference in inches:\n([BALLS_SIZE_MIN]-[BALLS_SIZE_MAX])", "Character Preference") as num|null
if(new_balls_size)
features["balls_size"] = max(min( round(text2num(new_balls_size)), BALLS_SIZE_MAX),BALLS_SIZE_MIN)
if("cock_shape")
var/new_shape
new_shape = input(user, "Penis shape:", "Character Preference") as null|anything in GLOB.cock_shapes_list
@@ -2118,18 +2133,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (pickedmap)
preferred_map = maplist[pickedmap]
// if ("clientfps")
// var/desiredfps = input(user, "Choose your desired fps. (0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num
// if (!isnull(desiredfps))
// clientfps = desiredfps
// parent.fps = desiredfps
if ("clientfps")
var/desiredfps = input(user, "Choose your desired fps. (0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num
if (!isnull(desiredfps))
clientfps = desiredfps
parent.fps = desiredfps
//Hyperstation Body Size
if("bodysize")
var/new_bodysize = input(user, "Choose your desired sprite size:\n(85%-110%), Warning: May make your character look distorted!", "Character Preference") as num|null
var/new_bodysize = input(user, "Choose your desired sprite size:\n([MIN_BODYSIZE]-[MAX_BODYSIZE]), Warning: May make your character look distorted!", "Character Preference") as num|null
if (new_bodysize)
body_size = max(min( round(text2num(new_bodysize)), 110),85)
body_size = max(min( round(text2num(new_bodysize)), MAX_BODYSIZE),MIN_BODYSIZE)
@@ -2151,6 +2166,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/pickedPDASkin = input(user, "Choose your PDA reskin.", "Character Preference", pda_skin) as null|anything in GLOB.pda_reskins
if(pickedPDASkin)
pda_skin = pickedPDASkin
if ("max_chat_length")
var/desiredlength = input(user, "Choose the max character length of shown Runechat messages. Valid range is 1 to [CHAT_MESSAGE_MAX_LENGTH] (default: [initial(max_chat_length)]))", "Character Preference", max_chat_length) as null|num
if (!isnull(desiredlength))
max_chat_length = clamp(desiredlength, 1, CHAT_MESSAGE_MAX_LENGTH)
else
switch(href_list["preference"])
@@ -2236,6 +2255,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
winset(user, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED] mainwindow.macro=old_default")
if("action_buttons")
buttons_locked = !buttons_locked
if("chat_on_map")
chat_on_map = !chat_on_map
if("see_chat_non_mob")
see_chat_non_mob = !see_chat_non_mob
if("tgui_fancy")
tgui_fancy = !tgui_fancy
if("tgui_lock")
@@ -100,6 +100,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["inquisitive_ghost"] >> inquisitive_ghost
S["uses_glasses_colour"]>> uses_glasses_colour
S["clientfps"] >> clientfps
S["chat_on_map"] >> chat_on_map
S["max_chat_length"] >> max_chat_length
S["see_chat_non_mob"] >> see_chat_non_mob
S["parallax"] >> parallax
S["ambientocclusion"] >> ambientocclusion
@@ -129,6 +133,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
UI_style = sanitize_inlist(UI_style, GLOB.available_ui_styles, GLOB.available_ui_styles[1])
hotkeys = sanitize_integer(hotkeys, 0, 1, initial(hotkeys))
chat_on_map = sanitize_integer(chat_on_map, 0, 1, initial(chat_on_map))
max_chat_length = sanitize_integer(max_chat_length, 1, CHAT_MESSAGE_MAX_LENGTH, initial(max_chat_length))
see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob))
tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy))
tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock))
buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked))
@@ -180,6 +187,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["lastchangelog"], lastchangelog)
WRITE_FILE(S["UI_style"], UI_style)
WRITE_FILE(S["hotkeys"], hotkeys)
WRITE_FILE(S["chat_on_map"], chat_on_map)
WRITE_FILE(S["max_chat_length"], max_chat_length)
WRITE_FILE(S["see_chat_non_mob"], see_chat_non_mob)
WRITE_FILE(S["tgui_fancy"], tgui_fancy)
WRITE_FILE(S["tgui_lock"], tgui_lock)
WRITE_FILE(S["buttons_locked"], buttons_locked)
+4
View File
@@ -56,9 +56,13 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
mob.log_talk(raw_msg, LOG_OOC, tag="(OOC)")
var/keyname = key
if(prefs.unlock_content)
if(prefs.toggles & MEMBER_PUBLIC)
keyname = "<font color='[prefs.ooccolor ? prefs.ooccolor : GLOB.normal_ooc_colour]'>[icon2html('icons/member_content.dmi', world, "blag")][keyname]</font>"
if(prefs.vip) //patreon supporter!
keyname = "<font color='[prefs.ooccolor ? prefs.ooccolor : GLOB.normal_ooc_colour]'>[icon2html('hyperstation/icons/chat/reward.dmi', world, "vip")] [keyname]</font>"
//The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url
for(var/client/C in GLOB.clients)
if(C.prefs.chat_toggles & CHAT_OOC)
+14 -2
View File
@@ -47,8 +47,8 @@
//Basically syntax is species_restricted = list("Species Name","Species Name")
//Add a "exclude" string to do the opposite, making it only only species listed that can't wear it.
//You append this to clothing objects.
//Hyper change// - Variables for HS13 checks
var/roomy = 0 //0 For false
/obj/item/clothing/Initialize()
@@ -95,6 +95,18 @@
obj_integrity = max_integrity
to_chat(user, "<span class='notice'>You fix the damage on [src] with [C].</span>")
return 1
//Hyper Change//
if(istype(W, /obj/item/bluespace_thread))
var/obj/item/bluespace_thread/B = W
if ((istype(src, /obj/item/clothing/under) || istype(src, /obj/item/clothing/suit)) && roomy != 1) //Make sure the thread is used on an item that could be ripped off in the first place
roomy = 1 //True
user.show_message("<span class='notice'>You add a few stiches to your clothing, and find them to fit a little looser.</span>", 1)
B.uses -= 1 //One use has been used
if(B.uses <= 0)
user.show_message("<span class='notice'>The thread has been used up!</span>", 1)
qdel(B)
else
user.show_message("<span class='notice'>You probably don't need any more room in that.</span>", 1)
return ..()
/obj/item/clothing/Destroy()
+32
View File
@@ -0,0 +1,32 @@
/obj/item/clothing/gloves/ring
name = "gold ring"
desc = "A tiny gold ring, sized to wrap around a finger."
gender = NEUTER
w_class = WEIGHT_CLASS_TINY
icon = 'icons/obj/ring.dmi'
icon_state = "ringgold"
item_state = "gring"
body_parts_covered = 0
attack_verb = list("proposed")
transfer_prints = TRUE
strip_delay = 40
/obj/item/clothing/gloves/ring/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>\[user] is putting the [src] in [user.p_their()] mouth! It looks like [user] is trying to choke on the [src]!</span>")
return OXYLOSS
/obj/item/clothing/gloves/ring/diamond
name = "diamond ring"
item_state = "dring"
icon_state = "ringdiamond"
desc = "An expensive ring, studded with a diamond. Cultures have used these rings in courtship for a millenia."
/obj/item/clothing/gloves/ring/diamond/attack_self(mob/user)
user.visible_message("<span class='warning'>\The [user] gets down on one knee, presenting \the [src].</span>","<span class='warning'>You get down on one knee, presenting \the [src].</span>")
/obj/item/clothing/gloves/ring/silver
name = "silver ring"
item_state = "sring"
icon_state = "ringsilver"
desc = "A tiny silver ring, sized to wrap around a finger."
+4 -4
View File
@@ -113,15 +113,15 @@
item_color = "vice"
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, adorned with a golden K and a star. This is not Nanotrasen."
desc = "CentCom officer's jumpsuit, adorned with a golden K and a star, signifying work under Kinaris."
name = "\improper CentCom Officer's jumpsuit"
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, adorned with a golden K and a star. This is not Nanotrasen."
name = "\improper CentCom officer's jumpsuit"
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders, adorned with a golden K and a star. signifying work under Kinaris."
name = "\improper CentCom Commander's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
-9
View File
@@ -685,15 +685,6 @@
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
category = CAT_MISC
/datum/crafting_recipe/femur_breaker
name = "Femur Breaker"
result = /obj/structure/femur_breaker
time = 150
reqs = list(/obj/item/stack/sheet/metal = 20,
/obj/item/stack/cable_coil = 30)
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
category = CAT_MISC
/datum/crafting_recipe/lizardhat
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/lizard
+17 -21
View File
@@ -683,31 +683,27 @@ GLOBAL_LIST_INIT(hallucination_list, list(
if(get_dist(target,H)<get_dist(target,person))
person = H
people += H
if(person && !force_radio) //Basic talk
var/chosen = specific_message
if(!chosen)
chosen = capitalize(pick(speak_messages))
chosen = replacetext(chosen, "%TARGETNAME%", target_name)
var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER)
var/message = target.compose_message(person,understood_language,chosen,null,list(person.speech_span),face_name = TRUE)
feedback_details += "Type: Talk, Source: [person.real_name], Message: [message]"
to_chat(target, message)
if(target.client)
target.client.images |= speech_overlay
sleep(30)
target.client.images.Remove(speech_overlay)
else // Radio talk
var/chosen = specific_message
if(!chosen)
chosen = capitalize(pick(radio_messages))
chosen = replacetext(chosen, "%TARGETNAME%", target_name)
// Get person to affect if radio hallucination
var/is_radio = !person || force_radio
if (is_radio)
var/list/humans = list()
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
humans += H
person = pick(humans)
var/message = target.compose_message(person,understood_language,chosen,"[FREQ_COMMON]",list(person.speech_span),face_name = TRUE)
feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]"
to_chat(target, message)
// Generate message
var/spans = list(person.speech_span)
var/chosen = !specific_message ? capitalize(pick(is_radio ? speak_messages : radio_messages)) : specific_message
chosen = replacetext(chosen, "%TARGETNAME%", target_name)
var/message = target.compose_message(person, understood_language, chosen, is_radio ? "[FREQ_COMMON]" : null, spans, face_name = TRUE)
feedback_details += "Type: [is_radio ? "Radio" : "Talk"], Source: [person.real_name], Message: [message]"
// Display message
if (!is_radio && !target.client?.prefs.chat_on_map)
var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER)
INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, speech_overlay, list(target.client), 30)
if (target.client?.prefs.chat_on_map)
target.create_chat_message(person, understood_language, chosen, spans, 0)
to_chat(target, message)
qdel(src)
/datum/hallucination/message
@@ -281,3 +281,11 @@
bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
tastes = list("bun" = 4, "bacon" = 2)
foodtype = GRAIN | MEAT
/obj/item/reagent_containers/food/snacks/burger/cumburger
name = "Cumburger"
desc = "A sticky and salty burger."
icon_state = "cumburger"
tastes = list("bun" = 4, "salt" = 5)
bonus_reagents = list("nutriment" = 3, "vitamin" = 10, "semen" = 10, "aphro" = 5)
foodtype = GRAIN
@@ -176,7 +176,7 @@
)
result = /obj/item/reagent_containers/food/snacks/burger/purple
subcategory = CAT_BURGER
/datum/crafting_recipe/food/blackburger
name = "Black burger"
reqs = list(
@@ -186,7 +186,7 @@
)
result = /obj/item/reagent_containers/food/snacks/burger/black
subcategory = CAT_BURGER
/datum/crafting_recipe/food/whiteburger
name = "White burger"
reqs = list(
@@ -293,3 +293,12 @@
result = /obj/item/reagent_containers/food/snacks/burger/baconburger
subcategory = CAT_BURGER
/datum/crafting_recipe/food/cumburger
name = "Cumburger"
reqs = list(
/datum/reagent/consumable/semen = 10,
/obj/item/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/reagent_containers/food/snacks/burger/cumburger
subcategory = CAT_BURGER
+16 -4
View File
@@ -61,16 +61,28 @@
if(client.keys_held["Ctrl"])
switch(SSinput.movement_keys[_key])
if(NORTH)
northface()
if(client.keys_held["Shift"])
northshift()
else
northface()
return
if(SOUTH)
southface()
if(client.keys_held["Shift"])
southshift()
else
southface()
return
if(WEST)
westface()
if(client.keys_held["Shift"])
westshift()
else
westface()
return
if(EAST)
eastface()
if(client.keys_held["Shift"])
eastshift()
else
eastface()
return
return ..()
@@ -578,12 +578,9 @@
mind.transfer_to(H) //won't transfer key since the mind is not active
H.name = real_name
//h13 assign your characters custom height.
if (H.custom_body_size > 0)
H.resize = (H.custom_body_size * 0.01)
//h13 assign your characters custom height.
if (H.custom_body_size) //Do they have it set?
H.size_multiplier = (max(min( round((H.custom_body_size)), MAX_BODYSIZE),MIN_BODYSIZE)* 0.01)
//h13 give your starting impregchance (30%)
if (H.breedable == TRUE)
H.impregchance = 30
@@ -225,6 +225,10 @@
name = "Hitop"
icon_state = "hair_hitop"
/datum/sprite_accessory/hair/hyenamane
name = "Hyena Mane"
icon_state = "hair_hyenamane"
/datum/sprite_accessory/hair/jensen
name = "Jensen Hair"
icon_state = "hair_jensen"
+3
View File
@@ -34,6 +34,9 @@
else
to_follow = V.source
var/link = FOLLOW_LINK(src, to_follow)
// Create map text prior to modifying message for goonchat
if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
create_chat_message(speaker, message_language, raw_message, spans, message_mode)
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(src, "[link] [message]")
+1 -1
View File
@@ -54,7 +54,7 @@
var/mob_size = MOB_SIZE_HUMAN
//H13 custom body size and impregnation
var/custom_body_size = 1
var/custom_body_size = 100
var/breedable = 0
var/impregchance = 0
@@ -1,6 +1,10 @@
/mob/living/Moved()
. = ..()
update_turf_movespeed(loc)
if(is_shifted)
is_shifted = FALSE
pixel_x = get_standard_pixel_x_offset(lying)
pixel_y = get_standard_pixel_y_offset(lying)
/mob/living/toggle_move_intent()
. = ..()
+4 -1
View File
@@ -238,6 +238,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
else
deaf_message = "<span class='notice'>You can't hear yourself!</span>"
deaf_type = 2 // Since you should be able to hear yourself without looking
// Create map text prior to modifying message for goonchat
if (client?.prefs.chat_on_map && stat != UNCONSCIOUS && (client.prefs.see_chat_non_mob || ismob(speaker)) && can_hear())
create_chat_message(speaker, message_language, raw_message, spans, message_mode)
// Recompose message for AI hrefs, language incomprehension.
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
@@ -295,7 +298,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
//speech bubble
var/list/speech_bubble_recipients = list()
for(var/mob/M in listening)
if(M.client)
if(M.client && !M.client.prefs.chat_on_map)
speech_bubble_recipients.Add(M.client)
var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
+5 -3
View File
@@ -808,7 +808,7 @@
return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5)
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
var/treated_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
var/start = "Relayed Speech: "
var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]"
var/hrefpart = "<a href='?src=[REF(src)];track=[html_encode(namepart)]'>"
@@ -821,9 +821,11 @@
else
jobpart = "Unknown"
var/rendered = "<i><span class='game say'>[start]<span class='name'>[hrefpart][namepart] ([jobpart])</a> </span><span class='message'>[raw_message]</span></span></i>"
var/rendered = "<i><span class='game say'>[start]<span class='name'>[hrefpart][namepart] ([jobpart])</a> </span><span class='message'>[treated_message]</span></span></i>"
if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
create_chat_message(speaker, message_language, raw_message, spans, message_mode)
show_message(rendered, 2)
show_message(rendered, 2)
/mob/living/silicon/ai/fully_replace_character_name(oldname,newname)
..()
+1
View File
@@ -38,6 +38,7 @@
var/lying = 0
var/lying_prev = 0
var/canmove = 1
var/is_shifted = FALSE
//MOVEMENT SPEED
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
@@ -33,3 +33,11 @@
desc = "A signiature shell from a Braton, lined with engravings."
caliber = "bratonb"
projectile_type = /obj/item/projectile/bullet/bratonb
//FAL bullet
/obj/item/ammo_casing/fal762
name = "7.62x51 bullet casing"
desc = "A 7.62x51 bullet casing. Looks to be a bit shorter than the also ancient 7.62x54r, just without the rim."
icon_state = "762fal-casing"
caliber = "762fal"
projectile_type = /obj/item/projectile/bullet/fal762
+10 -1
View File
@@ -26,4 +26,13 @@
icon_state = "bratonmag"
ammo_type = /obj/item/ammo_casing/bratonmag
caliber = "bratonb"
max_ammo = 60
max_ammo = 60
//FAL
/obj/item/ammo_box/magazine/falMag
name = "FAL Magazine (20rnd.)"
icon_state = "fal-mag"
ammo_type = /obj/item/ammo_casing/fal762
caliber = "762fal"
max_ammo = 20
multiple_sprites = 2
@@ -223,6 +223,20 @@
fire_delay = 1
//ENDS HERE
//FAL
/obj/item/gun/ballistic/automatic/fal
name = "\improper FAL"
desc = "An ancient, but reliable battle rifle. As long as you dont get any dirt in it."
icon_state = "fal-wood"
item_state = "fal-wood"
w_class = WEIGHT_CLASS_HUGE
slot_flags = 0
mag_type = /obj/item/ammo_box/magazine/falMag
fire_sound = 'sound/weapons/falshot.ogg'
can_suppress = FALSE
burst_size = 4
fire_delay = 1
/obj/item/gun/ballistic/automatic/tommygun
name = "\improper Thompson SMG"
desc = "Based on the classic 'Chicago Typewriter'."
@@ -18,4 +18,9 @@
// bratonmag (Braton)
/obj/item/projectile/bullet/bratonb
name = "braton bullet"
damage = 10
damage = 10
//FAL ammo
/obj/item/projectile/bullet/fal762
name = "7.62x51 bullet"
damage = 42
@@ -219,8 +219,8 @@
description = "An opaque white liquid produced by the mammary glands of mammals."
color = "#DFDFDF" // rgb: 223, 223, 223
taste_description = "milk"
glass_icon_state = "glass_white"
glass_name = "glass of milk"
glass_icon_state = "milkglass"
glass_name = "milk drum"
glass_desc = "White and nutritious goodness!"
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
@@ -2194,3 +2194,53 @@
to_chat(M, "<span class = 'notice'>[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]</span>")
M.adjustArousalLoss(2)
..()
// Adding new mutation toxin stuff from /code/modules/reagent/chemistry/recipes/slime_extracts.dm
//Some other stuff like moth and felinid ( /datum/reagent/mutationtoxin/moth and /datum/reagent/mutationtoxin/felinid ) already exists. - Chemlight
/datum/reagent/mutationtoxin/mammal
name = "Mammal Mutation Toxin"
id = "mammalmutationtoxin"
description = "A fuzzy toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/mammal
mutationtext = "<span class='danger'>The pain subsides. You feel... furry.</span>"
/datum/reagent/mutationtoxin/avian
name = "Avian Mutation Toxin"
id = "avianmutationtoxin"
description = "A bird-like toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/avian
mutationtext = "<span class='danger'>The pain subsides. You feel... feathery.</span>"
/datum/reagent/mutationtoxin/aquatic
name = "Aquatic Mutation Toxin"
id = "aquaticmutationtoxin"
description = "A aquatic toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/aquatic
mutationtext = "<span class='danger'>The pain subsides. You feel... parched and wet.</span>"
/datum/reagent/mutationtoxin/xeno
name = "Xeno Mutation Toxin"
id = "xenomutationtoxin"
description = "A xenomorhpic toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/xeno
mutationtext = "<span class='danger'>The pain subsides. You feel... very alien compared to your previous self.</span>"
/datum/reagent/mutationtoxin/insect
name = "Insect Mutation Toxin"
id = "insectmutationtoxin"
description = "A buggy toxin."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/insect
mutationtext = "<span class='danger'>The pain subsides. You feel... oddly attracted to light.</span>"
/datum/reagent/mutationtoxin/ipc
name = "IPC Mutation Toxin"
id = "ipcmutationtoxin"
description = "A robotic toxin." //NANOMACHINES SON.
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/ipc
mutationtext = "<span class='danger'>The pain subsides. You feel... metallic.</span>"
@@ -676,3 +676,62 @@
/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder)
new /obj/item/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom))
..()
// Hyper change addition with granting more mutations to the existing races in the code.
// Back to the special snowflame mammal race, and more!
// If something isn't wanted here, just delet this - Chemlight
/datum/chemical_reaction/slime/slimemammal //Mammal species, pet dog.
name = "Mammal Mutation Toxin"
id = "mammalmuttoxin"
results = list("mammalmutationtoxin" = 1)
required_reagents = list("sulfur" = 1) //Sulfur, furry, GET IT?!
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimeavian //BIRDUP Species
name = "Avian Mutation Toxin"
id = "avianmuttoxin"
results = list("avianmutationtoxin" = 1)
required_reagents = list("oxygen" = 1) //Oxygen gives you.. wait that's redbull.
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimeaquatic //Aquatic species, aquaman got now shit on you.
name = "Aquatic Mutation Toxin"
id = "aquaticmuttoxin"
results = list("aquaticmutationtoxin" = 1)
required_reagents = list("water" = 1) //Water, 60% found in a human body, you tipped the scales, you fucked up.
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimexeno //HISS(Xeno hybrid) species, the other hiss not cats.
name = "Xeno Mutation Toxin"
id = "xenomuttoxin"
results = list("xenomutationtoxin" = 1)
required_reagents = list("sacid" = 1) //Sulphuric Acid, just like xeno spit, yuck.
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimefelinid //Felinid species, like cats, but the degenerate kind.
name = "Felinid Mutation Toxin"
id = "felinidmuttoxin"
results = list("felinidmutationtoxin" = 1)
required_reagents = list("aphro" = 1) //Crocin, *points* HORNY, also the whole /datum/chemical_reaction/cat and /datum/reagent/mutationtoxin/felinid already exists in code, THIS ONE IS OPTIONAL.
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimeinsect //insect species, you have a strange attraction to... lamp..
name = "Insect Mutation Toxin"
id = "insectmuttoxin"
results = list("insectmutationtoxin" = 1)
required_reagents = list("ammonia" = 1) //Ammonia, used for the mothman chemical reaction so it's more of a reference.
required_other = TRUE
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimeipc //IPC species, BEEP.
name = "IPC Mutation Toxin"
id = "ipcmuttoxin"
results = list("ipcmutationtoxin" = 1)
required_reagents = list("oil" = 1) //Oil, makes sense for it being their blood, so..
required_other = TRUE
required_container = /obj/item/slime_extract/green
@@ -365,5 +365,15 @@
/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty
list_reagents = list()
/obj/item/reagent_containers/glass/beaker/waterbottle/wataur
name = "Bottled Wataur"
desc = "Finally, a bottle as proportionate as you. Incredible!"
icon = 'icons/obj/drinks.dmi'
icon_state = "wataur"
list_reagents = list("water" = 100) //robust ass wataur
volume = 100
amount_per_transfer_from_this = 20
container_HP = 1
/obj/item/reagent_containers/glass/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "bottle")
@@ -115,6 +115,8 @@
var/flat_icon = "towel_flat"
var/folded_icon = "towel"
var/list/possible_colors
//Hyper Change
var/roomy = 1 //To cover XL bits
/obj/item/reagent_containers/rag/towel/Initialize()
. = ..()
+3 -2
View File
@@ -1105,7 +1105,8 @@
//teir 2
/* removed for now
//removed for now
//Hyper change - Unremoved for now
//ORGASM
else if((findtext(message, orgasm_words)))
for(var/V in listeners)
@@ -1122,7 +1123,7 @@
E.cooldown += 6
else
H.throw_at(get_step_towards(user,H), 3 * power_multiplier, 1 * power_multiplier)
*/
//awoo
+2 -1
View File
@@ -130,7 +130,8 @@
/obj/item/clothing/suit/jacket/leather/overcoat = 4,
/obj/item/clothing/under/pants/mustangjeans = 3,
/obj/item/clothing/neck/necklace/dope = 5,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 5)
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 5,
/obj/item/bluespace_thread = 3)
refill_canister = /obj/item/vending_refill/clothing
/obj/item/vending_refill/clothing
+2 -1
View File
@@ -14,7 +14,8 @@
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
/obj/item/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6,
/obj/item/reagent_containers/glass/beaker/waterbottle/wataur = 2)
premium = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/air = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1)
+1
View File
@@ -1,3 +1,4 @@
//This file is just for the necessary /world definition
//Try looking in game/world.dm
+1
View File
@@ -38,3 +38,4 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_oasis.dmm
+5
View File
@@ -0,0 +1,5 @@
//Patreon Supporters go here, and get a special little icon in OOC, Keep each name to one line
User1
User2
User3
Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

-58
View File
@@ -1,58 +0,0 @@
/mob/living/simple_animal/hostile/mimic
name = "Mimic"
icon = 'hyperstation/icons/mobs/mimic.dmi'
icon_state = "mimic"
icon_living = "mimic"
icon_dead = "mimic_dead"
gender = NEUTER
speak_chance = 0
turns_per_move = 5
maxHealth = 30
health = 30
see_in_dark = 3
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/killertomato = 2)
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
melee_damage_lower = 8
melee_damage_upper = 12
attacktext = "slams"
attack_sound = 'sound/weapons/punch1.ogg'
ventcrawler = VENTCRAWLER_ALWAYS
faction = list("plants")
var/unstealth = FALSE
/mob/living/simple_animal/hostile/mimic/Initialize()
// When initialized, make sure they take the form of something.
unstealth = FALSE
Mimictransform()
/mob/living/simple_animal/hostile/mimic/proc/Mimictransform()
var/transformitem = rand(1,3)
if (unstealth == FALSE)
switch(transformitem)
if(1)
//Glass
icon = 'icons/obj/drinks.dmi'
icon_state = "glass_empty"
aggro_vision_range = 0
if(2)
//Glass
icon = 'icons/obj/drinks.dmi'
icon_state = "glass_empty"
aggro_vision_range = 0
if(3)
//Glass
icon = 'icons/obj/drinks.dmi'
icon_state = "glass_empty"
aggro_vision_range = 0
else
//back to normal
icon = 'hyperstation/icons/mobs/mimic.dmi'
icon_state = "mimic"
@@ -0,0 +1,15 @@
#define PATREONFILE "[global.config.directory]/patreons.txt"
GLOBAL_LIST_EMPTY(patreons)
/proc/load_patreons()
GLOB.patreons = list()
for(var/line in world.file2list(PATREONFILE))
if(!line)
continue
GLOB.patreons += ckey(line)
/proc/check_patreons(var/ckey)
if(!GLOB.patreons)
return FALSE
. = (ckey in GLOB.patreons)
+33
View File
@@ -0,0 +1,33 @@
//Jay Sparrow
/datum/quirk/cum_plus
name = "Extra productive genitals"
desc = "Your lower bits produce more and hold more than normal."
value = 0
mob_trait = TRAIT_CUM_PLUS
gain_text = "<span class='notice'>You feel pressure in your groin.</span>"
lose_text = "<span class='notice'>You feel a weight lifted from your groin.</span>"
medical_record_text = "Patient has greatly increased production of sexual fluids"
/datum/quirk/cum_plus/add()
var/mob/living/carbon/M = quirk_holder
if(M.getorganslot("testicles"))
var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles")
T.fluid_mult = 1.5 //Base is 1
T.fluid_max_volume = 5
/datum/quirk/cum_plus/remove()
var/mob/living/carbon/M = quirk_holder
if(quirk_holder.getorganslot("testicles"))
var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles")
T.fluid_mult = 1 //Base is 1
T.fluid_max_volume = 3 //Base is 3
/datum/quirk/cum_plus/on_process()
var/mob/living/carbon/M = quirk_holder //If you get balls later, then this will still proc
if(M.getorganslot("testicles"))
var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles")
if(T.fluid_max_volume <= 5 || T.fluid_mult <= 0.2) //INVALID EXPRESSION?
T.fluid_mult = 1.5 //Base is 0.133
T.fluid_max_volume = 5
@@ -0,0 +1,35 @@
//Jay Sparrow
#define ROOMY = "ROOMY"
/obj/item/bluespace_thread
name = "Bluespace Sewing Kit"
desc = "Thread infused with bluespace dust to make your clothes a little more roomy."
icon = 'hyperstation/icons/obj/bluespace_thread.dmi'
icon_state = "thread"
item_state = "thread"
var/uses = 5 //Give it a few charges so it can last through the shift
w_class = WEIGHT_CLASS_TINY
/obj/item/bluespace_thread/attack_obj(obj/O, mob/living/user)
. = ..()
if(!istype(O, /obj/item/clothing))
user.show_message("<span class='notice'>You find yourself unable to stitch this.</span>", 1)
return
/obj/item/bluespace_thread/attack_self(mob/living/user)
user.show_message("<span class='notice'>The spool has [uses] uses remaining.</span>", 1)
//Let's add this to the loadout screen
/datum/gear/bluespace_thread
name = "Bluespace Sewing Kit"
category = SLOT_IN_BACKPACK
path = /obj/item/bluespace_thread
//Crafting recipe
/datum/crafting_recipe/bluespace_thread
name = "Bluespace Sewing Kit"
result = /obj/item/bluespace_thread
time = 40
reqs = list(/obj/item/stack/ore/bluespace_crystal = 1,
/obj/item/stack/sheet/cloth = 3)
category = CAT_MISC
+2
View File
@@ -22,3 +22,5 @@
icon_state = "highheels"
item_state = "highheels"
icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
+403
View File
@@ -0,0 +1,403 @@
//Jay Sparrow
//TODO
/*
Icons, maybe?
*/
#define STATUS_EFFECT_LEASH_PET /datum/status_effect/leash_pet
#define STATUS_EFFECT_LEASH_DOM /datum/status_effect/leash_dom
#define STATUS_EFFECT_LEASH_FREEPET /datum/status_effect/leash_freepet
#define MOVESPEED_ID_LEASH "LEASH"
/////STATUS EFFECTS/////
//These are mostly used as flags for the states each member can be in
/datum/status_effect/leash_dom
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/leash_dom
/obj/screen/alert/status_effect/leash_dom
name = "Leash Master"
desc = "You've got a leash, and a cute pet on the other end."
icon_state = "leash_master" //These call icons that don't exist, so no icon comes up. Which is good.
//As a result, the descriptions also don't proc, which is fine.
/datum/status_effect/leash_freepet
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/leash_freepet
/obj/screen/alert/status_effect/leash_freepet
name = "Escaped Pet"
desc = "You're on a leash, but you've no master. If anyone grabs the leash they'll gain control!"
icon_state = "leash_freepet"
/datum/status_effect/leash_pet
id = "leashed"
status_type = STATUS_EFFECT_UNIQUE
var/datum/weakref/redirect_component
alert_type = /obj/screen/alert/status_effect/leash_pet
/obj/screen/alert/status_effect/leash_pet
name = "Leashed Pet"
desc = "You're on the hook now! Be good for your master."
icon_state = "leash_pet"
/datum/status_effect/leash_pet/on_apply()
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist))))
if(!owner.stat)
to_chat(owner, "<span class='userdanger'>You have been leashed!</span>")
return ..()
//This lets the pet resist their leash
/datum/status_effect/leash_pet/proc/owner_resist()
to_chat(owner, "You reach for the hook on your collar...")
//Determine how long it takes to remove the leash
var/deleash = 15
//if(owner.get_item_by_slot(SLOT_HANDCUFFED)) //Commented out because there is no clear way to make this proc BEFORE decuff on resist.
//deleash = 100
if(do_mob(owner, owner, deleash))//do_mob creates a progress bar and then enacts the code after. Owner, owner, because it's an act on themself
if(!QDELETED(src))
to_chat(owner, "<span class='warning'>[owner] has removed their leash!</span>")
owner.remove_status_effect(/datum/status_effect/leash_pet)
///// OBJECT /////
//The leash object itself
//The component variables are used for hooks, used later.
/obj/item/leash
name = "leash"
desc = "A simple tether that can easily be hooked onto a collar. Perfect for your pet."
icon = 'hyperstation/icons/obj/leash.dmi'
icon_state = "leash"
item_state = "leash"
throw_range = 4
slot_flags = ITEM_SLOT_BELT
force = 1
throwforce = 1
w_class = WEIGHT_CLASS_SMALL
var/leash_used = 0 //A flag to see if the leash has been used yet, because for some reason picking up an unused leash is weird
var/mob/living/leash_pet = "null" //Variable to store our pet later
var/mob/living/leash_master = "null" //And our master too
var/datum/component/mobhook_leash_pet
var/datum/component/mobhook_leash_master //Needed to watch for these entities to move
var/datum/component/mobhook_leash_freepet
var/leash_location[3] //Three digit list for us to store coordinates later
//Called when someone is clicked with the leash
/obj/item/leash/attack(mob/living/carbon/C, mob/living/user) //C is the target, user is the one with the leash
if(istype(C.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/petcollar) || istype(C.get_item_by_slot(SLOT_NECK), /obj/item/electropack/shockcollar))
var/leashtime = 50
if(C.handcuffed)
leashtime = 5
if(do_mob(user, C, leashtime)) //do_mob adds a progress bar, but then we also check to see if they have a collar
log_combat(user, C, "leashed", addition="playfully")
//TODO: Figure out how to make an easy breakout for leashed leash_pets
C.apply_status_effect(/datum/status_effect/leash_pet)//Has now been leashed
user.apply_status_effect(/datum/status_effect/leash_dom) //Is the leasher
leash_pet = C //Save pet reference for later
leash_master = user //Save dom reference for later
mobhook_leash_pet = leash_pet.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_pet_move)))
mobhook_leash_master = leash_master.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_master_move)))
leash_used = 1
if(!leash_pet.has_status_effect(/datum/status_effect/leash_dom)) //Add slowdown if the pet didn't leash themselves
leash_pet.add_movespeed_modifier(MOVESPEED_ID_LEASH, multiplicative_slowdown = 5)
for(var/mob/viewing in viewers(user, null))
if(viewing == leash_master)
to_chat(leash_master, "<span class='warning'>You have hooked a leash onto [leash_pet]!</span>")
else
viewing.show_message("<span class='warning'>[leash_pet] has been leashed by [leash_master]!</span>", 1)
if(leash_pet.has_status_effect(/datum/status_effect/leash_dom)) //Pet leashed themself. They are not the dom
leash_pet.apply_status_effect(/datum/status_effect/leash_freepet)
leash_pet.remove_status_effect(/datum/status_effect/leash_dom)
while(1) //While true loop. The mark of a genius coder. ##MAINLOOP START
sleep(2) //Check every other tick
if(leash_pet == "null") //No pet, break loop
return
if(!(leash_pet.get_item_by_slot(SLOT_NECK))) //The pet has slipped their collar and is not the pet anymore.
for(var/mob/viewing in viewers(user, null))
viewing.show_message("<span class='notice'>[leash_pet] has slipped out of their collar!!</span>", 1)
to_chat(leash_pet, "<span class='notice'>You have slipped out of your collar!</span>")
to_chat(loc, "<span class='notice'>[leash_pet] has slipped out of their collar!</span>")
leash_pet.remove_status_effect(/datum/status_effect/leash_pet)
if(!leash_pet.has_status_effect(/datum/status_effect/leash_pet)) //If there is no pet, there is no dom. Loop breaks.
QDEL_NULL(mobhook_leash_master)
QDEL_NULL(mobhook_leash_pet)
QDEL_NULL(mobhook_leash_freepet)
if(leash_pet.has_status_effect(/datum/status_effect/leash_freepet))
leash_pet.remove_status_effect(/datum/status_effect/leash_freepet)
if(leash_pet.has_movespeed_modifier(MOVESPEED_ID_LEASH))
leash_pet.remove_movespeed_modifier(MOVESPEED_ID_LEASH)
if(!leash_master == "null")
leash_master.remove_status_effect(/datum/status_effect/leash_dom)
leash_used = 0 //reset the leash to neutral
leash_pet = "null"
return
else //No collar, no fun
var/leash_message = pick("Your pet needs a collar")
to_chat(user, "<span class='notice'>[leash_message]</span>")
//Called when the leash is used in hand
//Tugs the pet closer
/obj/item/leash/attack_self(mob/living/user)
if(!leash_pet == "null") //No pet, no tug.
return
//Yank the pet. Yank em in close.
if(leash_pet.x > leash_master.x + 1)
step(leash_pet, WEST, 1) //"1" is the speed of movement. We want the tug to be faster than their slow current walk speed.
if(leash_pet.y > leash_master.y)//Check the other axis, and tug them into alignment so they are behind the master
step(leash_pet, SOUTH, 1)
if(leash_pet.y < leash_master.y)
step(leash_pet, NORTH, 1)
if(leash_pet.x < leash_master.x - 1)
step(leash_pet, EAST, 1)
if(leash_pet.y > leash_master.y)//Check the other axis, and tug them into alignment so they are behind the master
step(leash_pet, SOUTH, 1)
if(leash_pet.y < leash_master.y)
step(leash_pet, NORTH, 1)
if(leash_pet.y > leash_master.y + 1)
step(leash_pet, SOUTH, 1)
if(leash_pet.x > leash_master.x)//Check the other axis, and tug them into alignment so they are behind the master
step(leash_pet, WEST, 1)
if(leash_pet.x < leash_master.x)
step(leash_pet, EAST, 1)
if(leash_pet.y < leash_master.y - 1)
step(leash_pet, NORTH, 1)
if(leash_pet.x > leash_master.x)//Check the other axis, and tug them into alignment so they are behind the master
step(leash_pet, WEST, 1)
if(leash_pet.x < leash_master.x)
step(leash_pet, EAST, 1)
/obj/item/leash/proc/on_master_move()
//Make sure the dom still has a pet
if(leash_master == "null") //There must be a master
return
if(leash_pet == "null") //There must be a pet
return
if(leash_pet == leash_master) //Pet is the master
return
if(!leash_pet.has_status_effect(/datum/status_effect/leash_pet))
QDEL_NULL(mobhook_leash_master) //Probably redundant, but it's nice to be safe
leash_master.remove_status_effect(/datum/status_effect/leash_dom)
return
//If the master moves, pull the pet in behind
sleep(2) //A small sleep so the pet kind of bounces back after they make the step
//Also, the sleep means that the distance check for master happens before the pet, to prevent both from proccing.
if(leash_master == "null") //Just to stop error messages
return
if(leash_pet == "null")
return
if(leash_pet.x > leash_master.x + 2)
step(leash_pet, WEST, 1) //"1" is the speed of movement. We want the tug to be faster than their slow current walk speed.
if(leash_pet.y > leash_master.y)//Check the other axis, and tug them into alignment so they are behind the master
step(leash_pet, SOUTH, 1)
if(leash_pet.y < leash_master.y)
step(leash_pet, NORTH, 1)
if(leash_pet.x < leash_master.x - 2)
step(leash_pet, EAST, 1)
if(leash_pet.y > leash_master.y)
step(leash_pet, SOUTH, 1)
if(leash_pet.y < leash_master.y)
step(leash_pet, NORTH, 1)
if(leash_pet.y > leash_master.y + 2)
step(leash_pet, SOUTH, 1)
if(leash_pet.x > leash_master.x)
step(leash_pet, WEST, 1)
if(leash_pet.x < leash_master.x)
step(leash_pet, EAST, 1)
if(leash_pet.y < leash_master.y - 2)
step(leash_pet, NORTH, 1)
if(leash_pet.x > leash_master.x)
step(leash_pet, WEST, 1)
if(leash_pet.x < leash_master.x)
step(leash_pet, EAST, 1)
//Knock the pet over if they get further behind. Shouldn't happen too often.
sleep(3) //This way running normally won't just yank the pet to the ground.
if(leash_master == "null") //Just to stop error messages. Break the loop early if something removed the master
return
if(leash_pet == "null")
return
if(leash_pet.x > leash_master.x + 3 || leash_pet.x < leash_master.x - 3 || leash_pet.y > leash_master.y + 3 || leash_pet.y < leash_master.y - 3)
//var/leash_knockdown_message = "[leash_pet] got pulled to the ground by their leash!"
//to_chat(leash_master, "<span class='notice'>[leash_knockdown_message]</span>")
//to_chat(leash_pet, "<span class='notice'>[leash_knockdown_message]</span>")
leash_pet.apply_effect(20, EFFECT_KNOCKDOWN, 0)
//This code is to check if the pet has gotten too far away, and then break the leash.
sleep(3) //Wait to snap the leash
if(leash_master == "null") //Just to stop error messages
return
if(leash_pet == "null")
return
if(leash_pet.x > leash_master.x + 5 || leash_pet.x < leash_master.x - 5 || leash_pet.y > leash_master.y + 5 || leash_pet.y < leash_master.y - 5)
var/leash_break_message = "The leash snapped free from [leash_pet]!"
for(var/mob/viewing in viewers(leash_pet, null))
if(viewing == leash_master)
to_chat(leash_master, "<span class='warning'>The leash snapped free from your pet!</span>")
if(viewing == leash_pet)
to_chat(leash_pet, "<span class='warning'>Your leash has popped from your collar!</span>")
else
viewing.show_message("<span class='warning'>[leash_break_message]</span>", 1)
leash_pet.apply_effect(20, EFFECT_KNOCKDOWN, 0)
leash_pet.adjustOxyLoss(5)
leash_pet.remove_status_effect(/datum/status_effect/leash_pet)
leash_pet.remove_movespeed_modifier(MOVESPEED_ID_LEASH)
leash_master.remove_status_effect(/datum/status_effect/leash_dom)
QDEL_NULL(mobhook_leash_master)
QDEL_NULL(mobhook_leash_pet)
leash_pet = "null"
leash_master = "null"
leash_used = 0
/obj/item/leash/proc/on_pet_move()
//This should only work if there is a pet and a master.
//This is here pretty much just to stop the console from flooding with errors
if(leash_master == "null")
return
if(leash_pet == "null")
return
//Make sure the pet is still a pet
if(!leash_pet.has_status_effect(/datum/status_effect/leash_pet))
QDEL_NULL(mobhook_leash_pet) //Probably redundant, but it's nice to be safe
return
//The pet has escaped. There is no DOM. GO PET RUN.
if(leash_pet.has_status_effect(/datum/status_effect/leash_freepet))//If the pet is free, break
return
//If the pet gets too far away, they get tugged back
sleep(3)//A small sleep so the pet kind of bounces back after they make the step
if(leash_master == "null")
return
if(leash_pet == "null")
return
//West tug
if(leash_pet.x > leash_master.x + 2)
step(leash_pet, WEST, 1) //"1" is the speed of movement. We want the tug to be faster than their slow current walk speed.
//East tug
if(leash_pet.x < leash_master.x - 2)
step(leash_pet, EAST, 1)
//South tug
if(leash_pet.y > leash_master.y + 2)
step(leash_pet, SOUTH, 1)
//North tug
if(leash_pet.y < leash_master.y - 2)
step(leash_pet, NORTH, 1)
/obj/item/leash/proc/on_freepet_move()
. = ..()
//Pet is on the run. Let's drag the leash behind them.
if(!leash_master == "null") //If there is a master, don't do this
return
if(leash_pet == "null") //If there is no pet, don't do this
return
if(leash_pet.is_holding_item_of_type(/obj/item/leash)) //If the pet is holding the leash, don't do this
return
sleep(2)
if(leash_pet == "null")
return
//Double move to catch the leash up to the pet
if(src.x > leash_pet.x + 2)
. = step(src, WEST, 1)
if(src.x < leash_pet.x - 2)
. = step(src, EAST, 1)
if(src.y > leash_pet.y + 2)
. = step(src, SOUTH, 1)
if(src.y < leash_pet.y - 2)
. = step(src, NORTH, 1)
//Primary dragging code
if(src.x > leash_pet.x + 1)
. = step(src, WEST, 1) //"1" is the speed of movement. We want the tug to be faster than their slow current walk speed.
if(src.y > leash_pet.y)//Check the other axis, and tug them into alignment so they are behind the pet
. = step(src, SOUTH, 1)
if(src.y < leash_pet.y)
. = step(src, NORTH, 1)
if(src.x < leash_pet.x - 1)
. = step(src, EAST, 1)
if(src.y > leash_pet.y)
. = step(src, SOUTH, 1)
if(src.y < leash_pet.y)
. = step(src, NORTH, 1)
if(src.y > leash_pet.y + 1)
. = step(src, SOUTH, 1)
if(src.x > leash_pet.x)
. = step(src, WEST, 1)
if(src.x < leash_pet.x)
. = step(src, EAST, 1)
if(src.y < leash_pet.y - 1)
. = step(src, NORTH, 1)
if(src.x > leash_pet.x)
. = step(src, WEST, 1)
if(src.x < leash_pet.x)
. = step(src, EAST, 1)
sleep(1)
//Just to prevent error messages
if(leash_pet == "null")
return
if(src.x > leash_pet.x + 5 || src.x < leash_pet.x - 5 || src.y > leash_pet.y + 5 || src.y < leash_pet.y - 5)
var/leash_break_message = "The leash snapped free from [leash_pet]!"
for(var/mob/viewing in viewers(leash_pet, null))
if(viewing == leash_pet)
to_chat(leash_pet, "<span class='warning'>Your leash has popped from your collar!</span>")
else
viewing.show_message("<span class='warning'>[leash_break_message]</span>", 1)
leash_pet.apply_effect(20, EFFECT_KNOCKDOWN, 0)
leash_pet.adjustOxyLoss(5)
leash_pet.remove_status_effect(/datum/status_effect/leash_pet)
leash_pet.remove_status_effect(/datum/status_effect/leash_freepet)
QDEL_NULL(mobhook_leash_pet)
QDEL_NULL(mobhook_leash_freepet)
leash_pet = "null"
leash_used = 0
/obj/item/leash/dropped() //Drop the leash, and the leash effects stop
. = ..()
if(leash_pet == "null") //There is no pet. Stop this silliness
return
if(leash_master == "null")
return
//Dropping procs any time the leash changes slots. So, we will wait a tick and see if the leash was actually dropped
sleep(1)
if(leash_master.is_holding_item_of_type(/obj/item/leash) || istype(leash_master.get_item_by_slot(SLOT_BELT), /obj/item/leash))
return //Dom still has the leash as it turns out. Cancel the proc.
for(var/mob/viewing in viewers(leash_master, null))
viewing.show_message("<span class='notice'>[leash_master] has dropped the leash.</span>", 1)
//DOM HAS DROPPED LEASH. PET IS FREE. SCP HAS BREACHED CONTAINMENT.
leash_pet.remove_movespeed_modifier(MOVESPEED_ID_LEASH)
mobhook_leash_freepet = leash_pet.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_freepet_move)))
leash_master.remove_status_effect(/datum/status_effect/leash_dom) //No dom with no leash. We will get a new dom if the leash is picked back up.
leash_master = "null"
QDEL_NULL(mobhook_leash_master)
/obj/item/leash/equipped(mob/user)
. = ..()
if(leash_used == 0) //Don't apply statuses with a fresh leash. Keeps things clean on the backend.
return
sleep(2)
if(leash_pet == "null")
return
leash_master = user
if(leash_master.has_status_effect(/datum/status_effect/leash_freepet) || leash_master.has_status_effect(/datum/status_effect/leash_pet)) //Pet picked up their own leash.
leash_master = "null"
return
leash_master.apply_status_effect(/datum/status_effect/leash_dom)
mobhook_leash_master = leash_master.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_master_move)))
leash_pet.remove_status_effect(/datum/status_effect/leash_freepet)
QDEL_NULL(mobhook_leash_freepet)
leash_pet.add_movespeed_modifier(MOVESPEED_ID_LEASH, multiplicative_slowdown = 5)
/datum/crafting_recipe/leash
name = "Leash"
result = /obj/item/leash
time = 40
reqs = list(/obj/item/stack/sheet/metal = 1,
/obj/item/stack/sheet/cloth = 3)
category = CAT_MISC
+2 -2
View File
@@ -1,6 +1,6 @@
/obj/item/pregnancytest
name = "pregnancy test"
desc = "a one time use small device, used to determine if someone is pregnant or not."
desc = "A one time use small device, used to determine whether someone is pregnant or not."
icon = 'hyperstation/icons/obj/pregnancytest.dmi'
throwforce = 0
icon_state = "ptest"
@@ -27,7 +27,7 @@
icon_state = "negative"
name = "[results] pregnancy test"
status = 1
to_chat(user, "<span class='notice'>You use the pregnancy test, the display reads positive!</span>")
to_chat(user, "<span class='notice'>You use the pregnancy test, the display reads negative!</span>")
/obj/item/pregnancytest/proc/test(mob/living/user)
+6
View File
@@ -47,3 +47,9 @@
if (!C.handcuffed)
return //Break when the rope is removed
/datum/crafting_recipe/rope
name = "Soft Rope"
result = /obj/item/restraints/handcuffs/rope
time = 40
reqs = list(/obj/item/stack/sheet/cloth = 5)
category = CAT_MISC
Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

-48
View File
@@ -74,54 +74,6 @@ GLOBAL_LIST_EMPTY(menulist)
else
winset(C, null, list2params(list("command" = replacetext(verbpath.name, " ", "-"))))
//Hypestation 13 changes
/datum/verbs/menu/Settings/FPS
checkbox = CHECKBOX_GROUP
default = /datum/verbs/menu/Settings/FPS/verb/twentyfiveframes
/datum/verbs/menu/Settings/FPS/verb/twentyframes()
set name = "Low-End (20) FPS"
set desc = "&20 fps"
set category = "Preferences"
set hidden = 1
usr.client.prefs.clientfps = 20
usr.client.prefs.parent.fps = 20
/datum/verbs/menu/Settings/FPS/verb/twentyfiveframes()
set name = "High-End (25) FPS"
set desc = "&25 fps"
set category = "Preferences"
set hidden = 1
usr.client.prefs.clientfps = 25
usr.client.prefs.parent.fps = 25
/datum/verbs/menu/Settings/FPS/verb/thirtyframes()
set name = "Higher-End (30) FPS"
set desc = "&30 fps"
set category = "Preferences"
set hidden = 1
usr.client.prefs.clientfps = 30
usr.client.prefs.parent.fps = 30
/datum/verbs/menu/Settings/FPS/verb/fortyframes()
set name = "Very Higher-End (40) FPS"
set desc = "&40 fps"
set category = "Preferences"
set hidden = 1
usr.client.prefs.clientfps = 40
usr.client.prefs.parent.fps = 40
/datum/verbs/menu/Settings/FPS/verb/sixtyframes()
set name = "Very Very Higher-End (60) FPS"
set desc = "&60 fps"
set category = "Preferences"
set hidden = 1
usr.client.prefs.clientfps = 60
usr.client.prefs.parent.fps = 60
/datum/verbs/menu/Settings/ChatOutput
checkbox = CHECKBOX_GROUP
@@ -44,12 +44,16 @@
var/items = o.get_contents()
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(o, "<span class='warning'>Your clothes give, ripping into pieces under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!</b></span>")
o.visible_message("<span class='boldnotice'>[o]'s chest suddenly bursts forth, ripping their clothes off!'</span>")
else
to_chat(o, "<span class='notice'>Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
//Hyper change
var/obj/item/clothing/W2 = W
if(!W2.roomy == 1) //If the clothes are "roomy" then don't do this.
//Hyper change end
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(o, "<span class='warning'>Your clothes give, ripping into pieces under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!</b></span>")
o.visible_message("<span class='boldnotice'>[o]'s chest suddenly bursts forth, ripping their clothes off!'</span>")
else
to_chat(o, "<span class='notice'>Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
return ..()
/datum/status_effect/chem/breast_enlarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge
@@ -66,9 +70,13 @@
var/items = o.get_contents()
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(owner, "<span class='warning'>Your enormous breasts are way too large to fit anything over them!</b></span>")
//Hyper change// Check for a flag before we remove clothes.
var/obj/item/clothing/W2 = W
if(!W2.roomy == 1) //If the clothes are "roomy" then don't do this.
//End Hyper Change//
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(owner, "<span class='warning'>Your enormous breasts are way too large to fit anything over them!</b></span>")
/*
if (B.size == "huge")
if(prob(1))
@@ -125,14 +133,23 @@
var/mob/living/carbon/human/o = owner
var/items = o.get_contents()
if(o.w_uniform || o.wear_suit)
to_chat(o, "<span class='warning'>Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!</b></span>")
owner.visible_message("<span class='boldnotice'>[o]'s schlong suddenly bursts forth, ripping their clothes off!'</span>")
//Hyper change// Check for a flag before we remove clothes.
var/obj/item/clothing/suit = o.get_item_by_slot(SLOT_W_UNIFORM)
var/obj/item/clothing/jacket = o.get_item_by_slot(SLOT_WEAR_SUIT)
if(!suit.roomy == 1 || !jacket.roomy == 1) //If the clothes are "roomy" then don't do this.
//End Hyper Change//
to_chat(o, "<span class='warning'>Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!</b></span>")
owner.visible_message("<span class='boldnotice'>[o]'s schlong suddenly bursts forth, ripping their clothes off!'</span>")
else
to_chat(o, "<span class='notice'>Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
//Hyper change// Check for a flag before we remove clothes.
var/obj/item/clothing/W2 = W
if(!W2.roomy == 1) //If the clothes are "roomy" then don't do this.
//End Hyper Change//
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
return ..()
@@ -151,14 +168,19 @@
var/items = o.get_contents()
for(var/obj/item/W in items)
if (o.arousalloss > 32) // warning that your shaft is getting errect!
if(W == o.w_uniform || W == o.wear_suit )
to_chat(M, "<span class='warning'>Your swelling cock begins to strain against your clothes tightly!</b></span>")
if (o.arousalloss > 33)
if(W == o.w_uniform || W == o.wear_suit )
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(owner, "<span class='warning'>Your erect member is way to large to fit anything over! You will need to be flaccid again to wear clothes!</b></span>")
//Hyper change// Check for a flag before we remove clothes.
if(istype(W, /obj/item/clothing))
var/obj/item/clothing/W2 = W
if(!W2.roomy == 1) //If the clothes are "roomy" then don't do this.
//End Hyper Change//
if (o.arousalloss > 32) // warning that your shaft is getting errect!
if(W == o.w_uniform || W == o.wear_suit )
to_chat(M, "<span class='warning'>Your swelling cock begins to strain against your clothes tightly!</b></span>")
if (o.arousalloss > 33)
if(W == o.w_uniform || W == o.wear_suit )
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(owner, "<span class='warning'>Your erect member is way to large to fit anything over! You will need to be flaccid again to wear clothes!</b></span>")
/*
switch(round(P.cached_length))
if(21)
@@ -58,11 +58,14 @@
/obj/item/clothing/neck/petcollar = 5,
/obj/item/clothing/under/mankini = 1,
/obj/item/dildo/flared/huge = 1,
/obj/item/clothing/head/dominatrixcap = 1
/obj/item/clothing/head/dominatrixcap = 1,
/obj/item/mesmetron = 1
)
premium = list(
/obj/item/electropack/shockcollar = 3,
/obj/item/clothing/neck/petcollar/locked = 1
/obj/item/clothing/neck/petcollar/locked = 1,
/obj/item/restraints/handcuffs/rope = 1,
/obj/item/leash = 1
)
refill_canister = /obj/item/vending_refill/kink
/*
@@ -9,13 +9,13 @@
size = BREASTS_SIZE_DEF //SHOULD BE A LETTER, starts as a number...???
var/cached_size = null //for enlargement SHOULD BE A NUMBER
var/prev_size //For flavour texts SHOULD BE A LETTER
//var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat")
var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0)
//var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "massive", "giga", "flat")
var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "massive" = 17, "giga" = 25, "flat" = 0) // Note: Do not forget to define new sizes.
var/statuscheck = FALSE
fluid_id = "milk"
var/amount = 2
fluid_mult = 0.25 // Set to a lower value due to production scaling with size (I.E. D cups produce the "normal" amount)
fluid_max_volume = 5
fluid_max_volume = 10
producing = TRUE
shape = "Pair"
can_masturbate_with = TRUE
@@ -32,7 +32,7 @@
reagents.maximum_volume = fluid_max_volume * cached_size// fluid amount is also scaled by the size of the organ
if(fluid_id && producing)
if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
fluid_rate = 0.1
reagents.total_volume = 0.1
else
fluid_rate = CUM_RATE * cached_size * fluid_mult // fluid rate is scaled by the size of the organ
generate_milk()
@@ -68,7 +68,7 @@
desc = "You see three sets of breasts, running from their chest to their belly."
else
desc = "You see some breasts, they seem to be quite exotic."
if(cached_size > 16)
if(cached_size > 18 && cached_size != 25)
desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(cached_size)]cm in diameter."
else if (!isnum(size))
if (size == "flat")
@@ -125,12 +125,20 @@
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 20) //if Rediculous
size = cached_size
if(20 to INFINITY) //if Hyper-Rediculous
size = cached_size
if(16 to 18) //if Ridiculous
size = breast_values[round(cached_size)]
if(!owner.has_status_effect(/datum/status_effect/chem/breast_enlarger))
owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger)
statuscheck = TRUE
if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this.
if(19 to INFINITY) //if Hyper-Ridiculous
size = cached_size
if(!owner.has_status_effect(/datum/status_effect/chem/breast_enlarger))
owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger)
statuscheck = TRUE
if(round(cached_size) < 19 && round(cached_size) == 25)//Because byond doesn't count from 0, I have to do this.
if (prev_size == 0)
prev_size = "flat"
if(size == 0)//Bloody byond with it's counting from 1
@@ -146,7 +154,7 @@
var/mob/living/carbon/human/H = owner
H.Force_update_genitals()
prev_size = size
else if (cached_size >= 16)
size = "huge"
else if (cached_size >= 20)
else if (cached_size >= 18 && cached_size < 25)
size = "massive"
else if (cached_size >= 25)
size = "giga"
@@ -10,7 +10,8 @@
shape = "single"
var/sack_size = BALLS_SACK_SIZE_DEF
var/cached_size = 6
fluid_mult = 0.133 // Set to a lower value due to production scaling with size (I.E. 6 inches the "normal" amount)
//fluid_mult = 0.133 // Set to a lower value due to production scaling with size (I.E. 6 inches the "normal" amount)
fluid_mult = 1.0 //Defaults to 1 no matter what you do. It just does. Just gonna adapt I guess.
fluid_max_volume = 3
fluid_id = "semen"
producing = TRUE
@@ -24,17 +25,19 @@
return
if(!reagents || !owner)
return
reagents.maximum_volume = fluid_max_volume * cached_size// fluid amount is also scaled by the size of the organ
//reagents.maximum_volume = fluid_max_volume * cached_size// fluid amount is also scaled by the size of the organ
reagents.maximum_volume = fluid_max_volume * ((cached_size / 2) + 1) * ((size / 2) + 1) * fluid_mult //Hyper - New calculation for more dynamic fluid levels. I can't believe I typed that.
if(fluid_id && producing)
if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
fluid_rate = 0.1
else
fluid_rate = CUM_RATE * cached_size * fluid_mult // fluid rate is scaled by the size of the organ
//fluid_rate = CUM_RATE * cached_size * fluid_mult // fluid rate is scaled by the size of the organ
fluid_rate = ((CUM_RATE / 5) * (cached_size / 3) * (size / 4) * fluid_mult) / 10 //Hyper - Production was way too high by default. This should drop it back down, but allow for it to get really high
generate_cum()
/obj/item/organ/genital/testicles/proc/generate_cum()
reagents.maximum_volume = fluid_max_volume
if(reagents.total_volume >= reagents.maximum_volume)
//reagents.maximum_volume = fluid_max_volume //This is the line that broke cum for so long
if(reagents.total_volume >= reagents.maximum_volume - 0.1) //Hyper - Check for it being close to the maximum. It sometimes doesn't proc due to a rounding error.
if(!sent_full_message)
send_full_message()
sent_full_message = TRUE
@@ -66,11 +69,14 @@
/obj/item/organ/genital/testicles/update_appearance()
switch(size)
if(0.1 to 1)
//if(0.1 to 1) //Hyper - Change the displayed ball sizes
if(0.1 to 3)
size_name = "average"
if(1.1 to 2)
//if(1.1 to 2)
if(3.1 to 8)
size_name = "enlarged"
if(2.1 to INFINITY)
//if(2.1 to INFINITY)
if(8.1 to INFINITY)
size_name = "engorged"
else
size_name = "nonexistant"

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