Merge remote-tracking branch 'upstream/master' into call-it-whatever-the-fuck-i-want
@@ -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.
|
||||
|
||||
[](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
|
||||
|
||||
[](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
|
||||
"}
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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] " + 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)]"
|
||||
@@ -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
|
||||
@@ -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."
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -33,6 +33,7 @@ GLOBAL_VAR(restart_counter)
|
||||
#endif
|
||||
|
||||
load_admins()
|
||||
load_patreons()
|
||||
LoadVerbs(/datum/verbs/menu)
|
||||
if(CONFIG_GET(flag/usewhitelist))
|
||||
load_whitelist()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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"]];'> </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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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."
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,3 +1,4 @@
|
||||
|
||||
//This file is just for the necessary /world definition
|
||||
//Try looking in game/world.dm
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
Before Width: | Height: | Size: 22 KiB |
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 211 B |
|
After Width: | Height: | Size: 316 B |
|
Before Width: | Height: | Size: 182 B After Width: | Height: | Size: 353 B |
|
After Width: | Height: | Size: 323 B |
|
Before Width: | Height: | Size: 182 B After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 462 B |
|
After Width: | Height: | Size: 237 B |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 633 B |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 815 B |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -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"
|
||||
|
||||