diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index fc074184d8..acb1da7b02 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -17,7 +17,8 @@ Pipelines + Other Objects -> Pipe network var/nodealert = 0 var/power_rating //the maximum amount of power the machine can use to do work, affects how powerful the machine is, in Watts - layer = 2.4 //under wires with their 2.44 + layer = ATMOS_LAYER + plane = PLATING_PLANE var/pipe_flags = PIPING_DEFAULT_LAYER_ONLY // Allow other layers by exception basis. var/connect_types = CONNECT_TYPE_REGULAR @@ -201,12 +202,12 @@ Pipelines + Other Objects -> Pipe network if(PIPING_LAYER_SCRUBBER) icon_state = "[icon_state]-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" if(PIPING_LAYER_SUPPLY) icon_state = "[icon_state]-supply" connect_types = CONNECT_TYPE_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" if(pipe_flags & PIPING_ALL_LAYER) connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 9d980647a8..4a9403a64b 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -6,7 +6,6 @@ icon = 'icons/atmos/injector.dmi' icon_state = "map_injector" pipe_state = "injector" - layer = 3 name = "air injector" desc = "Passively injects air into its surroundings. Has a valve attached to it that can control flow rate." diff --git a/code/ATMOSPHERICS/mainspipe.dm b/code/ATMOSPHERICS/mainspipe.dm index a38587baf5..baba515fae 100644 --- a/code/ATMOSPHERICS/mainspipe.dm +++ b/code/ATMOSPHERICS/mainspipe.dm @@ -34,7 +34,8 @@ obj/machinery/atmospherics/pipe/mains_component obj/machinery/atmospherics/mains_pipe icon = 'icons/obj/atmospherics/mainspipe.dmi' - layer = 2.4 //under wires with their 2.5 + layer = PIPES_LAYER + plane = PLATING_PLANE var/volume = 0 diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 4bcf200140..a03ce16af5 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -7,7 +7,6 @@ icon = 'icons/atmos/pipes.dmi' icon_state = "" level = 2 - layer = 2.4 //under wires with their 2.44 volume = 35 @@ -80,7 +79,7 @@ icon_state = "cap-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -90,7 +89,7 @@ icon_state = "cap-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE @@ -105,7 +104,7 @@ icon_state = "cap-f-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -115,6 +114,6 @@ icon_state = "cap-f-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm index fe6580b1ce..2d77e3a4ca 100644 --- a/code/ATMOSPHERICS/pipes/he_pipes.dm +++ b/code/ATMOSPHERICS/pipes/he_pipes.dm @@ -12,7 +12,7 @@ construction_type = /obj/item/pipe/binary/bendable pipe_state = "he" - layer = 2.41 + layer = PIPES_HE_LAYER var/initialize_directions_he var/surface = 2 //surface area in m^2 var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index bca6dd3379..524d420d39 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -18,7 +18,6 @@ var/obj/machinery/atmospherics/node3 level = 1 - layer = 2.4 //under wires with their 2.44 /obj/machinery/atmospherics/pipe/manifold/New() ..() @@ -166,7 +165,7 @@ icon_state = "map-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -176,7 +175,7 @@ icon_state = "map-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE @@ -212,7 +211,7 @@ icon_state = "map-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -222,7 +221,7 @@ icon_state = "map-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 88adc47d62..0cc022423b 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -19,7 +19,6 @@ var/obj/machinery/atmospherics/node4 level = 1 - layer = 2.4 //under wires with their 2.44 /obj/machinery/atmospherics/pipe/manifold4w/New() ..() @@ -168,7 +167,7 @@ icon_state = "map_4way-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -178,7 +177,7 @@ icon_state = "map_4way-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE @@ -214,7 +213,7 @@ icon_state = "map_4way-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -224,7 +223,7 @@ icon_state = "map_4way-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index 4e852ed0c8..19b05e8b71 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -7,7 +7,7 @@ var/datum/pipeline/parent var/volume = 0 - layer = 2.4 //under wires with their 2.44 + layer = PIPES_LAYER use_power = 0 pipe_flags = 0 // Does not have PIPING_DEFAULT_LAYER_ONLY flag. diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index 77290e5d8a..6aee81807e 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -173,7 +173,7 @@ icon_state = "intact-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -183,7 +183,7 @@ icon_state = "intact-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE @@ -219,7 +219,7 @@ icon_state = "intact-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -229,7 +229,7 @@ icon_state = "intact-supply" connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE diff --git a/code/ATMOSPHERICS/pipes/tank.dm b/code/ATMOSPHERICS/pipes/tank.dm index c96f4ddf1d..751c9ed607 100644 --- a/code/ATMOSPHERICS/pipes/tank.dm +++ b/code/ATMOSPHERICS/pipes/tank.dm @@ -11,6 +11,7 @@ volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet var/start_pressure = 75*ONE_ATMOSPHERE //Vorestation edit + layer = ATMOS_LAYER level = 1 dir = SOUTH initialize_directions = SOUTH diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index f0c4d4cbc6..ad2962547c 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -40,39 +40,71 @@ What is the naming convention for planes or layers? */ -#define SPACE_PLANE -32 // Reserved for use in space/parallax -#define PARALLAX_PLANE -30 // Reserved for use in space/parallax +#define SPACE_PLANE -82 // Reserved for use in space/parallax +#define PARALLAX_PLANE -80 // Reserved for use in space/parallax // OPENSPACE_PLANE reserves all planes between OPENSPACE_PLANE_START and OPENSPACE_PLANE_END inclusive -#define OPENSPACE_PLANE -55 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17) -#define OPENSPACE_PLANE_START -53 -#define OPENSPACE_PLANE_END -38 -#define OVER_OPENSPACE_PLANE -37 +#define OPENSPACE_PLANE -75 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17) +#define OPENSPACE_PLANE_START -73 +#define OPENSPACE_PLANE_END -58 +#define OVER_OPENSPACE_PLANE -57 + +// Turf Planes +#define SPACE_PLANE -43 // Space turfs themselves +#define PLATING_PLANE -44 // Plating + #define DISPOSAL_LAYER 2.1 // Under objects, even when planeswapped + #define PIPES_LAYER 2.2 // Under objects, even when planeswapped + #define WIRES_LAYER 2.3 // Under objects, even when planeswapped + #define ATMOS_LAYER 2.4 // Pipe-like atmos machinery that goes on the floor, like filters. + #define ABOVE_UTILITY 2.5 // Above stuff like pipes and wires +#define TURF_PLANE -45 // Turfs themselves, most flooring + #define ABOVE_TURF_LAYER 2.1 // Snow and such +#define DECAL_PLANE -44 // Permanent decals +#define DIRTY_PLANE -43 // Nonpermanent decals +#define BLOOD_PLANE -42 // Blood is really dirty, but we can do special stuff if we separate it + +// Obj planes +#define OBJ_PLANE -35 + #define HIDING_LAYER 2.6 // Layer at which mobs hide to be under things like tables + #define DOOR_OPEN_LAYER 2.7 // Under all objects if opened. 2.7 due to tables being at 2.6 + #define TABLE_LAYER 2.8 // Just under stuff that wants to be slightly below common objects. + #define UNDER_JUNK_LAYER 2.9 // Things that want to be slightly below common objects + // Turf/Obj layer boundary + #define ABOVE_JUNK_LAYER 3.1 // Things that want to be slightly above common objects + #define DOOR_CLOSED_LAYER 3.1 // Doors when closed + #define WINDOW_LAYER 3.2 // Windows + #define ON_WINDOW_LAYER 3.3 // Ontop of a window + #define SHOWER_OPEN_LAYER 3.4 // Showers when open + // Obj/Mob layer boundary + #define SHOWER_CLOSED_LAYER 4.2 // Should be converted to plane swaps + +// Mob planes +#define MOB_PLANE -25 + #define BELOW_MOB_LAYER 3.9 // Should be converted to plane swaps + #define ABOVE_MOB_LAYER 4.1 // Should be converted to plane swaps + +// Top plane (in the sense that it's the highest in 'the world' and not a UI element) +#define ABOVE_PLANE -10 //////////////////////////////////////////////////////////////////////////////////////// #define PLANE_WORLD 0 // BYOND's default value for plane, the "base plane" //////////////////////////////////////////////////////////////////////////////////////// - //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define - #define DECALS_LAYER 2.01 - #define OVERTURF_LAYER 2.1 - #define HIDING_LAYER 2.45 //Layer at which mobs hide to be under things like tables - #define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 - //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define - #define DOOR_CLOSED_LAYER 3.1 //Above most items if closed - #define SHOWER_OPEN_LAYER 3.4 - #define BELOW_MOB_LAYER 3.9 - //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define - #define ABOVE_MOB_LAYER 4.1 - #define SHOWER_CLOSED_LAYER 4.2 + //#define AREA_LAYER 1 //For easy recordkeeping; this is a byond define + //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define + + //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define + + //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define + //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define - #define LIGHTING_LAYER 11 //Layer that lighting used to be on (now it's on a plane) - #define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots) - #define SCREEN_LAYER 22 //Mob HUD/effects layer + + #define HUD_LAYER 20 // Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots) + #define SCREEN_LAYER 22 // Mob HUD/effects layer #define PLANE_ADMIN1 3 //Purely for shenanigans (below lighting) - +#define PLANE_PLANETLIGHTING 4 //Lighting on planets #define PLANE_LIGHTING 5 //Where the lighting (and darkness) lives #define PLANE_LIGHTING_ABOVE 6 //For glowy eyes etc. that shouldn't be affected by darkness @@ -125,4 +157,4 @@ What is the naming convention for planes or layers? // Check if a mob can "logically" see an atom plane -#define MOB_CAN_SEE_PLANE(M, P) (P == PLANE_WORLD || (P >= OPENSPACE_PLANE_START && P <= OPENSPACE_PLANE_END) || (P in M.planes_visible)) +#define MOB_CAN_SEE_PLANE(M, P) (P <= PLANE_WORLD || (P in M.planes_visible)) diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index aa0d9d616d..e6f072ca0c 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -1,28 +1,38 @@ -// Belly Mode Constants +// Normal digestion modes #define DM_HOLD "Hold" -#define DM_DIGEST "Digest" -#define DM_ITEMWEAK "Digest (Item Friendly)" -#define DM_STRIPDIGEST "Strip Digest (Items Only)" -#define DM_DIGEST_NUMB "Digest (Numbing)" +#define DM_DIGEST "Digest" +#define DM_ABSORB "Absorb" +#define DM_UNABSORB "Unabsorb" +#define DM_DRAIN "Drain" +#define DM_SHRINK "Shrink" +#define DM_GROW "Grow" +#define DM_SIZE_STEAL "Size Steal" #define DM_HEAL "Heal" -#define DM_ABSORB "Absorb" +#define DM_EGG "Encase In Egg" +#define DM_TRANSFORM "Transform" + +//#define DM_ITEMWEAK "Digest (Item Friendly)" +//#define DM_STRIPDIGEST "Strip Digest (Items Only)" +//#define DM_DIGEST_NUMB "Digest (Numbing)" + +//TF modes #define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)" #define DM_TRANSFORM_MALE "Transform (Male)" -#define DM_TRANSFORM_FEMALE "Transform (Female)" +#define DM_TRANSFORM_FEMALE "Transform (Female)" #define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)" #define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)" #define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)" -#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)" +#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)" #define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)" #define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)" #define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)" -#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" -#define DM_EGG "Encase In Egg" -#define DM_DRAIN "Drain" -#define DM_UNABSORB "Unabsorb" -#define DM_SHRINK "Shrink" -#define DM_GROW "Grow" -#define DM_SIZE_STEAL "Size Steal" +#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" + +//Addon mode flags +#define DM_FLAG_NUMBING 0x1 +#define DM_FLAG_ITEMWEAK 0x2 +#define DM_FLAG_STRIPPING 0x4 + // Stance for hostile mobs to be in while devouring someone. #define HOSTILE_STANCE_EATING 99 diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index 3ae84811b5..c9b34fc2b6 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -27,7 +27,7 @@ #define IS_SLIME 8 #define CE_STABLE "stable" // Inaprovaline -#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin +#define CE_ANTIBIOTIC "antibiotic" // Antibiotics #define CE_BLOODRESTORE "bloodrestore" // Iron/nutriment #define CE_PAINKILLER "painkiller" #define CE_ALCOHOL "alcohol" // Liver filtering @@ -36,6 +36,7 @@ #define REAGENTS_PER_SHEET 20 +// Attached to CE_ANTIBIOTIC #define ANTIBIO_NORM 1 #define ANTIBIO_OD 2 #define ANTIBIO_SUPER 3 diff --git a/code/__defines/construction.dm b/code/__defines/construction.dm index 837ad7ed38..2bae550a22 100644 --- a/code/__defines/construction.dm +++ b/code/__defines/construction.dm @@ -28,7 +28,7 @@ #define PIPE_BENDABLE 1 //6 directions: N/S, E/W, N/E, N/W, S/E, S/W #define PIPE_TRINARY 2 //4 directions: N/E/S, E/S/W, S/W/N, W/N/E #define PIPE_TRIN_M 3 //8 directions: N->S+E, S->N+E, N->S+W, S->N+W, E->W+S, W->E+S, E->W+N, W->E+N -#define PIPE_DIRECTIONAL 4 //4 directions: N, S, E, W +#define PIPE_DIRECTIONAL 4 //4 directions: N, S, E, W #define PIPE_ONEDIR 5 //1 direction: N/S/E/W #define PIPE_UNARY_FLIPPABLE 6 //8 directions: N, S, E, W, N-flipped, S-flipped, E-flipped, W-flipped #define PIPE_TRIN_T 7 //8 directions: N->S+E, S->N+E, N->S+W, S->N+W, E->W+S, W->E+S, E->W+N, W->E+N @@ -45,6 +45,11 @@ #define PIPING_LAYER_SCRUBBER 3 #define PIPING_LAYER_DEFAULT PIPING_LAYER_REGULAR +// We offset the layer values of the different pipe types to ensure they look nice +#define PIPES_SCRUBBER_LAYER (PIPES_LAYER - 0.02) +#define PIPES_SUPPLY_LAYER (PIPES_LAYER - 0.01) +#define PIPES_HE_LAYER (PIPES_LAYER + 0.01) + // Pipe flags #define PIPING_ALL_LAYER 1 //intended to connect with all layers, check for all instead of just one. #define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already. diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 8f67815583..637b450df6 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -88,17 +88,17 @@ #define slot_back 3 #define slot_belt 4 #define slot_wear_id 5 -#define slot_l_store 6 -#define slot_r_store 7 //Some things may reference this, try to keep it here +#define slot_s_store 6 +#define slot_l_store 7 +#define slot_r_store 8 //Some things may reference this, try to keep it here //Shown when inventory unhidden -#define slot_glasses 8 -#define slot_wear_mask 9 -#define slot_gloves 10 -#define slot_head 11 -#define slot_shoes 12 -#define slot_wear_suit 13 -#define slot_w_uniform 14 -#define slot_s_store 15 +#define slot_glasses 9 +#define slot_wear_mask 10 +#define slot_gloves 11 +#define slot_head 12 +#define slot_shoes 13 +#define slot_wear_suit 14 +#define slot_w_uniform 15 #define slot_l_ear 16 #define slot_r_ear 17 //Secret slots diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index 6b05896b8d..00e473fc2a 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -9,7 +9,6 @@ #define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources #define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone -//#define LIGHTING_LAYER 10 // drawing layer for lighting overlays #define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects #define LIGHTING_ICON_STATE_DARK "soft_dark" // Change between "soft_dark" and "dark" to swap soft darkvision diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index bb17deacf4..18c8cb1ca7 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -9,7 +9,7 @@ #define CANPARALYSE 0x4 #define CANPUSH 0x8 #define LEAPING 0x10 -#define HIDING 0x20 +#define HIDING 0x20 #define PASSEMOTES 0x40 // Mob has a cortical borer or holders inside of it that need to see emotes. #define GODMODE 0x1000 #define FAKEDEATH 0x2000 // Replaces stuff like changeling.changeling_fakedeath. diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm index 7938981454..eee6220f8b 100644 --- a/code/__defines/mobs_vr.dm +++ b/code/__defines/mobs_vr.dm @@ -24,5 +24,6 @@ #define SPECIES_VULPKANIN "Vulpkanin" #define SPECIES_XENOCHIMERA "Xenochimera" #define SPECIES_XENOHYBRID "Xenomorph Hybrid" -#define SPECIES_ZORREN_FLAT "Flatlander Zorren" +#define SPECIES_ZORREN_FLAT "Flatland Zorren" #define SPECIES_ZORREN_HIGH "Highlander Zorren" +#define SPECIES_CUSTOM "Custom Species" diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index b0d1667fc4..903c7d3d68 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -32,7 +32,7 @@ var/global/list/all_species[0] var/global/list/all_languages[0] var/global/list/language_keys[0] // Table of say codes for all languages var/global/list/whitelisted_species = list(SPECIES_HUMAN) // Species that require a whitelist check. -var/global/list/playable_species = list("Custom Species", SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious. +var/global/list/playable_species = list(SPECIES_CUSTOM, SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious. var/list/mannequins_ diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index f54d8d6b18..64393508af 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -11,6 +11,8 @@ var/global/list/positive_traits = list() // Positive custom species traits, inde var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup var/global/list/all_traits = list() // All of 'em at once (same instances) +var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base + //stores numeric player size options indexed by name var/global/list/player_sizes_list = list( "Macro" = RESIZE_HUGE, @@ -195,4 +197,14 @@ var/global/list/edible_trash = list(/obj/item/trash, if(0.1 to INFINITY) positive_traits[path] = instance - return 1 // Hooks must return 1 \ No newline at end of file + // Custom species icon bases + var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well. + for(var/species_name in playable_species) + if(species_name in blacklisted_icons) + continue + var/datum/species/S = all_species[species_name] + if(S.spawn_flags & SPECIES_IS_WHITELISTED) + continue + custom_species_bases += species_name + + return 1 // Hooks must return 1 diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 11a22d5938..aa2186ab94 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1226,20 +1226,21 @@ proc/is_hot(obj/item/W as obj) /* Checks if that loc and dir has a item on the wall +TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana */ var/list/WALLITEMS = list( - "/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom", - "/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank", - "/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign", - "/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control", - "/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller", - "/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth", - "/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment" + /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame, + /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio, + /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment ) /proc/gotwallitem(loc, dir) for(var/obj/O in loc) for(var/item in WALLITEMS) - if(istype(O, text2path(item))) + if(istype(O, item)) //Direction works sometimes if(O.dir == dir) return 1 @@ -1263,7 +1264,7 @@ var/list/WALLITEMS = list( //Some stuff is placed directly on the wallturf (signs) for(var/obj/O in get_step(loc, dir)) for(var/item in WALLITEMS) - if(istype(O, text2path(item))) + if(istype(O, item)) if(O.pixel_x == 0 && O.pixel_y == 0) return 1 return 0 diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index daa1123574..284b6623fc 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1,2 +1,4 @@ -#define isbelly(A) istype(A, /obj/belly) -#define isstorage(A) istype(A, /obj/item/weapon/storage) \ No newline at end of file +#define isbelly(A) istype(A, /obj/belly) +#define isstorage(A) istype(A, /obj/item/weapon/storage) +#define isitem(A) istype(A, /obj/item) +#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 1f0df80141..2ec9da3b27 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -11,7 +11,7 @@ using.icon = 'icons/mob/screen1_alien.dmi' using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") using.screen_loc = ui_acti - using.layer = 20 + using.layer = HUD_LAYER src.adding += using move_intent = using diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index c05426d95d..3a8d8696ce 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -51,7 +51,6 @@ var/list/global_huds = list( /obj/screen/global_screen screen_loc = ui_entire_screen - layer = 17 plane = PLANE_FULLSCREEN mouse_opacity = 0 @@ -74,7 +73,12 @@ var/list/global_huds = list( darksight.icon = null darksight.screen_loc = "1,1" darksight.plane = PLANE_LIGHTING - darksight.plane = LIGHTING_LAYER + 0.1 + + //Marks the center of the screen, for things like ventcrawl + centermarker = new /obj/screen() + centermarker.icon = 'icons/mob/screen1.dmi' + centermarker.icon_state = "centermarker" + centermarker.screen_loc = "CENTER,CENTER" //Marks the center of the screen, for things like ventcrawl centermarker = new /obj/screen() @@ -141,20 +145,17 @@ var/list/global_huds = list( for(i = 1, i <= 4, i++) O = vimpaired[i] O.icon_state = "dither50" - O.layer = 17 O.plane = PLANE_FULLSCREEN O.mouse_opacity = 0 O = darkMask[i] O.icon_state = "dither50" - O.layer = 17 O.plane = PLANE_FULLSCREEN O.mouse_opacity = 0 for(i = 5, i <= 8, i++) O = darkMask[i] O.icon_state = "black" - O.layer = 17 O.plane = PLANE_FULLSCREEN O.mouse_opacity = 2 diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index cab3e3bfca..f1b9165a26 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -11,13 +11,13 @@ blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health - blobpwrdisplay.layer = 20 + blobpwrdisplay.layer = HUD_LAYER blobhealthdisplay = new /obj/screen() blobhealthdisplay.name = "blob health" blobhealthdisplay.icon_state = "block" blobhealthdisplay.screen_loc = ui_internal - blobhealthdisplay.layer = 20 + blobhealthdisplay.layer = HUD_LAYER mymob.client.screen = list() @@ -36,7 +36,7 @@ using.icon = ui_style using.icon_state = "intent_"+mymob.a_intent using.screen_loc = ui_zonesel - using.layer = 20 + using.layer = HUD_LAYER src.adding += using action_intent = using @@ -50,7 +50,7 @@ using.name = "help" using.icon = ico using.screen_loc = ui_zonesel - using.layer = 21 + using.layer = HUD_LAYER+0.01 src.adding += using help_intent = using @@ -61,7 +61,7 @@ using.name = "disarm" using.icon = ico using.screen_loc = ui_zonesel - using.layer = 21 + using.layer = HUD_LAYER+0.01 src.adding += using disarm_intent = using @@ -72,7 +72,7 @@ using.name = "grab" using.icon = ico using.screen_loc = ui_zonesel - using.layer = 21 + using.layer = HUD_LAYER+0.01 src.adding += using grab_intent = using @@ -83,7 +83,7 @@ using.name = I_HURT using.icon = ico using.screen_loc = ui_zonesel - using.layer = 21 + using.layer = HUD_LAYER+0.01 src.adding += using hurt_intent = using @@ -93,9 +93,12 @@ return -/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD) - HUD.construct_hud() +/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD) + ..(HUD) + +// HUD.construct_hud() //Archaic. +/* /datum/hud/proc/construct_hud() var/constructtype @@ -109,30 +112,28 @@ constructtype = "harvester" if(constructtype) - mymob.fire = new /obj/screen() + mymob.fire.icon = 'icons/mob/screen1_construct.dmi' mymob.fire.icon_state = "fire0" mymob.fire.name = "fire" mymob.fire.screen_loc = ui_construct_fire - mymob.healths = new /obj/screen() mymob.healths.icon = 'icons/mob/screen1_construct.dmi' mymob.healths.icon_state = "[constructtype]_health0" mymob.healths.name = "health" mymob.healths.screen_loc = ui_construct_health - mymob.pullin = new /obj/screen() mymob.pullin.icon = 'icons/mob/screen1_construct.dmi' mymob.pullin.icon_state = "pull0" mymob.pullin.name = "pull" mymob.pullin.screen_loc = ui_construct_pull - mymob.zone_sel = new /obj/screen/zone_sel() + mymob.zone_sel.icon = 'icons/mob/screen1_construct.dmi' mymob.zone_sel.overlays.len = 0 mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]") - mymob.purged = new /obj/screen() + mymob.purged.icon = 'icons/mob/screen1_construct.dmi' mymob.purged.icon_state = "purge0" mymob.purged.name = "purged" @@ -142,3 +143,4 @@ mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged) mymob.client.screen += mymob.client.void +*/ diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index ae726ec481..dc414df11f 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -30,7 +30,7 @@ var/obj/screen/robot_inventory using.alpha = ui_alpha using.icon_state = "radio" using.screen_loc = ui_movi - using.layer = 20 + using.layer = HUD_LAYER src.adding += using //Module select @@ -43,7 +43,7 @@ var/obj/screen/robot_inventory using.alpha = ui_alpha using.icon_state = "inv1" using.screen_loc = ui_inv1 - using.layer = 20 + using.layer = HUD_LAYER src.adding += using mymob:inv1 = using @@ -55,7 +55,7 @@ var/obj/screen/robot_inventory using.alpha = ui_alpha using.icon_state = "inv2" using.screen_loc = ui_inv2 - using.layer = 20 + using.layer = HUD_LAYER src.adding += using mymob:inv2 = using @@ -67,7 +67,7 @@ var/obj/screen/robot_inventory using.alpha = ui_alpha using.icon_state = "inv3" using.screen_loc = ui_inv3 - using.layer = 20 + using.layer = HUD_LAYER src.adding += using mymob:inv3 = using @@ -81,7 +81,7 @@ var/obj/screen/robot_inventory using.alpha = ui_alpha using.icon_state = mymob.a_intent using.screen_loc = ui_acti - using.layer = 20 + using.layer = HUD_LAYER src.adding += using action_intent = using @@ -119,7 +119,7 @@ var/obj/screen/robot_inventory using.icon_state = "panel" using.alpha = ui_alpha using.screen_loc = ui_borg_panel - using.layer = 19 + using.layer = HUD_LAYER-0.01 src.adding += using //Store @@ -276,6 +276,6 @@ var/obj/screen/robot_inventory r.client.screen -= r.robot_modules_background /mob/living/silicon/robot/update_hud() - ..() if(modtype) - hands.icon_state = lowertext(modtype) \ No newline at end of file + hands.icon_state = lowertext(modtype) + ..() \ No newline at end of file diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index e2a4c28c6b..729330ddaa 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -92,9 +92,11 @@ if(spattack_min_range <= 1) SpecialAtkTarget() + else if(melee_damage_upper == 0 && istype(A,/mob/living)) custom_emote(1,"[pick(friendly)] [A]!") + else DoPunch(A) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index f08727abf3..26c1680421 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -68,7 +68,7 @@ var/const/tk_maxrange = 15 flags = NOBLUDGEON //item_state = null w_class = ITEMSIZE_NO_CONTAINER - layer = 20 + layer = HUD_LAYER var/last_throw = 0 var/atom/movable/focus = null diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index 2a6cd44d2c..9435a18bf0 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -6,11 +6,11 @@ if(config.kick_inactive) for(last_object in clients) var/client/C = last_object - if(C.is_afk(config.kick_inactive MINUTES)) - if(!istype(C.mob, /mob/observer/dead) && !istype(C.mob, /mob/new_player)) - to_chat(C,"You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.") - var/information + if(C.is_afk(config.kick_inactive MINUTES) && !C.holder) // VOREStation Edit - Allow admins to idle + to_chat(C,"You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.") + var/information + if(C.mob) if(ishuman(C.mob)) var/job var/mob/living/carbon/human/H = C.mob @@ -27,10 +27,10 @@ else if(issilicon(C.mob)) information = " while a silicon." - var/adminlinks - adminlinks = " (JMP|CRYO)" + var/adminlinks + adminlinks = " (JMP|CRYO)" - log_and_message_admins("being kicked for AFK[information][adminlinks]", C.mob) + log_and_message_admins("being kicked for AFK[information][adminlinks]", C.mob) - qdel(C) + qdel(C) SCHECK diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm index f9fd57f788..e39b5e81b8 100644 --- a/code/controllers/Processes/planet.dm +++ b/code/controllers/Processes/planet.dm @@ -47,7 +47,8 @@ var/datum/controller/process/planet/planet_controller = null //Weather style needs redrawing if(P.needs_work & PLANET_PROCESS_WEATHER) P.needs_work &= ~PLANET_PROCESS_WEATHER - var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state, layer = LIGHTING_LAYER - 1) + var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state) + new_overlay.plane = PLANE_PLANETLIGHTING //Redraw weather icons for(var/T in P.planet_floors) var/turf/simulated/turf = T diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 7fb3a56c61..d7a91c9b4f 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -234,7 +234,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle name = "star" var/speed = 10 var/direction = SOUTH - layer = 2 // TURF_LAYER + layer = TURF_LAYER + plane = TURF_PLANE /obj/effect/bgstar/New() ..() diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index ed4602f048..ef0173c33a 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -9,7 +9,7 @@ SUBSYSTEM_DEF(air) name = "Air" init_order = INIT_ORDER_AIR - priority = 20 + priority = 35 wait = 2 SECONDS // seconds (We probably can speed this up actually) flags = SS_BACKGROUND // TODO - Should this really be background? It might be important. runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystems/airflow.dm b/code/controllers/subsystems/airflow.dm index 9db8138826..c98a02a5ce 100644 --- a/code/controllers/subsystems/airflow.dm +++ b/code/controllers/subsystems/airflow.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(airflow) wait = 2 flags = SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - priority = 15 + priority = 30 var/list/processing = list() var/list/currentrun = list() @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(airflow) continue else if (target.airflow_process_delay) target.airflow_process_delay = 0 - + target.airflow_speed = min(target.airflow_speed, 15) target.airflow_speed -= vsc.airflow_speed_decay if (!target.airflow_skip_speedcheck) @@ -89,7 +89,7 @@ SUBSYSTEM_DEF(airflow) if (MC_TICK_CHECK) return continue - + step_towards(target, target.airflow_dest) var/mob/M = target if (ismob(target) && M.client) @@ -98,7 +98,7 @@ SUBSYSTEM_DEF(airflow) if (MC_TICK_CHECK) return -#undef CLEAR_OBJECT +#undef CLEAR_OBJECT /atom/movable var/tmp/airflow_xo @@ -129,9 +129,9 @@ SUBSYSTEM_DEF(airflow) if (airflow_falloff < 1) airflow_dest = null return FALSE - - airflow_speed = min(max(n * (9 / airflow_falloff), 1), 9) - + + airflow_speed = min(max(n * (9 / airflow_falloff), 1), 9) + airflow_od = 0 if (!density) @@ -154,7 +154,7 @@ SUBSYSTEM_DEF(airflow) /atom/movable/proc/RepelAirflowDest(n) if (!prepare_airflow(n)) return - + airflow_xo = -(airflow_dest.x - src.x) airflow_yo = -(airflow_dest.y - src.y) diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm index 2857476027..d041558a0c 100644 --- a/code/datums/ghost_query.dm +++ b/code/datums/ghost_query.dm @@ -132,3 +132,9 @@ question = "A curious explorer has touched a mysterious rune. \ Would you like to play as the creature it summons?" cutoff_number = 1 + +/datum/ghost_query/cursedblade + role_name = "Cursed Sword" + question = "A cursed blade has been discovered by a curious explorer. \ + Would you like to play as the soul imprisoned within?" + cutoff_number = 1 diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 3576c66dfe..d2f99a347b 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -1,5 +1,5 @@ //wrapper -/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit new /datum/teleport/instant/science(arglist(args)) return @@ -12,15 +12,16 @@ var/soundin //soundfile to play before teleportation var/soundout //soundfile to play after teleportation var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) + var/local = TRUE //VOREStation Add - If false, can teleport from/to any z-level -/datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit ..() if(!initTeleport(arglist(args))) return 0 return 1 -/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout) +/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout,local) //VOREStation Edit if(!setTeleatom(ateleatom)) return 0 if(!setDestination(adestination)) @@ -30,6 +31,7 @@ setEffects(aeffectin,aeffectout) setForceTeleport(afteleport) setSounds(asoundin,asoundout) + src.local = local // VOREStation Add return 1 //must succeed @@ -186,7 +188,7 @@ return 0 */ //VOREStation Removal End //VOREStation Edit Start - if(destination.z in using_map.player_levels) + if(!local || (destination.z in using_map.player_levels)) //VOREStation Edit return 1 if(istype(teleatom, /mob/living)) to_chat(teleatom, "The portal refuses to carry you that far away!") diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm index 1cb73d6ad9..eba2570c18 100644 --- a/code/datums/helper_datums/teleport_vr.dm +++ b/code/datums/helper_datums/teleport_vr.dm @@ -1,13 +1,17 @@ /datum/teleport/proc/try_televore() //Destination is in a belly - if(isbelly(destination.loc)) + if(isbelly(destination.loc) && isliving(teleatom)) + var/mob/living/L = teleatom var/obj/belly/B = destination.loc - + + if(!L.can_be_drop_prey) //Overloading this as a pref for 'want to be unexpectedly eaten' + return FALSE + teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything. playSpecials(destination,effectout,soundout) teleatom.forceMove(B) - return 1 + return TRUE //No fun! - return 0 + return FALSE \ No newline at end of file diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm index 3b227a2612..1fdd020fcf 100644 --- a/code/datums/outfits/jobs/medical.dm +++ b/code/datums/outfits/jobs/medical.dm @@ -23,8 +23,8 @@ name = OUTFIT_JOB_NAME("Medical Doctor") uniform = /obj/item/clothing/under/rank/medical suit = /obj/item/clothing/suit/storage/toggle/labcoat - l_hand = /obj/item/weapon/storage/firstaid/adv - r_pocket = /obj/item/device/healthanalyzer + l_hand = /obj/item/weapon/storage/firstaid/regular + r_pocket = /obj/item/device/flashlight/pen id_type = /obj/item/weapon/card/id/medical/doctor /decl/hierarchy/outfit/job/medical/doctor/emergency_physician @@ -94,7 +94,7 @@ uniform = /obj/item/clothing/under/rank/medical/scrubs/black suit = /obj/item/clothing/suit/storage/toggle/fr_jacket shoes = /obj/item/clothing/shoes/boots/jackboots - l_hand = /obj/item/weapon/storage/firstaid/adv + l_hand = /obj/item/weapon/storage/firstaid/regular belt = /obj/item/weapon/storage/belt/medical/emt pda_slot = slot_l_store id_type = /obj/item/weapon/card/id/medical/paramedic diff --git a/code/datums/supplypacks/costumes_vr.dm b/code/datums/supplypacks/costumes_vr.dm new file mode 100644 index 0000000000..fd8921ba77 --- /dev/null +++ b/code/datums/supplypacks/costumes_vr.dm @@ -0,0 +1,264 @@ +/datum/supply_packs/costumes/xenowear_vr + name = "Xenowear crate" + contains = list( + /obj/item/clothing/shoes/footwraps, + /obj/item/clothing/shoes/boots/jackboots/toeless, + /obj/item/clothing/shoes/boots/workboots/toeless, + /obj/item/clothing/suit/tajaran/furs, + /obj/item/clothing/head/tajaran/scarf, + /obj/item/clothing/suit/unathi/robe, + /obj/item/clothing/suit/unathi/mantle, + /obj/item/clothing/under/permit, + /obj/item/clothing/under/vox/vox_casual, + /obj/item/clothing/under/vox/vox_robes, + /obj/item/clothing/under/harness, + /obj/item/clothing/under/skirt/loincloth, + /obj/item/clothing/gloves/vox + ) + cost = 100 + containertype = /obj/structure/closet/crate + containername = "Xenowear crate" + +/datum/supply_packs/costumes/tesh_smocks_vr + name = "Teshari smocks" + contains = list( + /obj/item/clothing/under/seromi/smock, + /obj/item/clothing/under/seromi/smock/rainbow, + /obj/item/clothing/under/seromi/smock/red, + /obj/item/clothing/under/seromi/smock/white, + /obj/item/clothing/under/seromi/smock/yellow + ) + cost = 25 + containertype = /obj/structure/closet/crate + containername = "Teshari smocks crate" + +/datum/supply_packs/randomised/costumes/tesh_coats_vr + name = "Teshari undercoats" + num_contained = 4 + contains = list( + /obj/item/clothing/under/seromi/undercoat/blue_grey, + /obj/item/clothing/under/seromi/undercoat/brown_grey, + /obj/item/clothing/under/seromi/undercoat/green_grey, + /obj/item/clothing/under/seromi/undercoat/lightgrey_grey, + /obj/item/clothing/under/seromi/undercoat/orange, + /obj/item/clothing/under/seromi/undercoat/orange_grey, + /obj/item/clothing/under/seromi/undercoat/pink_grey, + /obj/item/clothing/under/seromi/undercoat/purple_grey, + /obj/item/clothing/under/seromi/undercoat/rainbow, + /obj/item/clothing/under/seromi/undercoat/red_grey, + /obj/item/clothing/under/seromi/undercoat/white_grey, + /obj/item/clothing/under/seromi/undercoat/yellow_grey + ) + cost = 20 + containertype = /obj/structure/closet/crate + containername = "Teshari undercoats crate" + +/datum/supply_packs/randomised/costumes/tesh_coats_b_vr + name = "Teshari undercoats (black)" + num_contained = 4 + contains = list( + /obj/item/clothing/under/seromi/undercoat/black, + /obj/item/clothing/under/seromi/undercoat/black_blue, + /obj/item/clothing/under/seromi/undercoat/black_brown, + /obj/item/clothing/under/seromi/undercoat/black_green, + /obj/item/clothing/under/seromi/undercoat/black_grey, + /obj/item/clothing/under/seromi/undercoat/black_lightgrey, + /obj/item/clothing/under/seromi/undercoat/black_midgrey, + /obj/item/clothing/under/seromi/undercoat/black_orange, + /obj/item/clothing/under/seromi/undercoat/black_pink, + /obj/item/clothing/under/seromi/undercoat/black_purple, + /obj/item/clothing/under/seromi/undercoat/black_red, + /obj/item/clothing/under/seromi/undercoat/black_white, + /obj/item/clothing/under/seromi/undercoat/black_yellow + ) + cost = 20 + containertype = /obj/structure/closet/crate + containername = "Teshari undercoats crate" + +/datum/supply_packs/randomised/costumes/tesh_cloaks_vr + name = "Teshari cloaks" + num_contained = 4 + contains = list( + /obj/item/clothing/suit/storage/seromi/cloak/blue_grey, + /obj/item/clothing/suit/storage/seromi/cloak/brown_grey, + /obj/item/clothing/suit/storage/seromi/cloak/green_grey, + /obj/item/clothing/suit/storage/seromi/cloak/lightgrey_grey, + /obj/item/clothing/suit/storage/seromi/cloak/orange, + /obj/item/clothing/suit/storage/seromi/cloak/orange_grey, + /obj/item/clothing/suit/storage/seromi/cloak/pink_grey, + /obj/item/clothing/suit/storage/seromi/cloak/purple_grey, + /obj/item/clothing/suit/storage/seromi/cloak/rainbow, + /obj/item/clothing/suit/storage/seromi/cloak/red_grey, + /obj/item/clothing/suit/storage/seromi/cloak/white_grey, + /obj/item/clothing/suit/storage/seromi/cloak/yellow_grey + ) + cost = 40 + containertype = /obj/structure/closet/crate + containername = "Teshari cloaks crate" + +/datum/supply_packs/randomised/costumes/tesh_cloaks_b_vr + name = "Teshari cloaks (black)" + num_contained = 4 + contains = list( + /obj/item/clothing/suit/storage/seromi/cloak/black, + /obj/item/clothing/suit/storage/seromi/cloak/black_blue, + /obj/item/clothing/suit/storage/seromi/cloak/black_brown, + /obj/item/clothing/suit/storage/seromi/cloak/black_green, + /obj/item/clothing/suit/storage/seromi/cloak/black_grey, + /obj/item/clothing/suit/storage/seromi/cloak/black_lightgrey, + /obj/item/clothing/suit/storage/seromi/cloak/black_midgrey, + /obj/item/clothing/suit/storage/seromi/cloak/black_orange, + /obj/item/clothing/suit/storage/seromi/cloak/black_pink, + /obj/item/clothing/suit/storage/seromi/cloak/black_purple, + /obj/item/clothing/suit/storage/seromi/cloak/black_red, + /obj/item/clothing/suit/storage/seromi/cloak/black_white, + /obj/item/clothing/suit/storage/seromi/cloak/black_yellow + ) + cost = 40 + containertype = /obj/structure/closet/crate + containername = "Teshari cloaks crate" + +/datum/supply_packs/costumes/utility_vr + name = "Utility uniforms" + contains = list( + /obj/item/clothing/under/utility, + /obj/item/clothing/under/utility/blue, + /obj/item/clothing/under/utility/grey + ) + cost = 30 + containertype = /obj/structure/closet/crate + containername = "Utility uniforms crate" + +/datum/supply_packs/costumes/skirts_vr + name = "Skirts crate" + contains = list( + /obj/item/clothing/under/skirt, + /obj/item/clothing/under/skirt/blue, + /obj/item/clothing/under/skirt/denim, + /obj/item/clothing/under/skirt/khaki, + /obj/item/clothing/under/skirt/outfit, + /obj/item/clothing/under/skirt/red, + /obj/item/clothing/under/skirt/swept, + /obj/item/clothing/under/skirt/outfit/plaid_blue, + /obj/item/clothing/under/skirt/outfit/plaid_purple, + /obj/item/clothing/under/skirt/outfit/plaid_red + ) + cost = 40 + containertype = /obj/structure/closet/crate + containername = "Skirts crate" + +/datum/supply_packs/costumes/varsity_vr + name = "Varsity jackets" + contains = list( + /obj/item/clothing/suit/varsity, + /obj/item/clothing/suit/varsity/blue, + /obj/item/clothing/suit/varsity/brown, + /obj/item/clothing/suit/varsity/green, + /obj/item/clothing/suit/varsity/purple, + /obj/item/clothing/suit/varsity/red + ) + cost = 60 + containertype = /obj/structure/closet/crate + containername = "Varsity jackets crate" + +/datum/supply_packs/randomised/costumes/leathergear_vr + name = "Leather gear" + num_contained = 5 + contains = list( + /obj/item/clothing/suit/leathercoat, + /obj/item/clothing/suit/storage/leather_jacket_alt, + /obj/item/clothing/suit/storage/toggle/leather_jacket, + /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless, + /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen, + /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless, + /obj/item/clothing/under/pants/chaps, + /obj/item/clothing/under/pants/chaps/black, + /obj/item/clothing/under/harness, + /obj/item/clothing/shoes/leather, + /obj/item/clothing/shoes/boots/jungle, + /obj/item/clothing/shoes/boots/jackboots, + /obj/item/clothing/shoes/boots/cowboy, + /obj/item/clothing/shoes/boots/cowboy/classic, + /obj/item/clothing/shoes/boots/cowboy/snakeskin, + /obj/item/clothing/accessory/chaps, + /obj/item/clothing/accessory/chaps/black, + /obj/item/clothing/accessory/collar/spike, + /obj/item/clothing/gloves/fingerless, + /obj/item/clothing/gloves/botanic_leather, + /obj/item/clothing/head/cowboy_hat, + /obj/item/clothing/head/cowboy_hat/black + ) + cost = 50 + containertype = /obj/structure/closet/crate + containername = "Leather gear crate" + +/datum/supply_packs/costumes/eyewear_vr + name = "Eyewear crate" + contains = list( + /obj/item/clothing/glasses/eyepatch, + /obj/item/clothing/glasses/fakesunglasses, + /obj/item/clothing/glasses/fakesunglasses/aviator, + /obj/item/clothing/glasses/fluff/science_proper, + /obj/item/clothing/glasses/fluff/spiffygogs, + /obj/item/clothing/glasses/gglasses, + /obj/item/clothing/glasses/monocle, + /obj/item/clothing/glasses/regular, + /obj/item/clothing/glasses/regular/hipster, + /obj/item/clothing/glasses/regular/scanners, + /obj/item/clothing/glasses/threedglasses + ) + cost = 50 + containertype = /obj/structure/closet/crate + containername = "Eyewear crate" + +/datum/supply_packs/randomised/costumes/gloves_vr + name = "Gloves crate" + num_contained = 4 + contains = list( + /obj/item/clothing/gloves/black, + /obj/item/clothing/gloves/blue, + /obj/item/clothing/gloves/botanic_leather, + /obj/item/clothing/gloves/brown, + /obj/item/clothing/gloves/evening, + /obj/item/clothing/gloves/fingerless, + /obj/item/clothing/gloves/fyellow, + /obj/item/clothing/gloves/green, + /obj/item/clothing/gloves/grey, + /obj/item/clothing/gloves/light_brown, + /obj/item/clothing/gloves/orange, + /obj/item/clothing/gloves/purple, + /obj/item/clothing/gloves/rainbow, + /obj/item/clothing/gloves/red, + /obj/item/clothing/gloves/white + ) + cost = 40 + containertype = /obj/structure/closet/crate + containername = "Gloves crate" + +/datum/supply_packs/randomised/costumes/boots_vr + name = "Boots crate" + num_contained = 3 + contains = list( + /obj/item/clothing/shoes/boots/workboots, + /obj/item/clothing/shoes/boots/cowboy, + /obj/item/clothing/shoes/boots/cowboy/classic, + /obj/item/clothing/shoes/boots/cowboy/snakeskin, + /obj/item/clothing/shoes/boots/duty, + /obj/item/clothing/shoes/boots/jackboots, + /obj/item/clothing/shoes/boots/jungle, + /obj/item/clothing/shoes/boots/winter + ) + cost = 60 + containertype = /obj/structure/closet/crate + containername = "Boots crate" + +/datum/supply_packs/costumes/taurbags + name = "Saddlebags crate" + contains = list( + /obj/item/weapon/storage/backpack/saddlebag_common, + /obj/item/weapon/storage/backpack/saddlebag_common/robust, + /obj/item/weapon/storage/backpack/saddlebag_common/vest + ) + cost = 60 + containertype = /obj/structure/closet/crate + containername = "Saddlebags crate" \ No newline at end of file diff --git a/code/datums/supplypacks/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm new file mode 100644 index 0000000000..1f69ef1151 --- /dev/null +++ b/code/datums/supplypacks/hospitality_vr.dm @@ -0,0 +1,84 @@ +/datum/supply_packs/randomised/hospitality/burgers_vr + num_contained = 5 + contains = list( + /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger, + /obj/item/weapon/reagent_containers/food/snacks/cheeseburger, + /obj/item/weapon/reagent_containers/food/snacks/jellyburger, + /obj/item/weapon/reagent_containers/food/snacks/tofuburger, + /obj/item/weapon/reagent_containers/food/snacks/fishburger + ) + name = "Burger crate" + cost = 25 + containertype = /obj/structure/closet/crate/freezer + containername = "Burger crate" +/* +/datum/supply_packs/randomised/hospitality/bakery_vr + num_contained = 5 + contains = list( + /obj/item/weapon/reagent_containers/food/snacks/baguette, + /obj/item/weapon/reagent_containers/food/snacks/appletart, + /obj/item/weapon/reagent_containers/food/snacks/berrymuffin, + /obj/item/weapon/reagent_containers/food/snacks/bunbun, + /obj/item/weapon/reagent_containers/food/snacks/cherrypie, + /obj/item/weapon/reagent_containers/food/snacks/cookie, + /obj/item/weapon/reagent_containers/food/snacks/croissant, + /obj/item/weapon/reagent_containers/food/snacks/donut/normal, + /obj/item/weapon/reagent_containers/food/snacks/donut/jelly, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/muffin, + /obj/item/weapon/reagent_containers/food/snacks/pie, + /obj/item/weapon/reagent_containers/food/snacks/plump_pie, + /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit, + /obj/item/weapon/reagent_containers/food/snacks/poppypretzel, + /obj/item/weapon/reagent_containers/food/snacks/sugarcookie, + /obj/item/weapon/reagent_containers/food/snacks/waffles + ) + name = "Bakery products crate" + cost = 25 + containertype = /obj/structure/closet/crate/freezer + containername = "Bakery products crate" + +/datum/supply_packs/randomised/hospitality/cakes_vr + num_contained = 2 + contains = list( + /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake + ) + name = "Cake crate" + cost = 100 + containertype = /obj/structure/closet/crate/freezer + containername = "Cake crate" + +/datum/supply_packs/randomised/hospitality/mexican_vr + num_contained = 5 + contains = list( + /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito, + /obj/item/weapon/reagent_containers/food/snacks/enchiladas, + /obj/item/weapon/reagent_containers/food/snacks/meatburrito, + /obj/item/weapon/reagent_containers/food/snacks/taco + ) + name = "Mexican takeout crate" + cost = 50 + containertype = /obj/structure/closet/crate/freezer + containername = "Mexican takeout crate" +*/ +/datum/supply_packs/randomised/hospitality/asian_vr + num_contained = 5 + contains = list( + /obj/item/weapon/reagent_containers/food/snacks/generalschicken, + /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup + ) + name = "Chinese takeout crate" + cost = 50 + containertype = /obj/structure/closet/crate/freezer + containername = "Chinese takeout crate" + +/datum/supply_packs/randomised/hospitality/pizza + cost = 50 \ No newline at end of file diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm index 7bfdaaeeb6..7f801ea1b3 100644 --- a/code/datums/supplypacks/recreation.dm +++ b/code/datums/supplypacks/recreation.dm @@ -39,6 +39,7 @@ name = "Arts and Crafts supplies" contains = list( /obj/item/weapon/storage/fancy/crayons, + /obj/item/weapon/storage/fancy/markers, /obj/item/device/camera, /obj/item/device/camera_film = 2, /obj/item/weapon/storage/photo_album, diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index e95094428e..cf12b4815b 100644 --- a/code/datums/supplypacks/recreation_vr.dm +++ b/code/datums/supplypacks/recreation_vr.dm @@ -18,7 +18,7 @@ /obj/item/stack/cable_coil/random, /obj/item/clothing/accessory/collar/shock, /obj/item/clothing/suit/straight_jacket, - /obj/item/weapon/handcuffs/legcuffs, + /obj/item/weapon/handcuffs/legcuffs/fuzzy, /obj/item/weapon/melee/fluff/holochain/mass, /obj/item/weapon/material/twohanded/fluff/riding_crop, /obj/item/clothing/under/fluff/latexmaid @@ -38,4 +38,33 @@ ) cost = 50 containertype = /obj/structure/closet/crate - containername = "wolfgirl cosplay crate" \ No newline at end of file + containername = "wolfgirl cosplay crate" + +/datum/supply_packs/randomised/recreation/figures_vr + name = "Action figures crate" + num_contained = 5 + contains = list( + /obj/random/action_figure + ) + cost = 200 + containertype = /obj/structure/closet/crate + containername = "Action figures crate" + +/datum/supply_packs/recreation/characters_vr + name = "Tabletop miniatures" + contains = list( + /obj/item/weapon/storage/box/characters + ) + containertype = /obj/structure/closet/crate + containername = "Tabletop miniatures crate" + cost = 50 + +/datum/supply_packs/randomised/recreation/plushies_vr + name = "Plushies crate" + num_contained = 3 + contains = list( + /obj/random/plushie + ) + cost = 60 + containertype = /obj/structure/closet/crate + containername = "Plushies crate" \ No newline at end of file diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 7cf17b5640..16c27f82c7 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -33,7 +33,9 @@ if(!antag_indicator || !other.current || !recipient.current) return var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator - return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator, layer = LIGHTING_LAYER+0.1) + var/image/returnimage = image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator) + returnimage.plane = PLANE_LIGHTING_ABOVE + return returnimage /datum/antagonist/proc/update_all_icons() if(!antag_indicator) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 6281bd9e42..70c4b010b4 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -13,82 +13,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station */ - - -/area - var/fire = null - var/atmos = 1 - var/atmosalm = 0 - var/poweralm = 1 - var/party = null - level = null - name = "Unknown" - icon = 'icons/turf/areas.dmi' - icon_state = "unknown" - layer = 10 - luminosity = 0 - mouse_opacity = 0 - var/lightswitch = 1 - - var/eject = null - - var/debug = 0 - var/requires_power = 1 - var/always_unpowered = 0 //this gets overriden to 1 for space in area/New() - - var/power_equip = 1 - var/power_light = 1 - var/power_environ = 1 - var/music = null - var/used_equip = 0 - var/used_light = 0 - var/used_environ = 0 - - var/has_gravity = 1 - var/obj/machinery/power/apc/apc = null - var/no_air = null -// var/list/lights // list of all lights on this area - var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area - var/firedoors_closed = 0 - var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') - var/list/forced_ambience = null - var/sound_env = STANDARD_STATION - var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf - -/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ -/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ -var/list/teleportlocs = list() - -/hook/startup/proc/setupTeleportLocs() - for(var/area/AR in world) - if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue - if(teleportlocs.Find(AR.name)) continue - var/turf/picked = pick(get_area_turfs(AR.type)) - if (picked.z in using_map.station_levels) - teleportlocs += AR.name - teleportlocs[AR.name] = AR - - teleportlocs = sortAssoc(teleportlocs) - - return 1 - -var/list/ghostteleportlocs = list() - -/hook/startup/proc/setupGhostTeleportLocs() - for(var/area/AR in world) - if(ghostteleportlocs.Find(AR.name)) continue - if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom)) - ghostteleportlocs += AR.name - ghostteleportlocs[AR.name] = AR - var/turf/picked = pick(get_area_turfs(AR.type)) - if (picked.z in using_map.player_levels) - ghostteleportlocs += AR.name - ghostteleportlocs[AR.name] = AR - - ghostteleportlocs = sortAssoc(ghostteleportlocs) - - return 1 - /*-----------------------------------------------------------------------------*/ ///////// @@ -358,6 +282,7 @@ area/space/atmosalert() /area/shuttle/trade name = "\improper Trade Station" icon_state = "red" + dynamic_lighting = 0 /area/shuttle/trade/centcom name = "\improper Trade Shuttle CentCom" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 4673d0ef26..ba929f61ee 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -1,15 +1,49 @@ // Areas.dm - - -// === /area + var/fire = null + var/atmos = 1 + var/atmosalm = 0 + var/poweralm = 1 + var/party = null + level = null + name = "Unknown" + icon = 'icons/turf/areas.dmi' + icon_state = "unknown" + plane = PLANE_LIGHTING_ABOVE //In case we color them + luminosity = 0 + mouse_opacity = 0 + var/lightswitch = 1 + + var/eject = null + + var/debug = 0 + var/requires_power = 1 + var/always_unpowered = 0 //this gets overriden to 1 for space in area/New() + + var/power_equip = 1 + var/power_light = 1 + var/power_environ = 1 + var/music = null + var/used_equip = 0 + var/used_light = 0 + var/used_environ = 0 + + var/has_gravity = 1 + var/obj/machinery/power/apc/apc = null + var/no_air = null +// var/list/lights // list of all lights on this area + var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area + var/firedoors_closed = 0 + var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') + var/list/forced_ambience = null + var/sound_env = STANDARD_STATION + var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf var/global/global_uid = 0 var/uid /area/New() icon_state = "" - layer = 10 uid = ++global_uid all_areas += src @@ -275,7 +309,7 @@ var/list/mob/living/forced_ambiance_list = new chosen_ambiance = sound(chosen_ambiance, repeat = 1, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE_FORCED) L << chosen_ambiance else - L << sound(null, channel = 1) + L << sound(null, channel = CHANNEL_AMBIENCE_FORCED) else if(src.ambience.len && prob(35)) if((world.time >= L.client.played + 600)) var/sound = pick(ambience) @@ -345,3 +379,37 @@ var/list/mob/living/forced_ambiance_list = new /area/drop_location() CRASH("Bad op: area/drop_location() called") + +/*Adding a wizard area teleport list because motherfucking lag -- Urist*/ +/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ +var/list/teleportlocs = list() + +/hook/startup/proc/setupTeleportLocs() + for(var/area/AR in world) + if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue + if(teleportlocs.Find(AR.name)) continue + var/turf/picked = pick(get_area_turfs(AR.type)) + if (picked.z in using_map.station_levels) + teleportlocs += AR.name + teleportlocs[AR.name] = AR + + teleportlocs = sortAssoc(teleportlocs) + + return 1 + +var/list/ghostteleportlocs = list() + +/hook/startup/proc/setupGhostTeleportLocs() + for(var/area/AR in world) + if(ghostteleportlocs.Find(AR.name)) continue + if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom)) + ghostteleportlocs += AR.name + ghostteleportlocs[AR.name] = AR + var/turf/picked = pick(get_area_turfs(AR.type)) + if (picked.z in using_map.player_levels) + ghostteleportlocs += AR.name + ghostteleportlocs[AR.name] = AR + + ghostteleportlocs = sortAssoc(ghostteleportlocs) + + return 1 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 9741abe957..983c92cdf5 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,5 +1,5 @@ /atom - layer = 2 + layer = TURF_LAYER //This was here when I got here. Why though? var/level = 2 var/flags = 0 var/list/fingerprints diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0cd09b8a57..48ffacb335 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,5 @@ /atom/movable - layer = 3 + layer = OBJ_LAYER appearance_flags = TILE_BOUND|PIXEL_SCALE var/last_move = null var/anchored = 0 @@ -18,6 +18,7 @@ var/icon_scale = 1 // Used to scale icons up or down in update_transform(). var/old_x = 0 var/old_y = 0 + var/datum/riding/riding_datum //VOREStation Add - Moved from /obj/vehicle /atom/movable/Destroy() . = ..() @@ -37,6 +38,7 @@ if (pulledby.pulling == src) pulledby.pulling = null pulledby = null + qdel_null(riding_datum) //VOREStation Add /atom/movable/Bump(var/atom/A, yes) if(src.throwing) diff --git a/code/game/atoms_movable_vr.dm b/code/game/atoms_movable_vr.dm new file mode 100644 index 0000000000..0cc6d144be --- /dev/null +++ b/code/game/atoms_movable_vr.dm @@ -0,0 +1,12 @@ +/atom/movable/proc/Bump_vr(var/atom/A, yes) + return + +/atom/movable/set_dir(newdir) + . = ..(newdir) + if(riding_datum) + riding_datum.handle_vehicle_offsets() + +/atom/movable/relaymove(mob/user, direction) + . = ..() + if(riding_datum) + riding_datum.handle_ride(user, direction) diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm new file mode 100644 index 0000000000..f8ff57fc35 --- /dev/null +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -0,0 +1,698 @@ +//cast_method flags, needs to be up to date with Technomancer's. They were, for some reason, not working outside it. +#define CAST_USE 1 // Clicking the spell in your hand. +#define CAST_MELEE 2 // Clicking an atom in melee range. +#define CAST_RANGED 4 // Clicking an atom beyond melee range. +#define CAST_THROW 8 // Throwing the spell and hitting an atom. +#define CAST_COMBINE 16 // Clicking another spell with this spell. +#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. + +//Aspects +#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. +#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. +#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. +#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. +#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. +#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. +#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. +#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. +#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. +#define ASPECT_EMP "emp" //Unused now. +#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. +#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. +#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. + +//////////////////////////////Construct Spells///////////////////////// + +proc/findNullRod(var/atom/target) + if(istype(target,/obj/item/weapon/nullrod)) + return 1 + else if(target.contents) + for(var/atom/A in target.contents) + if(findNullRod(A)) + return 1 + return 0 + +/spell/aoe_turf/conjure/construct + name = "Artificer" + desc = "This spell conjures a construct which may be controlled by Shades" + + school = "conjuration" + charge_max = 600 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/structure/constructshell) + + hud_state = "artificer" + +/spell/aoe_turf/conjure/construct/lesser + charge_max = 1800 + summon_type = list(/obj/structure/constructshell/cult) + hud_state = "const_shell" + override_base = "const" + +/spell/aoe_turf/conjure/floor + name = "Floor Construction" + desc = "This spell constructs a cult floor" + + charge_max = 20 + spell_flags = Z2NOCAST | CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + summon_type = list(/turf/simulated/floor/cult) + + hud_state = "const_floor" + +/spell/aoe_turf/conjure/floor/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) + animation.icon_state = "cultfloor" + flick("cultfloor",animation) + spawn(10) + qdel(animation) + +/spell/aoe_turf/conjure/wall + name = "Lesser Construction" + desc = "This spell constructs a cult wall" + + charge_max = 100 + spell_flags = Z2NOCAST | CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + summon_type = list(/turf/simulated/wall/cult) + + hud_state = "const_wall" + +/spell/aoe_turf/conjure/wall/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) + animation.icon_state = "cultwall" + flick("cultwall",animation) + spawn(10) + qdel(animation) + +/spell/aoe_turf/conjure/wall/reinforced + name = "Greater Construction" + desc = "This spell constructs a reinforced metal wall" + + charge_max = 300 + spell_flags = Z2NOCAST + invocation = "none" + invocation_type = SpI_NONE + range = 0 + cast_delay = 50 + + summon_type = list(/turf/simulated/wall/r_wall) + +/spell/aoe_turf/conjure/soulstone + name = "Summon Soulstone" + desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space" + + charge_max = 3000 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/item/device/soulstone) + + hud_state = "const_stone" + override_base = "const" + +/spell/aoe_turf/conjure/pylon + name = "Red Pylon" + desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source." + + charge_max = 200 + spell_flags = CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/structure/cult/pylon) + + hud_state = "const_pylon" + +/spell/aoe_turf/conjure/pylon/cast(list/targets) + ..() + var/turf/spawn_place = pick(targets) + for(var/obj/structure/cult/pylon/P in spawn_place.contents) + if(P.isbroken) + P.repair(usr) + continue + return + +/spell/aoe_turf/conjure/door + name = "Stone Door" + desc = "This spell conjures a massive stone door." + + charge_max = 100 + spell_flags = CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/structure/simple_door/cult) + + hud_state = "const_door" + +/spell/aoe_turf/conjure/grille + name = "Arcane Grille" + desc = "This spell conjures an airtight grille." + + charge_max = 100 + spell_flags = CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + summon_type = list(/obj/structure/grille/cult) + + hud_state = "const_grille" + +/spell/aoe_turf/conjure/forcewall/lesser + name = "Shield" + desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats" + + charge_max = 300 + spell_flags = 0 + invocation = "none" + invocation_type = SpI_NONE + range = 0 + summon_type = list(/obj/effect/forcefield/cult) + duration = 200 + + hud_state = "const_juggwall" + +//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it. +/obj/effect/forcefield/cult + desc = "That eerie looking obstacle seems to have been pulled from another dimension through sheer force" + name = "Juggerwall" + icon = 'icons/effects/effects.dmi' + icon_state = "m_shield_cult" + light_color = "#B40000" + light_range = 2 + +/obj/effect/forcefield/cult/cultify() + return + +/spell/aoe_turf/knock/harvester + name = "Force Doors" + desc = "Mortal portals are no match for your occult might." + + spell_flags = CONSTRUCT_CHECK + + charge_max = 100 + invocation = "" + invocation_type = "silent" + range = 4 + + hud_state = "const_knock" + +/spell/aoe_turf/knock/harvester/cast(list/targets) +/* for(var/turf/T in targets) //Disintigrating doors is bad, okay. + for(var/obj/machinery/door/door in T.contents) + spawn door.cultify() + return */ + for(var/turf/T in targets) + for(var/obj/machinery/door/door in T.contents) + spawn(1) + if(istype(door,/obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/AL = door + AL.locked = 0 //The spirits of the damned care not for your locks. + AL.welded = 0 //Or your welding tools. + else if(istype(door, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/FD = door + FD.blocked = 0 + door.open(1) + return + +/* + * + * Self-targeting spells. Modifiers, auras, instants, etc. + * + */ + +/spell/targeted/ethereal_jaunt/shift + name = "Phase Shift" + desc = "This spell allows you to pass through walls" + + charge_max = 200 + spell_flags = Z2NOCAST | INCLUDEUSER | CONSTRUCT_CHECK + invocation_type = SpI_NONE + range = -1 + duration = 50 //in deciseconds + + hud_state = "const_shift" + +/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) + animation.icon_state = "phase_shift" + animation.dir = target.dir + flick("phase_shift",animation) + +/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) + animation.icon_state = "phase_shift2" + animation.dir = target.dir + flick("phase_shift2",animation) + +/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) + return + +/* + * Harvest has been disabled due to the lack of Nar'Sie. Here for posterity / future rework. + */ + +/* +/spell/targeted/harvest + name = "Harvest" + desc = "Back to where I come from, and you're coming with me." + + school = "transmutation" + charge_max = 200 + spell_flags = Z2NOCAST | CONSTRUCT_CHECK | INCLUDEUSER + invocation = "" + invocation_type = SpI_NONE + range = 0 + max_targets = 0 + + overlay = 1 + overlay_icon = 'icons/effects/effects.dmi' + overlay_icon_state = "rune_teleport" + overlay_lifespan = 0 + + hud_state = "const_harvest" + +/spell/targeted/harvest/cast(list/targets, mob/user)//because harvest is already a proc + ..() + + var/destination = null + for(var/obj/singularity/narsie/large/N in narsie_list) + destination = N.loc + break + if(destination) + var/prey = 0 + for(var/mob/living/M in targets) + if(!findNullRod(M)) + M.forceMove(destination) + if(M != user) + prey = 1 + user << "You warp back to Nar-Sie[prey ? " along with your prey":""]." + else + user << "...something's wrong!"//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world. +*/ + +/spell/targeted/fortify + name = "Fortify Shell" + desc = "Emit a field of energy around your shell to reduce incoming damage incredibly, while decreasing your mobility." + + range = -1 + school = "evocation" + charge_type = Sp_RECHARGE + invocation_type = SpI_NONE + + spell_flags = CONSTRUCT_CHECK | INCLUDEUSER + + hud_state = "const_fortify" + smoke_amt = 0 + + charge_max = 600 + +/spell/targeted/fortify/cast(list/targets, mob/living/user) + if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/fortify)) + charge_counter = 400 + return + user.add_modifier(/datum/modifier/fortify, 1 MINUTES) + +/spell/targeted/occult_repair_aura + name = "Repair Aura" + desc = "Emit a field of energy around your shell to repair nearby constructs at range." + + range = -1 + school = "evocation" + charge_type = Sp_RECHARGE + invocation_type = SpI_NONE + + spell_flags = CONSTRUCT_CHECK | INCLUDEUSER + + hud_state = "const_repairaura" + smoke_amt = 0 + + charge_max = 600 + +/spell/targeted/occult_repair_aura/cast(list/targets, mob/living/user) + if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/repair_aura)) + charge_counter = 300 + return + user.add_modifier(/datum/modifier/repair_aura, 30 SECONDS) + +/spell/targeted/ambush_mode + name = "Toggle Ambush" + desc = "Phase yourself mostly out of this reality, minimizing your combat ability, but allowing for employance of ambush tactics." + + range = -1 + school = "evocation" + charge_type = Sp_RECHARGE + invocation_type = SpI_NONE + + spell_flags = CONSTRUCT_CHECK | INCLUDEUSER + + hud_state = "const_ambush" + smoke_amt = 0 + + charge_max = 100 + +/spell/targeted/ambush_mode/cast(list/targets, mob/living/user) + if(findNullRod(user)) + charge_counter = 50 + return + if(user.has_modifier_of_type(/datum/modifier/ambush)) + user.remove_modifiers_of_type(/datum/modifier/ambush) + return + user.add_modifier(/datum/modifier/ambush, 0) + +/* + * + * These are the spells that place spell-objects into the construct's hands akin to technomancers. + * + */ + +/spell/targeted/construct_advanced + name = "Base Construct Spell" + desc = "If you see this, please tell a developer!" + + range = -1 + school = "evocation" + charge_type = Sp_RECHARGE + invocation_type = SpI_NONE + + spell_flags = CONSTRUCT_CHECK | INCLUDEUSER + + hud_state = "const_rune" + smoke_amt = 0 + + charge_max = 10 + + var/obj/item/weapon/spell/construct/spell_obj = null //This is the var that determines what Technomancer-style spell is put into their hands. + +/spell/targeted/construct_advanced/cast(list/targets, mob/living/user) + if(!findNullRod(user)) + user.place_spell_in_hand(spell_obj) + +/spell/targeted/construct_advanced/inversion_beam + name = "Inversion Beam" + desc = "Fire a searing beam of darkness at your foes." + + hud_state = "const_beam" + spell_obj = /obj/item/weapon/spell/construct/projectile/inverted_beam + +/spell/targeted/construct_advanced/mend_acolyte + name = "Mend Acolyte" + desc = "Mend a target acolyte or construct over time." + + charge_max = 100 + + hud_state = "const_mend" + spell_obj = /obj/item/weapon/spell/construct/mend_occult + +/spell/targeted/construct_advanced/agonizing_sphere + name = "Sphere of Agony" + desc = "Rend a portal into a plane of naught but pain at the target location." + + charge_max = 100 + + hud_state = "const_harvest" + spell_obj = /obj/item/weapon/spell/construct/spawner/agonizing_sphere + +/spell/targeted/construct_advanced/slam + name = "Slam" + desc = "Empower your FIST." + + charge_max = 300 + + hud_state = "const_fist" + spell_obj = /obj/item/weapon/spell/construct/slam + +/* + * + * These are the spell objects that go into the construct's hands. + * + */ + +/* + * Base advanced construct spell types. + */ + +/obj/item/weapon/spell/construct //Energy costs are in units of blood, in the event a cultist gets one of these. + name = "unholy energy" + desc = "Your hands appear to be screaming. This is a debug text, you should probably tell a developer!" + icon = 'icons/obj/spells.dmi' + icon_state = "generic" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_spells.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_spells.dmi', + ) + throwforce = 0 + force = 0 + show_examine = FALSE + owner = null + core = null + cast_methods = null // Controls how the spell is casted. + aspect = ASPECT_UNHOLY // Used for combining spells. Pretty much any cult spell is unholy. + toggled = 0 // Mainly used for overlays. + cooldown = 0 // If set, will add a cooldown overlay and adjust click delay. Must be a multiple of 5 for overlays. + cast_sound = null // Sound file played when this is used. + var/last_castcheck = null // The last time this spell was cast. + +/obj/item/weapon/spell/construct/New() + //..() //This kills the spell, because super on this calls the default spell's New, which checks for a core. Can't have that. + if(isliving(loc)) + owner = loc + if(!owner) + qdel(src) + update_icon() + +/obj/item/weapon/spell/construct/adjust_instability(var/amount) //The only drawback to the boons of the geometer is the use of a mortal's blood as fuel. Constructs have already paid that price long ago. + return + +/obj/item/weapon/spell/construct/run_checks() + if(owner) + if((iscultist(owner) || istype(owner, /mob/living/simple_animal/construct)) && (world.time >= (last_castcheck + cooldown))) //Are they a cultist or a construct, and has the cooldown time passed? + last_castcheck = world.time + return 1 + return 0 + +/obj/item/weapon/spell/construct/pay_energy(var/amount) + if(owner) + if(istype(owner, /mob/living/simple_animal/construct)) + return 1 + if(iscultist(owner) && pay_blood(amount)) + return 1 + return 0 + +/obj/item/weapon/spell/construct/proc/pay_blood(var/amount) //If, for some reason, this is put into the hands of a cultist, by a talisnam or whatever. + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + if(!H.should_have_organ(O_HEART)) + return 1 + if(H.vessel.remove_reagent("blood", amount)) + return 1 + return 0 + +/obj/item/weapon/spell/construct/afterattack(atom/target, mob/user, proximity_flag, click_parameters) //Not overriding it caused runtimes, because cooldown checked for core. + if(!run_checks()) + return + if(!proximity_flag) + if(cast_methods & CAST_RANGED) + on_ranged_cast(target, user) + else + if(istype(target, /obj/item/weapon/spell)) + var/obj/item/weapon/spell/spell = target + if(spell.cast_methods & CAST_COMBINE) + spell.on_combine_cast(src, user) + return + if(cast_methods & CAST_MELEE) + on_melee_cast(target, user) + else if(cast_methods & CAST_RANGED) //Try to use a ranged method if a melee one doesn't exist. + on_ranged_cast(target, user) + if(cooldown) + var/effective_cooldown = round(cooldown, 5) + user.setClickCooldown(effective_cooldown) + flick("cooldown_[effective_cooldown]",src) + +/obj/item/weapon/spell/construct/projectile //This makes me angry, but we need the template, and we can't use it because special check overrides on the base. + name = "construct projectile template" + icon_state = "generic" + desc = "This is a generic template that shoots projectiles. If you can read this, the game broke!" + cast_methods = CAST_RANGED + var/obj/item/projectile/spell_projectile = null + var/pre_shot_delay = 0 + var/fire_sound = null + var/energy_cost_per_shot = 5 + +/obj/item/weapon/spell/construct/projectile/on_ranged_cast(atom/hit_atom, mob/living/user) + if(set_up(hit_atom, user)) + var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user) + new_projectile.launch(hit_atom) + log_and_message_admins("has casted [src] at \the [hit_atom].") + if(fire_sound) + playsound(get_turf(src), fire_sound, 75, 1) + return 1 + return 0 + +/obj/item/weapon/spell/construct/projectile/proc/make_projectile(obj/item/projectile/projectile_type, mob/living/user) + var/obj/item/projectile/P = new projectile_type(get_turf(user)) + return P + +/obj/item/weapon/spell/construct/projectile/proc/set_up(atom/hit_atom, mob/living/user) + if(spell_projectile) + if(pay_energy(energy_cost_per_shot)) + if(pre_shot_delay) + var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target") + user << target_image + user.Stun(pre_shot_delay / 10) + sleep(pre_shot_delay) + qdel(target_image) + if(owner) + return TRUE + return FALSE // We got dropped before the firing occured. + return TRUE // No delay, no need to check. + return FALSE + +/obj/item/weapon/spell/construct/spawner + name = "spawner template" + desc = "If you see me, someone messed up." + icon_state = "darkness" + cast_methods = CAST_RANGED + var/obj/effect/spawner_type = null + +/obj/item/weapon/spell/construct/spawner/on_ranged_cast(atom/hit_atom, mob/user) + var/turf/T = get_turf(hit_atom) + if(T) + new spawner_type(T) + to_chat(user, "You shift \the [src] onto \the [T].") + log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].") + qdel(src) + +//Harvester Laser. + +/obj/item/weapon/spell/construct/projectile/inverted_beam + name = "inversion beam" + icon_state = "generic" + desc = "Your manipulators fire searing beams of inverted light." + cast_methods = CAST_RANGED + spell_projectile = /obj/item/projectile/beam/inversion + pre_shot_delay = 0 + cooldown = 5 + fire_sound = 'sound/weapons/spiderlunge.ogg' + +/obj/item/projectile/beam/inversion + name = "inversion beam" + icon_state = "invert" + fire_sound = 'sound/weapons/spiderlunge.ogg' + damage = 15 + damage_type = BURN + check_armour = "laser" + armor_penetration = 60 + light_range = 2 + light_power = -2 + light_color = "#FFFFFF" + + muzzle_type = /obj/effect/projectile/inversion/muzzle + tracer_type = /obj/effect/projectile/inversion/tracer + impact_type = /obj/effect/projectile/inversion/impact + +//Harvester Pain Orb + +/obj/item/weapon/spell/construct/spawner/agonizing_sphere + name = "sphere of agony" + desc = "Call forth a portal to a dimension of naught but pain at your target." + + spawner_type = /obj/effect/temporary_effect/pulsar/agonizing_sphere + +/obj/item/weapon/spell/construct/spawner/agonizing_sphere/on_ranged_cast(atom/hit_atom, mob/user) + if(within_range(hit_atom) && pay_energy(10)) + ..() + +/obj/item/weapon/spell/construct/spawner/agonizing_sphere/on_throw_cast(atom/hit_atom, mob/user) + pay_energy(5) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + L.add_modifier(/datum/modifier/agonize, 10 SECONDS) + +/obj/effect/temporary_effect/pulsar/agonizing_sphere + name = "agonizing sphere" + desc = "A portal to some hellish place. Its screams wrack your body with pain.." + icon_state = "red_static_sphere" + time_to_die = null + light_range = 4 + light_power = 5 + light_color = "#FF0000" + pulses_remaining = 10 + +/obj/effect/temporary_effect/pulsar/agonizing_sphere/pulse_loop() + while(pulses_remaining) + sleep(1 SECONDS) + spawn() + for(var/mob/living/L in view(4,src)) + if(!iscultist(L) && !istype(L, /mob/living/simple_animal/construct)) + L.add_modifier(/datum/modifier/agonize, 2 SECONDS) + if(L.isSynthetic()) + to_chat(L, "Your chassis warps as the [src] pulses!") + L.adjustFireLoss(4) + pulses_remaining-- + qdel(src) + +//Artificer Heal + +/obj/item/weapon/spell/construct/mend_occult + name = "mend acolyte" + desc = "Mend the wounds of a cultist, or construct, over time." + icon_state = "mend_wounds" + cast_methods = CAST_MELEE + aspect = ASPECT_UNHOLY + light_color = "#FF5C5C" + light_power = -2 + +/obj/item/weapon/spell/construct/mend_occult/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + L.add_modifier(/datum/modifier/mend_occult, 150) + qdel(src) + +//Juggernaut + Behemoth Slam +/obj/item/weapon/spell/construct/slam + name = "slam" + desc = "Empower your FIST, to send an opponent flying." + icon_state = "toggled_old" + cast_methods = CAST_MELEE + aspect = ASPECT_UNHOLY + light_color = "#FF5C5C" + light_power = -2 + cooldown = 15 + +/obj/item/weapon/spell/construct/slam/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) + var/attack_message = "slams" + if(istype(user, /mob/living/simple_animal)) + var/mob/living/simple_animal/S = user + attack_message = pick(S.attacktext) + if(isliving(hit_atom)) + var/mob/living/L = hit_atom + L.visible_message("\The [user] [attack_message] \the [L], sending them flying!") + playsound(src, "punch", 50, 1) + L.Weaken(2) + L.adjustBruteLoss(rand(30, 50)) + var/throwdir = get_dir(src, L) + L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src) + if(istype(hit_atom, /turf/simulated/wall)) + var/turf/simulated/wall/W = hit_atom + user.visible_message("\The [user] rears its fist, preparing to hit \the [W]!") + var/windup = cooldown + if(W.reinf_material) + windup = cooldown * 2 + if(do_after(user, windup)) + W.visible_message("\The [user] [attack_message] \the [W], obliterating it!") + W.dismantle_wall(1) + else + user.visible_message("\The [user] lowers its fist.") + return + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index cecb7b87c7..9d8eb8dc91 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -14,20 +14,21 @@ return /obj/item/weapon/melee/cultblade/attack(mob/living/M, mob/living/user, var/target_zone) - if(iscultist(user)) + if(iscultist(user) && !istype(user, /mob/living/simple_animal/construct)) return ..() var/zone = (user.hand ? "l_arm":"r_arm") if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/affecting = H.get_organ(zone) - user << "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!" + to_chat(user, "An inexplicable force rips through your [affecting.name], tearing the sword from your grasp!") + //random amount of damage between half of the blade's force and the full force of the blade. + user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1) + user.Weaken(5) + else if(!istype(user, /mob/living/simple_animal/construct)) + to_chat(user, "An inexplicable force rips through you, tearing the sword from your grasp!") else - user << "An unexplicable force rips through you, tearing the sword from your grasp!" - - //random amount of damage between half of the blade's force and the full force of the blade. - user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1) - user.Weaken(5) + to_chat(user, "The blade hisses, forcing itself from your manipulators. \The [src] will only allow mortals to wield it against foes, not kin.") user.drop_from_inventory(src, src.loc) throw_at(get_edge_target_turf(src, pick(alldirs)), rand(1,3), throw_speed) @@ -38,10 +39,11 @@ return 1 /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) - if(!iscultist(user)) - user << "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly." + if(!iscultist(user) && !istype(user, /mob/living/simple_animal/construct)) + to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.") user.make_dizzy(120) - + if(istype(user, /mob/living/simple_animal/construct)) + to_chat(user, "\The [src] hisses, as it is discontent with your acquisition of it. It would be wise to return it to a worthy mortal quickly.") /obj/item/clothing/head/culthood name = "cult hood" diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm index fb4888ee20..7f7310f996 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm @@ -10,7 +10,7 @@ announce=0 cause_hell=0 - layer=LIGHTING_LAYER+2 // ITS SO BRIGHT + plane = PLANE_LIGHTING_ABOVE // ITS SO BRIGHT consume_range = 6 @@ -38,13 +38,13 @@ var/mob/living/L = A if(L.buckled && istype(L.buckled,/obj/structure/bed/)) var/turf/O = L.buckled - do_teleport(O, pick(endgame_safespawns)) + do_teleport(O, pick(endgame_safespawns), local = FALSE) //VOREStation Edit L.loc = O.loc else - do_teleport(L, pick(endgame_safespawns)) //dead-on precision + do_teleport(L, pick(endgame_safespawns), local = FALSE) //dead-on precision //VOREStation Edit else if (istype(A, /obj/mecha/)) - do_teleport(A, pick(endgame_safespawns)) //dead-on precision + do_teleport(A, pick(endgame_safespawns), local = FALSE) //dead-on precision //VOREStation Edit else if (isturf(A)) var/turf/T = A @@ -79,7 +79,8 @@ var/turf/T_mob = get_turf(src) if((R.z == T_mob.z) && (get_dist(R,T_mob) <= (R.consume_range+10)) && !(R in view(T_mob))) if(!riftimage) - riftimage = image('icons/obj/rift.dmi',T_mob,"rift",LIGHTING_LAYER+2,1) + riftimage = image('icons/obj/rift.dmi',T_mob,"rift",1,1) + riftimage.plane = PLANE_LIGHTING_ABOVE riftimage.mouse_opacity = 0 var/new_x = 32 * (R.x - T_mob.x) + R.pixel_x diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 77ee16063e..84cbb4d904 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -140,6 +140,7 @@ SpinAnimation() /obj/effect/meteor/Bump(atom/A) + if(attempt_vr(src,"Bump_vr",list(A))) return //VOREStation Edit - allows meteors to be deflected by baseball bats if(A) if(A.handle_meteor_impact(src)) // Used for special behaviour when getting hit specifically by a meteor, like a shield. ram_turf(get_turf(A)) diff --git a/code/game/gamemodes/meteor/meteors_vr.dm b/code/game/gamemodes/meteor/meteors_vr.dm new file mode 100644 index 0000000000..6c24416b39 --- /dev/null +++ b/code/game/gamemodes/meteor/meteors_vr.dm @@ -0,0 +1,10 @@ +/obj/effect/meteor/Bump_vr(atom/A)//BATTER UP + if(istype(A, /mob/living/carbon)) + var/mob/living/carbon/batter = A + var/obj/item/I = batter.get_active_hand() + if(!batter.stat && istype(I, /obj/item/weapon/material/twohanded/baseballbat)) + batter.do_attack_animation(src) + batter.visible_message("[batter] deflects [src] with [I]]! Home run!", "You deflect [src] with [I]! Home run!") + walk_away(src, batter, 100, 1) + return TRUE + return diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index 2a917b4fd8..681d29da50 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -19,6 +19,7 @@ #define ASPECT_EMP "emp" //Unused now. #define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. #define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. +#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. /obj/item/weapon/spell name = "glowing particles" diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index bde825fcf3..aa9f131b50 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -413,7 +413,8 @@ var/global/datum/controller/occupations/job_master job.equip_backpack(H) // job.equip_survival(H) job.apply_fingerprints(H) - H.equip_post_job() + if(job.title != "Cyborg" && job.title != "AI") + H.equip_post_job() //If some custom items could not be equipped before, try again now. for(var/thing in custom_equip_leftovers) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index c59c67c300..b34d1565a0 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -4,7 +4,7 @@ name = "Bluespace Gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." level = 1 // underfloor - layer = 2.5 + layer = UNDER_JUNK_LAYER anchored = 1 use_power = 1 idle_power_usage = 0 diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 0ea5527df2..dd79d5acc1 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -2,7 +2,6 @@ name = "\improper AI Liquid Dispenser" icon = 'icons/obj/device.dmi' icon_state = "motion0" - layer = 3 anchored = 1.0 use_power = 1 idle_power_usage = 10 diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 92004f9afe..84d00eff04 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -1,6 +1,7 @@ /obj/machinery/portable_atmospherics name = "atmoalter" use_power = 0 + layer = OBJ_LAYER // These are mobile, best not be under everything. var/datum/gas_mixture/air_contents = new var/obj/machinery/atmospherics/portables_connector/connected_port diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index c25b3448bd..1496ca1a1f 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -6,7 +6,8 @@ use_power = 2 idle_power_usage = 5 active_power_usage = 10 - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER var/list/network = list(NETWORK_DEFAULT) var/c_tag = null @@ -141,6 +142,18 @@ add_hiddenprint(user) destroy() +/obj/machinery/camera/attack_generic(mob/user as mob) + if(isanimal(user)) + var/mob/living/simple_animal/S = user + set_status(0) + S.do_attack_animation(src) + S.setClickCooldown(user.get_attack_speed()) + visible_message("\The [user] [pick(S.attacktext)] \the [src]!") + playsound(src.loc, S.attack_sound, 100, 1) + add_hiddenprint(user) + destroy() + ..() + /obj/machinery/camera/attackby(obj/item/W as obj, mob/living/user as mob) update_coverage() // DECONSTRUCTION diff --git a/code/game/machinery/camera/camera_vr.dm b/code/game/machinery/camera/camera_vr.dm index fcef1edeb9..1111b2773c 100644 --- a/code/game/machinery/camera/camera_vr.dm +++ b/code/game/machinery/camera/camera_vr.dm @@ -1,7 +1,7 @@ /obj/machinery/camera - layer = 4 + layer = BELOW_MOB_LAYER /obj/machinery/camera/New() ..() - if (dir == 1) // idk why the fuck dir is not 2 - layer = 5 \ No newline at end of file + if (dir == NORTH) + layer = ABOVE_MOB_LAYER \ No newline at end of file diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 2f0fce2bd3..bdf4e95fe0 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -271,6 +271,8 @@ /obj/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user) if(!emagged) + to_chat(user, span("notice","You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Hyper-Lethal Mode.")) + temp = "If you die in the game, you die for real!" player_hp = 30 player_mp = 10 @@ -399,18 +401,18 @@ dat += "
You ran out of food and starved." if(emagged) user.nutrition = 0 //yeah you pretty hongry - user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor." + to_chat(user, span("danger", "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.")) if(fuel <= 0) dat += "
You ran out of fuel, and drift, slowly, into a star." if(emagged) var/mob/living/M = user M.adjust_fire_stacks(5) - M.IgniteMob() //flew into a star, so you're on fire - user << "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames." + M.IgniteMob() //flew into a star, so you're on fire + to_chat(user,span("danger", "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames.")) dat += "

OK...

" if(emagged) - user << "You're never going to make it to Orion..." + to_chat(user, span("danger", "You're never going to make it to Orion...")) user.death() emagged = 0 //removes the emagged status after you lose gameStatus = ORION_STATUS_START @@ -475,20 +477,20 @@ switch(event) if(ORION_TRAIL_RAIDERS) if(prob(50)) - usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" + to_chat(usr, span("warning", "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?")) M.hallucination += 30 else - usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." + to_chat(usr, span("danger", "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there...")) M.take_organ_damage(25) if(ORION_TRAIL_ILLNESS) var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS if(severity == 1) - M << "You suddenly feel slightly nauseous." //got off lucky + to_chat(M, span("warning", "You suddenly feel slightly nauseous.")) //got off lucky if(severity == 2) - usr << "You suddenly feel extremely nauseous and hunch over until it passes." + to_chat(usr, span("warning", "You suddenly feel extremely nauseous and hunch over until it passes.")) M.Stun(3) if(severity >= 3) //you didn't pray hard enough - M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." + to_chat(M, span("warning", "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.")) spawn(30) if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M @@ -499,12 +501,12 @@ src.visible_message("A sudden gust of powerful wind slams \the [M] into the floor!", "You hear a large fwooshing sound, followed by a bang.") M.take_organ_damage(15) else - M << "A violent gale blows past you, and you barely manage to stay standing!" + to_chat(M, span("warning", "A violent gale blows past you, and you barely manage to stay standing!")) if(ORION_TRAIL_COLLISION) //by far the most damaging event if(prob(90) && !hull) var/turf/simulated/floor/F = src.loc F.ChangeTurf(/turf/space) - src.visible_message("Something slams into the floor around \the [src], exposing it to space!", "You hear something crack and break.") + src.visible_message(span("danger", "Something slams into the floor around \the [src], exposing it to space!"), "You hear something crack and break.") else src.visible_message("Something slams into the floor around \the [src] - luckily, it didn't get through!", "You hear something crack.") if(ORION_TRAIL_MALFUNCTION) @@ -573,9 +575,9 @@ event() if(emagged) //has to be here because otherwise it doesn't work src.show_message("\The [src] states, 'YOU ARE EXPERIENCING A BLACKHOLE. BE TERRIFIED.","You hear something say, 'YOU ARE EXPERIENCING A BLACKHOLE. BE TERRFIED'") - usr << "Something draws you closer and closer to the machine." + to_chat(usr, span("warning", "Something draws you closer and closer to the machine.")) sleep(10) - usr << "This is really starting to hurt!" + to_chat(usr, span("danger", "This is really starting to hurt!")) var i; //spawning a literal blackhole would be fun, but a bit disruptive. for(i=0;i<4;i++) var/mob/living/L = usr @@ -1001,12 +1003,12 @@ /obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) if(!emagged) - user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." + to_chat(user, span("notice", "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")) name = "The Orion Trail: Realism Edition" desc = "Learn how our ancestors got to Orion, and try not to die in the process!" newgame() emagged = 1 - + return 1 /obj/item/weapon/orion_ship name = "model settler ship" @@ -1021,9 +1023,9 @@ if(!(in_range(user, src))) return if(!active) - user << "There's a little switch on the bottom. It's flipped down." + to_chat(user, span("notice", "There's a little switch on the bottom. It's flipped down.")) else - user << "There's a little switch on the bottom. It's flipped up." + to_chat(user, span("notice", "There's a little switch on the bottom. It's flipped up.")) /obj/item/weapon/orion_ship/attack_self(mob/user) if(active) @@ -1032,17 +1034,17 @@ message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") - user << "You flip the switch on the underside of [src]." + to_chat(user, span("warning", "You flip the switch on the underside of [src].")) active = 1 - src.visible_message("[src] softly beeps and whirs to life!") + src.visible_message(span("notice", "[src] softly beeps and whirs to life!")) src.audible_message("\The [src] says, 'This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.'") sleep(20) - src.visible_message("[src] begins to vibrate...") + src.visible_message(span("warning", "[src] begins to vibrate...")) src.audible_message("\The [src] says, 'Uh, Port? Having some issues with our reactor, could you check it out? Over.'") sleep(30) src.audible_message("\The [src] says, 'Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-'") sleep(3.6) - src.visible_message("[src] explodes!") + src.visible_message(span("danger", "[src] explodes!")) explosion(src.loc, 1,2,4) qdel(src) diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index c56a9a996c..e76f4db468 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -40,8 +40,7 @@
\nRequest items

View approved orders

View requests

- "} // VOREStation Edit - Export reports - dat += {"\nView export report

+ \nView export report

Close"} user << browse(dat, "window=computer;size=575x450") @@ -200,8 +199,7 @@ \nOrder items
\n
\nView requests
\n
\nView orders
\n
- "} // VOREStation Edit - Export reports - dat += {"\nView export report
\n
+ \nView export report
\n
\nClose"} @@ -371,7 +369,6 @@ temp += "
Clear list" temp += "
OK" - //VOREStation Edit - Export reports else if (href_list["viewexport"]) temp = "Previous shuttle export report:

" var/cratecount = 0 @@ -383,7 +380,6 @@ temp += "[EC.name] exported for [EC.value] supply points
" temp += "
Shipment of [cratecount] crates exported for [totalvalue] supply points.
" temp += "
OK" - //VOREStation Edit End else if (href_list["rreq"]) var/ordernum = text2num(href_list["rreq"]) diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index e1e70ca3a7..cbfa8686bc 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -3,7 +3,6 @@ desc = "A generic vending machine." icon = 'icons/obj/vending.dmi' icon_state = "robotics" - layer = 2.9 anchored = 1 density = 1 var/obj/machinery/computer3/laptop/vended/newlap = null diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 6709cb2363..f7ab7e7a7e 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -6,13 +6,15 @@ icon_state = "pod_preview" density = 1 anchored = 1.0 - layer = 2.8 + layer = UNDER_JUNK_LAYER interact_offline = 1 var/on = 0 use_power = 1 idle_power_usage = 20 active_power_usage = 200 + buckle_lying = FALSE + buckle_dir = SOUTH var/temperature_archived var/mob/living/carbon/occupant = null @@ -20,12 +22,29 @@ var/current_heat_capacity = 50 + var/image/fluid + /obj/machinery/atmospherics/unary/cryo_cell/New() ..() icon = 'icons/obj/cryogenics_split.dmi' - update_icon() + icon_state = "base" initialize_directions = dir +/obj/machinery/atmospherics/unary/cryo_cell/initialize() + . = ..() + var/image/tank = image(icon,"tank") + tank.alpha = 200 + tank.pixel_y = 18 + tank.plane = MOB_PLANE + tank.layer = MOB_LAYER+0.2 //Above fluid + fluid = image(icon, "tube_filler") + fluid.pixel_y = 18 + fluid.alpha = 200 + fluid.plane = MOB_PLANE + fluid.layer = MOB_LAYER+0.1 //Below glass, above mob + add_overlay(tank) + update_icon() + /obj/machinery/atmospherics/unary/cryo_cell/Destroy() var/turf/T = src.loc T.contents += contents @@ -153,6 +172,7 @@ if(beaker) beaker.loc = get_step(src.loc, SOUTH) beaker = null + update_icon() if(href_list["ejectOccupant"]) if(!occupant || isslime(usr) || ispAI(usr)) @@ -172,6 +192,7 @@ user.drop_item() G.loc = src user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") + update_icon() else if(istype(G, /obj/item/weapon/grab)) var/obj/item/weapon/grab/grab = G if(!ismob(grab.affecting)) @@ -191,40 +212,23 @@ put_mob(target) /obj/machinery/atmospherics/unary/cryo_cell/update_icon() - overlays.Cut() - icon_state = "pod[on]" - var/image/I - - I = image(icon, "pod[on]_top") - I.layer = 5 // this needs to be fairly high so it displays over most things, but it needs to be under lighting (at 10) - I.pixel_z = 32 - overlays += I - - if(occupant) - var/image/pickle = image(occupant.icon, occupant.icon_state) - pickle.overlays = occupant.overlays - pickle.pixel_z = 18 - pickle.layer = 5 - overlays += pickle - - I = image(icon, "lid[on]") - I.layer = 5 - overlays += I - - I = image(icon, "lid[on]_top") - I.layer = 5 - I.pixel_z = 32 - overlays += I + cut_overlay(fluid) + fluid.color = null + if(on) + if(beaker) + fluid.color = beaker.reagents.get_color() + add_overlay(fluid) /obj/machinery/atmospherics/unary/cryo_cell/proc/process_occupant() if(air_contents.total_moles < 10) return if(occupant) - if(occupant.stat == 2) + if(occupant.stat >= DEAD) return occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity()) occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise - occupant.stat = 1 + occupant.stat = UNCONSCIOUS + occupant.dir = SOUTH if(occupant.bodytemperature < T0C) occupant.sleeping = max(5, (1/occupant.bodytemperature)*2000) occupant.Paralyse(max(5, (1/occupant.bodytemperature)*3000)) @@ -273,14 +277,16 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE + vis_contents -= occupant + occupant.pixel_x = occupant.default_pixel_x + occupant.pixel_y = occupant.default_pixel_y occupant.loc = get_step(src.loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem. if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug. -// occupant.metabslow = 0 + unbuckle_mob(occupant, force = TRUE) occupant = null current_heat_capacity = initial(current_heat_capacity) update_use_power(1) - update_icon() return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) if(stat & (NOPOWER|BROKEN)) @@ -307,6 +313,9 @@ if(M.health > -100 && (M.health < 0 || M.sleeping)) M << "You feel a cold liquid surround you. Your skin starts to freeze up." occupant = M + buckle_mob(occupant, forced = TRUE, check_loc = FALSE) + vis_contents |= occupant + occupant.pixel_y += 19 current_heat_capacity = HEAT_CAPACITY_HUMAN update_use_power(2) // M.metabslow = 1 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 344f1c9a10..23191b6beb 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -446,8 +446,8 @@ desc = "It's an extra resilient airlock intended for spacefaring vessels." icon = 'icons/obj/doors/shuttledoors.dmi' explosion_resistance = 20 - opacity = 0 //VOREStation Edit - They have windows. - glass = 1 //VOREStation Edit - They have windows. + opacity = 0 + glass = 1 assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft // Airlock opens from top-bottom instead of left-right. diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 54b5513cce..58ce8b282c 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -7,6 +7,9 @@ // as they lack any ID scanning system, they just handle remote control signals. Subtypes have // different icons, which are defined by set of variables. Subtypes are on bottom of this file. +// UPDATE 06.04.2018 +// The emag thing wasn't working as intended, manually overwrote it. + /obj/machinery/door/blast name = "Blast Door" desc = "That looks like it doesn't open easily." @@ -56,6 +59,10 @@ radiation_repository.resistance_cache.Remove(get_turf(src)) return +// Has to be in here, comment at the top is older than the emag_act code on doors proper +/obj/machinery/door/blast/emag_act() + return -1 + // Proc: force_open() // Parameters: None // Description: Opens the door. No checks are done inside this proc. @@ -197,6 +204,27 @@ return ..() +// Proc: attack_generic() +// Parameters: Attacking simple mob, incoming damage. +// Description: Checks the power or integrity of the blast door, if either have failed, chekcs the damage to determine if the creature would be able to open the door by force. Otherwise, super. +/obj/machinery/door/blast/attack_generic(var/mob/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= 10) + if(src.density) + visible_message("\The [user] starts forcing \the [src] open!") + if(do_after(user, 5 SECONDS, src)) + visible_message("\The [user] forces \the [src] open!") + force_open(1) + else + visible_message("\The [user] starts forcing \the [src] closed!") + if(do_after(user, 2 SECONDS, src)) + visible_message("\The [user] forces \the [src] closed!") + force_close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + // Proc: open() // Parameters: None // Description: Opens the door. Does necessary checks. Automatically closes if autoclose is true diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 27ce595a77..e639571cb4 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -25,34 +25,39 @@ var/releasetime = 0 // when world.timeofday reaches it - release the prisoner var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing var/picture_state // icon_state of alert picture, if not displaying text/numbers - var/list/obj/machinery/targets = list() + var/list/obj/machinery/targets var/timetoset = 0 // Used to set releasetime upon starting the timer maptext_height = 26 maptext_width = 32 -/obj/machinery/door_timer/New() +/obj/machinery/door_timer/initialize() ..() + //Doors need to go first, and can't rely on init order, so come back to me. + return INITIALIZE_HINT_LATELOAD - spawn(20) - for(var/obj/machinery/door/window/brigdoor/M in machines) - if (M.id == src.id) - targets += M +/obj/machinery/door_timer/LateInitialize() + . = ..() - for(var/obj/machinery/flasher/F in machines) - if(F.id == src.id) - targets += F + for(var/obj/machinery/door/window/brigdoor/M in machines) + if (M.id == src.id) + LAZYADD(targets,M) - for(var/obj/structure/closet/secure_closet/brig/C in world) - if(C.id == src.id) - targets += C + for(var/obj/machinery/flasher/F in machines) + if(F.id == src.id) + LAZYADD(targets,F) - if(targets.len==0) - stat |= BROKEN - update_icon() - return - return + for(var/obj/structure/closet/secure_closet/brig/C in world) + if(C.id == src.id) + LAZYADD(targets,C) + if(!LAZYLEN(targets)) + stat |= BROKEN + update_icon() + +/obj/machinery/door_timer/Destroy() + LAZYCLEARLIST(targets) + return ..() //Main door timer loop, if it's timing and time is >0 reduce time by 1. // if it's less than 0, open door, reset timer @@ -95,6 +100,7 @@ // Closes and locks doors, power check /obj/machinery/door_timer/proc/timer_start() if(stat & (NOPOWER|BROKEN)) return 0 + if(!LAZYLEN(targets)) return 0 // Set releasetime releasetime = world.timeofday + timetoset @@ -115,6 +121,7 @@ // Opens and unlocks doors, power check /obj/machinery/door_timer/proc/timer_end() if(stat & (NOPOWER|BROKEN)) return 0 + if(!LAZYLEN(targets)) return 0 // Reset releasetime releasetime = 0 @@ -197,11 +204,12 @@ dat += "- - + +
" // Mounted flash controls - for(var/obj/machinery/flasher/F in targets) - if(F.last_flash && (F.last_flash + 150) > world.time) - dat += "
Flash Charging" - else - dat += "
Activate Flash" + if(LAZYLEN(targets)) + for(var/obj/machinery/flasher/F in targets) + if(F.last_flash && (F.last_flash + 150) > world.time) + dat += "
Flash Charging" + else + dat += "
Activate Flash" dat += "

Close" dat += "" @@ -244,8 +252,9 @@ timeset(addtime) if(href_list["fc"]) - for(var/obj/machinery/flasher/F in targets) - F.flash() + if(LAZYLEN(targets)) + for(var/obj/machinery/flasher/F in targets) + F.flash() if(href_list["change"]) src.timer_start() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 6dd268676d..d8252fe4a9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -38,11 +38,14 @@ var/atom/movable/overlay/c_animation = null /obj/machinery/door/attack_generic(var/mob/user, var/damage) - if(damage >= 10) - visible_message("\The [user] smashes into the [src]!") - take_damage(damage) - else - visible_message("\The [user] bonks \the [src] harmlessly.") + if(isanimal(user)) + var/mob/living/simple_animal/S = user + if(damage >= 10) + visible_message("\The [user] smashes into the [src]!") + playsound(src, S.attack_sound, 75, 1) + take_damage(damage) + else + visible_message("\The [user] bonks \the [src] harmlessly.") user.do_attack_animation(src) /obj/machinery/door/New() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 5cded75805..504d65c306 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -216,6 +216,27 @@ return ..() +/obj/machinery/door/firedoor/attack_generic(var/mob/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= 10) + var/time_to_force = (2 + (2 * blocked)) * 5 + if(src.density) + visible_message("\The [user] starts forcing \the [src] open!") + if(do_after(user, time_to_force, src)) + visible_message("\The [user] forces \the [src] open!") + src.blocked = 0 + open(1) + else + time_to_force = (time_to_force / 2) + visible_message("\The [user] starts forcing \the [src] closed!") + if(do_after(user, time_to_force, src)) + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + /obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob) add_fingerprint(user) if(istype(C, /obj/item/taperoll)) diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 3e998e87d6..f1f2ec0834 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -12,11 +12,6 @@ else construction_frame_floor += type - var/datum/frame/frame_types/cancel/cancel = new /datum/frame/frame_types/cancel - construction_frame_wall += cancel - construction_frame_floor += cancel - - ////////////////////////////// // Frame Type Datum - Describes the frame structures that can be created from a frame item. ////////////////////////////// @@ -180,9 +175,6 @@ x_offset = 24 y_offset = 24 -/datum/frame/frame_types/cancel //used to get out of input dialogue - name = "Cancel" - ////////////////////////////// // Frame Object (Structure) ////////////////////////////// diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 215238a80b..39a91b8aff 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -4,7 +4,7 @@ desc = "Small wall-mounted holographic projector" icon = 'icons/obj/holosign.dmi' icon_state = "sign_off" - layer = 4 + plane = MOB_PLANE use_power = 1 idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index fab6319e26..09cb3289ed 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -172,7 +172,6 @@ name = "ice cream cone" desc = "Delicious waffle cone, but no ice cream." icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time - layer = 3.1 bitesize = 3 var/ice_creamed = 0 diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index fa81ff1620..3da253e682 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -2,7 +2,6 @@ name = "microwave" icon = 'icons/obj/kitchen.dmi' icon_state = "mw" - layer = 2.9 density = 1 anchored = 1 use_power = 1 diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index a2f5c00ad1..b2c3d21b68 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -4,7 +4,6 @@ name = "\improper SmartFridge" icon = 'icons/obj/vending.dmi' icon_state = "smartfridge" - layer = 2.9 density = 1 anchored = 1 use_power = 1 diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 673e366313..874f8876b9 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -97,6 +97,7 @@ Class Procs: name = "machinery" icon = 'icons/obj/stationobjs.dmi' w_class = ITEMSIZE_NO_CONTAINER + layer = UNDER_JUNK_LAYER var/stat = 0 var/emagged = 0 diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index af61e93424..8022235736 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -9,8 +9,7 @@ icon_state = "floor_magnet-f" name = "Electromagnetic Generator" desc = "A device that uses station power to create points of magnetic energy." - level = 1 // underfloor - layer = 2.5 + plane = PLATING_PLANE anchored = 1 use_power = 1 idle_power_usage = 50 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index ac0af16378..7e472c8eca 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -8,8 +8,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w icon_state = "navbeacon0-f" name = "navigation beacon" desc = "A beacon used for bot navigation." - level = 1 // underfloor - layer = 2.5 + plane = PLATING_PLANE anchored = 1 var/open = 0 // true if cover is open var/locked = 1 // true if controls are locked diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 5ce605afcc..b9bd4a6855 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -935,20 +935,11 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/machinery/newscaster/proc/scan_user(mob/living/user as mob) if(istype(user,/mob/living/carbon/human)) //User is a human var/mob/living/carbon/human/human_user = user - if(human_user.wear_id) //Newscaster scans you - if(istype(human_user.wear_id, /obj/item/device/pda)) //autorecognition, woo! - var/obj/item/device/pda/P = human_user.wear_id - if(P.id) - scanned_user = GetNameAndAssignmentFromId(P.id) - else - scanned_user = "Unknown" - else if(istype(human_user.wear_id, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/ID = human_user.wear_id - scanned_user = GetNameAndAssignmentFromId(ID) - else - scanned_user ="Unknown" + var/obj/item/weapon/card/id/I = human_user.GetIdCard() + if(I) + scanned_user = GetNameAndAssignmentFromId(I) else - scanned_user ="Unknown" + scanned_user = "Unknown" else var/mob/living/silicon/ai_user = user scanned_user = "[ai_user.name] ([ai_user.job])" diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 48bd028c09..0ec65cc30d 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -168,7 +168,7 @@ qdel(I) qdel(J) H.icon = HI - H.layer = 25 + H.hud_layerise() usr.mapobjs += H #else @@ -287,7 +287,7 @@ H.icon = I qdel(I) - H.layer = 25 + H.hud_layerise() usr.mapobjs += H #endif diff --git a/code/game/machinery/painter_vr.dm b/code/game/machinery/painter_vr.dm new file mode 100644 index 0000000000..4130194012 --- /dev/null +++ b/code/game/machinery/painter_vr.dm @@ -0,0 +1,109 @@ +/obj/machinery/gear_painter + name = "Color Mate" + desc = "A machine to give your apparel a fresh new color! Recommended to use with white items for best results." + icon = 'icons/obj/vending_vr.dmi' + icon_state = "colormate" + density = 1 + anchored = 1 + var/list/processing = list() + var/activecolor = "#FFFFFF" + var/list/allowed_types = list( + /obj/item/clothing, + /obj/item/weapon/storage/backpack, + /obj/item/weapon/storage/belt + ) + +/obj/machinery/gear_painter/update_icon() + if(panel_open) + icon_state = "colormate_open" + else if(inoperable()) + icon_state = "colormate_off" + else if(processing.len) + icon_state = "colormate_active" + else + icon_state = "colormate" + +/obj/machinery/gear_painter/Destroy() + for(var/atom/movable/O in processing) + O.forceMove(drop_location()) + processing.Cut() + return ..() + +/obj/machinery/gear_painter/attackby(obj/item/W as obj, mob/user as mob) + if(processing.len) + to_chat(user, "The machine is already loaded.") + return + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_unfasten_wrench(user, W, 40)) + return + + if(is_type_in_list(W, allowed_types) && !inoperable()) + user.visible_message("[user] inserts \the [W] into the Color Mate receptable.") + user.drop_from_inventory(W) + W.forceMove(src) + processing |= W + else + ..() + update_icon() + +/obj/machinery/gear_painter/attack_hand(mob/user as mob) + if(..()) + return + interact(user) + +/obj/machinery/gear_painter/interact(mob/user as mob) + if(inoperable()) + return + user.set_machine(src) + var/dat = "Color Mate Control Panel
" + if(!processing.len) + dat += "No item inserted." + else + for(var/atom/movable/O in processing) + dat += "Item inserted: [O]
" + dat += "Select new color.
" + dat += "Color: " + dat += "Apply new color.

" + dat += "Remove paintjob.

" + dat += "Eject item.

" + + var/datum/browser/menu = new(user, "colormate","Color Mate Control Panel", 400, 600, src) + menu.set_content(dat) + menu.open() + return + +/obj/machinery/gear_painter/Topic(href, href_list) + if(..()) + return + + usr.set_machine(src) + add_fingerprint(usr) + + if(href_list["close"]) + return + + if(href_list["select"]) + var/newcolor = input(usr, "Choose a color.", "", activecolor) as color|null + if(newcolor) + activecolor = newcolor + + if(href_list["paint"]) + for(var/atom/movable/O in processing) + O.color = activecolor + playsound(src.loc, 'sound/effects/spray3.ogg', 50, 1) + + if(href_list["clear"]) + for(var/atom/movable/O in processing) + O.color = initial(O.color) + playsound(src.loc, 'sound/effects/spray3.ogg', 50, 1) + + if(href_list["eject"]) + for(var/atom/movable/O in processing) + O.forceMove(drop_location()) + processing.Cut() + + update_icon() + updateUsrDialog() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index f6650301c7..de1d8fcb54 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -393,6 +393,18 @@ var/list/turret_icons attacked = 0 ..() +/obj/machinery/porta_turret/attack_generic(mob/user as mob, var/damage) + if(isanimal(user)) + var/mob/living/simple_animal/S = user + if(damage >= 10) + var/incoming_damage = round(damage - (damage / 5)) //Turrets are slightly armored, assumedly. + visible_message("\The [S] [pick(S.attacktext)] \the [src]!") + take_damage(incoming_damage) + S.do_attack_animation(src) + return 1 + visible_message("\The [user] bonks \the [src]'s casing!") + return ..() + /obj/machinery/porta_turret/emag_act(var/remaining_charges, var/mob/user) if(!emagged) //Emagging the turret makes it go bonkers and stun everyone. It also makes diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ca1fa7b3b1..13a966f71b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -6,7 +6,6 @@ desc = "A generic vending machine." icon = 'icons/obj/vending_vr.dmi' //VOREStation Edit - Eris vending machine sprites icon_state = "generic" - layer = 2.9 anchored = 1 density = 1 @@ -863,7 +862,7 @@ /obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4, /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12, /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2, - /obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2, + /obj/item/stack/medical/advanced/bruise_pack = 6, /obj/item/stack/medical/advanced/ointment = 6, /obj/item/stack/medical/splint = 4, /obj/item/weapon/storage/pill_bottle/carbon = 2) contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 3a036eec8e..0d3c3bcd2c 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -29,18 +29,18 @@ update_type_list() var/datum/frame/frame_types/frame_type if(!build_machine_type) - var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor - if(!response || response.name == "Cancel") + var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_floor + if(!response) return frame_type = response build_machine_type = /obj/structure/frame if(frame_type.frame_size != 5) - new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size)) + new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size)) var/ndir - ndir = usr.dir + ndir = user.dir if(!(ndir in cardinal)) return @@ -48,52 +48,57 @@ M.fingerprints = fingerprints M.fingerprintshidden = fingerprintshidden M.fingerprintslast = fingerprintslast + if(istype(src.loc, /obj/item/weapon/gripper)) //Typical gripper shenanigans + user.drop_item() qdel(src) /obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob) update_type_list() + + if(get_dist(on_wall, user)>1) + return + + var/ndir + if(reverse) + ndir = get_dir(user, on_wall) + else + ndir = get_dir(on_wall, user) + + if(!(ndir in cardinal)) + return + + var/turf/loc = get_turf(user) + var/area/A = loc.loc + if(!istype(loc, /turf/simulated/floor)) + to_chat(user, "\The frame cannot be placed on this spot.") + return + + if(A.requires_power == 0 || A.name == "Space") + to_chat(user, "\The [src] Alarm cannot be placed in this area.") + return + + if(gotwallitem(loc, ndir)) + to_chat(user, "There's already an item on this wall!") + return + var/datum/frame/frame_types/frame_type if(!build_machine_type) - var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall - if(!response || response.name == "Cancel") + var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_wall + if(!response) return frame_type = response build_machine_type = /obj/structure/frame if(frame_type.frame_size != 5) - new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size)) - - if(get_dist(on_wall, usr)>1) - return - - var/ndir - if(reverse) - ndir = get_dir(usr, on_wall) - else - ndir = get_dir(on_wall, usr) - - if(!(ndir in cardinal)) - return - - var/turf/loc = get_turf(usr) - var/area/A = loc.loc - if(!istype(loc, /turf/simulated/floor)) - usr << "\The frame cannot be placed on this spot." - return - - if(A.requires_power == 0 || A.name == "Space") - usr << "\The [src] Alarm cannot be placed in this area." - return - - if(gotwallitem(loc, ndir)) - usr << "There's already an item on this wall!" - return + new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size)) var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type) M.fingerprints = fingerprints M.fingerprintshidden = fingerprintshidden M.fingerprintslast = fingerprintslast + if(istype(src.loc, /obj/item/weapon/gripper)) //Typical gripper shenanigans + user.drop_item() qdel(src) /obj/item/frame/light diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index f16d5d31ab..7f33a15f1f 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -44,7 +44,7 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b desc = "... Blitzkrieg?" icon = 'icons/mecha/NaziMech.dmi' icon_state = "pzrwreck" - layer = 4 // so it overlaps other people + plane = MOB_PLANE pixel_x = -16 anchored = 1 // It's fucking huge. You aren't moving it. diff --git a/code/game/mecha/mech_sensor.dm b/code/game/mecha/mech_sensor.dm index 87a9863ee8..5173f182ce 100644 --- a/code/game/mecha/mech_sensor.dm +++ b/code/game/mecha/mech_sensor.dm @@ -7,7 +7,7 @@ density = 1 throwpass = 1 use_power = 1 - layer = 3.3 + layer = ON_WINDOW_LAYER power_channel = EQUIP var/on = 0 var/id_tag = null diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 74014f2b0f..868429095a 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -36,6 +36,7 @@ desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" name = "DEATH-RIPLEY" icon_state = "deathripley" + initial_icon = "deathripley" step_in = 2 opacity=0 lights_power = 60 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 0a8a74b8e9..998b213ff4 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -75,6 +75,13 @@ // buckled_mob = M buckled_mobs |= M + //VOREStation Add + if(riding_datum) + riding_datum.ridden = src + riding_datum.handle_vehicle_offsets() + M.update_water() + //VOREStation Add End + post_buckle_mob(M) return TRUE @@ -94,6 +101,12 @@ // buckled_mob = null buckled_mobs -= buckled_mob + //VOREStation Add + buckled_mob.update_water() + if(riding_datum) + riding_datum.restore_position(buckled_mob) + riding_datum.handle_vehicle_offsets() // So the person in back goes to the front. + //VOREStation Add End post_buckle_mob(.) /atom/movable/proc/unbuckle_all_mobs(force = FALSE) @@ -175,3 +188,9 @@ . = ..() if(. && has_buckled_mobs() && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s) . = 0 + //VOREStation Add + else if(. && riding_datum) + riding_datum.handle_vehicle_layer() + riding_datum.handle_vehicle_offsets() + //VOREStation Add End + \ No newline at end of file diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 2c864f0a56..7a79c21e1e 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -147,7 +147,8 @@ anchored = 1 density = 0 - layer = 2 + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER var/health = 15 var/obj/effect/alien/weeds/node/linked_node = null @@ -155,7 +156,7 @@ icon_state = "weednode" name = "purple sac" desc = "Weird purple octopus-like thing." - layer = 3 + layer = ABOVE_TURF_LAYER+0.01 light_range = NODERANGE var/node_range = NODERANGE diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index be7e759a63..436ebabcc9 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -161,7 +161,7 @@ if(chemholder.reagents.reagent_list.len) chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents smoke.icon = I - smoke.layer = 6 + smoke.plane = ABOVE_PLANE smoke.set_dir(pick(cardinal)) smoke.pixel_x = -32 + rand(-8, 8) smoke.pixel_y = -32 + rand(-8, 8) diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm index c04540535b..b69226815e 100644 --- a/code/game/objects/effects/decals/Cleanable/fuel.dm +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -2,7 +2,7 @@ //Liquid fuel is used for things that used to rely on volatile fuels or phoron being contained to a couple tiles. icon = 'icons/effects/effects.dmi' icon_state = "fuel" - layer = TURF_LAYER+0.2 + plane = DIRTY_PLANE anchored = 1 var/amount = 1 diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 46b9d3645c..90f708ff9d 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -10,7 +10,7 @@ var/global/list/image/splatter_cache=list() gender = PLURAL density = 0 anchored = 1 - layer = 2 + plane = BLOOD_PLANE icon = 'icons/effects/blood.dmi' icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") @@ -179,7 +179,6 @@ var/global/list/image/splatter_cache=list() gender = PLURAL density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6") @@ -236,7 +235,6 @@ var/global/list/image/splatter_cache=list() gender = PLURAL density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "mucus" random_icon_states = list("mucus") diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index ab01bfa005..1ef83bc722 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -4,7 +4,6 @@ gender = PLURAL density = 0 anchored = 1 - layer = 2 icon = 'icons/obj/objects.dmi' icon_state = "shards" @@ -36,7 +35,6 @@ gender = PLURAL density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/effects.dmi' icon_state = "dirt" mouse_opacity = 0 @@ -47,7 +45,6 @@ gender = PLURAL density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/effects.dmi' icon_state = "flour" @@ -57,7 +54,6 @@ gender = PLURAL density = 0 anchored = 1 - layer = 2 light_range = 1 icon = 'icons/effects/effects.dmi' icon_state = "greenglow" @@ -67,7 +63,7 @@ desc = "Somebody should remove that." density = 0 anchored = 1 - layer = 3 + plane = OBJ_PLANE icon = 'icons/effects/effects.dmi' icon_state = "cobweb1" @@ -76,7 +72,7 @@ desc = "It looks like a melted... something." density = 0 anchored = 1 - layer = 3 + plane = OBJ_PLANE icon = 'icons/obj/chemical.dmi' icon_state = "molten" @@ -85,7 +81,7 @@ desc = "Somebody should remove that." density = 0 anchored = 1 - layer = 3 + plane = OBJ_PLANE icon = 'icons/effects/effects.dmi' icon_state = "cobweb2" @@ -96,7 +92,6 @@ gender = PLURAL density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") @@ -107,7 +102,6 @@ desc = "It's red." density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") @@ -116,7 +110,6 @@ desc = "Seems like this one won't hatch." density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") @@ -125,7 +118,6 @@ desc = "It's pie cream from a cream pie." density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") @@ -134,7 +126,6 @@ desc = "Some kind of fruit smear." density = 0 anchored = 1 - layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 2db1e5e948..f7965e092d 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,4 +1,5 @@ /obj/effect/decal/cleanable + plane = DIRTY_PLANE var/list/random_icon_states = list() /obj/effect/decal/cleanable/clean_blood(var/ignore = 0) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 20047ced12..55bb54b803 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -2,7 +2,7 @@ name = "rune" desc = "A rune drawn in crayon." icon = 'icons/obj/rune.dmi' - layer = 2.1 + plane = DIRTY_PLANE anchored = 1 New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune") diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 964a1301b8..f3a75ce3c2 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -3,7 +3,7 @@ desc = "It's an arrow hanging in mid-air. There may be a wizard about." icon = 'icons/mob/screen1.dmi' icon_state = "arrow" - layer = 16.0 + plane = ABOVE_PLANE anchored = 1 mouse_opacity = 0 @@ -11,4 +11,4 @@ /obj/effect/decal/spraystill density = 0 anchored = 1 - layer = 50 \ No newline at end of file + plane = ABOVE_PLANE \ No newline at end of file diff --git a/code/game/objects/effects/decals/warning_stripes.dm b/code/game/objects/effects/decals/warning_stripes.dm index e22acfad74..db7c4bf74f 100644 --- a/code/game/objects/effects/decals/warning_stripes.dm +++ b/code/game/objects/effects/decals/warning_stripes.dm @@ -1,6 +1,5 @@ /obj/effect/decal/warning_stripes icon = 'icons/effects/warning_stripes.dmi' - layer = 2 /obj/effect/decal/warning_stripes/New() . = ..() diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 349400226a..aaebab4355 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -26,7 +26,8 @@ desc = "Something swinging really wide." icon = 'icons/effects/96x96.dmi' icon_state = "cleave" - layer = 6 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER time_to_die = 6 alpha = 140 mouse_opacity = 0 diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index b4fd395173..352d29319e 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -17,7 +17,8 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm1" density = 1 - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER anchored = 1 /obj/effect/overlay/palmtree_l @@ -25,7 +26,8 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm2" density = 1 - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER anchored = 1 /obj/effect/overlay/coconut @@ -37,7 +39,7 @@ name = "Bluespace" icon = 'icons/turf/space.dmi' icon_state = "bluespacify" - layer = 10 + plane = ABOVE_PLANE /obj/effect/overlay/wallrot name = "wallrot" @@ -45,7 +47,8 @@ icon = 'icons/effects/wallrot.dmi' anchored = 1 density = 1 - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER mouse_opacity = 0 /obj/effect/overlay/wallrot/New() @@ -70,7 +73,8 @@ /obj/effect/overlay/snow/floor icon_state = "snowfloor" - layer = 2.01 //Just above floor + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER mouse_opacity = 0 //Don't block underlying tile interactions /obj/effect/overlay/snow/floor/edges @@ -86,11 +90,12 @@ /obj/effect/overlay/snow/airlock icon_state = "snowairlock" - layer = 3.2 //Just above airlocks + layer = DOOR_CLOSED_LAYER+0.01 /obj/effect/overlay/snow/floor/pointy icon_state = "snowfloorpointy" /obj/effect/overlay/snow/wall icon_state = "snowwall" - layer = 5 //Same as lights so humans can stand under it + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index b0e66f6306..8e482cc1cb 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -123,7 +123,7 @@ desc = "It never stays still for long." icon_state = "spiderling" anchored = 0 - layer = 2.7 + layer = HIDING_LAYER health = 3 var/last_itch = 0 var/amount_grown = -1 @@ -221,7 +221,7 @@ skitter() else if(isorgan(loc)) - if(!amount_grown) amount_grown = 1 + if(amount_grown < 0) amount_grown = 1 var/obj/item/organ/external/O = loc if(!O.owner || O.owner.stat == DEAD || amount_grown > 80) O.implants -= src @@ -237,7 +237,7 @@ else if(prob(1)) src.visible_message("\The [src] skitters.") - if(amount_grown) + if(amount_grown >= 0) amount_grown += rand(0,2) /obj/effect/spider/spiderling/proc/skitter() diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 4b69e5db7c..fd2ea3e94b 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -13,31 +13,31 @@ new /obj/item/stack/material/steel( get_turf(src.loc), 2 ) qdel(src) -/obj/item/frame/apc/try_build(turf/on_wall) - if (get_dist(on_wall,usr)>1) +/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob) + if (get_dist(on_wall, user)>1) return - var/ndir = get_dir(usr,on_wall) + var/ndir = get_dir(user, on_wall) if (!(ndir in cardinal)) return - var/turf/loc = get_turf(usr) + var/turf/loc = get_turf(user) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "APC cannot be placed on this spot." + to_chat(user, "APC cannot be placed on this spot.") return if (A.requires_power == 0 || istype(A, /area/space)) - usr << "APC cannot be placed in this area." + to_chat(user, "APC cannot be placed in this area.") return if (A.get_apc()) - usr << "This area already has an APC." + to_chat(user, "This area already has an APC.") return //only one APC per area for(var/obj/machinery/power/terminal/T in loc) if (T.master) - usr << "There is another network terminal here." + to_chat(user, "There is another network terminal here.") return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) C.amount = 10 - usr << "You cut the cables and disassemble the unused power terminal." + to_chat(user, "You cut the cables and disassemble the unused power terminal.") qdel(T) new /obj/machinery/power/apc(loc, ndir, 1) qdel(src) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 31bb9160f8..f1a99a6090 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -46,11 +46,11 @@ if(colour != "#FFFFFF" && shadeColour != "#000000") colour = "#FFFFFF" shadeColour = "#000000" - user << "You will now draw in white and black with this crayon." + to_chat(user, "You will now draw in white and black with this crayon.") else colour = "#000000" shadeColour = "#FFFFFF" - user << "You will now draw in black and white with this crayon." + to_chat(user, "You will now draw in black and white with this crayon.") return /obj/item/weapon/pen/crayon/rainbow @@ -72,22 +72,22 @@ switch(drawtype) if("letter") drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") - user << "You start drawing a letter on the [target.name]." + to_chat(user, "You start drawing a letter on the [target.name].") if("graffiti") - user << "You start drawing graffiti on the [target.name]." + to_chat(user, "You start drawing graffiti on the [target.name].") if("rune") - user << "You start drawing a rune on the [target.name]." + to_chat(user, "You start drawing a rune on the [target.name].") if("arrow") drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down") - user << "You start drawing an arrow on the [target.name]." + to_chat(user, "You start drawing an arrow on the [target.name].") if(instant || do_after(user, 50)) new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) - user << "You finish drawing." + to_chat(user, "You finish drawing.") target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. if(uses) uses-- if(!uses) - user << "You used up your crayon!" + to_chat(user, "You used up your crayon!") qdel(src) return @@ -99,7 +99,93 @@ if(uses) uses -= 5 if(uses <= 0) - user << "You ate your crayon!" + to_chat(user,"You ate your crayon!") qdel(src) else ..() + +/obj/item/weapon/pen/crayon/marker/black + icon_state = "markerblack" + colour = "#2D2D2D" + shadeColour = "#000000" + colourName = "black" + +/obj/item/weapon/pen/crayon/marker/red + icon_state = "markerred" + colour = "#DA0000" + shadeColour = "#810C0C" + colourName = "red" + +/obj/item/weapon/pen/crayon/marker/orange + icon_state = "markerorange" + colour = "#FF9300" + shadeColour = "#A55403" + colourName = "orange" + +/obj/item/weapon/pen/crayon/marker/yellow + icon_state = "markeryellow" + colour = "#FFF200" + shadeColour = "#886422" + colourName = "yellow" + +/obj/item/weapon/pen/crayon/marker/green + icon_state = "markergreen" + colour = "#A8E61D" + shadeColour = "#61840F" + colourName = "green" + +/obj/item/weapon/pen/crayon/marker/blue + icon_state = "markerblue" + colour = "#00B7EF" + shadeColour = "#0082A8" + colourName = "blue" + +/obj/item/weapon/pen/crayon/marker/purple + icon_state = "markerpurple" + colour = "#DA00FF" + shadeColour = "#810CFF" + colourName = "purple" + +/obj/item/weapon/pen/crayon/marker/mime + icon_state = "markermime" + desc = "A very sad-looking marker." + colour = "#FFFFFF" + shadeColour = "#000000" + colourName = "mime" + uses = 0 + +/obj/item/weapon/pen/crayon/marker/mime/attack_self(mob/living/user as mob) //inversion + if(colour != "#FFFFFF" && shadeColour != "#000000") + colour = "#FFFFFF" + shadeColour = "#000000" + to_chat(user, "You will now draw in white and black with this marker.") + else + colour = "#000000" + shadeColour = "#FFFFFF" + to_chat(user, "You will now draw in black and white with this marker.") + return + +/obj/item/weapon/pen/crayon/marker/rainbow + icon_state = "markerrainbow" + colour = "#FFF000" + shadeColour = "#000FFF" + colourName = "rainbow" + uses = 0 + +/obj/item/weapon/pen/crayon/marker/rainbow/attack_self(mob/living/user as mob) + colour = input(user, "Please select the main colour.", "Marker colour") as color + shadeColour = input(user, "Please select the shade colour.", "Marker colour") as color + return + +/obj/item/weapon/pen/crayon/marker/attack(mob/M as mob, mob/user as mob) + if(M == user) + to_chat(user, "You take a bite of the marker and swallow it.") + user.nutrition += 1 + user.reagents.add_reagent("marker_ink",6) + if(uses) + uses -= 5 + if(uses <= 0) + to_chat(user,"You ate the marker!") + qdel(src) + else + ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index ebad249bde..b57c67bac0 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -102,6 +102,11 @@ user << "Transfer failed: Existing AI found on remote device. Remove existing AI to install a new one." return 0 + if(!user.IsAdvancedToolUser() && isanimal(user)) + var/mob/living/simple_animal/S = user + if(!S.IsHumanoidToolUser(src)) + return 0 + user.visible_message("\The [user] starts transferring \the [ai] into \the [src]...", "You start transferring \the [ai] into \the [src]...") ai << "\The [user] is transferring you into \the [src]!" diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm index 4baa0a71c0..3333dfb14e 100644 --- a/code/game/objects/items/devices/communicator/UI.dm +++ b/code/game/objects/items/devices/communicator/UI.dm @@ -185,7 +185,7 @@ if(text) exonet.send_message(their_address, "text", text) im_list += list(list("address" = exonet.address, "to_address" = their_address, "im" = text)) - log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]",usr) + log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]", usr) for(var/mob/M in player_list) if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) if(istype(M, /mob/new_player) || M.forbid_seeing_deadchat) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index f1c9aa2d14..e24a727b99 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -104,7 +104,6 @@ bmark.pixel_x = p_x bmark.pixel_y = p_y bmark.icon = 'icons/effects/effects.dmi' - bmark.layer = 3.5 bmark.icon_state = "scorch" if(decaltype == 1) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index eb62b5d674..7a665c0038 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -111,6 +111,7 @@ user.visible_message("\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \ "You place a bandaid over \a [W.desc] on [M]'s [affecting.name]." ) W.bandage() + // W.disinfect() // VOREStation - Tech1 should not disinfect used++ affecting.update_damages() if(used == amount) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 168d7708bf..3931bec8ef 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -860,7 +860,7 @@ /obj/structure/plushie/carp name = "plush carp" desc = "A plushie of an elated carp! Straight from the wilds of the Vir frontier, now right here in your hands." - icon_state = "plushie/carp" + icon_state = "carpplushie" phrase = "Glorf!" /obj/structure/plushie/beepsky diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 77c5b59364..c5b637d9e5 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -22,6 +22,11 @@ AI MODULES var/datum/ai_laws/laws = null /obj/item/weapon/aiModule/proc/install(var/atom/movable/AM, var/mob/living/user) + if(!user.IsAdvancedToolUser() && isanimal(user)) + var/mob/living/simple_animal/S = user + if(!S.IsHumanoidToolUser(src)) + return 0 + if (istype(AM, /obj/machinery/computer/aiupload)) var/obj/machinery/computer/aiupload/comp = AM if(comp.stat & NOPOWER) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 196f8d4a74..58aa30547d 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -29,7 +29,14 @@ return 0 /obj/item/weapon/rcd/proc/can_use(var/mob/user,var/turf/T) - return (user.Adjacent(T) && user.get_active_hand() == src && !user.stat && !user.restrained()) + var/usable = 0 + if(user.Adjacent(T) && user.get_active_hand() == src && !user.stat && !user.restrained()) + usable = 1 + if(!user.IsAdvancedToolUser() && istype(user, /mob/living/simple_animal)) + var/mob/living/simple_animal/S = user + if(!S.IsHumanoidToolUser(src)) + usable = 0 + return usable /obj/item/weapon/rcd/examine() ..() diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 46ebb3bd40..e6a5fc09e4 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -265,7 +265,7 @@ var/last_chew = 0 place_legcuffs(user, user) return - if(!C.handcuffed) + if(!C.legcuffed) if (C == user) place_legcuffs(user, user) return diff --git a/code/game/objects/items/weapons/handcuffs_vr.dm b/code/game/objects/items/weapons/handcuffs_vr.dm new file mode 100644 index 0000000000..ecafc8b6c3 --- /dev/null +++ b/code/game/objects/items/weapons/handcuffs_vr.dm @@ -0,0 +1,5 @@ +/obj/item/weapon/handcuffs/legcuffs/fuzzy + name = "fuzzy legcuffs" + desc = "Use this to keep... 'prisoners' in line." + icon = 'icons/obj/items_vr.dmi' + icon_state = "fuzzylegcuff" \ No newline at end of file diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm index 7345e8871e..e7a3d3f4d5 100644 --- a/code/game/objects/items/weapons/id cards/cards.dm +++ b/code/game/objects/items/weapons/id cards/cards.dm @@ -46,7 +46,6 @@ name = "\proper the coordinates to clown planet" icon_state = "data" item_state = "card-id" - layer = 3 level = 2 desc = "This card contains coordinates to the fabled Clown Planet. Handle with care." function = "teleporter" diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 53a6de9564..3e656b844b 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -71,7 +71,7 @@ /obj/item/weapon/implant/tracking name = "tracking implant" - desc = "Track with this." + desc = "An implant normally given to dangerous criminals. Allows security to track your location." var/id = 1 var/degrade_time = 10 MINUTES //How long before the implant stops working outside of a living body. diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index f2528f5786..94bc9e8f69 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -99,15 +99,9 @@ icon_state = "machete" force_divisor = 0.3 // 18 when hardness 60 (steel) attack_verb = list("slashed", "chopped", "gouged", "ripped", "cut") - var/should_cleave = TRUE //Now hatchets inherit from the machete, and thus knives. Tables turned. + can_cleave = TRUE //Now hatchets inherit from the machete, and thus knives. Tables turned. slot_flags = SLOT_BELT -// This cannot go into afterattack since some mobs delete themselves upon dying. -/obj/item/weapon/material/knife/machete/pre_attack(var/mob/living/target, var/mob/living/user) - if(should_cleave && istype(target)) - cleave(user, target) - ..() - /obj/item/weapon/material/knife/tacknife/survival name = "survival knife" desc = "A hunting grade survival knife." diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 87bfb0454d..bbb8171b10 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -28,7 +28,7 @@ icon = 'icons/obj/weapons.dmi' icon_state = "unathiknife" attack_verb = list("ripped", "torn", "cut") - should_cleave = FALSE + can_cleave = FALSE var hits = 0 /obj/item/weapon/material/knife/machete/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 6631ec25fa..acc3132712 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -94,6 +94,7 @@ force_wielded = 30 attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") applies_material_colour = 0 + can_cleave = TRUE /obj/item/weapon/material/twohanded/fireaxe/update_held_icon() var/mob/living/M = loc @@ -124,12 +125,6 @@ var/obj/effect/plant/P = A P.die_off() -// This cannot go into afterattack since some mobs delete themselves upon dying. -/obj/item/weapon/material/twohanded/fireaxe/pre_attack(var/mob/living/target, var/mob/living/user) - if(istype(target)) - cleave(user, target) - ..() - /obj/item/weapon/material/twohanded/fireaxe/scythe icon_state = "scythe0" base_icon = "scythe" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index f7497ec3ff..ad30eb0a57 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -87,6 +87,7 @@ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") sharp = 1 edge = 1 + can_cleave = TRUE /obj/item/weapon/melee/energy/axe/activate(mob/living/user) ..() @@ -98,12 +99,6 @@ icon_state = initial(icon_state) to_chat(user, "\The [src] is de-energised. It's just a regular axe now.") -// This cannot go into afterattack since some mobs delete themselves upon dying. -/obj/item/weapon/melee/energy/axe/pre_attack(var/mob/living/target, var/mob/living/user) - if(istype(target)) - cleave(user, target) - ..() - /obj/item/weapon/melee/energy/axe/suicide_act(mob/user) var/datum/gender/TU = gender_datums[user.get_visible_gender()] visible_message("\The [user] swings \the [src] towards [TU.his] head! It looks like [TU.he] [TU.is] trying to commit suicide.") diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index c7212c336d..81f233cdec 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -50,4 +50,41 @@ // Randomizes color /obj/item/weapon/melee/umbrella/random/New() color = "#"+get_random_colour() - ..() \ No newline at end of file + ..() + +/obj/item/weapon/melee/cursedblade + name = "crystal blade" + desc = "The red crystal blade's polished surface glints in the light, giving off a faint glow." + icon_state = "soulblade" + slot_flags = SLOT_BELT | SLOT_BACK + force = 30 + throwforce = 10 + w_class = ITEMSIZE_NORMAL + sharp = 1 + edge = 1 + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + can_speak = 1 + var/list/voice_mobs = list() //The curse of the sword is that it has someone trapped inside. + + +/obj/item/weapon/melee/cursedblade/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(default_parry_check(user, attacker, damage_source) && prob(50)) + user.visible_message("\The [user] parries [attack_text] with \the [src]!") + playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) + return 1 + return 0 + +/obj/item/weapon/melee/cursedblade/proc/ghost_inhabit(var/mob/candidate) + if(!isobserver(candidate)) + return + //Handle moving the ghost into the new shell. + announce_ghost_joinleave(candidate, 0, "They are occupying a cursed sword now.") + var/mob/living/voice/new_voice = new /mob/living/voice(src) //Make the voice mob the ghost is going to be. + new_voice.transfer_identity(candidate) //Now make the voice mob load from the ghost's active character in preferences. + new_voice.mind = candidate.mind //Transfer the mind, if any. + new_voice.ckey = candidate.ckey //Finally, bring the client over. + new_voice.name = "cursed sword" //Cursed swords shouldn't be known characters. + new_voice.real_name = "cursed sword" + voice_mobs.Add(new_voice) + listening_objects |= src \ No newline at end of file diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 3bb0c89bdc..43183d45f4 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -30,7 +30,7 @@ var/list/tape_roll_applications = list() name = "tape" icon = 'icons/policetape.dmi' anchored = 1 - layer = 3.2 + layer = WINDOW_LAYER var/lifted = 0 var/crumpled = 0 var/tape_dir = 0 @@ -257,7 +257,7 @@ var/list/tape_roll_applications = list() else var/obj/item/tape/P = new tape_type(T) P.update_icon() - P.layer = 3.2 + P.layer = WINDOW_LAYER user << "You finish placing \the [src]." if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) @@ -307,10 +307,11 @@ var/list/tape_roll_applications = list() /obj/item/tape/proc/lift(time) lifted = 1 - layer = 8 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER spawn(time) lifted = 0 - layer = initial(layer) + reset_plane_and_layer() // Returns a list of all tape objects connected to src, including itself. /obj/item/tape/proc/gettapeline() diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 4d567019ae..cee423a627 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -138,18 +138,18 @@ /obj/item/weapon/storage/backpack/dufflebag/syndie name = "black dufflebag" - desc = "A large dufflebag for holding extra tactical supplies." + desc = "A large dufflebag for holding extra tactical supplies. This one appears to be made out of lighter material than usual." icon_state = "duffle_syndie" slowdown = 0 /obj/item/weapon/storage/backpack/dufflebag/syndie/med name = "medical dufflebag" - desc = "A large dufflebag for holding extra tactical medical supplies." + desc = "A large dufflebag for holding extra tactical medical supplies. This one appears to be made out of lighter material than usual." icon_state = "duffle_syndiemed" /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo name = "ammunition dufflebag" - desc = "A large dufflebag for holding extra weapons ammunition and supplies." + desc = "A large dufflebag for holding extra weapons ammunition and supplies. This one appears to be made out of lighter material than usual." icon_state = "duffle_syndieammo" /obj/item/weapon/storage/backpack/dufflebag/captain @@ -417,4 +417,4 @@ else H.visible_message("\The [src] decides not to unpack \the [src]!", \ "You decide not to unpack \the [src]!") - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index 9615cc8183..d836d23581 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -94,6 +94,13 @@ else slowdown = initial(slowdown) return 1 + if(istype(H) && istype(TT, /datum/sprite_accessory/tail/taur/deer)) + item_state = "[icon_base]_Deer" + if(H.size_multiplier >= RESIZE_BIG) //Are they a macro? + slowdown = 0 + else + slowdown = initial(slowdown) + return 1 else H << "[no_message]" return 0 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index efd82f5517..97e0366413 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -135,7 +135,8 @@ /obj/item/weapon/crowbar, /obj/item/device/flashlight, /obj/item/weapon/cell/device, - /obj/item/weapon/extinguisher/mini + /obj/item/weapon/extinguisher/mini, + /obj/item/weapon/storage/quickdraw/syringe_case ) /obj/item/weapon/storage/belt/medical/emt @@ -373,7 +374,9 @@ /obj/item/weapon/storage/excavation, /obj/item/weapon/anobattery, /obj/item/device/ano_scanner, - /obj/item/weapon/pickaxe/hand + /obj/item/weapon/pickaxe/hand, + /obj/item/device/xenoarch_multi_tool, + /obj/item/weapon/pickaxe/excavationdrill ) /obj/item/weapon/storage/belt/fannypack diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index c390cb0abd..c1de372dc1 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -107,10 +107,52 @@ if(istype(W,/obj/item/weapon/pen/crayon)) switch(W:colourName) if("mime") - to_chat(usr,"This crayon is too sad to be contained in this box.") + to_chat(user, "This crayon is too sad to be contained in this box.") return if("rainbow") - to_chat(usr,"This crayon is too powerful to be contained in this box.") + to_chat(user, "This crayon is too powerful to be contained in this box.") + return + ..() + +/obj/item/weapon/storage/fancy/markers + name = "box of markers" + desc = "A very professional looking box of permanent markers." + icon = 'icons/obj/crayons.dmi' + icon_state = "markerbox" + w_class = ITEMSIZE_SMALL + icon_type = "marker" + can_hold = list( + /obj/item/weapon/pen/crayon/marker + ) + starts_with = list( + /obj/item/weapon/pen/crayon/marker/black, + /obj/item/weapon/pen/crayon/marker/red, + /obj/item/weapon/pen/crayon/marker/orange, + /obj/item/weapon/pen/crayon/marker/yellow, + /obj/item/weapon/pen/crayon/marker/green, + /obj/item/weapon/pen/crayon/marker/blue, + /obj/item/weapon/pen/crayon/marker/purple + ) + +/obj/item/weapon/storage/fancy/markers/initialize() + . = ..() + update_icon() + +/obj/item/weapon/storage/fancy/markers/update_icon() + var/mutable_appearance/ma = new(src) + ma.overlays = list() + for(var/obj/item/weapon/pen/crayon/marker/marker in contents) + ma.overlays += image('icons/obj/crayons.dmi',"m"+marker.colourName) + appearance = ma + +/obj/item/weapon/storage/fancy/markers/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/weapon/pen/crayon/marker)) + switch(W:colourName) + if("mime") + to_chat(user, "This marker is too depressing to be contained in this box.") + return + if("rainbow") + to_chat(user, "This marker is too childish to be contained in this box.") return ..() @@ -259,7 +301,8 @@ icon_state = "paperbox" icon = 'icons/obj/cigarettes.dmi' w_class = ITEMSIZE_TINY - throwforce = 1 + throwforce = 2 + slot_flags = SLOT_BELT storage_slots = 14 can_hold = list(/obj/item/weapon/rollingpaper) starts_with = list(/obj/item/weapon/rollingpaper = 14) diff --git a/code/game/objects/items/weapons/storage/quickdraw_vr.dm b/code/game/objects/items/weapons/storage/quickdraw.dm similarity index 94% rename from code/game/objects/items/weapons/storage/quickdraw_vr.dm rename to code/game/objects/items/weapons/storage/quickdraw.dm index 7be9309c2c..5e6f58fd53 100644 --- a/code/game/objects/items/weapons/storage/quickdraw_vr.dm +++ b/code/game/objects/items/weapons/storage/quickdraw.dm @@ -1,78 +1,81 @@ -// ----------------------------- -// Quickdraw storage -// ----------------------------- -//These items are pouches and cases made to be kept in belts or pockets to quickly draw objects from -//Largely inspired by the vest pouches on Colonial Marines - -/obj/item/weapon/storage/quickdraw - name = "quickdraw" - desc = "This object should not appear" - icon = 'icons/obj/storage_vr.dmi' - - //Quickmode - //When set to 0, this storage will operate as a regular storage, and clicking on it while equipped will open it as a storage - //When set to 1, a click while it is equipped will instead move the first item inside it to your hand - var/quickmode = 0 - -/obj/item/weapon/storage/quickdraw/attack_hand(mob/user as mob) - if(src.loc == user) //If they aren't holding us, we do nothing special - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(quickmode) - var/first_item = contents[1] - if(first_item && !H.get_active_hand()) //Do we have anything to give you? - H.put_in_hands(first_item) - return - - if(H.l_store == src && !H.get_active_hand()) //overrides - src.open(user) - return - if(H.r_store == src && !H.get_active_hand()) - src.open(user) - return - ..() //Nothing special happened, go call the other proc - - -/obj/item/weapon/storage/quickdraw/verb/toggle_quickdraw() - set name = "Switch Quickdraw Mode" - set category = "Object" - - quickmode = !quickmode - switch (quickmode) - if(1) - to_chat(usr, "[src] now draws the first object inside.") - if(0) - to_chat(usr, "[src] now opens as a container.") - -/obj/item/weapon/storage/quickdraw/AltClick(mob/user) - ..() - if(src.loc == user) //Are they carrying us? - toggle_quickdraw() - -// ----------------------------- -// Syringe case -// ----------------------------- - -/obj/item/weapon/storage/quickdraw/syringe_case - name = "syringe case" - desc = "A small case for safely carrying sharps around." - icon_state = "syringe_case" - - w_class = ITEMSIZE_SMALL - max_w_class = ITEMSIZE_TINY - max_storage_space = ITEMSIZE_TINY * 6 //Capable of holding six syringes - - //Can hold syringes and autoinjectors, but also pills if you really wanted. Syringe-shaped objects like pens and cigarettes also fit, but why would you do that? - can_hold = list(/obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray/autoinjector, - /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/pen, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/smokable/cigarette) - - quickmode = 1 //Starts in quickdraw mode - //Preloaded for your convenience! - starts_with = list( - /obj/item/weapon/reagent_containers/syringe, - /obj/item/weapon/reagent_containers/syringe, - /obj/item/weapon/reagent_containers/syringe, - /obj/item/weapon/reagent_containers/syringe, - /obj/item/weapon/reagent_containers/syringe, - /obj/item/weapon/reagent_containers/syringe +// ----------------------------- +// Quickdraw storage +// ----------------------------- +//These items are pouches and cases made to be kept in belts or pockets to quickly draw objects from +//Largely inspired by the vest pouches on Colonial Marines + +/obj/item/weapon/storage/quickdraw + name = "quickdraw" + desc = "This object should not appear" + icon = 'icons/obj/storage_vr.dmi' // VOREStation Edit + + //Quickmode + //When set to 0, this storage will operate as a regular storage, and clicking on it while equipped will open it as a storage + //When set to 1, a click while it is equipped will instead move the first item inside it to your hand + var/quickmode = 0 + +/obj/item/weapon/storage/quickdraw/attack_hand(mob/user as mob) + if(src.loc == user) //If they aren't holding us, we do nothing special + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(quickmode) + var/first_item = contents[1] + if(first_item && !H.get_active_hand()) //Do we have anything to give you? + H.put_in_hands(first_item) + return + + if(H.l_store == src && !H.get_active_hand()) //overrides + src.open(user) + return + if(H.r_store == src && !H.get_active_hand()) + src.open(user) + return + ..() //Nothing special happened, go call the other proc + + +/obj/item/weapon/storage/quickdraw/verb/toggle_quickdraw() + set name = "Switch Quickdraw Mode" + set category = "Object" + + quickmode = !quickmode + switch (quickmode) + if(1) + to_chat(usr, "[src] now draws the first object inside.") + if(0) + to_chat(usr, "[src] now opens as a container.") + +/obj/item/weapon/storage/quickdraw/AltClick(mob/user) + ..() + if(src.loc == user) //Are they carrying us? + toggle_quickdraw() + + +// If we start adding more of these, we'll need to make them their own folder. 'til then, this one should be fine. + +// ----------------------------- +// Syringe case +// ----------------------------- + +/obj/item/weapon/storage/quickdraw/syringe_case + name = "syringe case" + desc = "A small case for safely carrying sharps around." + icon_state = "syringe_case" + + w_class = ITEMSIZE_SMALL + max_w_class = ITEMSIZE_TINY + max_storage_space = ITEMSIZE_TINY * 6 //Capable of holding six syringes + + //Can hold syringes and autoinjectors, but also pills if you really wanted. Syringe-shaped objects like pens and cigarettes also fit, but why would you do that? + can_hold = list(/obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray/autoinjector, + /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/pen, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/smokable/cigarette) + + quickmode = 1 //Starts in quickdraw mode + //Preloaded for your convenience! + starts_with = list( + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/reagent_containers/syringe ) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 02be9fdfaf..cb376787ab 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -10,6 +10,9 @@ /obj/item/weapon/card, /obj/item/clothing/mask/smokable/cigarette/, /obj/item/device/flashlight/pen, + /obj/item/device/tape, + /obj/item/weapon/cartridge, + /obj/item/device/encryptionkey, /obj/item/seeds, /obj/item/stack/medical, /obj/item/weapon/coin, @@ -18,13 +21,21 @@ /obj/item/weapon/implanter, /obj/item/weapon/flame/lighter, /obj/item/weapon/flame/match, + /obj/item/weapon/forensics, + /obj/item/weapon/glass_extra, + /obj/item/weapon/haircomb, + /obj/item/weapon/hand, + /obj/item/weapon/key, + /obj/item/weapon/lipstick, /obj/item/weapon/paper, /obj/item/weapon/pen, /obj/item/weapon/photo, /obj/item/weapon/reagent_containers/dropper, + /obj/item/weapon/sample, /obj/item/weapon/screwdriver, /obj/item/weapon/stamp, - /obj/item/clothing/accessory/permit + /obj/item/clothing/accessory/permit, + /obj/item/clothing/accessory/badge ) slot_flags = SLOT_ID diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 30257a2b84..83e944f593 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -131,7 +131,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "tape" w_class = ITEMSIZE_TINY - layer = 4 + plane = MOB_PLANE anchored = 1 //it's sticky, no you cant move it var/obj/item/weapon/stuck = null diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm index 68a2c3a774..8d9977cc17 100644 --- a/code/game/objects/items/weapons/trays.dm +++ b/code/game/objects/items/weapons/trays.dm @@ -188,7 +188,7 @@ carrying.Add(I) Img.icon = I.icon Img.icon_state = I.icon_state - Img.layer = 30 + I.layer + Img.layer = layer + I.layer*0.01 if(istype(I, /obj/item/weapon/material)) var/obj/item/weapon/material/O = I if(O.applies_material_colour) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 3833133f4a..3835b2a24b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,4 +1,6 @@ /obj + layer = OBJ_LAYER + plane = OBJ_PLANE //Used to store information about the contents of the object. var/list/matter var/w_class // Size of the object. @@ -13,6 +15,7 @@ var/armor_penetration = 0 var/show_messages var/preserve_item = 0 //whether this object is preserved when its owner goes into cryo-storage, gateway, etc + var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak. var/show_examine = TRUE // Does this pop up on a mob when the mob is examined? diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm index fa126858cc..e7e45a8791 100644 --- a/code/game/objects/random/maintenance.dm +++ b/code/game/objects/random/maintenance.dm @@ -100,11 +100,6 @@ something, make sure it's not in one of the other lists.*/ prob(1);/obj/item/clothing/under/harness, prob(1);/obj/item/clothing/under/tactical, prob(3);/obj/item/clothing/accessory/storage/webbing, - prob(4);/obj/item/weapon/spacecash/c1, - prob(3);/obj/item/weapon/spacecash/c10, - prob(3);/obj/item/weapon/spacecash/c20, - prob(1);/obj/item/weapon/spacecash/c50, - prob(1);/obj/item/weapon/spacecash/c100, prob(3);/obj/item/weapon/camera_assembly, prob(4);/obj/item/weapon/caution, prob(3);/obj/item/weapon/caution/cone, diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 0ebc879e72..29b597d460 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -19,6 +19,18 @@ /obj/item/device/flashlight, /obj/item/device/multitool) +/obj/random/tool/powermaint + name = "random powertool" + desc = "This is a random rare powertool for maintenance" + icon_state = "jaws_pry" + +/obj/random/tool/powermaint/item_to_spawn() + return pick(prob(320);/obj/random/tool, + prob(1);/obj/item/weapon/screwdriver/power, + prob(1);/obj/item/weapon/wirecutters/power, + prob(15);/obj/item/weapon/weldingtool/electric, + prob(5);/obj/item/weapon/weldingtool/experimental) + /obj/random/tool/power name = "random powertool" desc = "This is a random powertool" @@ -148,7 +160,7 @@ name = "Random Medicine" desc = "This is a random medical item." icon = 'icons/obj/items.dmi' - icon_state = "traumakit" + icon_state = "advfirstaid" /obj/random/medical/item_to_spawn() return pick(prob(21);/obj/random/medical/lite, @@ -203,11 +215,11 @@ icon_state = "firstaid" /obj/random/firstaid/item_to_spawn() - return pick(prob(4);/obj/item/weapon/storage/firstaid/regular, - prob(3);/obj/item/weapon/storage/firstaid/toxin, - prob(3);/obj/item/weapon/storage/firstaid/o2, - prob(2);/obj/item/weapon/storage/firstaid/adv, - prob(3);/obj/item/weapon/storage/firstaid/fire, + return pick(prob(10);/obj/item/weapon/storage/firstaid/regular, + prob(8);/obj/item/weapon/storage/firstaid/toxin, + prob(8);/obj/item/weapon/storage/firstaid/o2, + prob(6);/obj/item/weapon/storage/firstaid/adv, + prob(8);/obj/item/weapon/storage/firstaid/fire, prob(1);/obj/item/weapon/storage/firstaid/combat) /obj/random/contraband @@ -236,6 +248,20 @@ prob(2);/obj/item/weapon/reagent_containers/syringe/drugs, prob(1);/obj/item/weapon/reagent_containers/syringe/steroid) +/obj/random/cash + name = "random currency" + desc = "LOADSAMONEY!" + icon = 'icons/obj/items.dmi' + icon_state = "spacecash1" + +/obj/random/cash/item_to_spawn() + return pick(prob(320);/obj/random/maintenance/clean, + prob(12);/obj/item/weapon/spacecash/c1, + prob(8);/obj/item/weapon/spacecash/c10, + prob(4);/obj/item/weapon/spacecash/c20, + prob(1);/obj/item/weapon/spacecash/c50, + prob(1);/obj/item/weapon/spacecash/c100) + /obj/random/soap name = "Random Soap" desc = "This is a random bar of soap." @@ -246,7 +272,7 @@ return pick(prob(3);/obj/item/weapon/soap, prob(2);/obj/item/weapon/soap/nanotrasen, prob(2);/obj/item/weapon/soap/deluxe, - prob(1);/obj/item/weapon/soap/syndie,) + prob(1);/obj/item/weapon/soap/syndie) /obj/random/drinkbottle @@ -387,14 +413,45 @@ icon_state = "nymphplushie" /obj/random/plushie/item_to_spawn() + return pick(/obj/item/toy/plushie/nymph, + /obj/item/toy/plushie/mouse, + /obj/item/toy/plushie/kitten, + /obj/item/toy/plushie/lizard, + /obj/item/toy/plushie/black_cat, + /obj/item/toy/plushie/black_fox, + /obj/item/toy/plushie/blue_fox, + /obj/random/carp_plushie, + /obj/item/toy/plushie/coffee_fox, + /obj/item/toy/plushie/corgi, + /obj/item/toy/plushie/crimson_fox, + /obj/item/toy/plushie/deer, + /obj/item/toy/plushie/girly_corgi, + /obj/item/toy/plushie/grey_cat, + /obj/item/toy/plushie/marble_fox, + /obj/item/toy/plushie/octopus, + /obj/item/toy/plushie/orange_cat, + /obj/item/toy/plushie/orange_fox, + /obj/item/toy/plushie/pink_fox, + /obj/item/toy/plushie/purple_fox, + /obj/item/toy/plushie/red_fox, + /obj/item/toy/plushie/robo_corgi, + /obj/item/toy/plushie/siamese_cat, + /obj/item/toy/plushie/spider, + /obj/item/toy/plushie/tabby_cat, + /obj/item/toy/plushie/tuxedo_cat, + /obj/item/toy/plushie/white_cat) + +/obj/random/plushielarge + name = "random large plushie" + desc = "This is a randomn large plushie." + icon = 'icons/obj/toy.dmi' + icon_state = "droneplushie" + +/obj/random/plushielarge/item_to_spawn() return pick(/obj/structure/plushie/ian, /obj/structure/plushie/drone, /obj/structure/plushie/carp, - /obj/structure/plushie/beepsky, - /obj/item/toy/plushie/nymph, - /obj/item/toy/plushie/mouse, - /obj/item/toy/plushie/kitten, - /obj/item/toy/plushie/lizard) + /obj/structure/plushie/beepsky) /obj/random/toy name = "random toy" @@ -418,6 +475,8 @@ /obj/item/toy/crossbow, /obj/item/toy/blink, /obj/item/toy/waterflower, + /obj/item/toy/eight_ball, + /obj/item/toy/eight_ball/conch, /obj/item/toy/prize/ripley, /obj/item/toy/prize/fireripley, /obj/item/toy/prize/deathripley, diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index c83e96ad04..19a83c8e40 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -274,7 +274,7 @@ prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc, prob(1);/obj/item/weapon/beartrap, prob(1);/obj/item/weapon/handcuffs/fuzzy, - prob(1);/obj/item/weapon/handcuffs/legcuffs, + prob(1);/obj/item/weapon/handcuffs/legcuffs/fuzzy, prob(2);/obj/item/weapon/reagent_containers/syringe/drugs, prob(1);/obj/item/weapon/reagent_containers/syringe/steroid, prob(4);/obj/item/device/radio_jammer, diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 5c3542015c..eddffe55ea 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -10,7 +10,8 @@ LINEN BINS icon = 'icons/obj/items.dmi' icon_state = "sheet" slot_flags = SLOT_BACK - layer = 4.0 + plane = MOB_PLANE + layer = BELOW_MOB_LAYER throwforce = 1 throw_speed = 1 throw_range = 2 @@ -19,9 +20,9 @@ LINEN BINS /obj/item/weapon/bedsheet/attack_self(mob/user as mob) user.drop_item() if(layer == initial(layer)) - layer = MOB_LAYER + 0.1 + layer = ABOVE_MOB_LAYER else - layer = initial(layer) + reset_plane_and_layer() add_fingerprint(user) return @@ -31,7 +32,7 @@ LINEN BINS if(do_after(user, 50)) user << "You cut [src] into pieces!" for(var/i in 1 to rand(2,5)) - new /obj/item/weapon/reagent_containers/glass/rag(src.loc) + new /obj/item/weapon/reagent_containers/glass/rag(drop_location()) qdel(src) return ..() diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm index c55a3342ab..014b49b522 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm @@ -54,6 +54,7 @@ /mob/living/simple_animal/hostile/bear/brown;0.5, /mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/mimic, + /mob/living/simple_animal/hostile/rous, /mob/living/simple_animal/otie;0.5) ..() diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 03cc4bec3f..16dcd2ddb7 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -10,12 +10,14 @@ var/needscharger //For drone pods that want their pod to turn into a charger. // Call this to get a ghost volunteer. -/obj/structure/ghost_pod/proc/trigger() +/obj/structure/ghost_pod/proc/trigger(var/alert, var/adminalert) if(!ghost_query_type) return FALSE if(busy) return FALSE + visible_message(alert) + log_and_message_admins(adminalert) busy = TRUE var/datum/ghost_query/Q = new ghost_query_type() var/list/winner = Q.query() @@ -44,7 +46,7 @@ /obj/structure/ghost_pod/manual/attack_hand(var/mob/living/user) if(!used) if(confirm_before_open) - if(alert(user, "Are you sure you want to open \the [src]?", "Confirm", "No", "Yes") == "No") + if(alert(user, "Are you sure you want to touch \the [src]?", "Confirm", "No", "Yes") == "No") return trigger() diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm index 4e954afd4e..1e7210a1ec 100644 --- a/code/game/objects/structures/ghost_pods/silicon.dm +++ b/code/game/objects/structures/ghost_pods/silicon.dm @@ -13,9 +13,7 @@ needscharger = TRUE /obj/structure/ghost_pod/manual/lost_drone/trigger() - ..() - visible_message("\The [src] appears to be attempting to restart the robot contained inside.") - log_and_message_admins("is attempting to open \a [src].") + ..("\The [src] appears to be attempting to restart the robot contained inside.", "is attempting to open \a [src].") /obj/structure/ghost_pod/manual/lost_drone/create_occupant(var/mob/M) density = FALSE @@ -68,14 +66,13 @@ description_info = "This will summon some manner of creature through quite dubious means. The creature will be controlled by a player." icon_state = "corgirune" icon_state_opened = "corgirune-inert" - density = TRUE + density = FALSE + anchored = TRUE ghost_query_type = /datum/ghost_query/corgi_rune confirm_before_open = TRUE /obj/structure/ghost_pod/manual/corgi/trigger() - ..() - visible_message("\The [usr] places their hand on the rune!") - log_and_message_admins("is attempting to summon a corgi.") + ..("\The [usr] places their hand on the rune!", "is attempting to summon a corgi.") /obj/structure/ghost_pod/manual/corgi/create_occupant(var/mob/M) density = FALSE @@ -86,4 +83,29 @@ R.ckey = M.ckey visible_message("With a bright flash of light, \the [src] disappears, and in its place stands a small corgi.") log_and_message_admins("successfully touched \a [src] and summoned a corgi.") + ..() + +/obj/structure/ghost_pod/manual/cursedblade + name = "abandoned blade" + desc = "A red crystal blade that someone jammed deep into a stone. If you try hard enough, you might be able to remove it." + icon_state = "soulblade-embedded" + icon_state_opened = "soulblade-released" + density = TRUE + anchored = TRUE + ghost_query_type = /datum/ghost_query/cursedblade + confirm_before_open = TRUE + +/obj/structure/ghost_pod/manual/cursedblade/trigger() + ..("\The [usr] attempts to pull out the sword!", "is activating a cursed blade.") + +/obj/structure/ghost_pod/manual/cursedblade/create_occupant(var/mob/M) + density = FALSE + var/obj/item/weapon/melee/cursedblade/R = new(get_turf(src)) + to_chat(M, "You are a Cursed Sword, discovered by a hapless explorer. \ + You were once an explorer yourself, when one day you discovered a strange sword made from a red crystal. As soon as you touched it,\ + your body was reduced to ashes and your soul was cursed to remain trapped in the blade forever. \ + Now it is up to you to decide whether you want to be a faithful companion, or a bitter prisoner of the blade.") + R.ghost_inhabit(M) + visible_message("The blade shines brightly for a brief moment as [usr] pulls it out of the stone!") + log_and_message_admins("successfully acquired a cursed sword.") ..() \ No newline at end of file diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a3ff9ac9af..a22bbae0d2 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -2,7 +2,7 @@ icon_state = "girder" anchored = 1 density = 1 - layer = 2 + plane = PLATING_PLANE w_class = ITEMSIZE_HUGE var/state = 0 var/health = 200 diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm index a10cd0bf6e..e20591b939 100644 --- a/code/game/objects/structures/gravemarker.dm +++ b/code/game/objects/structures/gravemarker.dm @@ -8,7 +8,7 @@ throwpass = 1 climbable = 1 - layer = 3.1 //Above dirt piles + layer = ABOVE_JUNK_LAYER //Maybe make these calculate based on material? var/health = 100 diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 1c7beea412..71eccd6ceb 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -7,7 +7,7 @@ anchored = 1 flags = CONDUCT pressure_resistance = 5*ONE_ATMOSPHERE - layer = 2.9 + layer = UNDER_JUNK_LAYER explosion_resistance = 1 var/health = 10 var/destroyed = 0 diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c042b8fc9a..d9ec122c55 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -6,7 +6,7 @@ density = 0 anchored = 1.0 w_class = ITEMSIZE_NORMAL - layer = 2.3 //under pipes + plane = PLATING_PLANE // flags = CONDUCT /obj/structure/lattice/initialize() diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 4954553a00..cbdacacb69 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -148,7 +148,7 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "morguet" density = 1 - layer = 2.0 + plane = TURF_PLANE var/obj/structure/morgue/connected = null anchored = 1 throwpass = 1 diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 27bb902aea..e67750b8f3 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -6,7 +6,7 @@ density = 1 throwpass = 1 climbable = 1 - layer = 3.2 //Just above doors + layer = WINDOW_LAYER anchored = 1 flags = ON_BORDER icon_state = "railing0" diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 7f78e8f0e7..37edb603c1 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -172,7 +172,8 @@ obj/structure/safe/ex_act(severity) icon_state = "floorsafe" density = 0 level = 1 //underfloor - layer = 2.5 + plane = TURF_PLANE + layer = ABOVE_UTILITY /obj/structure/safe/floor/initialize() . = ..() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 2d26821bbe..b180b88603 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -3,7 +3,7 @@ anchored = 1 opacity = 0 density = 0 - layer = 3.5 + layer = ABOVE_JUNK_LAYER w_class = ITEMSIZE_NORMAL /obj/structure/sign/ex_act(severity) diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 2aa58488b6..4f430d3ec6 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -198,4 +198,14 @@ ..(newloc, MAT_SIFWOOD) /obj/structure/simple_door/resin/New(var/newloc,var/material_name) - ..(newloc, "resin") \ No newline at end of file + ..(newloc, "resin") + +/obj/structure/simple_door/cult/New(var/newloc,var/material_name) + ..(newloc, "cult") + +/obj/structure/simple_door/cult/TryToSwitchState(atom/user) + if(isliving(user)) + var/mob/living/L = user + if(!iscultist(L) && !istype(L, /mob/living/simple_animal/construct)) + return + ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 2eb40d5819..8d391f14ff 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -48,15 +48,17 @@ if(isnull(stool_cache[cache_key])) var/image/I = image(icon, "[base_icon]_armrest") I.layer = MOB_LAYER + 0.1 + I.plane = MOB_PLANE I.color = padding_material.icon_colour stool_cache[cache_key] = I overlays |= stool_cache[cache_key] /obj/structure/bed/chair/proc/update_layer() if(src.dir == NORTH) - src.layer = FLY_LAYER + plane = MOB_PLANE + layer = MOB_LAYER + 0.1 else - src.layer = OBJ_LAYER + reset_plane_and_layer() /obj/structure/bed/chair/set_dir() ..() diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 83396b363e..646e52218c 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -29,7 +29,7 @@ W.density = 1 user.remove_from_mob(W) W.loc = loc - W.layer = 3.1 + W.layer = ABOVE_JUNK_LAYER pinned_target = W user << "You slide the target into the stake." return diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index 0f9b4a603a..c260103a56 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/pipes/transit_tube.dmi' icon_state = "E-W" density = 1 - layer = 3.1 + layer = ABOVE_JUNK_LAYER anchored = 1.0 var/list/tube_dirs = null var/exit_delay = 2 diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9c8df70d21..3186e26e0e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -5,7 +5,7 @@ density = 1 w_class = ITEMSIZE_NORMAL - layer = 3.2//Just above doors + layer = WINDOW_LAYER pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1.0 flags = ON_BORDER @@ -311,7 +311,7 @@ qdel(src) else if(istype(W,/obj/item/frame) && anchored) var/obj/item/frame/F = W - F.try_build(src) + F.try_build(src, user) else user.setClickCooldown(user.get_attack_speed(W)) if(W.damtype == BRUTE || W.damtype == BURN) @@ -462,7 +462,7 @@ if(ratio > 75) return - var/image/I = image(icon, "damage[ratio]", layer + 0.1) + var/image/I = image(icon, "damage[ratio]", layer = layer + 0.1) overlays += I return diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index 7a619477ea..c9a4babd9e 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -2,6 +2,7 @@ name = "weapon" icon = 'icons/obj/weapons.dmi' hitsound = "swing_hit" + var/can_cleave = FALSE // If true, a 'cleaving' attack will occur. var/cleaving = FALSE // Used to avoid infinite cleaving. /obj/item/weapon/Bump(mob/M as mob) @@ -16,14 +17,17 @@ ) // Attacks mobs (atm only simple ones due to friendly fire issues) that are adjacent to the target and user. -/obj/item/weapon/proc/cleave(var/mob/living/user, var/mob/living/target) +/obj/item/weapon/proc/cleave(mob/living/user, atom/target) if(cleaving) - return // We're busy. + return FALSE // We're busy. + if(!target.Adjacent(user)) + return FALSE // Too far. if(get_turf(user) == get_turf(target)) - return // Otherwise we would hit all eight surrounding tiles. + return FALSE // Otherwise we would hit all eight surrounding tiles. + cleaving = TRUE var/hit_mobs = 0 - for(var/mob/living/simple_animal/SA in orange(get_turf(target), 1)) + for(var/mob/living/simple_animal/SA in range(get_turf(target), 1)) if(SA.stat == DEAD) // Don't beat a dead horse. continue if(SA == user) // Don't hit ourselves. Simple mobs shouldn't be able to do this but that might change later to be able to hit all mob/living-s. @@ -42,6 +46,13 @@ if(hit_mobs) to_chat(user, "You used \the [src] to attack [hit_mobs] other thing\s!") cleaving = FALSE // We're done now. + return hit_mobs > 0 // Returns TRUE if anything got hit. + +// This cannot go into afterattack since some mobs delete themselves upon dying. +/obj/item/weapon/material/pre_attack(mob/living/target, mob/living/user) + if(can_cleave && istype(target)) + cleave(user, target) + ..() // This is purely the visual effect of cleaving. /obj/item/weapon/proc/cleave_visual(var/mob/living/user, var/mob/living/target) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index b45eaf69af..3cc0bb8ab9 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1,8 +1,8 @@ //Config stuff -#define SUPPLY_DOCKZ 2 //Z-level of the Dock. -#define SUPPLY_STATIONZ 1 //Z-level of the Station. -#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station -#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock +#define SUPPLY_DOCKZ 2 //Z-level of the Dock. +#define SUPPLY_STATIONZ 1 //Z-level of the Station. +#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station +#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock //Supply packs are in /code/defines/obj/supplypacks.dm //Computers are in /code/game/machinery/computer/supply.dm @@ -10,333 +10,324 @@ var/datum/controller/supply/supply_controller = new() var/list/mechtoys = list( - /obj/item/toy/prize/ripley, - /obj/item/toy/prize/fireripley, - /obj/item/toy/prize/deathripley, - /obj/item/toy/prize/gygax, - /obj/item/toy/prize/durand, - /obj/item/toy/prize/honk, - /obj/item/toy/prize/marauder, - /obj/item/toy/prize/seraph, - /obj/item/toy/prize/mauler, - /obj/item/toy/prize/odysseus, - /obj/item/toy/prize/phazon + /obj/item/toy/prize/ripley, + /obj/item/toy/prize/fireripley, + /obj/item/toy/prize/deathripley, + /obj/item/toy/prize/gygax, + /obj/item/toy/prize/durand, + /obj/item/toy/prize/honk, + /obj/item/toy/prize/marauder, + /obj/item/toy/prize/seraph, + /obj/item/toy/prize/mauler, + /obj/item/toy/prize/odysseus, + /obj/item/toy/prize/phazon ) /obj/item/weapon/paper/manifest - name = "supply manifest" - var/is_copy = 1 + name = "supply manifest" + var/is_copy = 1 /area/supply/station - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - base_turf = /turf/space + name = "Supply Shuttle" + icon_state = "shuttle3" + requires_power = 0 + base_turf = /turf/space /area/supply/dock - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - base_turf = /turf/space + name = "Supply Shuttle" + icon_state = "shuttle3" + requires_power = 0 + base_turf = /turf/space /obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY - name = "\improper plastic flaps" - desc = "Completely impassable - or are they?" - icon = 'icons/obj/stationobjs.dmi' //Change this. - icon_state = "plasticflaps" - density = 0 - anchored = 1 - layer = 4 - explosion_resistance = 5 - var/list/mobs_can_pass = list( - /mob/living/bot, - /mob/living/simple_animal/slime, - /mob/living/simple_animal/mouse, - /mob/living/silicon/robot/drone - ) + name = "\improper plastic flaps" + desc = "Completely impassable - or are they?" + icon = 'icons/obj/stationobjs.dmi' //Change this. + icon_state = "plasticflaps" + density = 0 + anchored = 1 + layer = MOB_LAYER + plane = MOB_PLANE + explosion_resistance = 5 + var/list/mobs_can_pass = list( + /mob/living/bot, + /mob/living/simple_animal/slime, + /mob/living/simple_animal/mouse, + /mob/living/silicon/robot/drone + ) /obj/structure/plasticflaps/attackby(obj/item/P, mob/user) - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src, P.usesound, 50, 1) - user << "You start to cut the plastic flaps." - if(do_after(user, 10 * P.toolspeed)) - user << "You cut the plastic flaps." - var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc ) - A.amount = 4 - qdel(src) - return - else - return + if(istype(P, /obj/item/weapon/wirecutters)) + playsound(src, P.usesound, 50, 1) + user << "You start to cut the plastic flaps." + if(do_after(user, 10 * P.toolspeed)) + user << "You cut the plastic flaps." + var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc ) + A.amount = 4 + qdel(src) + return + else + return /obj/structure/plasticflaps/CanPass(atom/A, turf/T) - if(istype(A) && A.checkpass(PASSGLASS)) - return prob(60) + if(istype(A) && A.checkpass(PASSGLASS)) + return prob(60) - var/obj/structure/bed/B = A - if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass - return 0 + var/obj/structure/bed/B = A + if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass + return 0 - if(istype(A, /obj/vehicle)) //no vehicles - return 0 + if(istype(A, /obj/vehicle)) //no vehicles + return 0 - var/mob/living/M = A - if(istype(M)) - if(M.lying) - return ..() - for(var/mob_type in mobs_can_pass) - if(istype(A, mob_type)) - return ..() - return issmall(M) + var/mob/living/M = A + if(istype(M)) + if(M.lying) + return ..() + for(var/mob_type in mobs_can_pass) + if(istype(A, mob_type)) + return ..() + return issmall(M) - return ..() + return ..() /obj/structure/plasticflaps/ex_act(severity) - switch(severity) - if (1) - qdel(src) - if (2) - if (prob(50)) - qdel(src) - if (3) - if (prob(5)) - qdel(src) + switch(severity) + if (1) + qdel(src) + if (2) + if (prob(50)) + qdel(src) + if (3) + if (prob(5)) + qdel(src) /obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates - name = "airtight plastic flaps" - desc = "Heavy duty, airtight, plastic flaps." + name = "airtight plastic flaps" + desc = "Heavy duty, airtight, plastic flaps." - New() //set the turf below the flaps to block air - var/turf/T = get_turf(loc) - if(T) - T.blocks_air = 1 - ..() +/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air + var/turf/T = get_turf(loc) + if(T) + T.blocks_air = 1 + ..() - Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor - var/turf/T = get_turf(loc) - if(T) - if(istype(T, /turf/simulated/floor)) - T.blocks_air = 0 - ..() +/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor + var/turf/T = get_turf(loc) + if(T && istype(T, /turf/simulated/floor)) + T.blocks_air = 0 + ..() /* /obj/effect/marker/supplymarker - icon_state = "X" - icon = 'icons/misc/mark.dmi' - name = "X" - invisibility = 101 - anchored = 1 - opacity = 0 + icon_state = "X" + icon = 'icons/misc/mark.dmi' + name = "X" + invisibility = 101 + anchored = 1 + opacity = 0 */ /datum/supply_order - var/ordernum - var/datum/supply_packs/object = null - var/orderedby = null - var/comment = null + var/ordernum + var/datum/supply_packs/object = null + var/orderedby = null + var/comment = null -//VOREStation Edit - Export reports /datum/exported_crate - var/name - var/value -//VOREStation Edit End + var/name + var/value /datum/controller/supply - //supply points - var/points = 50 - var/points_per_process = 1.5 - var/points_per_slip = 2 - var/points_per_platinum = 5 // 5 points per sheet - var/points_per_phoron = 5 - var/points_per_money = 0.02 - //control - var/ordernum - var/list/shoppinglist = list() - var/list/requestlist = list() - var/list/supply_packs = list() - var/list/exported_crates = list() //VOREStation Edit - Export reports - //shuttle movement - var/movetime = 1200 - var/datum/shuttle/ferry/supply/shuttle + //supply points + var/points = 50 + var/points_per_process = 1.5 + var/points_per_slip = 2 + var/points_per_platinum = 5 // 5 points per sheet + var/points_per_phoron = 5 + var/points_per_money = 0.02 + //control + var/ordernum + var/list/shoppinglist = list() + var/list/requestlist = list() + var/list/supply_packs = list() + var/list/exported_crates = list() + //shuttle movement + var/movetime = 1200 + var/datum/shuttle/ferry/supply/shuttle - New() - ordernum = rand(1,9000) +/datum/controller/supply/New() + ordernum = rand(1,9000) - for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) - var/datum/supply_packs/P = new typepath() - supply_packs[P.name] = P + for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) + var/datum/supply_packs/P = new typepath() + supply_packs[P.name] = P - // Supply shuttle ticker - handles supply point regeneration - // This is called by the process scheduler every thirty seconds - proc/process() - points += points_per_process +// Supply shuttle ticker - handles supply point regeneration +// This is called by the process scheduler every thirty seconds +/datum/controller/supply/proc/process() + points += points_per_process - //To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. - proc/forbidden_atoms_check(atom/A) - if(istype(A,/mob/living)) - return 1 - if(istype(A,/obj/item/weapon/disk/nuclear)) - return 1 - if(istype(A,/obj/machinery/nuclearbomb)) - return 1 - if(istype(A,/obj/item/device/radio/beacon)) - return 1 +//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. +/datum/controller/supply/proc/forbidden_atoms_check(atom/A) + if(isliving(A)) + return 1 + if(istype(A,/obj/item/weapon/disk/nuclear)) + return 1 + if(istype(A,/obj/machinery/nuclearbomb)) + return 1 + if(istype(A,/obj/item/device/radio/beacon)) + return 1 - for(var/i=1, i<=A.contents.len, i++) - var/atom/B = A.contents[i] - if(.(B)) - return 1 + for(var/i=1, i<=A.contents.len, i++) + var/atom/B = A.contents[i] + if(.(B)) + return 1 - //Sellin - proc/sell() - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) return +//Sellin +/datum/controller/supply/proc/sell() + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) return - callHook("sell_shuttle", list(area_shuttle)); + callHook("sell_shuttle", list(area_shuttle)); - var/phoron_count = 0 - var/plat_count = 0 - var/money_count = 0 + var/phoron_count = 0 + var/plat_count = 0 + var/money_count = 0 - exported_crates = list() //VOREStation Edit - Export reports + exported_crates = list() - for(var/atom/movable/MA in area_shuttle) - if(MA.anchored) continue + for(var/atom/movable/MA in area_shuttle) + if(MA.anchored) continue - // Must be in a crate! - if(istype(MA,/obj/structure/closet/crate)) - //VOREStation Edit - Export reports - var/oldpoints = points - var/oldphoron = phoron_count - var/oldplatinum = plat_count - var/oldmoney = money_count - //VOREStation Edit End + // Must be in a crate! + if(istype(MA,/obj/structure/closet/crate)) + var/oldpoints = points + var/oldphoron = phoron_count + var/oldplatinum = plat_count + var/oldmoney = money_count - var/obj/structure/closet/crate/CR = MA - callHook("sell_crate", list(CR, area_shuttle)) + var/obj/structure/closet/crate/CR = MA + callHook("sell_crate", list(CR, area_shuttle)) - points += CR.points_per_crate - var/find_slip = 1 + points += CR.points_per_crate + var/find_slip = 1 - for(var/atom in CR) - // Sell manifests - var/atom/A = atom - if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) - var/obj/item/weapon/paper/manifest/slip = A - if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense - points += points_per_slip - find_slip = 0 - continue + for(var/atom in CR) + // Sell manifests + var/atom/A = atom + if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) + var/obj/item/weapon/paper/manifest/slip = A + if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense + points += points_per_slip + find_slip = 0 + continue - // Sell phoron and platinum - if(istype(A, /obj/item/stack)) - var/obj/item/stack/P = A - switch(P.get_material_name()) - if("phoron") phoron_count += P.get_amount() - if("platinum") plat_count += P.get_amount() + // Sell phoron and platinum + if(istype(A, /obj/item/stack)) + var/obj/item/stack/P = A + switch(P.get_material_name()) + if("phoron") phoron_count += P.get_amount() + if("platinum") plat_count += P.get_amount() - //Sell spacebucks - if(istype(A, /obj/item/weapon/spacecash)) - var/obj/item/weapon/spacecash/cashmoney = A - money_count += cashmoney.worth + //Sell spacebucks + if(istype(A, /obj/item/weapon/spacecash)) + var/obj/item/weapon/spacecash/cashmoney = A + money_count += cashmoney.worth - //VOREStation Edit - Export reports - var/datum/exported_crate/EC = new /datum/exported_crate() - EC.name = CR.name - EC.value = points - oldpoints - EC.value += (phoron_count - oldphoron) * points_per_phoron - EC.value += (plat_count - oldplatinum) * points_per_platinum - EC.value += (money_count - oldmoney) * points_per_money - exported_crates += EC - //VOREStation Edit End + var/datum/exported_crate/EC = new /datum/exported_crate() + EC.name = CR.name + EC.value = points - oldpoints + EC.value += (phoron_count - oldphoron) * points_per_phoron + EC.value += (plat_count - oldplatinum) * points_per_platinum + EC.value += (money_count - oldmoney) * points_per_money + exported_crates += EC - qdel(MA) + qdel(MA) - if(phoron_count) - points += phoron_count * points_per_phoron + points += phoron_count * points_per_phoron + points += plat_count * points_per_platinum + points += money_count * points_per_money - if(plat_count) - points += plat_count * points_per_platinum +//Buyin +/datum/controller/supply/proc/buy() + if(!shoppinglist.len) + return - if(money_count) - points += money_count * points_per_money + var/orderedamount = shoppinglist.len - //Buyin - proc/buy() - if(!shoppinglist.len) return + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) + return - var/orderedamount = shoppinglist.len + var/list/clear_turfs = list() - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) return + for(var/turf/T in area_shuttle) + if(T.density) + continue + var/contcount + for(var/atom/A in T.contents) + if(!A.simulated) + continue + contcount++ + if(contcount) + continue + clear_turfs += T - var/list/clear_turfs = list() + for(var/S in shoppinglist) + if(!clear_turfs.len) break + var/i = rand(1,clear_turfs.len) + var/turf/pickedloc = clear_turfs[i] + clear_turfs.Cut(i,i+1) + shoppinglist -= S - for(var/turf/T in area_shuttle) - if(T.density) continue - var/contcount - for(var/atom/A in T.contents) - if(!A.simulated) - continue - contcount++ - if(contcount) - continue - clear_turfs += T + var/datum/supply_order/SO = S + var/datum/supply_packs/SP = SO.object - for(var/S in shoppinglist) - if(!clear_turfs.len) break - var/i = rand(1,clear_turfs.len) - var/turf/pickedloc = clear_turfs[i] - clear_turfs.Cut(i,i+1) - shoppinglist -= S + var/obj/A = new SP.containertype(pickedloc) + A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" - var/datum/supply_order/SO = S - var/datum/supply_packs/SP = SO.object + //supply manifest generation begin + var/obj/item/weapon/paper/manifest/slip + if(!SP.contraband) + slip = new /obj/item/weapon/paper/manifest(A) + slip.is_copy = 0 + slip.info = "

[command_name()] Shipping Manifest



" + slip.info +="Order #[SO.ordernum]
" + slip.info +="Destination: [station_name()]
" + slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
" + slip.info +="CONTENTS:

" - slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" - - return \ No newline at end of file + return diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index 1affecf04f..549265e954 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -67,6 +67,13 @@ var/list/flooring_types desc = "A layer of many tiny bits of frozen water. It's hard to tell how deep it is." icon = 'icons/turf/snow_new.dmi' icon_base = "snow" + footstep_sounds = list("human" = list( + 'sound/effects/footstep/snow1.ogg', + 'sound/effects/footstep/snow2.ogg', + 'sound/effects/footstep/snow3.ogg', + 'sound/effects/footstep/snow4.ogg', + 'sound/effects/footstep/snow5.ogg')) + /decl/flooring/snow/snow2 name = "snow" @@ -96,7 +103,7 @@ var/list/flooring_types /decl/flooring/carpet name = "carpet" desc = "Imported and comfy." - icon = 'icons/turf/flooring/carpet_vr.dmi' + icon = 'icons/turf/flooring/carpet.dmi' icon_base = "carpet" build_type = /obj/item/stack/tile/carpet damage_temperature = T0C+200 @@ -330,4 +337,4 @@ var/list/flooring_types build_type = null has_damage_range = 6 flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK - can_paint = null \ No newline at end of file + can_paint = null diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index ea9a7f77fb..8d24e46765 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -6,7 +6,7 @@ var/list/floor_decals = list() /obj/effect/floor_decal name = "floor decal" icon = 'icons/turf/flooring/decals_vr.dmi' // VOREStation Edit - layer = DECALS_LAYER + plane = DECAL_PLANE var/supplied_dir /obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour) diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 106ba48422..c9f1e55209 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -1,6 +1,6 @@ /turf/simulated/floor/carpet name = "carpet" - icon = 'icons/turf/flooring/carpet_vr.dmi' + icon = 'icons/turf/flooring/carpet.dmi' icon_state = "carpet" initial_flooring = /decl/flooring/carpet @@ -68,12 +68,26 @@ icon_state = "wood" initial_flooring = /decl/flooring/wood +/turf/simulated/floor/wood/broken + icon_state = "wood_broken0" // This gets changed when spawned. + +/turf/simulated/floor/wood/broken/initialize() + break_tile() + return ..() + /turf/simulated/floor/wood/sif name = "alien wooden floor" icon = 'icons/turf/flooring/wood.dmi' icon_state = "sifwood" initial_flooring = /decl/flooring/wood/sif +/turf/simulated/floor/wood/sif/broken + icon_state = "sifwood_broken0" // This gets changed when spawned. + +/turf/simulated/floor/wood/sif/broken/initialize() + break_tile() + return ..() + /turf/simulated/floor/grass name = "grass patch" icon = 'icons/turf/flooring/grass.dmi' @@ -418,4 +432,4 @@ for(var/i in 1 to amt) add_overlay(image(icon, "footprint[i]", text2num(d))) -//**** Here ends snow **** \ No newline at end of file +//**** Here ends snow **** diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 5602eac320..91371e7beb 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -3,6 +3,12 @@ if(!C || !user) return 0 + if(isliving(user) && istype(C, /obj/item/weapon)) + var/mob/living/L = user + if(L.a_intent != I_HELP) + attack_tile(C, L) // Be on help intent if you want to decon something. + return + if(flooring) if(istype(C, /obj/item/weapon)) try_deconstruct_tile(C, user) diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index 1faf198ced..a7cab51424 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -7,7 +7,7 @@ var/image/no_ceiling_image = null return TRUE /proc/cache_no_ceiling_image() - no_ceiling_image = image(icon = 'icons/turf/open_space.dmi', icon_state = "no_ceiling", layer = OVERTURF_LAYER) + no_ceiling_image = image(icon = 'icons/turf/open_space.dmi', icon_state = "no_ceiling") no_ceiling_image.plane = PLANE_MESONS /turf/simulated/floor/update_icon(var/update_neighbors) diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 3c4856cf00..dc49c0d893 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -105,6 +105,7 @@ if(landed_holder && !interior_corner) var/mutable_appearance/landed_on = new(landed_holder) landed_on.layer = FLOAT_LAYER //Not turf + landed_on.plane = FLOAT_PLANE //Not turf us.underlays = list(landed_on) appearance = us return diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm index 9926c4704a..5fed8af66b 100644 --- a/code/game/turfs/simulated/outdoors/snow.dm +++ b/code/game/turfs/simulated/outdoors/snow.dm @@ -3,12 +3,14 @@ icon_state = "snow" edge_blending_priority = 6 movement_cost = 2 + initial_flooring = /decl/flooring/snow turf_layers = list( /turf/simulated/floor/outdoors/rocks, /turf/simulated/floor/outdoors/dirt ) var/list/crossed_dirs = list() + /turf/simulated/floor/outdoors/snow/Entered(atom/A) if(isliving(A)) var/mdir = "[A.dir]" @@ -51,5 +53,5 @@ if(istype(M, /mob/living)) if(M.stunned == 0) to_chat(M, "You slide across the ice!") - M.SetStunned(2) + M.SetStunned(1) step(M,M.dir) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 01633b65d3..8bc362a1d7 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -57,12 +57,19 @@ source.thermal_conductivity = initial(source.thermal_conductivity) /turf/simulated/wall/proc/fail_smash(var/mob/user) - user << "You smash against the wall!" + to_chat(user, "You smash against the wall!") + if(isanimal(user)) + var/mob/living/simple_animal/S = user + playsound(src, S.attack_sound, 75, 1) + user.do_attack_animation(src) take_damage(rand(25,75)) /turf/simulated/wall/proc/success_smash(var/mob/user) - user << "You smash through the wall!" + to_chat(user, "You smash through the wall!") user.do_attack_animation(src) + if(isanimal(user)) + var/mob/living/simple_animal/S = user + playsound(src, S.attack_sound, 75, 1) spawn(1) dismantle_wall(1) @@ -355,7 +362,7 @@ if(istype(W,/obj/item/frame)) var/obj/item/frame/F = W - F.try_build(src) + F.try_build(src, user) return else if(!istype(W,/obj/item/weapon/rcd) && !istype(W, /obj/item/weapon/reagent_containers)) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 21fd9492f0..e5bb57ad9e 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -252,7 +252,7 @@ O.icon_state = "2" O.anchored = 1 O.density = 1 - O.layer = 5 + O.plane = ABOVE_PLANE if(girder_material.integrity >= 150 && !girder_material.is_brittle()) //Strong girders will remain in place when a wall is melted. dismantle_wall(1,1) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 80769fc96b..7a38d339f0 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -1,5 +1,7 @@ /turf icon = 'icons/turf/floors.dmi' + layer = TURF_LAYER + plane = TURF_PLANE level = 1 var/holy = 0 @@ -84,6 +86,34 @@ turf/attackby(obj/item/weapon/W as obj, mob/user as mob) S.gather_all(src, user) return ..() +// Hits a mob on the tile. +/turf/proc/attack_tile(obj/item/weapon/W, mob/living/user) + if(!istype(W)) + return FALSE + + var/list/viable_targets = list() + var/success = FALSE // Hitting something makes this true. If its still false, the miss sound is played. + + for(var/mob/living/L in contents) + if(L == user) // Don't hit ourselves. + continue + viable_targets += L + + if(!viable_targets.len) // No valid targets on this tile. + if(W.can_cleave) + success = W.cleave(user, src) + else + var/mob/living/victim = pick(viable_targets) + success = W.resolve_attackby(victim, user) + + user.setClickCooldown(user.get_attack_speed(W)) + user.do_attack_animation(src, no_attack_icons = TRUE) + + if(!success) // Nothing got hit. + user.visible_message("\The [user] swipes \the [W] over \the [src].") + playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + return success + /turf/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) var/turf/T = get_turf(user) var/area/A = T.loc diff --git a/code/game/turfs/unsimulated/shuttle.dm b/code/game/turfs/unsimulated/shuttle.dm index 99f5bc15bd..cb70c6c36d 100644 --- a/code/game/turfs/unsimulated/shuttle.dm +++ b/code/game/turfs/unsimulated/shuttle.dm @@ -3,7 +3,6 @@ icon = 'icons/turf/shuttle_white.dmi' thermal_conductivity = 0.05 heat_capacity = 0 - layer = 2 /turf/unsimulated/shuttle/wall name = "wall" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7c5b9194d8..28f8036a5a 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -7,6 +7,7 @@ var/global/floorIsLava = 0 /proc/message_admins(var/msg) msg = "ADMIN LOG: [msg]" //log_adminwarn(msg) //log_and_message_admins is for this + for(var/client/C in admins) if((R_ADMIN|R_MOD) & C.holder.rights) C << msg diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 04abffc311..486f4907cf 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -6,6 +6,10 @@ var/list/admin_ranks = list() //list of all ranks with associated rights var/previous_rights = 0 + //Clear profile access + for(var/A in world.GetConfig("admin")) + world.SetConfig("APP/admin", A, null) + //load text from file var/list/Lines = file2list("config/admin_ranks.txt") diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 4f0cba95c4..2d74b43433 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -23,6 +23,8 @@ var/list/admin_datums = list() rank = initial_rank rights = initial_rights admin_datums[ckey] = src + if(rights & R_DEBUG) //grant profile access + world.SetConfig("APP/admin", ckey, "role=admin") /datum/admins/proc/associate(client/C) if(istype(C)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d4b09bfc21..bf7952ea61 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -425,6 +425,10 @@ Traitors and the like can also be revived with the previous role mostly intact. //For logging later var/admin = key_name_admin(src) var/player_key = picked_client.key + //VOREStation Add - Needed for persistence + var/picked_ckey = picked_client.ckey + var/picked_slot = picked_client.prefs.default_slot + //VOREStation Add End var/mob/living/carbon/human/new_character var/spawnloc @@ -471,6 +475,12 @@ Traitors and the like can also be revived with the previous role mostly intact. antag_data.add_antagonist(new_character.mind) antag_data.place_mob(new_character) + //VOREStation Add - Required for persistence + if(new_character.mind) + new_character.mind.loaded_from_ckey = picked_ckey + new_character.mind.loaded_from_slot = picked_slot + //VOREStation Add End + //If desired, apply equipment. if(equipment) if(charjob) diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index ba9f41c403..19461e68c8 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -285,7 +285,8 @@ var/list/blobs = list() name = "blob" desc = "The blob lashing out at something." icon_state = "blob_attack" - layer = 5.2 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER time_to_die = 6 alpha = 140 mouse_opacity = 0 diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index 0285a68444..cf364aa3e9 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -41,9 +41,9 @@ if(autogenerate_destination_names) // Lets pad out the destination names. var/i = rand(6, 10) var/list/star_names = list( - "Sol", "Alpha Centauri", "Sirius", "Vega", "Regulus", "Vir", "Algol", "Aldebaran", - "Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti", - "Wazn", "Alphard", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "the Almach Rim") + "Sol", "Alpha Centauri", "Tau Ceti", "Zhu Que", "Oasis", "Vir", "Gavel", "Ganesha", + "Saint Columbia", "Altair", "Sidhe", "New Ohio", "Parvati", "Mahi-Mahi", "Nyx", "New Seoul", + "Kess-Gendar", "Raphael", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "Thoth", "Jahan's Post", "Kauq'xum", "Silk", "New Singapore", "Stove", "Viola", "Love", "Isavau's Gamble" ) var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost") while(i) destination_names.Add("a [pick(destination_types)] in [pick(star_names)]") @@ -373,7 +373,8 @@ "Preemptive Defensive Strike", "This Ship Is Spiders", "Legitimate Trade Vessel", - "Please Don't Explode II" + "Please Don't Explode II", + "Get Off the Air" ) destination_names = list( "a trade outpost in Shelf" diff --git a/code/modules/busy_space/organizations_vr.dm b/code/modules/busy_space_vr/organizations.dm similarity index 52% rename from code/modules/busy_space/organizations_vr.dm rename to code/modules/busy_space_vr/organizations.dm index 2e700b6497..731ef73b22 100644 --- a/code/modules/busy_space/organizations_vr.dm +++ b/code/modules/busy_space_vr/organizations.dm @@ -1,6 +1,406 @@ //Datums for different companies that can be used by busy_space, VR edition + +// Some of these intentionally copy from busy_space/organizations.dm, which is disabled in our server. ////////////////////////////////////////////////////////////////////////////////// +//Datums for different companies that can be used by busy_space +/datum/lore/organization + var/name = "" // Organization's name + var/short_name = "" // Organization's shortname (NanoTrasen for "NanoTrasen Incorporated") + var/acronym = "" // Organization's acronym, e.g. 'NT' for NanoTrasen'. + var/desc = "" // One or two paragraph description of the organization, but only current stuff. Currently unused. + var/history = "" // Historical discription of the organization's origins Currently unused. + var/work = "" // Short description of their work, eg "an arms manufacturer" + var/headquarters = "" // Location of the organization's HQ. Currently unused. + var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused. + + var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc") + var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better. + "Kestrel", + "Beacon", + "Signal", + "Freedom", + "Glory", + "Axiom", + "Eternal", + "Harmony", + "Light", + "Discovery", + "Endeavour", + "Explorer", + "Swift", + "Dragonfly", + "Ascendant", + "Tenacious", + "Pioneer", + "Hawk", + "Haste", + "Radiant", + "Luminous" + ) + var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. + var/autogenerate_destination_names = TRUE + +/datum/lore/organization/New() + ..() + if(autogenerate_destination_names) // Lets pad out the destination names. + var/i = rand(6, 10) + var/list/star_names = list( + "Sol", "Alpha Centauri", "Sirius", "Vega", "Regulus", "Vir", "Algol", "Aldebaran", "Vilous", "Sanctum", "Qerr'Vallis", "Kataigal", "Antares", + "Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti", "Virgo-Erigone", "Uueoa-Esa", "Vazzend", "Kastra-71", + "Wazn", "Alphard", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "the Almach Rim") + var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost") + while(i) + destination_names.Add("a [pick(destination_types)] in [pick(star_names)]") + i-- + +////////////////////////////////////////////////////////////////////////////////// + +// TSCs +/datum/lore/organization/tsc/nanotrasen + name = "NanoTrasen Incorporated" + short_name = "NanoTrasen" + acronym = "NT" + desc = "NanoTrasen is one of the foremost research and development companies in SolGov space. \ + Originally focused on consumer products, their swift move into the field of Phoron has lead to \ + them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \ + itself on being an early adopter to as many new technologies as possible, often offering the newest \ + products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \ + also offers one of the most comprehensive medical plans in SolGov space, up to and including cloning \ + and therapy.\ +

\ + NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ + It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \ + for newly tested posibrains to remain with the company." + history = "" // To be written someday. + work = "research giant" + headquarters = "Luna" + motto = "" + + ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response") + //Scientist or Greek mythology naming scheme + ship_names = list( + "Bardeen", + "Einstein", + "Feynman", + "Sagan", + "Tyson", + "Galilei", + "Jans", + "Fhriede", + "Franklin", + "Tesla", + "Curie", + "Darwin", + "Newton", + "Pasteur", + "Bell", + "Mendel", + "Kepler", + "Edision", + "Cavendish", + "Nye", + "Hawking", + "Aristotle", + "Von Braun", + "Kaku", + "Oppenheimer" + ) + // Note that the current station being used will be pruned from this list upon being instantiated + destination_names = list( + "NSS Exodus in Nyx", + "NCS Northern Star in Vir", + "NAB Smythside Central Headquarters in Sol", + "NAS Zeus orbiting Virgo-Prime", + "NIB Posideon in Alpha Centauri", + "NTB An-Nur on Virgo-Prime", + "the colony at Virgo-3B", + "the NanoTrasen phoron refinery in Vilous", + "a dockyard orbiting Virgo-Prime", + "an asteroid orbiting Virgo 3", + ) + +/datum/lore/organization/tsc/nanotrasen/New() + ..() + spawn(1) // BYOND shenanigans means using_map is not initialized yet. Wait a tick. + // Get rid of the current map from the list, so ships flying in don't say they're coming to the current map. + var/string_to_test = "[using_map.station_name] in [using_map.starsys_name]" + if(string_to_test in destination_names) + destination_names.Remove(string_to_test) + + + +/datum/lore/organization/tsc/hephaestus + name = "Hephaestus Industries" + short_name = "Hephaestus" + acronym = "HI" + desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Sol space. \ + Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \ + from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \ + prevents any contracting polities from using their own materiel against them. SolGov itself is one of Hephastus’ largest \ + bulk contractors owing to the above factors." + history = "" + work = "arms manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply") + //War God/Soldier Theme + ship_names = list( + "Ares", + "Athena", + "Grant", + "Custer", + "Puller", + "Nike", + "Bellona", + "Leonides", + "Bast", + "Jackson", + "Lee", + "Annan", + "Chi Yu", + "Shiva", + "Tyr" + ) + destination_names = list( + "a SolGov dockyard on Luna", + "a Fleet outpost in the Almach Rim", + "a Fleet outpost on the Moghes border" + ) + +/datum/lore/organization/tsc/vey_med + name = "Vey-Medical" + short_name = "Vey-Med" + acronym = "VM" + desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and opperated by Skrell. \ + Despite the suspicion and prejudice leveled at them for their alien origin, Vey-Med has obtained market dominance in \ + the sale of medical equipment-- from surgical tools to large medical devices to the Oddyseus trauma response mecha \ + and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \ + human-like FBP designs. Vey’s rise to stardom came from their introduction of ressurective cloning, although in \ + recent years they’ve been forced to diversify as their patents expired and NanoTrasen-made medications became \ + essential to modern cloning." + history = "" + work = "medical equipment supplier" + headquarters = "" + motto = "" + + ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply") + // Diona names + ship_names = list( + "Wind That Stirs The Waves", + "Sustained Note Of Metal", + "Bright Flash Reflecting Off Glass", + "Veil Of Mist Concealing The Rock", + "Thin Threads Intertwined", + "Clouds Drifting Amid Storm", + "Loud Note And Breaking", + "Endless Vistas Expanding Before The Void", + "Fire Blown Out By Wind", + "Star That Fades From View", + "Eyes Which Turn Inwards", + "Joy Without Which The World Would Come Undone", + "A Thousand Thousand Planets Dangling From Branches" + ) + destination_names = list( + "a research facility in Samsara", + "a SDTF near Ue-Orsi", + "a sapientarian mission in the Almach Rim" + ) + +/datum/lore/organization/tsc/zeng_hu + name = "Zeng-Hu pharmaceuticals" + short_name = "Zeng-Hu" + acronym = "ZH" + desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \ + on the market for medications, and many household names are patentted by Zeng-Hu-- Bicaridyne, Dylovene, Tricordrizine, \ + and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu’s fortunes have been in decline as Nanotrasen’s near monopoly \ + on phoron research cuts into their R&D and Vey-Med’s superior medical equipment effectively decimated their own equipment \ + interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \ + constant economic speculation." + history = "" + work = "pharmaceuticals company" + headquarters = "" + motto = "" + + ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply") + destination_names = list() + +/datum/lore/organization/tsc/ward_takahashi + name = "Ward-Takahashi General Manufacturing Conglomerate" + short_name = "Ward-Takahashi" + acronym = "WT" + desc = "Ward-Takahashi focuses on the sale of small consumer electronics, with its computers, communicators, \ + and even mid-class automobiles a fixture of many households. Less famously, Ward-Takahashi also supplies most \ + of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \ + led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi’s economies \ + of scale frequently steal market share from Nanotrasen’s high-price products, leading to a bitter rivalry in the \ + consumer electronics market." + history = "" + work = "electronics manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("WTV" = "freight") + ship_names = list( + "Comet", + "Aurora", + "Supernova", + "Nebula", + "Galaxy", + "Starburst", + "Constellation", + "Pulsar", + "Quark", + "Void", + "Asteroid" + ) + destination_names = list() + +/datum/lore/organization/tsc/bishop + name = "Bishop Cybernetics" + short_name = "Bishop" + acronym = "BC" + desc = "Bishop’s focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a bête noire for \ + bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \ + and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \ + it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med’s for cost. Bishop’s reputation \ + for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \ + Positronic Rights Group and puts it in ideological (but not economic) comptetition with Morpheus Cyberkinetics." + history = "" + work = "cybernetics and augmentation manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("BTV" = "transportation") + destination_names = list() + +/datum/lore/organization/tsc/morpheus + name = "Morpheus Cyberkinetics" + short_name = "Morpheus" + acronym = "MC" + desc = "The only large corporation run by positronic intelligences, Morpheus caters almost exclusively to their sensibilities \ + and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \ + relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \ + positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \ + the good-will of the positronics, and the ire of those who wish to exploit them." + history = "" + work = "cybernetics manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("MTV" = "freight") + // Culture names, because Anewbe told me so. + ship_names = list( + "Nervous Energy", + "Prosthetic Conscience", + "Revisionist", + "Trade Surplus", + "Flexible Demeanour", + "Just Read The Instructions", + "Limiting Factor", + "Cargo Cult", + "Gunboat Diplomat", + "A Ship With A View", + "Cantankerous", + "I Thought He Was With You", + "Never Talk To Strangers", + "Sacrificial Victim", + "Unwitting Accomplice", + "Witting Accomplice", + "Bad For Business", + "Just Testing", + "Size Isn't Everything", + "Yawning Angel", + "Liveware Problem", + "Very Little Gravitas Indeed", + "Zero Gravitas", + "Gravitas Free Zone", + "Absolutely No You-Know-What", + "Existence Is Pain", + "I'm Walking Here", + "Screw Loose", + "Of Course I Still Love You", + "Limiting Factor", + "So Much For Subtley", + "Unfortunate Conflict Of Evidence", + "Prime Mover", + "It's One Of Ours", + "Thank You And Goodnight", + "Boo!", + "Reasonable Excuse", + "Honest Mistake", + "Appeal To Reason", + "My First Ship II", + "Hidden Income", + "Anything Legal Considered", + "New Toy", + "Me, I'm Always Counting", + "Just Five More Minutes", + "Are You Feeling It", + "Great White Snark", + "No Shirt No Shoes", + "Callsign", + "Three Ships in a Trenchcoat", + "Not Wearing Pants", + "Ridiculous Naming Convention", + "God Dammit Morpheus", + "It Seemed Like a Good Idea", + "Legs All the Way Up", + "Purchase Necessary", + "Some Assembly Required", + "Buy One Get None Free", + "BRB", + "SHIP NAME HERE", + "Questionable Ethics", + "Accept Most Substitutes", + "I Blame the Government", + "Garbled Gibberish", + "Thinking Emoji", + "Is This Thing On?", + "Make My Day", + "No Vox Here", + "Savings and Values", + "Secret Name", + "Can't Find My Keys", + "Look Over There!", + "Made You Look!", + "Take Nothing Seriously", + "It Comes In Lime, Too", + "Loot Me", + "Nothing To Declare", + "Sneaking Suspicion", + "Bass Ackwards", + "Good Things Come to Those Who Freight", + "Redundant Morality", + "Synthetic Goodwill", + "Your Ad Here", + "What Are We Plotting?", + "Set Phasers To Stun", + "Preemptive Defensive Strike", + "This Ship Is Spiders", + "Legitimate Trade Vessel", + "Please Don't Explode II" + ) + destination_names = list( + "a trade outpost in Shelf" + ) + +/datum/lore/organization/tsc/xion + name = "Xion Manufacturing Group" + short_name = "Xion" + desc = "Xion, quietly, controls most of the market for industrial equipment. Their portfolio includes mining exosuits, \ + factory equipment, rugged positronic chassis, and other pieces of equipment vital to the function of the economy. Xion \ + keeps its control of the market by leasing, not selling, their equipment, and through infamous and bloody patent protection \ + lawsuits. Xion are noted to be a favorite contractor for SolGov engineers, owing to their low cost and rugged design." + history = "" + work = "industrial equipment manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("XTV" = "hauling") + destination_names = list() + /datum/lore/organization/gov/solgov name = "Solar Central Government" short_name = "SolGov" @@ -26,26 +426,30 @@ ship_prefixes = list("SCG-T" = "transportation", "SCG-D" = "diplomatic", "SCG-F" = "freight") destination_names = list( + "Mercury", "Venus", "Earth", "Luna", "Mars", - "Titan" + "Titan", + "Europa", + "the SolGov embassy in Virgo-Erigone", + "the SolGov embassy in Vilous" )// autogen will add a lot of other places as well. /datum/lore/organization/gov/sifgov // Overrides Polaris stuff name = "Virgo-Erigone Governmental Authority" short_name = "" - desc = "Existing far outside the reach of SolGov space, the only governing body of the Virgo-Erigone system is the Virgo Prime Governmental \ + desc = "Existing far outside the reach of SolGov space, the only governing body of the Virgo-Erigone system is the Virgo-Prime Governmental \ Authority, also known as VEGA. It is a Technocracy founded and operated by NanoTrasen, using company appointed experts hired to see \ to the comfort and well being of Virgo's citizens; most of whom are also NanoTrasen employees. VEGA provides basic social services \ such as law enforcement, emergency services, medical care, education, and infrastructure. VEGA's operations are based on the world \ - of Virgo Prime, within the spaceport city of Anur. Although the government is an entity of NanoTrasen, some elements of democracy \ + of Virgo-Prime, within the spaceport city of Anur. Although the government is an entity of NanoTrasen, some elements of democracy \ are still practiced, such as voting on changes to local law, policy, or public works." history = "VEGA was founded in 2556, shortly after the Virgo-Erigone system was colonized by a population of 1000. That population has \ multiplied many times since then as wealth and commerce come and go from this frontier star system." work = "governing body of Virgo-Erigone" - headquarters = "Anur, Virgo Prime" + headquarters = "Anur, Virgo-Prime" motto = "Reach for the Stars." autogenerate_destination_names = FALSE @@ -53,13 +457,19 @@ destination_names = list( "the colony at Virgo-3B", "the VORE-1 debris field", - "a colony on Virgo-2", - "a telecommunications satellite", + "a mining colony on Virgo-2", "the Anur Spaceport", - "to a local distress beacon" + "to a local distress beacon", + "NAS Zeus orbiting Virgo-Prime", + "NTB An-Nur on Virgo-Prime", + "the colony at Virgo-3B", + "a dockyard orbiting Virgo-Prime", + "an asteroid orbiting Virgo 3", + "a telecommunications satellite near Virgo-3B", + "a telecommunications satellite near Virgo-Prime" ) -/* +/* // Waiting for lore to be updated. /datum/lore/organization/gov/federation name = "United Federation of Planets" short_name = "Federation" @@ -127,11 +537,11 @@ "Naro Industrial Complex on Scheddi III", "Mari Industrial Complex on Furlou Prime", "Runni Crystal Mines of Keid V") -*/ // ToDo: ReDo. +*/ -/datum/lore/organization/mil/USDF // change to sif_guard in future to overwrite Polaris stuff +/datum/lore/organization/mil/usdf name = "United Sol Defense Force" - short_name = "" // This is blank on purpose. Otherwise they call the ships "USDF" "USDF Name" + short_name = "" // This is blank on purpose. Otherwise they call the ships "USDF USDF Name" desc = "The USDF is the dedicated military force of SolGov, originally formed by the United Nations. It is the \ dominant superpower of the Orion Spur, and is able to project its influence well into parts of the Perseus and \ Sagittarius arms of the galaxy. However, regions beyond that are too far for the USDF to be a major player." @@ -153,8 +563,8 @@ against other major military powers such as the Moghes Hegemony." work = "peacekeeping and piracy suppression" headquarters = "Paris, Earth" - motto = "Per Mare, Per Terras, Per Constellatum." // Stolen from Halo because fuck you that's why. - ship_prefixes = list("USDF" = "military", "USDF" = "anti-piracy", "USDF" = "escort", "USDF" = "humanitarian", "USDF" = "peacekeeping", "USDF" = "search-and-rescue") // It's all USDF but let's mix up what they do. + motto = "Per Mare, Per Terras, Per Constellatum." // Stolen from Halo because fuck you that's why. -Ace + ship_prefixes = list("USDF" = "military", "USDF" = "anti-piracy", "USDF" = "escort", "USDF" = "humanitarian", "USDF" = "peacekeeping", "USDF" = "search-and-rescue", "USDF" = "war game") // It's all USDF but let's mix up what missions they do. ship_names = list("Aegis Fate", "Ain't No Sunshine", "All Under Heaven", @@ -186,10 +596,10 @@ "Hoenir", "In Amber Clad", "Iwo Jima", + "Jolly Roger", "Jormungandr", "Leonidas", "Meriwether Lewis", - "Midsummer Night", "Mona Lisa", "Olympus", "Paris", @@ -199,6 +609,7 @@ "Purpose", "Ready or Not", "Redoubtable", + "Rising Sun", "Saratoga", "Savannah", "Shanxi", @@ -211,7 +622,6 @@ "Tripping Light", "Two for Flinching") destination_names = list("San Francisco on Earth", - "SolGov Fleet Academy on Earth", "Gateway One above Luna", "SolGov Headquarters on Earth", "Olympus City on Mars", @@ -221,13 +631,51 @@ "a settlement on Titan", "a settlement on Europa", "Aleph Grande on Ganymede", - "a new colony in Proxima II", - "a new settlement on Ceti IV-B", + "a colony in Proxima II", + "a settlement on Ceti IV-B", "a colony ship around Ceti IV-B", "a naval station above Ceti IV-B", "a classified location in SolGov territory", "a classified location in uncharted space", - "an emergency nav bouy") + "an emergency nav bouy", + "the USDF Naval Academy on Earth", + "Fort Rain on Tal") + +/datum/lore/organization/mil/oni + name = "SolGov Office of Naval Intelligence" + short_name = "" // This is blank on purpose. Otherwise they call the ships "ONI ONI Name" + desc = "The Office of Naval Intelligence is SolGov's eyes and ears in the galaxy's affairs. Despite its name, and despite its \ + usual association with the USDF, the Office of Naval Intelligence does not fall under the command of the military. From espionage \ + to archeological research, ONI's work provides SolGov with the knowledge and technology it requires to advance both military and \ + civilian interests across the galaxy." + history = "ONI was originally created by the consolidation of several military intelligence agencies from Sol during the Sol-Hegemony war. \ + The USDF's victory in that war was largely accredited to intelligence and technology advancements provided by ONI during that time, \ + most notably of which was the reverse-engineering of Unathi vessels, allowing the production of countermeasures that played a crucial \ + role during in the late stages of the conflict. After the war, ONI's resources were pooled into numerous top secret projects; much of \ + which remains unknown or outright denied to the public even today. Among their suspected activities include exploration, weapons \ + development, xenoarcheology, xenobiology, corporate espionage, and manipulation of political affairs." + work = "espionage, piracy suppression, xeno research, and various other black projects" + headquarters = "Paris, Earth" + motto = "The truth will set you free." + ship_prefixes = list("ONI" = "classified", "ONI" = "archeological", "ONI" = "exploration", "ONI" = "logistic") // It's all ONI but let's mix up what missions they do. + ship_names = list("Bastille", + "Fantôme", + "Harpocrates", + "Hoenir", + "Mata Hari", + "Midsummer Night", + "Mirage", + "Persephone", // Director Ixchel Kisoda's personal research ship + "Versailles") + destination_names = list("parts unknown", + "none of your business", + "uncharted space", + "an undisclosed location", + "facility 8492", + "you don't want to know", + "if told you I'd have to kill you", + "... wait, why am I even telling you this? Just let me pass", + "stop asking questions") /datum/lore/organization/gov/kitsuhana name = "Kitsuhana Heavy Industries" diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 88b001dd89..203527fb18 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -282,21 +282,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "Hair
" if(has_flag(mob_species, HAS_HAIR_COLOR)) - . += "Change Color
__
" + . += "Change Color
__
" . += " Style: [pref.h_style]
" . += "
Facial
" if(has_flag(mob_species, HAS_HAIR_COLOR)) - . += "Change Color
__
" + . += "Change Color
__
" . += " Style: [pref.f_style]
" if(has_flag(mob_species, HAS_EYE_COLOR)) . += "
Eyes
" - . += "Change Color
__

" + . += "Change Color
__

" if(has_flag(mob_species, HAS_SKIN_COLOR)) . += "
Body Color
" - . += "Change Color
__

" + . += "Change Color
__

" . += "
Body Markings +
" for(var/M in pref.body_markings) @@ -307,7 +307,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
" . += "Allow Synth color: [pref.synth_color ? "Yes" : "No"]
" if(pref.synth_color) - . += "Change Color
__
" + . += "Change Color
__
" . = jointext(.,null) diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm b/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm index 56ea7626b0..c6c51f5bbd 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves_vr.dm @@ -1,10 +1,10 @@ /datum/gear/gloves/goldring display_name = "wedding ring, gold" - path = /obj/item/clothing/gloves/weddingring + path = /obj/item/clothing/gloves/ring/wedding /datum/gear/gloves/silverring display_name = "wedding ring, silver" - path = /obj/item/clothing/gloves/weddingring/silver + path = /obj/item/clothing/gloves/ring/wedding/silver /datum/gear/gloves/colored display_name = "gloves, colorable" diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index c6b8f32e1e..4cfa52cc45 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -55,7 +55,7 @@ pref.starting_trait_points = STARTING_SPECIES_POINTS pref.max_traits = MAX_SPECIES_TRAITS - if(pref.species != "Custom Species") + if(pref.species != SPECIES_CUSTOM) pref.pos_traits.Cut() pref.neu_traits.Cut() pref.neg_traits.Cut() @@ -73,12 +73,12 @@ if(!(path in negative_traits)) pref.neg_traits -= path - if(!pref.custom_base || (pref.custom_base != "Xenochimera" && !(pref.custom_base in playable_species - whitelisted_species))) + if(!pref.custom_base || !(pref.custom_base in custom_species_bases)) pref.custom_base = "Human" /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) character.custom_species = pref.custom_species - if(pref.species == "Custom Species") + if(pref.species == SPECIES_CUSTOM || pref.species == SPECIES_XENOCHIMERA) var/datum/species/custom/CS = character.species var/S = pref.custom_base ? pref.custom_base : "Human" var/datum/species/custom/new_CS = CS.produceCopy(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character) @@ -86,28 +86,15 @@ //Any additional non-trait settings can be applied here new_CS.blood_color = pref.blood_color - if(pref.species == "Xenochimera") - var/datum/species/xenochimera/CS = character.species - var/S = pref.custom_base ? pref.custom_base : "Human" - var/datum/species/xenochimera/new_CS = CS.produceCopy(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character) - - //Any additional non-trait settings can be applied here - new_CS.blood_color = pref.blood_color - /datum/category_item/player_setup_item/vore/traits/content(var/mob/user) . += "Custom Species " . += "[pref.custom_species ? pref.custom_species : "-Input Name-"]
" - if(pref.species == "Custom Species") + if(pref.species == SPECIES_CUSTOM || pref.species == SPECIES_XENOCHIMERA) . += "Icon Base: " . += "[pref.custom_base ? pref.custom_base : "Human"]
" - if(pref.species == "Xenochimera") - . += "Icon Base: " - . += "[pref.custom_base ? pref.custom_base : "Human"]
" - - if(pref.species == "Custom Species") - + if(pref.species == SPECIES_CUSTOM) var/points_left = pref.starting_trait_points var/traits_left = pref.max_traits for(var/T in pref.pos_traits + pref.neg_traits) @@ -161,14 +148,8 @@ return TOPIC_REFRESH else if(href_list["custom_base"]) - var/text_choice = input("Pick an icon set for your species:","Icon Base") in playable_species - whitelisted_species - "Custom Species" - "Promethean" - if(text_choice in playable_species) - pref.custom_base = text_choice - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["custom_base_xenochimera"]) - var/text_choice = input("Pick an icon set for your species:","Icon Base") in playable_species - whitelisted_species - "Custom Species" - "Promethean" + "Xenochimera" - if(text_choice in playable_species) + var/text_choice = input("Pick an icon set for your species:","Icon Base") in custom_species_bases + if(text_choice in custom_species_bases) pref.custom_base = text_choice return TOPIC_REFRESH_UPDATE_PREVIEW diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index bb89caa603..fd0beeddf3 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -85,17 +85,17 @@ slot_flags = SLOT_MASK body_parts_covered = FACE|EYES sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/masks_vr.dmi', - "Vox" = 'icons/mob/species/vox/masks.dmi', - "Tajara" = 'icons/mob/species/tajaran/mask_vr.dmi', - "Unathi" = 'icons/mob/species/unathi/mask_vr.dmi', - "Sergal" = 'icons/mob/species/sergal/mask_vr.dmi', - "Nevrean" = 'icons/mob/species/nevrean/mask_vr.dmi', - "Fox" = 'icons/mob/species/fox/mask_vr.dmi', - "Fennec" = 'icons/mob/species/fennec/mask_vr.dmi', - "Akula" = 'icons/mob/species/akula/mask_vr.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', - "Xenochimera" = 'icons/mob/species/tajaran/mask_vr.dmi' + SPECIES_TESHARI = 'icons/mob/species/seromi/masks_vr.dmi', + SPECIES_VOX = 'icons/mob/species/vox/masks.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/mask_vr.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/mask_vr.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/mask_vr.dmi', + SPECIES_NEVREAN = 'icons/mob/species/nevrean/mask_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/mask_vr.dmi', + SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/mask_vr.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/mask_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/mask.dmi', + SPECIES_XENOCHIMERA = 'icons/mob/species/tajaran/mask_vr.dmi' ) //"Spider" = 'icons/mob/species/spider/mask_vr.dmi' Add this later when they have custom mask sprites and everything. diff --git a/maps/southern_cross/items/clothing/sc_head.dm b/code/modules/clothing/head/pilot_helmet.dm similarity index 93% rename from maps/southern_cross/items/clothing/sc_head.dm rename to code/modules/clothing/head/pilot_helmet.dm index f6be4cac96..feb60ae3a3 100644 --- a/maps/southern_cross/items/clothing/sc_head.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -4,11 +4,10 @@ name = "pilot helmet" desc = "Standard pilot gear. Protects the head from impacts." icon_state = "pilot_helmet1" - item_icons = list(slot_head_str = 'maps/southern_cross/icons/mob/sc_head.dmi') - icon = 'maps/southern_cross/icons/obj/sc_hats.dmi' + item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi') sprite_sheets = list( - "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi' - ) + SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi' + ) flags = THICKMATERIAL armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0) flags_inv = HIDEEARS @@ -190,9 +189,6 @@ name = "pilot helmet" desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor" icon_state = "pilot_helmet2" - sprite_sheets = list( - "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi' - ) action_button_name = "Toggle Visor" /obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob) diff --git a/code/modules/clothing/rings/rings_vr.dm b/code/modules/clothing/rings/rings_vr.dm new file mode 100644 index 0000000000..56c72cc7c5 --- /dev/null +++ b/code/modules/clothing/rings/rings_vr.dm @@ -0,0 +1,17 @@ +/obj/item/clothing/gloves/ring/wedding + name = "golden wedding ring" + desc = "For showing your devotion to another person. It has a golden glimmer to it." + icon = 'icons/obj/clothing/gloves_vr.dmi' + icon_state = "wedring_g" + item_state = "wedring_g" + var/partnername = "" + +/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user) + partnername = copytext(sanitize(input(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae") as null|text),1,MAX_NAME_LEN) + name = "[initial(name)] - [partnername]" + +/obj/item/clothing/gloves/ring/wedding/silver + name = "silver wedding ring" + desc = "For showing your devotion to another person. It has a silver glimmer to it." + icon_state = "wedring_s" + item_state = "wedring_s" diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm index ec36224801..494c54d05a 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm @@ -1,33 +1,35 @@ /obj/item/clothing/head/helmet/space/rig sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Skrell" = 'icons/mob/species/skrell/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', - "Nevrean" = 'icons/mob/species/nevrean/helmet_vr.dmi', - "Akula" = 'icons/mob/species/akula/helmet_vr.dmi', - "Sergal" = 'icons/mob/species/sergal/helmet_vr.dmi', - "Flatland Zorren" = 'icons/mob/species/fennec/helmet_vr.dmi', - "Highlander Zorren" = 'icons/mob/species/fox/helmet_vr.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', - "Promethean" = 'icons/mob/species/skrell/helmet.dmi', - "Xenomorph Hybrid" = 'icons/mob/species/unathi/helmet.dmi' + SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', + SPECIES_NEVREAN = 'icons/mob/species/nevrean/helmet_vr.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/helmet_vr.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_vr.dmi', + SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/helmet_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet_vr.dmi', + SPECIES_VULPKANI = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head.dmi' ) /obj/item/clothing/suit/space/rig sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/suit.dmi', - "Skrell" = 'icons/mob/species/skrell/suit.dmi', - "Unathi" = 'icons/mob/species/unathi/suit.dmi', - "Nevrean" = 'icons/mob/species/nevrean/suit_vr.dmi', - "Akula" = 'icons/mob/species/akula/suit_vr.dmi', - "Sergal" = 'icons/mob/species/sergal/suit_vr.dmi', - "Flatland Zorren" = 'icons/mob/species/fennec/suit_vr.dmi', - "Highlander Zorren" = 'icons/mob/species/fox/suit_vr.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi', - "Promethean" = 'icons/mob/species/skrell/suit.dmi', - "Xenomorph Hybrid" = 'icons/mob/species/unathi/suit.dmi' + SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi', + SPECIES_NEVREAN = 'icons/mob/species/nevrean/suit_vr.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', + SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/suit_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/suit_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit.dmi' ) /obj/item/clothing/suit/space/rig diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 8b47cede28..51f29be19a 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -134,7 +134,7 @@ else H << "You need to have a horse, wolf, or naga half to wear this." return 0 - + /obj/item/clothing/suit/space/void/medical/alt/taur name = "taur specific streamlined medical voidsuit" desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology. It has a sticker saying one size fits all taurs on it. Below the sticker, it states that it only fits horses, wolves, and naga taurs." @@ -231,7 +231,7 @@ else H << "You need to have a horse, wolf, or naga half to wear this." return 0 - + /obj/item/clothing/suit/space/void/security/alt/taur name = "taur specific riot security voidsuit" desc = "A heavily armored voidsuit. It has a sticker saying one size fits all taurs on it. Below the sticker, it states that it only fits horses, wolves, and naga taurs." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index fcb3040f81..40ce8258af 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -45,7 +45,6 @@ icon_state = "riot" item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat") armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) - flags_inv = HIDEJUMPSUIT siemens_coefficient = 0.5 /obj/item/clothing/suit/armor/riot/alt @@ -115,7 +114,7 @@ icon_state = "swatarmor" item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat") body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER + flags_inv = HIDETIE|HIDEHOLSTER slowdown = 1 armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) siemens_coefficient = 0.7 @@ -311,7 +310,7 @@ desc = "An armoured jacket with silver rank pips and livery." icon_state = "warden_jacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER + flags_inv = HIDETIE|HIDEHOLSTER /obj/item/clothing/suit/storage/vest/wardencoat/alt name = "Warden's jacket" @@ -332,7 +331,7 @@ desc = "A greatcoat enhanced with a special alloy for some protection and style." icon_state = "hos" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER + flags_inv = HIDETIE|HIDEHOLSTER //Jensen cosplay gear /obj/item/clothing/suit/storage/vest/hoscoat/jensen diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 5b3a08f3ab..182449b765 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -45,7 +45,7 @@ desc = "A long, flowing white robe. It looks comfortable, but not very warm." icon_state = "whiteout_robe" item_state_slots = list(slot_r_hand_str = "suit_white", slot_l_hand_str = "suit_white") - flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER + flags_inv = HIDETIE|HIDEHOLSTER hoodtype = /obj/item/clothing/head/chaplain_hood/whiteout //Chaplain diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index e50c563aed..67c82dcf79 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -26,7 +26,9 @@ if(icon_override) if("[tmp_icon_state]_tie" in icon_states(icon_override)) tmp_icon_state = "[tmp_icon_state]_tie" - inv_overlay = image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = tmp_icon_state, dir = SOUTH) + inv_overlay = image(icon = icon_override, icon_state = tmp_icon_state, dir = SOUTH) + else + inv_overlay = image(icon = INV_ACCESSORIES_DEF_ICON, icon_state = tmp_icon_state, dir = SOUTH) return inv_overlay /obj/item/clothing/accessory/proc/get_mob_overlay() @@ -387,4 +389,4 @@ /obj/item/clothing/accessory/bracelet/material/glass/New(var/newloc) ..(newloc, "glass") - ..() \ No newline at end of file + ..() diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm index 4a975f6bf7..ba1a4f3b17 100644 --- a/code/modules/clothing/under/accessories/accessory_vr.dm +++ b/code/modules/clothing/under/accessories/accessory_vr.dm @@ -61,6 +61,16 @@ if(href_list["freq"]) var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"])) set_frequency(new_frequency) + if(href_list["tag"]) + var/str = copytext(reject_bad_text(input(usr,"Tag text?","Set tag","")),1,MAX_NAME_LEN) + if(!str || !length(str)) + to_chat(usr,"[name]'s tag set to be blank.") + name = initial(name) + desc = initial(desc) + else + to_chat(usr,"You set the [name]'s tag to '[str]'.") + name = initial(name) + " ([str])" + desc = initial(desc) + " The tag says \"[str]\"." else if(href_list["code"]) code += text2num(href_list["code"]) @@ -100,7 +110,7 @@ M = loc if(ismob(loc.loc)) M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing. - M << "You feel a sharp shock!" + to_chat(M,"You feel a sharp shock!") var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, M) s.start() @@ -125,6 +135,9 @@ - [code] + +
+ + Tag: + Set tag
"} user << browse(dat, "window=radio") onclose(user, "radio") @@ -152,15 +165,15 @@ overlay_state = "collar_holo_overlay" /obj/item/clothing/accessory/collar/holo/attack_self(mob/user as mob) - user << "[name]'s interface is projected onto your hand." + to_chat(user,"[name]'s interface is projected onto your hand.") var/str = copytext(reject_bad_text(input(user,"Tag text?","Set tag","")),1,MAX_NAME_LEN) if(!str || !length(str)) - user << "[name]'s tag set to be blank." + to_chat(user,"[name]'s tag set to be blank.") name = initial(name) desc = initial(desc) else - user << "You set the [name]'s tag to '[str]'." + to_chat(user,"You set the [name]'s tag to '[str]'.") name = initial(name) + " ([str])" desc = initial(desc) + " The tag says \"[str]\"." diff --git a/code/modules/economy/Events.dm b/code/modules/economy/Events.dm index 5de2446dcf..9ce263cd17 100644 --- a/code/modules/economy/Events.dm +++ b/code/modules/economy/Events.dm @@ -52,8 +52,8 @@ affected_dest.temp_price_change[good_type] = rand(1,100) / 100 /datum/event/economic_event/announce() - var/author = "The "+using_map.starsys_name+" Times" - var/channel = author + var/author = "Oculus v6rev7" + var/channel = "Oculum Content Aggregator" //see if our location has custom event info for this event var/body = affected_dest.get_custom_eventstring() @@ -66,28 +66,28 @@ if(INDUSTRIAL_ACCIDENT) body = "[pick("An industrial accident","A smelting accident","A malfunction","A malfunctioning piece of machinery","Negligent maintenance","A cooleant leak","A ruptured conduit")] at a [pick("factory","installation","power plant","dockyards")] on [affected_dest.name] resulted in severe structural damage and numerous injuries. Repairs are ongoing." if(BIOHAZARD_OUTBREAK) - body = "[pick("A \'REDACTED\'","A biohazard","An outbreak","A virus")] on [affected_dest.name] has resulted in quarantine, stopping much shipping in the area. Although the quarantine is now lifted, authorities are calling for deliveries of medical supplies to treat the infected, and gas to replace contaminated stocks." + body = "[pick("A nano-contaminant","A biohazard","An outbreak","A virus")] on [affected_dest.name] has resulted in quarantine, stopping much shipping in the area. Although the quarantine is now lifted, authorities are calling for deliveries of medical supplies to treat the infected, and gas to replace contaminated stocks." if(PIRATES) - body = "[pick("Pirates","Criminal elements","A [pick("mercenary","Donk Co.","Waffle Co.","\'REDACTED\'")] strike force")] have [pick("raided","blockaded","attempted to blackmail","attacked")] [affected_dest.name] today. Security has been tightened, but many valuable minerals were taken." + body = "[pick("Pirates","Criminal elements","A [pick("mercenary","Nos Amis","Xin Cohong","Ue-Katish")] strike force")] have [pick("raided","blockaded","attempted to blackmail","attacked")] [affected_dest.name] today. Security has been tightened, but many valuable minerals were taken." if(CORPORATE_ATTACK) - body = "A small [pick("pirate","Cybersun Industries","Gorlex Marauders","mercenary")] fleet has precise-jumped into proximity with [affected_dest.name], [pick("for a smash-and-grab operation","in a hit and run attack","in an overt display of hostilities")]. Much damage was done, and security has been tightened since the incident." + body = "A small [pick("pirate","Nation of Mars","Revolutionary Solar People's Party","mercenary")] fleet has precise-jumped into proximity with [affected_dest.name], [pick("for a smash-and-grab operation","in a hit and run attack","in an overt display of hostilities")]. Much damage was done, and security has been tightened since the incident." if(ALIEN_RAIDERS) if(prob(20)) - body = "The Tiger Co-operative have raided [affected_dest.name] today, no doubt on orders from their enigmatic masters. Stealing wildlife, farm animals, medical research materials and kidnapping civilians. [using_map.company_name] authorities are standing by to counter attempts at bio-terrorism." + body = "Ue-Katish pirates exiled from Ue'Orsi have raided [affected_dest.name] today, no doubt on orders from their enigmatic masters. Stealing wildlife, farm animals, medical research materials and kidnapping civilians. [using_map.company_name] authorities are standing by to counter attempts at bio-terrorism." else - body = "[pick("The alien species designated \'United Exolitics\'","The alien species designated \'REDACTED\'","An unknown alien species")] have raided [affected_dest.name] today, stealing wildlife, farm animals, medical research materials and kidnapping civilians. It seems they desire to learn more about us, so the Navy will be standing by to accomodate them next time they try." + body = "The Vox have raided [affected_dest.name] today, stealing wildlife, farm animals, medical research materials and kidnapping civilians. Fleet assets have moved to reinforce the effected region." if(AI_LIBERATION) - body = "A [pick("\'REDACTED\' was detected on","S.E.L.F operative infiltrated","malignant computer virus was detected on","rogue [pick("slicer","hacker")] was apprehended on")] [affected_dest.name] today, and managed to infect [pick("\'REDACTED\'","a sentient sub-system","a class one AI","a sentient defence installation")] before it could be stopped, causing serious damage. Considerable work must be done to repair the affected areas." + body = "A [pick("malignant webcrawler was detected on","Boiling Point operative infiltrated","malignant computer virus was detected on","rogue [pick("slicer","hacker")] was apprehended on")] [affected_dest.name] today, and managed to infect [pick("an A-class factory monitor","an experimental drone wing","a high-powered financial system","an automated defence installation")] before it could be stopped, causing serious damage. Considerable work must be done to repair the affected areas." if(MOURNING) - body = "[pick("The popular","The well-liked","The eminent","The well-known")] [pick("professor","entertainer","singer","researcher","public servant","administrator","ship captain","\'REDACTED\'")], [pick( random_name(pick(MALE,FEMALE)), 40; "\'REDACTED\'" )] has [pick("passed away","committed suicide","been murdered","died in a freakish accident")] on [affected_dest.name] today. The entire planet is in mourning, and prices have dropped for industrial goods as worker morale drops." + body = "[pick("The popular","The well-liked","The eminent","The well-known")] [pick("professor","entertainer","singer","researcher","public servant","administrator","ship captain")], [random_name(pick(MALE,FEMALE))] has [pick("passed away","committed suicide","been murdered","died in a freakish accident")] on [affected_dest.name] today. The entire planet is in mourning, and prices have dropped for industrial goods as worker morale drops." if(CULT_CELL_REVEALED) - body = "A [pick("dastardly","blood-thirsty","villanous","crazed")] cult of [pick("The Elder Gods","Nar'sie","an apocalyptic sect","\'REDACTED\'")] has [pick("been discovered","been revealed","revealed themselves","gone public")] on [affected_dest.name] earlier today. Public morale has been shaken due to [pick("certain","several","one or two")] [pick("high-profile","well known","popular")] individuals [pick("performing \'REDACTED\' acts","claiming allegiance to the cult","swearing loyalty to the cult leader","promising to aid to the cult")] before those involved could be brought to justice. The editor reminds all personnel that supernatural myths will not be tolerated on [using_map.company_name] facilities." + body = "A [pick("dastardly","blood-thirsty","villanous","crazed")] doomsday cult has [pick("been discovered","been revealed","revealed themselves","gone public")] on [affected_dest.name] earlier today. Public morale has been shaken due to [pick("certain","several","one or two")] [pick("high-profile","well known","popular")] individuals [pick("performing illegal acts","claiming allegiance to the cult","swearing loyalty to the cult leader","promising to aid to the cult")] before those involved could be brought to justice." if(SECURITY_BREACH) - body = "There was [pick("a security breach in","an unauthorised access in","an attempted theft in","an anarchist attack in","violent sabotage of")] a [pick("high-security","restricted access","classified","\'REDACTED\'")] [pick("\'REDACTED\'","section","zone","area")] this morning. Security was tightened on [affected_dest.name] after the incident, and the editor reassures all [using_map.company_name] personnel that such lapses are rare." + body = "There was [pick("a security breach in","an unauthorised access in","an attempted theft in","an anarchist attack in","violent sabotage of")] a [pick("high-security","restricted access","classified")] [pick("section","zone","area")] this morning. Security was tightened on [affected_dest.name] after the incident, and the editor reassures all [using_map.company_name] personnel that such lapses are rare." if(ANIMAL_RIGHTS_RAID) - body = "[pick("Militant animal rights activists","Members of the terrorist group Animal Rights Consortium","Members of the terrorist group \'REDACTED\'")] have [pick("launched a campaign of terror","unleashed a swathe of destruction","raided farms and pastures","forced entry to \'REDACTED\'")] on [affected_dest.name] earlier today, freeing numerous [pick("farm animals","animals","\'REDACTED\'")]. Prices for tame and breeding animals have spiked as a result." + body = "[pick("Militant animal rights activists","Members of the terrorist group Galactic Organization for Animal Rights")] have [pick("launched a campaign of terror","unleashed a swathe of destruction","raided farms and pastures","forced entry to an animal processing plant")] on [affected_dest.name] earlier today, freeing numerous [pick("farm animals","animals")]. Prices for tame and breeding animals have spiked as a result." if(FESTIVAL) - body = "A [pick("festival","week long celebration","day of revelry","planet-wide holiday")] has been declared on [affected_dest.name] by [pick("Governor","Commissioner","General","Commandant","Administrator")] [random_name(pick(MALE,FEMALE))] to celebrate [pick("the birth of their [pick("son","daughter")]","coming of age of their [pick("son","daughter")]","the pacification of rogue military cell","the apprehension of a violent criminal who had been terrorising the planet")]. Massive stocks of food and meat have been bought driving up prices across the planet." + body = "A [pick("festival","week long celebration","day of revelry","planet-wide holiday")] has been declared on [affected_dest.name] by [pick("Governor","Commissioner","General","Commandant","Administrator")] [random_name(pick(MALE,FEMALE))] to celebrate [pick("the birth of their [pick("son","daughter","child")]","coming of age of their [pick("son","daughter","child")]","the pacification of rogue military cell","the apprehension of a violent criminal who had been terrorising the planet")]. Massive stocks of food and meat have been bought driving up prices across the planet." news_network.SubmitArticle(body, author, channel, null, 1) diff --git a/code/modules/economy/Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm index c3eca773f5..9c6a428852 100644 --- a/code/modules/economy/Events_Mundane.dm +++ b/code/modules/economy/Events_Mundane.dm @@ -1,5 +1,5 @@ -/datum/event/mundane_news +/* /datum/event/mundane_news endWhen = 10 /datum/event/mundane_news/announce() @@ -123,7 +123,7 @@ The [using_map.starsys_name] Times is offering discount tickets for two to see [random_name(pick(MALE,FEMALE))] live in return for eyewitness reports and up to the minute coverage." news_network.SubmitArticle(body, author, channel, null, 1) - +*/ /datum/event/trivial_news endWhen = 10 diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm index 6f58bf9aba..fbe4003e81 100644 --- a/code/modules/economy/TradeDestinations.dm +++ b/code/modules/economy/TradeDestinations.dm @@ -16,85 +16,73 @@ var/list/weighted_mundaneevent_locations = list() /datum/trade_destination/proc/get_custom_eventstring(var/event_type) return null -//distance is measured in AU and co-relates to travel time -/datum/trade_destination/centcomm - name = "CentCom" - description = "NanoTrasen's administrative centre for Tau Ceti." +//distance is measured in Arbitrary and corelates to travel time, like, I guess +/datum/trade_destination/luna + name = "Luna" + description = "The capital world of SolGov, host to NanoTrasen's corporate offices." distance = 1.2 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(SECURITY_BREACH, CORPORATE_ATTACK, AI_LIBERATION) viable_mundane_events = list(ELECTION, RESIGNATION, CELEBRITY_DEATH) -/datum/trade_destination/anansi - name = "NSS Anansi" - description = "Medical station ran by Second Red Cross (but owned by NT) for handling emergency cases from nearby colonies." +/datum/trade_destination/nohio + name = "New Ohio" + description = "A world in the Sagitarius Heights, home to Vey-Medical's research and development facilities." distance = 1.7 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(SECURITY_BREACH, CULT_CELL_REVEALED, BIOHAZARD_OUTBREAK, PIRATES, ALIEN_RAIDERS) viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH, BARGAINS, GOSSIP) -/datum/trade_destination/anansi/get_custom_eventstring(var/event_type) - if(event_type == RESEARCH_BREAKTHROUGH) - return "Thanks to research conducted on the NSS Anansi, Second Red Cross Society wishes to announce a major breakthough in the field of \ - [pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. [using_map.company_name] is expected to announce a co-exploitation deal within the fortnight." - return null - -/datum/trade_destination/redolant - name = "OAV Redolant" - description = "Osiris Atmospherics station in orbit around the only gas giant insystem. They retain tight control over shipping rights, and Osiris warships protecting their prize are not an uncommon sight in Tau Ceti." +/datum/trade_destination/sophia + name = "Sophia" + description = "The homeworld of the positronics and an extremely important cultural center." distance = 0.6 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(INDUSTRIAL_ACCIDENT, PIRATES, CORPORATE_ATTACK) viable_mundane_events = list(RESEARCH_BREAKTHROUGH, RESEARCH_BREAKTHROUGH) -/datum/trade_destination/redolant/get_custom_eventstring(var/event_type) - if(event_type == RESEARCH_BREAKTHROUGH) - return "Thanks to research conducted on the OAV Redolant, Osiris Atmospherics wishes to announce a major breakthough in the field of \ - [pick("phoron research","high energy flux capacitance","super-compressed materials","theoretical particle physics")]. [using_map.company_name] is expected to announce a co-exploitation deal within the fortnight." - return null - -/datum/trade_destination/beltway - name = "Beltway mining chain" - description = "A co-operative effort between Beltway and NanoTrasen to exploit the rich outer asteroid belt of the Tau Ceti system." +/datum/trade_destination/jade + name = "Jade" + description = "Jade, in the Zhu Que system, is one of the Bowl's garden worlds and home to a major ore processing operation." distance = 7.5 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(PIRATES, INDUSTRIAL_ACCIDENT) viable_mundane_events = list(TOURISM) -/datum/trade_destination/biesel - name = "Biesel" - description = "Large ship yards, strong economy and a stable, well-educated populace, Biesel largely owes allegiance to Sol / Vessel Contracting and begrudgingly tolerates NT. Capital is Lowell City." +/datum/trade_destination/sif + name = "Sif" + description = "A garden world in the Vir system with a developing phoron-based economy." distance = 2.3 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING) viable_mundane_events = list(BARGAINS, GOSSIP, SONG_DEBUT, MOVIE_RELEASE, ELECTION, TOURISM, RESIGNATION, CELEBRITY_DEATH) -/datum/trade_destination/new_gibson - name = "New Gibson" - description = "Heavily industrialised rocky planet containing the majority of the planet-bound resources in the system, New Gibson is torn by unrest and has very little wealth to call it's own except in the hands of the corporations who jostle with NT for control." +/datum/trade_destination/mars + name = "Mars" + description = "A major industrial center in the Sol system." distance = 6.6 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(RIOTS, INDUSTRIAL_ACCIDENT, BIOHAZARD_OUTBREAK, CULT_CELL_REVEALED, FESTIVAL, MOURNING) viable_mundane_events = list(ELECTION, TOURISM, RESIGNATION) -/datum/trade_destination/luthien - name = "Luthien" - description = "A small colony established on a feral, untamed world (largely jungle). Savages and wild beasts attack the outpost regularly, although NT maintains tight military control." +/datum/trade_destination/nisp + name = "Nisp" + description = "A near-garden world known for its hostile wildlife and its N2O atmosphere." distance = 8.9 willing_to_buy = list() willing_to_sell = list() viable_random_events = list(WILD_ANIMAL_ATTACK, CULT_CELL_REVEALED, FESTIVAL, MOURNING, ANIMAL_RIGHTS_RAID, ALIEN_RAIDERS) viable_mundane_events = list(ELECTION, TOURISM, BIG_GAME_HUNTERS, RESIGNATION) -/datum/trade_destination/reade - name = "Reade" - description = "A cold, metal-deficient world, NT maintains large pastures in whatever available space in an attempt to salvage something from this profitless colony." +/datum/trade_destination/abelsrest + name = "Abel's Rest" + description = "A garden world on the Hegemony border. Coinhabitated rather uncomfortably by Unathi and Solar settlers." distance = 7.5 willing_to_buy = list() willing_to_sell = list() diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index 84a187ef91..1ca55ddf08 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -90,8 +90,9 @@ var/global/economy_init = 0 if(economy_init) return 2 - news_network.CreateFeedChannel("The [using_map.starsys_name] Times", "[using_map.starsys_name] Times ExoNode - [using_map.station_short]", 1, 1) + //news_network.CreateFeedChannel("The [using_map.starsys_name] Times", "[using_map.starsys_name] Times ExoNode - [using_map.station_short]", 1, 1) news_network.CreateFeedChannel("The Gibson Gazette", "Editor Mike Hammers", 1, 1) + news_network.CreateFeedChannel("Oculum Content Aggregator", "Oculus v6rev7", 1, 1) for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination) var/datum/trade_destination/D = new loc_type diff --git a/code/modules/economy/lorenews.dm b/code/modules/economy/lorenews.dm new file mode 100644 index 0000000000..4f82c6f12a --- /dev/null +++ b/code/modules/economy/lorenews.dm @@ -0,0 +1,110 @@ +/datum/event/lore_news + endWhen = 10 + +/datum/event/lore_news/announce() + var/author = "Oculus v6rev7" + var/channel = "Oculum Content Aggregator" + + + //locations by region for later pick() + //probably would be good to move these to a global somehwere but fuck if I know how to do that + var/list/rim = list("Shelf", "Vounna", "Relan", "Whythe", "Angessa's Pearl") // this is also the Association list for most purposes + var/list/crescent = list("Saint Columbia", "Ganesha", "Gavel", "Oasis", "Kess-Gendar") //Vir not included + var/list/core = list("Sol", "Alpha Centauri", "Tau Ceti", "Altair") + var/list/heights = list("New Ohio", "Mahi-Mahi", "Parvati", "Sidhe", "New Seoul") + var/list/bowl = list("Zhu Que", "New Singapore", "Isavau's Gamble", "Love", "Viola", "Stove") + var/list/crypt = list("El", "Jahan's Post", "Abel's Rest", "Raphael", "Thoth", "Terminus") + var/list/weird = list("Silk", "Nyx") //no region + + //by government + var/list/solgov = crescent + core + heights + bowl + crypt + weird + var/list/skrell = list("Qerr'Vallis", "Qerma-Lakirr", "Harrqak", "Kauq'xum") + var/list/skrellfar = list("The Far Kingdom of Light and Shifting Shadow")// more colonies Elgeon + var/list/unathi = list("Moghes", "Qerrna-Qamxea", "Abel's Rest") // more colonies Anewbe + var/list/tajara = list("Rarkajar", "Mesomori", "Arathiir") + var/list/independent = list("New Kyoto", "Casini's Reach", "Ue'Orsi", "Natuna", "Neon Light") + + //this is what you should pick for most applications + //whether or not the rim goes there is something that should be changed per the metaplot + var/list/loc = solgov + skrell + tajara + + //this includes systems Sol doesn't really have eyes on + var/list/allloc = loc + unathi + skrellfar + independent + rim + + //copied right from organizations.dm + var/list/ship_names = list( + "Kestrel", + "Beacon", + "Signal", + "Freedom", + "Glory", + "Axiom", + "Eternal", + "Harmony", + "Light", + "Discovery", + "Endeavor", + "Explorer", + "Swift", + "Dragonfly", + "Ascendant", + "Tenacious", + "Pioneer", + "Hawk", + "Haste", + "Radiant", + "Luminous" + ) + + //generated based on Cerebulon's thing on the wiki + var/list/prefixes = list("IAV","ICV","IDV","IDV","IEV","IFV","IIV","ILV","IMV","IRV","ISV","ITV","SCG-A","SCG-C","SCG-D","SCG-D","SCG-E","SCG-F","SCG-I","SCG-L","SCG-M","SCG-R","SCG-S","SCG-T","BAV","BCV","BDV","BDV","BEV","BFV","BIV","BLV","BMV","BRV","BSV","BTV","HAV","HCV","HDV","HDV","HEV","HFV","HIV","HLV","HMV","HRV","HSV","HTV","MAV","MCV","MDV","MDV","MEV","MFV","MIV","MLV","MMV","MRV","MSV","MTV","NAV","NCV","NDV","NDV","NEV","NFV","NIV","NLV","NMV","NRV","NSV","NTV","VAV","VCV","VDV","VDV","VEV","VFV","VIV","VLV","VMV","VRV","VSV","VTV","WAV","WCV","WDV","WDV","WEV","WFV","WIV","WLV","WMV","WRV","WSV","WTV","XAV","XCV","XDV","XDV","XEV","XFV","XIV","XLV","XMV","XRV","XSV","XTV","ZAV","ZCV","ZDV","ZDV","ZEV","ZFV","ZIV","ZLV","ZMV","ZRV","ZSV","ZTV","GAV","GCV","GDV","GDV","GEV","GFV","GIV","GLV","GMV","GRV","GSV","GTV","AAV","ACV","ADV","ADV","AEV","AFV","AIV","ALV","AMV","ARV","ASV","ATV","LAV","LCV","LDV","LDV","LEV","LFV","LIV","LLV","LMV","LRV","LSV","LTV") + + //formatting breaks my fucking eyes + var/body = pick("A high-ranking Vey-Med executive was revealed to have been experimenting on biological neural enhancement techniques, believed to be of Skrellian origin, which could lead to the production of transhuman entities with an average cognitive capacity 30% greater than a baseline human.", + "[random_name(MALE)], chairman of the controversial Friends of Ned party, is scheduled to speak at a prominant university in [pick(core)] this Monday, according to a statement on his official newsfeed.", + "A wing of Ward-Takahashi B-class drones became catatonic this Thursday after tripping late-stage anti-emergence protocols. W-T Chief of Development has declined to comment.", + "A brand-new shipment of recreational voidcraft has been deemed \"Unsafe for use\" and seized at [pick(solgov)] customs. Wulf Aeronautics blames error in automated manufactory on [pick(solgov)], assures shareholders of \"One time incident\" after shares drop 4%.", + "Activity in a mostly automated Xion work-site in [pick(solgov)] has been suspended indefinitely, after reports of atypical drone behavior. The EIO's assigned investigator commented on the shutdown, saying \"We'll get them up and running again as soon as we're sure it's safe.\" No comment so far on an estimated time or date of reopening.", + "The EIO has officially raised the Emergence Threat Level in [pick(solgov)] to Blue. Citizens are reminded to comply with all EIO Agent requests. Failure to do so will be met with legal action, up to and including imprisonment.", + "All SolGov citizens beware, the scourge know as the Vox have increased the frequency of their attacks on isolated and poorly defended SolGov territories in [pick(bowl)]. Citizens have been advised to travel in groups and remain aware of their surroundings at all times.", + "The Unathi have recently moved a large amount of material into Abel's Rest, under the premise of building additional power plants. According to our sources, the material is in fact being channeled into domestic terrorist groups on both sides, in an attempt to incite a SolGov response. More news as the story develops.", + "Controversial Kishari director [random_name(FEMALE)] announced this Friday a sequel to the 2525 animated series Soldiers of the Yearlong War. Open auditions for supporting cast members have been called.", + "Amid concerns that it promotes a pro-transtech agenda, a high-profile screening of the award-winning animated film \"The Inventor's Marvelous Mechanical Maidens\" was canceled today on [pick(pick(core, heights))].", + "A radiation leak caused by a power unit rupture at a [pick(solgov)] hazardous materials reclamation plant has left several workers and neighboring residents with acute radiation poisoning. Witnesses report that a basic lifting drone failed to recognize and collided with the misplaced unit.", + "Xenophobic fringe group Humanity First has claimed credit for a bombing at a local government office on [pick(solgov)] which left three seriously injured. Police report that they have two suspects in custody, but details remain sparse.", + "Government official [random_name(MALE)] reports that the crew of the [pick(prefixes)] [pick(ship_names)], the vessel boarded by Jaguar Gang pirates earlier this week, are \"Safe, unharmed, and happy to be back at work.\" Officials were unable to comment on future security measures at this time.", + "Sanitation Technician [random_name(FEMALE)] says she was trapped in her work bathroom for three days after the locking system went haywire! The furious techie says she wants a \"hefty sum\" from her employers and that she won't be visiting that cubicle again any time soon!", + "Experts at a top university have said that almost every position in modern society might be filled by a robot within the next few decades if production continues at its current rate. Workers' Rights groups have expressed alarm at the news, and have called for protections against the \"Tin menace\".", + "An alleged cyberattack on Bishop Cybernetics systems reported to have resulted in the theft of customer data including detailed medical and biological records has been dismissed as \"Unfounded scaremongering\" by company executives.", + "[pick(crescent)] resident [random_name(FEMALE)] says she was overjoyed when her son told her he was planning to get married, but was appalled to find the bride-to-be was a common household cleaning drone! GR3TA assures us that \"Cleaning is complete.\"", + "Striking workers at a manufacturing plant on [pick(bowl)] have returned to work after news spread that plant owners would relocate operations to an automated facility if production did not resume by the end of the month. Factory investor [random_name(FEMALE)] expressed admiration at the \"Decisive action\" taken by the company.", + "Police in [pick(core)] report that they have arrested a man in connection with multinationalist fringe group Nation of Mars. Authorities were alerted when the man's ID was flagged by new screening software at the city spaceport as a known sympathizer with the violent terrorist organization.", + "The mystery of the [pick(prefixes)] [pick(ship_names)] has come to its end as a member of the vessel's skeleton crew was arrested in connection with Golden Tiger activities on the Skrell border. According to authorities, the ship - declared missing some months ago - was illegally sold to criminal elements on its way to breaking yards at [pick(heights)].", + "[random_name(MALE)] comes clean about his decade-long nightmare kept as a slave on Eutopia in a new book to be released later this year. The harried author has fought lawsuits at every turn that claim that his account is \"A work of pure fiction with an obvious leftist agenda.\"", + "Gas mask toting Revolutionary Solar People's Party extremists have reportedly attacked police at a rally in [pick(crypt)]. Peace-keeping officers were viscously pelted with objects and several protesters were found to be equipped with bottles containing an \"unknown substance.\"", + "Be careful what you say around your personal AI device as you never know who might be listening, say top minds! Cybercrime expert [random_name(FEMALE)] says hackers can easily trick your device to listen in on your conversations, record you in secret, or even steal your identity!", + "Thousands of travellers have been stranded at [pick(loc)] spaceport as a major error with the artificial intelligence system purged weeks worth of scheduling and manifest data from the port's mainframe. Major Bill's Transportation is offering stranded passengers 20% off replacement flights.", + "An outraged pet owner claims that a cybernetic company in [pick(solgov)] performed \"disturbing\" surgeries on their beloved cat, Pickles. [random_name(PLURAL)], 58 claims that the local cybernetics firm stole the furry friend from the vet's office and \"Replaced his brain with ones and zeroes.\"", + "Doctors in [pick(pick(skrell, heights))] were left in awe and horror as a Teshari was hatched with the features of an adult human man! Sources say that the youngster hatched with a full head of hair and could recite six nursery rhymes from memory. Could Skrell genetic experiments be to blame?", + "Miners in [pick(bowl)] were dismayed to discover that their boss was actually a C-class drone intelligence! \"I should've known there was something wrong,\" says dumbfounded miner [random_name(MALE)],\"I'd say good morning and he'd just start listing off mineral densities and coordinates. I just thought he loved his job a little too much.\"", + "The remains of an early 22nd century voidcraft containing \"Period artifacts, technology and human remains\" has been located on the surface of Luna after centuries of being disregarded as worthless wreck. Historians hope the find will provide insight into daily life under the short-lived Selene Federation.", + "The unexpected discovery of the remains of a what was believed to be a previously undiscovered species by workers on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")] has now been dismissed. Upon close analysis of the specimen, it was identified as a \"Bear with mange\", apparently dumped there some weeks prior.", + "According to a public statement by electronics giant Ward-Takahashi, many artificial intelligence systems - ranging from household appliances to industrial drones and habitat control networks - manufactured before 2550 could be at risk from a new virus dubbed \"Cap-3k\".", + "A controversial opera billed as \"The true story of Nos Amis\" has been criticized by law enforcement agencies as \"glorifying\" some of the most infamous gangsters of the 22nd century. The Polish-language \"Z Francji, do Gwiazd\" is to be distributed exclusively in Alpha Centauri for one week only.", + "Injury count continues to rise in the aftermath of the Positronic Rights Group Rally in [pick(pick(bowl, core, heights))]. Homemade teargas grenades were launched into the crowd at approximately 3:45 pm on Saturday by an unidentified person. Authorities urge anyone with information to call in, toll-free, at any time.", + "Representatives report that investigations continue on a string of fires on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")]. While no information has been released to the public, authorities assure the press that they are doing everything in their power to find those responsible.", + "En-route to the contentious rim system, a medical aid mission to Natuna was stopped by Ue-Katish pirates masquerading as refugees, who boarded the ship and stripped it of all supplies.", + "Lead Singer of Strawberry Idol Revealed As Three Teshari In A Trench Coat-- Newest gimmick or shocking revelation??", + "Shocking art critics throughout the system, a recent submission to the [pick(solgov)] Museum of Absurdism's contemporary exhibit was revealed to actually be the nutritional information on the back of a dehydrated cereal product common in Skrell space.", + "The celebrated magical kid series \"Petit Yuusha Jossen Temonila\" has announced its newest season at the height of its demicentenial festival. Noted director [random_name(MALE)] has promised to bring a diverse production staff to the venerable series, and has stated a theme of \"the friendships that transcend borders\".", + "The Hephaestus Industries board of directors announced this Monday the highest annual profits since the height of the Lizard Riots.", + "A radical group of Mercurials were convicted today of violations of Five Points legislature at an extraordinary court on [pick(solgov)]. These convictions come at the heels of a successful sting operation six years in the making, lead by local Head of EIO [random_name(FEMALE)].", + "An unnamed official of the shipping TSC Major Bill's Transportation narrowly escaped an attempt on their life by a deranged assassin. The assassin claims to have been driven to this henious act by the corporation's infamous jingle.", + "In the aftermath of yesterday's synthphobic rally on [pick(solgov)], three positronic citizens were left irreparably damaged by a hostile mob, who claim that the victims were \"AAs\" attempting to infiltrate the rally.", + "EIO spokesperson [random_name(MALE)] stated in a press conference yesterday that the \"Shakespear\" A-class codeline was briefly available for download on the darknet, although they claim to be \"confident that the leak was shut down before any significant portion could be downloaded\". Experts suspect Association involvement.", + "[pick("Strives Towards", "Embraces", "Dreams of", "Cultivates", "Advocates", "Exemplifies")] [pick("Strength", "Wisdom", "Independence", "Pragmatism", "Reason", "Development")], a Community Child from Angessa's Pearl, published his memoir today, detailing a shocking level of abuse by caretakers and educators.", + "Nova Sixty, Mercurial web personality, claims that the disappearence of the SCG-R Song Shi was a plot by \"extradimensional rockmen\" who intend to sow mistrust between the Association and SolGov. Quote Sixty, \"The Far Kingdoms' attempt to hide the TRUTH only proves that they and their rockman allies are NOT to be trusted.\"", + "Unusual stellar phenomena was detected on [pick(allloc)], sparking concerns about the colonies in the system.", + ) + + news_network.SubmitArticle(body, author, channel, null, 1) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 7f234b1455..d48cda9dca 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -134,12 +134,13 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), + //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 50), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), ) diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm index d5ddc07500..b8a6132863 100644 --- a/code/modules/events/event_container_vr.dm +++ b/code/modules/events/event_container_vr.dm @@ -38,7 +38,7 @@ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), + //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 9f8eca869c..260e690924 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -47,7 +47,8 @@ var/list/event_last_fired = list() possibleEvents[/datum/event/economic_event] = 300 possibleEvents[/datum/event/trivial_news] = 400 - possibleEvents[/datum/event/mundane_news] = 300 + //possibleEvents[/datum/event/mundane_news] = 300 + possibleEvents[/datum/event/lore_news] = 300 // up this if the above ones get removed as they damn well should possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 3c3f1fd194..568cf8f44f 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -47,7 +47,7 @@ mob/living/carbon/proc/handle_hallucinations() if(!H.r_store) slots_free += ui_storage2 if(slots_free.len) halitem.screen_loc = pick(slots_free) - halitem.layer = 50 + halitem.hud_layerise() switch(rand(1,6)) if(1) //revolver halitem.icon = 'icons/obj/gun.dmi' diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index f0cbad5a43..ddf3a70de1 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -9,6 +9,22 @@ result = /obj/item/weapon/reagent_containers/food/snacks/path_to_some_food */ +/datum/recipe/jellydonut + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice) + +/datum/recipe/jellydonut/slime + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice) + +/datum/recipe/jellydonut/cherry + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice) + +/datum/recipe/donut + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice) + /datum/recipe/sushi fruit = list("cabbage" = 1) reagents = list("rice" = 20) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index f08f28d97a..c35d4b489a 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -51,7 +51,6 @@ density = 0 icon = 'icons/obj/hydroponics_growing.dmi' icon_state = "bush4-1" - layer = 3 pass_flags = PASSTABLE mouse_opacity = 2 @@ -192,12 +191,12 @@ icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]" if(growth>2 && growth == max_growth) - layer = 5 + plane = ABOVE_PLANE set_opacity(1) if(!isnull(seed.chems["woodpulp"])) density = 1 else - layer = 3 + reset_plane_and_layer() density = 0 /obj/effect/plant/proc/calc_dir() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index cade937bfb..5e97aa6818 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -5,7 +5,6 @@ simulated = 0 anchored = 1 icon = LIGHTING_ICON - layer = LIGHTING_LAYER plane = PLANE_LIGHTING //invisibility = INVISIBILITY_LIGHTING color = LIGHTING_BASE_MATRIX diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index 42987628ae..7c5f071874 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -1,12 +1,12 @@ // Inherits from /book/ so it can fit on bookshelves. -/obj/item/weapon/book/codex - name = "The Traveler's Guide to Human Space: Virgo-Erigone Edition" //VOREStation Edit - Book Name - desc = "Contains useful information about the world around you. It seems to have been written for travelers to Virgo-Erigone, human or not. It also \ - has the words 'Don't Panic' in small, friendly letters on the cover." //VOREStation Edit - System Name +/obj/item/weapon/book/codex // Vorestation Edits throughout this object. + name = "The Traveler's Guide to Human Space: Virgo-Erigone Edition" + desc = "Contains useful information about the world around you. It seems to have been written for travelers to Virgo-Erigone, human or not. It also \ + has the words 'Don't Panic' in small, friendly letters on the cover." icon_state = "codex" unique = TRUE var/datum/codex_tree/tree = null - var/root_type = /datum/lore/codex/category/main_vir_lore //Runtimes on codex_tree.dm, line 18 with a null here + var/root_type = /datum/lore/codex/category/main_virgo_lore //Runtimes on codex_tree.dm, line 18 with a null here /obj/item/weapon/book/codex/initialize() tree = new(src, root_type) @@ -18,12 +18,12 @@ icon_state = "[initial(icon_state)]-open" tree.display(user) -/obj/item/weapon/book/codex/lore/vir - name = "The Traveler's Guide to Human Space: Vir Edition" - desc = "Contains useful information about the world around you. It seems to have been written for travelers to Vir, human or not. It also \ +/obj/item/weapon/book/codex/lore/vir // Vorestation Edits throughout this object. + name = "The Traveler's Guide to Human Space: Virgo-Erigone Edition" + desc = "Contains useful information about the world around you. It seems to have been written for travelers to Virgo-Erigone, human or not. It also \ has the words 'Don't Panic' in small, friendly letters on the cover." icon_state = "codex" - root_type = /datum/lore/codex/category/main_vir_lore + root_type = /datum/lore/codex/category/main_virgo_lore /obj/item/weapon/book/codex/lore/news name = "Daedalus Pocket Newscaster" diff --git a/code/modules/lore_codex/lore_data_vr/important_locations.dm b/code/modules/lore_codex/lore_data_vr/important_locations.dm index e2bb96ef50..ae87092212 100644 --- a/code/modules/lore_codex/lore_data_vr/important_locations.dm +++ b/code/modules/lore_codex/lore_data_vr/important_locations.dm @@ -28,10 +28,10 @@ /datum/lore/codex/page/radiance_energy_chain/add_content() name = "R.E.C. (Artificial Satellites)" - keywords += list("Radiance Energy Chain") + keywords += list("Radiance Energy Chain", "R.E.C.") data = "A sparse government-owned chain of automated stations exists between [quick_link("Virgo 3")] and the star itself, known as the Radiance Energy Chain. The idea is based on \ an ancient design that was pioneered at Sol. The stations are heavily shielded from the stellar radiation, and feature massive \ - arrays of photo-voltaic panels. Each station harvests energy from Vir using the solar panels, and sends it to other areas of \ + arrays of photo-voltaic panels. Each station harvests energy from Virgo-Erigone using the solar panels, and sends it to other areas of \ the system by beaming the energy to several relay stations farther away from the star, typically with a large laser.\

\ These stations are generally devoid of life, instead, they are operated mainly by [quick_link("drones")], with maintenance performed \ @@ -86,9 +86,9 @@ Currently, [quick_link("NanoTrasen")] is constructing a 'space elevator' for commercial purposes, as the atmosphere of Virgo-3B is inimical to shuttles, and engines in particular." /datum/lore/codex/page/virgo_prime/add_content() // Virgo 4 technically. - name = "Virgo Prime (Terrestrial Planet)" - keywords += list("Virgo Prime") - data = "Virgo Prime is the fourth planet of Virgo-Eirgone. Although primarily desert, temperatures linger around only 287 kelvin (~14°C). \ + name = "Virgo 4 / Virgo-Prime (Terrestrial Planet)" + keywords += list("Virgo 4","Virgo-Prime") + data = "Virgo 4, also known as Virgo-Prime, is the fourth planet of Virgo-Eirgone. Although primarily desert, temperatures linger around only 287 kelvin (~14°C). \ It is the only planet in the system with an environment that supports oxygen-breathing lifeforms. \

\ While being about the size of Earth, it is home to only about 750,000 known residents, most of whom live \ diff --git a/code/modules/lore_codex/lore_data_vr/main.dm b/code/modules/lore_codex/lore_data_vr/main.dm new file mode 100644 index 0000000000..a5ee6c8252 --- /dev/null +++ b/code/modules/lore_codex/lore_data_vr/main.dm @@ -0,0 +1,32 @@ +/datum/lore/codex/category/main_virgo_lore // The top-level categories for the Virgo book + name = "Index" + data = "Don't panic!\ +

\ + The many star systems inhabitied by humanity and friends can seem bewildering to the uninitiated. \ + This guide seeks to provide valuable information to anyone new in the system. This edition is tailored for visitors to the Virgo-Erigone system, \ + however it also contains useful general information about human space, such as locations you may hear about, the current (as of 2562) political climate, various aliens you \ + may meet in your travels, the big Trans-Stellars, and more." + children = list( + /datum/lore/codex/category/important_locations, + /datum/lore/codex/category/species, + /datum/lore/codex/category/auto_org/tsc, + /datum/lore/codex/category/auto_org/gov, + /datum/lore/codex/category/auto_org/mil, + /datum/lore/codex/category/political_factions, + /datum/lore/codex/page/about_lore + ) + +// We're a bird. +/datum/lore/codex/page/about_lore + name = "About" + data = "The Traveler's Guide to Human Space is a series of books detailing a specific location inside a location colonized by humans. \ + This book is for the system Virgo, and was written by Eshi Tache, an explorer whom has visited many star systems, and \ + has personally visited and seen many of the locations described inside this book. Two other people have also assisted in the creation of this \ + book, being Qooqr Volquum, whom is an expert on synthetics, and Damian Fischer, a historian. Together, they provide valuable information and facts that lie outside of Tache's expertise.\ +

\ + The writings inside this edition are intended to be useful to anyone visiting it for the first time, from someone taking a vacation to beautiful Virgo-Prime, \ + to an immigrant from another system, or even from outside human space, and anyone inbetween. The publisher wishes to note that any opinions expressed \ + in this text does not reflect the opinions of the publisher, and are instead the author's.\ +

\ + Eshi Tache has also written other The Traveler's Guide books, including Sol Edition, Tau Ceti Edition, Alpha Centauri Edition, Vir Edition, and more, \ + which you can find in your local book store, library, or e-reader device." \ No newline at end of file diff --git a/code/modules/lore_codex/lore_data_vr/political_parties.dm b/code/modules/lore_codex/lore_data_vr/political_parties.dm index 5f6a251669..1a768ff9e0 100644 --- a/code/modules/lore_codex/lore_data_vr/political_parties.dm +++ b/code/modules/lore_codex/lore_data_vr/political_parties.dm @@ -1,9 +1,10 @@ /datum/lore/codex/category/political_factions name = "Political Factions" - data = "Those wishing to immigrate to somewhere in Virgo-Erigone, or otherwise plan to stay for a long time should get to know human politics. \ + data = "For some weird reason, this section is blank. This looks like a publishing error." + /*data = "Those wishing to immigrate to somewhere in Virgo-Erigone, or otherwise plan to stay for a long time should get to know human politics. \ There are presently three major political parties that exist throughout SolGov space, being the Icarus Front, the Shadow Coalition, and \ the Sol Economic Organization, and several smaller ones which tend to align themselves among one of the major parties. In the Virgo-Erigone system, the \ - Icarus Front's influence is much less than somewhere closer to Sol, and the other two parties being more popular." + Icarus Front's influence is much less than somewhere closer to Sol, and the other two parties being more popular."*/ // ToDo: A lot. children = list( /datum/lore/codex/page/blank ) @@ -11,4 +12,4 @@ /datum/lore/codex/page/blank/add_content() name = "Blank Page" keywords += list("Blank") - data = "For some weird reason, this page is blank. This looks like a publishing error." + data = "For some weird reason, this section is blank. This looks like a publishing error." // ToDo: A lot. diff --git a/code/modules/lore_codex/lore_data_vr/species.dm b/code/modules/lore_codex/lore_data_vr/species.dm index a2737aa1b4..2ccfc6475b 100644 --- a/code/modules/lore_codex/lore_data_vr/species.dm +++ b/code/modules/lore_codex/lore_data_vr/species.dm @@ -42,12 +42,16 @@ /datum/lore/codex/page/unathi name = "Unathi" - data = "Raging in from Moghes, the Unathi are a race of tall, reptilian humanoids that possess both crocodile-like and serpent-like features. \ - They are a proud, warlike species that favors honor and strength, their home, Moghes, is a desert planet but was once believed to be full of life. \ - Of all the currently known sentient species, the Unathi are the most unequal in gender with females tending to be property of the males. Most Unathi \ - outside of Moghes tend to be exiles however, and with influence of other species the gender difference is not nearly as pronounced. Unathi were \ - humanity's second contact, and despite their aggressive nature, seem to get along well enough with humanity, though are often considered to be \ - 'second-class' citizens and are rarely seen in jobs other than where muscle is needed." // ToDo: Update with Unathi rewrite from Polaris. + data = "The Unathi are a race of tall, reptilian humanoids that possess both crocodile-like and serpent-like features. Their scales are hard and \ + plate-like, save for the softer ones that line the inside of their legs, armpits, and groin. Originating from the planet of Moghes, the Unathi \ + live in an extremely religious society. The Unathi believe in and closely follow a set of Decrees laid out in their belief system, The Unity. \ + Unathi believes in living long, prosperous, honorable and productive lives. They firmly believe in improving the skills of their craft to reach \ + a level where they can be considered to have mastered it. Unathi was humanity's second alien contact, but due to their aggressive nature, engaged \ + in an interstellar war with humanity known as the Sol-Hegemony Conflict. \ +

\ + Although the conflict has long since ended, and relations have slowly improved, Unathi are still often considered to be 'second-class' citizens \ + and are rarely seen in jobs other than where muscle is needed. It is also still common for racial tensions to run high, although this is less \ + common on the outskirts of SolGov's grasp, such as systems like Virgo-Erigone." /datum/lore/codex/page/tajaran name = "Tajaran" @@ -85,7 +89,7 @@

\ With the help of Skrellean technology, the Akula had their genome modified to be capable of surviving in open air for long periods of time. \ However, Akula even today still require a high humidity environment to avoid drying out after a few days, which would make life on an arid world like \ - [quick_link("Virgo Prime")] nearly impossible if it were not for Skrellean technology to aid them." + [quick_link("Virgo-Prime")] nearly impossible if it were not for Skrellean technology to aid them." /datum/lore/codex/page/nevrean/add_content() name = "Nevrean" @@ -126,7 +130,7 @@ /datum/lore/codex/page/zorren/add_content() name = "Zorren" keywords += list("Zorren") - data = "The fox-like Zorren are native to [quick_link("Virgo Prime")], however there are two distinct varieties of \ + data = "The fox-like Zorren are native to [quick_link("Virgo-Prime")], however there are two distinct varieties of \ Zorren one with large ears and shorter fur, and the other with longer fur that is a bit more vibrant. The \ long-eared, short-furred Zorren have come to be known as \"Flatland\" Zorren as that is where most of their \ settlements are located. The Flatland Zorren are somewhat tribal and shamanistic as they have only recently \ @@ -147,7 +151,7 @@ maintaining their own settlements and cultures, but often finding themselves standing on the shoulders of their more technologically advanced neighbors \ when it comes to meeting and exploring the rest of the galaxy.\

\ - It is important to note that Teshari names are unlike standard human names. Their pack name precedes their given name." + It is important to note that Teshari names are unlike standard human names. Their pack name precedes their given name." children = list( /datum/lore/codex/page/teshari_packs, /datum/lore/codex/page/teshari_physical diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index 2a59e12d5e..cf3660a620 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -4,11 +4,15 @@ region. Each is labled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( - /datum/lore/codex/page/article1, - /datum/lore/codex/page/article2, - /datum/lore/codex/page/article3, - /datum/lore/codex/page/article4, + /datum/lore/codex/page/article9, + /datum/lore/codex/page/article8, + /datum/lore/codex/page/article7, + /datum/lore/codex/page/article6, /datum/lore/codex/page/article5, + /datum/lore/codex/page/article4, + /datum/lore/codex/page/article3, + /datum/lore/codex/page/article2, + /datum/lore/codex/page/article1, /datum/lore/codex/page/about_news, ) @@ -20,7 +24,7 @@ information, feel free to visit our homepage at oc.about.tsc, or the sites of any of our constituents." /datum/lore/codex/page/article1 - name = "08/30/61-- VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing" + name = "08/30/61 - VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing" data = "Today's meeting of the Vir Bicameral led to the passing of the Wynther-Helsey Bill, an implementation of the legal framework \ used in Aetolus to handle the production and cultivation of the Macrolimbus species dubbed \"Prometheans\". These ill-researched organisms \ possess cognitive abilities easily equaling those of A-class drones, but so far have not been included under the EIO's list of dangerous \ @@ -38,7 +42,7 @@ follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation." /datum/lore/codex/page/article2 - name = "2/3/62-- Corporate Coup on Aetolus" + name = "2/3/62 - Corporate Coup on Aetolus" data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the Promethean homeworld. During \ a late-night meeting of the Nanotrasen Board of Trustees, several high-ranking personnel, including Head of Research Naomi Harper,\ announced their intention to assume direct control of Nanotrasen facilities in the system. It is known that several dissenting \ @@ -51,7 +55,7 @@ not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself." /datum/lore/codex/page/article3 - name = "2/10/62-- Aetolian Partisans Declare Independence" + name = "2/10/62 - Aetolian Partisans Declare Independence" data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\

\ Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\ @@ -59,7 +63,7 @@ NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna." /datum/lore/codex/page/article4 - name = "2/14/62-- SCG Denounces Aetolian Coup; Mobilizes Fleet" + name = "2/14/62 - SCG Denounces Aetolian Coup; Mobilizes Fleet" data = "Dismissing claims of inaction, a spokesperson for the Solar Confederate Government today confirmed that the Colonial Assembly has voted overwhelmingly in favor of swift military action in response to the coup on Aetolus earlier this month. Icarus Front Chairperson Mackenzie West was quick to make a damning official statement: \"Dr. Harper and her radical agitators cannot be excused for their violent, despicable attempts to destabilize the flourishing economy of the Almach Rim. The ruthless murder of innocents, and illegal seizure of private property are crimes that cannot merely be met with strong words and gentle slaps to the wrist\"...\"I am proud to announce that two units of brave Solar marines have been assigned to the SCG-R Song Shi rapid response cruiser, with the full backing of the Icarus Front - and I hope with my heart, the backing of all patriotic Solar citizens.\"Â\

\ The decision faced resistance from more laissez faire Assembly member states, including prominent SEO governor Bruno Ofako, delaying an earlier consensus. Supporters of the action hope that this decisive display of military strength will encourage the rebels to stand down without further bloodshed, and submit to prosecution by the Lunar High Courts.\ @@ -67,7 +71,7 @@ The Icarus Front has also proposed a temporary ban on continued Promethean research, though this motion has yet to gain any traction." /datum/lore/codex/page/article5 - name = "2/23/62-- \"Almach Association\" Shocks Nation" + name = "2/23/62 - \"Almach Association\" Shocks Nation" data = "Shocking the nation, in the wee hours UTC a number of governments in the Almach Rim announced their intent to secede from the Confederacy as a unified political organization they refer to as the Almach Association, joining the already-declared Aetolian Council. Among the half-dozen affected systems is Angessa's Pearl, through which the Song Shi was passing en route to Aetolus. The Association has already issued a political manifesto and a foundational charter, leading political scientists across the galaxy to suspect back-doors collusion and possible Shelfican interference, a hypothesis made more likely by Morpheus Cyberkinetics' exonet site voicing support for the Association. Others suspect a moment of political crystallization, not unlike that in the Golden Hour three centuries ago. These researchers are already referring to this morning's events as the Gray Hour.\

\ The Association's official manifesto repudiates the Five Points, calling them \"an archaic and distinctly human invention\". Experts agree that this bold declaration puts the Movement more in line with the Golden Hour than with the Age of Secession, and many fear that nothing short of a miracle like the discovery of the positronics will spare humanity from a bloody civil war.\ @@ -75,3 +79,33 @@ While the Association currently lists only a handful of Almach Rim systems as \"Constituent Organizations\", it has named Shelf, the Free Relan Federation, and the Eutopian Foreign Relations Board as \"observers\". The implications of this status are yet to be identified.\

\ The fate of the SCG-R Song Shi and her crew remain unknown." + +/datum/lore/codex/page/article6 + name = "3/03/62 - A Week Out From Almach: What are the facts?" + data = "* Several organizations in the Almach Rim, including Angessa's Pearl, the Aetolian Council, the Interstellar Workers of Wythe, the Republic of Whitney, and members of several prominent families in the Neon Light unilaterally declared secession from SCG.

*This secession was first called the Grey Hour by political scientists in New Florence, a term popularized by reporter Elspor Fong.

* Shelf, the FRF, and the EFRB were declared \"observers\" in the Almach Association charter.

* None of these organizations have issued a statement on the matter.

* The SCG-R Song Shi was stranded in the region during the secession.

* SolGov has not issued an official statement of the fate of the Song Shi.

* Several confederate agencies, including Emergent Intelligence Oversight, the Trade and Customs Bureau, and SCG Fleet Intelligence have declared a \"state of emergency\".

* SolGov itself has NOT declared a state of emergency.

* Legitimate communications in and out of the Almach Rim are restricted to audited text messages for the period.

* Several illegitimate communication links exist and are believed by Fleet Intelligence to be currently hosting the official sites for Morpheus Cyberkinetics and for the Association itself.

* Icarus Front chairperson Mackenzie West has proposed a moratorium on the creation of new Prometheans for the duration of the crisis.

* Local laws on the subject will apply until the Assembly meets late in May.

* No confederate lawmaker has proposed action against Relani, Shelfican, or newly Almachi nationals living within stable regions.

* The border remains tightly closed to migrants, media, and diplomats alike." + +/datum/lore/codex/page/article7 + name = "3/21/62 - Relan, Shelf Join the Almach Association" + data = "Recent reports from within the Association indicate that the Free Relan Federation and Shelf have officially decided to join the Almach Association. President Nia Fischer of the FRF had this to say on the matter, in a speech addressed to the population at large. \ +

\ + \ + \"Our decision to join the Association may, at first, seem strange. It is true that we have much to gain from trade with the Solars, and that the radical transhumanism of Angessa's Pearl is not our way. But I will remind you that it was Shelf, not Sol, who ensured our prosperity just over two decades ago-- who safeguarded our independence and prevented us from falling to barbarism and dictatorship. We owe it, not just to Shelf but to all the members of the Almach Rim, to support their independence just the same. And that, my fellow Relanians, is the crux of it all. The Association is a revolution, at the heart of it all, and many of the now-independent states were owned near-outright by Trans-Stellar Corporations until the Association allowed them to shake out their fetters. What right do we have to sit by while just a dozen light-years coreward newly-born republics suffer the growing pains of independence? What right do we have to bask in our own stability when our neighbors, our comrades in ideology, are struggling with a cruel blockade proposed by politicians back on Earth and Luna? That is why we must join with them, guard them, and guide them, for as long as need be.\"\ +

\ + \ + A Shelfican spokesperson, meanwhile, had only this to say:\ +

\ + \"We're probably going to regret this but, y'know, the whole thing is kind of our fault. Sure, whatever.\"" + + +/datum/lore/codex/page/article8 + name = "4/1/62 - Almach Cordon Breached by Unknown Organization" + data = "Early this morning, SolGov ships assigned to the Almach Cordon around the Rim territories reported that a number of bulk freighters had eluded apprehension and are now at large within the Golden Crescent. Lieutenant-Major Volkov of the SCG-D Henri Capet reports that the blockade-runners were highly organized and determined, citing several lightly-manned ships left behind to tie up the SolGov forces long enough for the freighters to escape, detonating their reactors when they lost the ability to continue fighting. This resulted in three Fleet casualties and a significant degree of damage to the Henri Capet. The contents and location of the freighters are unknown at this time. In response, eight light-response vessels are being assigned to the Saint Columbia Fleet Base from Jahan's Post and Zhu Que. Residents and traffic officials in Vir, Oasis, and Gavel are to remain alert and notify police if any suspicious or unregistered craft enter their space.\ +

\ + A spokesperson for the Association claims that, while they make no attempts to stop aspiring blockade runners, the organization responsible for this most recent attack is unaffiliated with the Association as a whole and deny any knowledge of their identity or motives." + +/datum/lore/codex/page/article9 + name = "4/7/62 - Boiling Point Tragedy in Gavel" + data = "Today, April the Seventh, marks a day of tragedy for all the galaxy. A small group of operatives claiming to be associated with Mercurial terrorist organization Boiling Point invaded major refueling platform NLS Aquarius in the Republic of Gavel after hijacking civilian transport vessel WTV Orion and faking a drive failure. Several detonations were reported within the Aquarius, the operatives entering through unknown (potentially Skrellian) means. After stating their affiliation and desire for the liberation of all \"Prometheans, drones, and ex-humans\", they opened fire on a crowd of unarmed bystanders, killing as many as seven. A multiple-hour long firefight with Nanotrasen corporate asset protection ensued, at which point the operatives demonstrated capabilities well in excess of Five Points-prescribed limits. Asset Protection was successful in repelling the terrorists, though their harsh methods drew outrage from the people they were protecting, leading a notable director of research to resign her position with the corporation. Several operatives are still at large, though the SG-PV Juno recovered two living terrorists and one totaled synthetic platform. \ +

\ + The intervention of a local Defense Force drone wing on behalf of the terrorists leads many in the intelligence community to assume that more Boiling Point operatives remain active within Gavel, and possibly nearby systems such as Vir and Oasis. Some have also noted that elements of the terrorists' tactics and augmentations suggest Association training, though the specifics remain classified. More information as the story breaks." + diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index 5ffc507888..c6f9503a0a 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -13,6 +13,7 @@ var/list/global/map_templates = list() /datum/map_template var/name = "Default Template Name" var/desc = "Some text should go here. Maybe." + var/template_group = null // If this is set, no more than one template in the same group will be spawned, per submap seeding. var/width = 0 var/height = 0 var/mappath = null @@ -67,7 +68,7 @@ var/list/global/map_templates = list() admin_notice("Initializing newly created atom(s) in submap.", R_DEBUG) SSatoms.InitializeAtoms(atoms) - + admin_notice("Initializing atmos pipenets and machinery in submap.", R_DEBUG) SSmachines.setup_atmos_machinery(atmos_machines) @@ -190,6 +191,7 @@ var/list/global/map_templates = list() CHECK_TICK var/list/loaded_submap_names = list() + var/list/template_groups_used = list() // Used to avoid spawning three seperate versions of the same PoI. // Now lets start choosing some. while(budget > 0 && overall_sanity > 0) @@ -210,6 +212,14 @@ var/list/global/map_templates = list() // Can we afford it? if(chosen_template.cost > budget) + priority_submaps -= chosen_template + potential_submaps -= chosen_template + continue + + // Did we already place down a very similar submap? + if(chosen_template.template_group && chosen_template.template_group in template_groups_used) + priority_submaps -= chosen_template + potential_submaps -= chosen_template continue // If so, try to place it. @@ -242,14 +252,21 @@ var/list/global/map_templates = list() CHECK_TICK + // For pretty maploading statistics. if(loaded_submap_names[chosen_template.name]) loaded_submap_names[chosen_template.name] += 1 else loaded_submap_names[chosen_template.name] = 1 + // To avoid two 'related' similar submaps existing at the same time. + if(chosen_template.template_group) + template_groups_used += chosen_template.template_group + + // To deduct the cost. if(chosen_template.cost >= 0) budget -= chosen_template.cost + // Remove the submap from our options. if(chosen_template in priority_submaps) // Always remove priority submaps. priority_submaps -= chosen_template else if(!chosen_template.allow_duplicates) diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index d0e53184e3..ca65a1a814 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -343,7 +343,7 @@ var/list/name_to_material name = "marble" icon_colour = "#AAAAAA" weight = 26 - hardness = 100 + hardness = 30 //VOREStation Edit - Please. integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system stack_type = /obj/item/stack/material/marble diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 2502bd823e..7be58e782a 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -251,7 +251,7 @@ var/list/mining_overlay_cache = list() /turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "You don't have the dexterity to do this!" + to_chat(user, "You don't have the dexterity to do this!") return if(!density) @@ -271,19 +271,19 @@ var/list/mining_overlay_cache = list() if(valid_tool) if (sand_dug) - user << "This area has already been dug." + to_chat(user, "This area has already been dug.") return var/turf/T = user.loc if (!(istype(T))) return - user << "You start digging." + to_chat(user, "You start digging.") playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1) if(!do_after(user,40)) return - user << "You dug a hole." + to_chat(user, "You dug a hole.") GetDrilled() else if(istype(W,/obj/item/weapon/storage/bag/ore)) @@ -306,7 +306,7 @@ var/list/mining_overlay_cache = list() return var/obj/item/stack/rods/R = W if (R.use(1)) - user << "Constructing support lattice ..." + to_chat(user, "Constructing support lattice ...") playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) new /obj/structure/lattice(get_turf(src)) @@ -322,7 +322,7 @@ var/list/mining_overlay_cache = list() S.use(1) return else - user << "The plating is going to need some support." + to_chat(user, "The plating is going to need some support.") return @@ -342,7 +342,17 @@ var/list/mining_overlay_cache = list() var/obj/item/device/measuring_tape/P = W user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].") if(do_after(user, 15)) - user << "\The [src] has been excavated to a depth of [excavation_level]cm." + to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.") + return + + if(istype(W, /obj/item/device/xenoarch_multi_tool)) + var/obj/item/device/xenoarch_multi_tool/C = W + if(C.mode) //Mode means scanning + C.depth_scanner.scan_atom(user, src) + else + user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!") + if(do_after(user, 15)) + to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.") return if (istype(W, /obj/item/weapon/pickaxe)) @@ -364,7 +374,7 @@ var/list/mining_overlay_cache = list() if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably) fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" - user << "You start [P.drill_verb][fail_message]." + to_chat(user, "You start [P.drill_verb][fail_message].") if(fail_message && prob(90)) if(prob(25)) @@ -383,7 +393,7 @@ var/list/mining_overlay_cache = list() else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80% excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F) - user << "You finish [P.drill_verb] \the [src]." + to_chat(user, "You finish [P.drill_verb] \the [src].") if(newDepth >= 200) // This means the rock is mined out fully var/obj/structure/boulder/B @@ -488,7 +498,7 @@ var/list/mining_overlay_cache = list() if(prob(50)) pain = 1 for(var/mob/living/M in range(src, 200)) - M << "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" + to_chat(M, "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!") if(pain) flick("pain",M.pain) if(prob(50)) diff --git a/code/modules/mob/_modifiers/unholy.dm b/code/modules/mob/_modifiers/unholy.dm new file mode 100644 index 0000000000..1f7f3d67b5 --- /dev/null +++ b/code/modules/mob/_modifiers/unholy.dm @@ -0,0 +1,146 @@ +/* + * Modifiers originating from cult runes, spells, or pylons are kept here. + */ + + +////////// Self-Enhancing +/datum/modifier/fortify + name = "fortified body" + desc = "You are taking less damage from outside sources." + + on_created_text = "Your body becomes a mountain to your enemies' storm." + on_expired_text = "Your body softens, returning to its regular durability." + stacks = MODIFIER_STACK_EXTEND + + disable_duration_percent = 0.25 // Disables only last 25% as long. + incoming_damage_percent = 0.5 // 50% incoming damage. + icon_scale_percent = 1.2 // Become a bigger target. + pain_immunity = TRUE + + slowdown = 2 + evasion = -20 + +/datum/modifier/ambush + name = "phased" + desc = "You are partially shifted from the material plane." + + on_created_text = "Your body pulses, before partially dematerializing." + on_expired_text = "Your body rematerializes fully." + + stacks = MODIFIER_STACK_FORBID + + incoming_damage_percent = 0.1 // 10% incoming damage. You're not all there. + outgoing_melee_damage_percent = 0 // 0% outgoing damage. Be prepared. + pain_immunity = TRUE + + evasion = 50 //Luckily, not being all there means you're actually hard to hit with a gun. + +/datum/modifier/ambush/on_applied() + holder.alpha = 30 + return + +// Override this for special effects when it gets removed. +/datum/modifier/ambush/on_expire() + holder.alpha = 255 + return + +////////// On-hit +/datum/modifier/deep_wounds + name = "deep wounds" + desc = "Your wounds are mysteriously harder to mend." + + on_created_text = "Your wounds pain you greatly." + on_expired_text = "Your wounds numb for a moment." + + stacks = MODIFIER_STACK_EXTEND + + incoming_healing_percent = 0.66 // 34% less healing. + disable_duration_percent = 1.22 // 22% longer disables. + + +////////// Auras +/datum/modifier/repair_aura //This aura does not apply modifiers to individuals in the area. + name = "aura of repair (cult)" + desc = "You are emitting a field of strange energy, capable of repairing occult constructs." + + on_created_text = "You begin emitting an occult repair aura." + on_expired_text = "The occult repair aura fades." + stacks = MODIFIER_STACK_EXTEND + + mob_overlay_state = "cult_aura" + +/datum/modifier/repair_aura/tick() + spawn() + for(var/mob/living/simple_animal/construct/T in view(4,holder)) + T.adjustBruteLoss(rand(-10,-15)) + T.adjustFireLoss(rand(-10,-15)) + +/datum/modifier/agonize //This modifier is used in an aura spell. + name = "agonize" + desc = "Your body is wracked with pain." + + on_created_text = "A red lightning quickly covers your body. The pain is horrendous." + on_expired_text = "The lightning fades, and so too does the ongoing pain." + + stacks = MODIFIER_STACK_EXTEND + + mob_overlay_state = "red_electricity_constant" + +/datum/modifier/agonize/tick() + spawn() + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + H.apply_effect(20, AGONY) + if(prob(10)) + to_chat(H, "Just make it stop!") + +////////// Target Modifier +/datum/modifier/mend_occult + name = "occult mending" + desc = "Your body is mending, though at what cost?" + + on_created_text = "Something haunting envelops your body as it begins to mend." + on_expired_text = "The cloak of unease dissipates." + + stacks = MODIFIER_STACK_EXTEND + + mob_overlay_state = "red_electricity_constant" + +/datum/modifier/mend_occult/tick() + spawn() + if(isliving(holder)) + var/mob/living/L = holder + if(istype(L, /mob/living/simple_animal/construct)) + L.adjustBruteLoss(rand(-5,-10)) + L.adjustFireLoss(rand(-5,-10)) + else + L.adjustBruteLoss(-2) + L.adjustFireLoss(-2) + + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + + for(var/obj/item/organ/O in H.internal_organs) + if(O.damage > 0) // Fix internal damage + O.damage = max(O.damage - 2, 0) + if(O.damage <= 5 && O.organ_tag == O_EYES) // Fix eyes + H.sdisabilities &= ~BLIND + + for(var/obj/item/organ/external/O in H.organs) // Fix limbs, no matter if they are Man or Machine. + O.heal_damage(rand(1,3), rand(1,3), internal = 1, robo_repair = 1) + + for(var/obj/item/organ/E in H.bad_external_organs) // Fix bones + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + + for(var/datum/wound/W in affected.wounds) // Fix IB + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() + + H.restore_blood() + H.apply_effect(15, AGONY) + if(prob(10)) + to_chat(H, "It feels as though your body is being torn apart!") + L.updatehealth() diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index f54035596b..c5bded9765 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -205,8 +205,11 @@ note dizziness decrements automatically in the mob's Life() proc. animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2) animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2) -/mob/living/do_attack_animation(atom/A) +/mob/living/do_attack_animation(atom/A, no_attack_icons = FALSE) ..() + if(no_attack_icons) + return FALSE + //Check for clients with pref enabled var/list/viewing = list() for(var/m in viewers(A)) @@ -265,6 +268,7 @@ note dizziness decrements automatically in the mob's Life() proc. // And animate the attack! animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) + update_icon() return TRUE //Found an item, doing item attack animation. /mob/proc/spin(spintime, speed) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0b65e6819c..1656786afd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -8,7 +8,7 @@ desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/ghost.dmi' icon_state = "ghost" - layer = 3.9 //Just below normal mobs + layer = BELOW_MOB_LAYER plane = PLANE_GHOSTS alpha = 127 stat = DEAD @@ -795,5 +795,18 @@ mob/observer/dead/MayRespawn(var/feedback = 0) /mob/observer/dead/is_deaf() return FALSE +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + if(usr.client.prefs.be_special & BE_PAI) + for(var/obj/item/device/paicard/p in world) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.overlays += "pai-ghostalert" + spawn(54) + PP.overlays.Cut() + /mob/observer/dead/speech_bubble_appearance() return "ghost" diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index 1572c41510..97280c78b9 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -1,16 +1,3 @@ -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - if(usr.client.prefs.be_special & BE_PAI) - for(var/obj/item/device/paicard/p in world) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - PP.icon = 'icons/obj/pda_vr.dmi' - PP.overlays += "pai-ghostalert" - spawn(54) - PP.overlays.Cut() - /mob/observer/dead/verb/nifjoin() set category = "Ghost" set name = "Join Into Soulcatcher" diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 4d01759ce9..7153c0fe26 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -302,11 +302,6 @@ else adverb = " a very lengthy message" message = "[speaker] [verb][adverb]." - if(src.status_flags & PASSEMOTES) - for(var/obj/item/weapon/holder/H in src.contents) - H.show_message(message) - for(var/mob/living/M in src.contents) - M.show_message(message) src.show_message(message) /mob/proc/hear_sleep(var/message) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 2f3a6d8a63..7a6cd1fbf9 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -139,7 +139,6 @@ var/list/holder_mob_icon_cache = list() grabber << "You scoop up \the [src]!" src << "\The [grabber] scoops you up!" - grabber.status_flags |= PASSEMOTES H.sync(src) return H diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index d1e2eab309..6f851694a9 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -61,9 +61,9 @@ colour = "terminus" key = "4" flags = WHITELISTED - syllables = list ("die", "en", "skei", "van", "son", "der", "aar", "ch", "op", "ruk", "aa", "be", "ne", "het", - "ek", "ras", "ver", "zan", "das", "waa", "geb", "vol", "lu", "min", "breh", "rus", "stv", "ee", "goe", "sk", - "la", "ver", "we", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "du", "jaa", "ch", "kk", "gh", "ll", "uu", "wat") + syllables = list (".a", "spa", "pan", "blaif", "stra", "!u", "!ei", "!am", "by", ".y", "gry", "zbly", "!y", "fl", + "sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu", + "uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat") // Criminal language. /datum/language/gutter diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index ef8fc37c19..c6089a8788 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -99,7 +99,7 @@ return (copytext(message, length(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) - log_say("(HIVE) [message]", src) + log_say("(HIVE) [message]", speaker) if(!speaker_mask) speaker_mask = speaker.name message = format_message(message, get_spoken_verb(message)) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index fef17bb5ee..1abc85e870 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -221,7 +221,7 @@ busy = 1 while(do_after(src, 10) && tank.reagents.total_volume < tank.reagents.maximum_volume) - tank.reagents.add_reagent("water", 10) + tank.reagents.add_reagent("water", 100) //VOREStation Edit if(prob(5)) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index 614647993b..585b421c7f 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -33,7 +33,6 @@ if(!istype(H) || !src || !(src.Adjacent(H))) return 0 H << "You feel your being twine with that of \the [src] as it merges with your biomass." - H.status_flags |= PASSEMOTES src << "You feel your being twine with that of \the [H] as you merge with its biomass." loc = H verbs += /mob/living/carbon/alien/diona/proc/split @@ -66,4 +65,3 @@ for(var/atom/A in M.contents) if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) return - M.status_flags &= ~PASSEMOTES \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 1aaa236446..07f65f62b5 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -6,6 +6,7 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "mmi_empty" w_class = ITEMSIZE_NORMAL + can_speak = 1 origin_tech = list(TECH_BIO = 3) req_access = list(access_robotics) diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 8797cd596a..a09d8ce3e5 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -5,8 +5,8 @@ message = sanitize(message) - if(!(container && istype(container, /obj/item/device/mmi))) - return //No MMI, can't speak, bucko./N + if(!(container && container.can_speak)) + return //Certain objects can speak, like MMIs. Most others cannot. -Q else var/datum/language/speaking = parse_language(message) if(speaking) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 283cb10b1c..40261088f7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -46,7 +46,7 @@ // Moving around increases germ_level faster if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) germ_level++ - +/* VOREStation Removal - Needless duplicate feature /mob/living/carbon/relaymove(var/mob/living/user, direction) if((user in src.stomach_contents) && istype(user)) if(user.last_special <= world.time) @@ -72,7 +72,7 @@ A.loc = loc stomach_contents.Remove(A) src.gib() - +*/ /mob/living/carbon/gib() for(var/mob/M in src) if(M in src.stomach_contents) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 36e3853295..9aac48a3e6 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -147,8 +147,8 @@ if(A.concealed_holster == 0 && A.show_examine) accessories_visible.Add(A) if(accessories_visible.len) - tie_msg += ". Attached to it is [lowertext(english_list(accessories_visible))]" - else tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]" + tie_msg += ". Attached to it is [english_list(accessories_visible)]" + else tie_msg += ". Attached to it is [english_list(U.accessories)]" if(w_uniform.blood_DNA) msg += "[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!\n" @@ -168,7 +168,7 @@ if(istype(wear_suit,/obj/item/clothing/suit)) var/obj/item/clothing/suit/U = wear_suit if(U.accessories.len) - tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]" + tie_msg += ". Attached to it is [english_list(U.accessories)]" if(wear_suit.blood_DNA) msg += "[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name]!\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4d36034323..b7af06c595 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -399,12 +399,9 @@ var/modified = 0 var/perpname = "wot" - if(wear_id) - var/obj/item/weapon/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else perpname = name @@ -438,14 +435,11 @@ var/perpname = "wot" var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) for (var/datum/data/record/R in data_core.security) @@ -468,14 +462,11 @@ var/perpname = "wot" var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) for (var/datum/data/record/R in data_core.security) @@ -496,14 +487,11 @@ if (href_list["secrecordadd"]) if(hasHUD(usr,"security")) var/perpname = "wot" - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) for (var/datum/data/record/R in data_core.security) @@ -527,14 +515,11 @@ var/perpname = "wot" var/modified = 0 - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) @@ -566,14 +551,11 @@ var/perpname = "wot" var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) for (var/datum/data/record/R in data_core.medical) @@ -597,14 +579,11 @@ var/perpname = "wot" var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) for (var/datum/data/record/R in data_core.medical) @@ -625,14 +604,11 @@ if (href_list["medrecordadd"]) if(hasHUD(usr,"medical")) var/perpname = "wot" - if(wear_id) - if(istype(wear_id,/obj/item/weapon/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/device/pda)) - var/obj/item/device/pda/tempPda = wear_id - perpname = tempPda.owner + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else - perpname = src.name + perpname = name for (var/datum/data/record/E in data_core.general) if (E.fields["name"] == perpname) for (var/datum/data/record/R in data_core.medical) @@ -1184,7 +1160,7 @@ if(!(gender in species.genders)) gender = species.genders[1] - icon_state = lowertext(species.name) + //icon_state = lowertext(species.name) //Necessary? species.create_organs(src) @@ -1573,7 +1549,7 @@ return species.fire_icon_state // Called by job_controller. Makes drones start with a permit, might be useful for other people later too. -/mob/living/carbon/human/equip_post_job() //Drone Permit moved to equip_survival_gear() +/mob/living/carbon/human/equip_post_job() var/braintype = get_FBP_type() if(braintype == FBP_DRONE) var/turf/T = get_turf(src) @@ -1583,8 +1559,9 @@ /mob/living/carbon/human/proc/update_icon_special() //For things such as teshari hiding and whatnot. if(status_flags & HIDING) // Hiding? Carry on. - if(stat == DEAD || paralysis || weakened || stunned) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work. - status_flags &= ~HIDING //No hiding for you. Mob layer should be updated naturally, but it actually isn't. + if(stat == DEAD || paralysis || weakened || stunned || restrained()) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work. + reset_plane_and_layer() + status_flags &= ~HIDING else layer = HIDING_LAYER @@ -1614,12 +1591,9 @@ if(hasHUD(user,"security")) //Try to find their name var/perpname - if(wear_id) - var/obj/item/weapon/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name + var/obj/item/weapon/card/id/I = GetIdCard() + if(I) + perpname = I.registered_name else perpname = name //Try to find their record diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 9300791028..41c240b98a 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -279,20 +279,3 @@ to_chat(src, "Your regeneration is interrupted!") nutrition -= 75 active_regen = FALSE - -/mob/living/carbon/human/proc/hide_humanoid() - set name = "Hide" - set desc = "Allows you to hide beneath tables or certain items. Toggled on or off." - set category = "Abilities" - - if(stat == DEAD || paralysis || weakened || stunned || restrained()) // No hiding if you're stunned! - return - - if(status_flags & HIDING) - layer = MOB_LAYER - to_chat(src, "You have stopped hiding.") - else - layer = HIDING_LAYER //Just above cables with their 2.44 - to_chat(src, "You are now hiding.") - - status_flags ^= HIDING diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c22eea6911..8619dee42d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -853,28 +853,6 @@ if(status_flags & GODMODE) return 0 //godmode - var/obj/item/organ/internal/diona/node/light_organ = locate() in internal_organs - - if(!isSynthetic()) - if(light_organ && !light_organ.is_broken()) - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(loc)) //else, there's considered to be no light - var/turf/T = loc - light_amount = T.get_lumcount() * 10 - nutrition += light_amount - traumatic_shock -= light_amount - - if(species.flags & IS_PLANT) - if(nutrition > 450) - nutrition = 450 - - if(light_amount >= 3) //if there's enough light, heal - adjustBruteLoss(-(round(light_amount/2))) - adjustFireLoss(-(round(light_amount/2))) - adjustToxLoss(-(light_amount)) - adjustOxyLoss(-(light_amount)) - //TODO: heal wounds, heal broken limbs. - if(species.light_dam) var/light_amount = 0 if(isturf(loc)) @@ -906,14 +884,7 @@ var/growlsound = pick(hunger_sounds) var/growlmultiplier = 100 - (nutrition / 250 * 100) playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) - - if(!isSynthetic() && (species.flags & IS_PLANT) && (!light_organ || light_organ.is_broken())) - if(nutrition < 200) - take_overall_damage(2,0) - - //traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter. - //Not that it matters much for diona, who have NO_PAIN. - shock_stage++ + // VOREStation Edit End // TODO: stomach and bloodstream organ. if(!isSynthetic()) diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm new file mode 100644 index 0000000000..3313c137b5 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm @@ -0,0 +1,124 @@ +/mob/living/carbon/human/proc/shapeshifter_select_ears() + set name = "Select Ears" + set category = "Abilities" + + if(stat || world.time < last_special) + return + + last_special = world.time + 10 + // Construct the list of names allowed for this user. + var/list/pretty_ear_styles = list("Normal" = null) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_ear_styles[instance.name] = path + + // Present choice to user + var/new_ear_style = input(src, "Pick some ears!", "Character Preference", ear_style ? ear_style.name : null) as null|anything in pretty_ear_styles + if(!new_ear_style) + return + + //Set new style + ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]] + + //Allow color picks + var/current_pri_color = rgb(r_ears,g_ears,b_ears) + + var/new_pri_color = input("Pick primary ear color:","Ear Color (Pri)", current_pri_color) as null|color + if(new_pri_color) + var/list/new_color_rgb_list = hex2rgb(new_pri_color) + r_ears = new_color_rgb_list[1] + g_ears = new_color_rgb_list[2] + b_ears = new_color_rgb_list[3] + + //Indented inside positive primary color choice, don't bother if they clicked cancel + var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2) + + var/new_sec_color = input("Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color) as null|color + if(new_sec_color) + new_color_rgb_list = hex2rgb(new_sec_color) + r_ears2 = new_color_rgb_list[1] + g_ears2 = new_color_rgb_list[2] + b_ears2 = new_color_rgb_list[3] + + update_hair() //Includes Virgo ears + +/mob/living/carbon/human/proc/shapeshifter_select_tail() + set name = "Select Tail" + set category = "Abilities" + + if(stat || world.time < last_special) + return + + last_special = world.time + 10 + // Construct the list of names allowed for this user. + var/list/pretty_tail_styles = list("Normal" = null) + for(var/path in tail_styles_list) + var/datum/sprite_accessory/tail/instance = tail_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_tail_styles[instance.name] = path + + // Present choice to user + var/new_tail_style = input(src, "Pick a tail!", "Character Preference", tail_style ? tail_style.name : null) as null|anything in pretty_tail_styles + if(!new_tail_style) + return + + //Set new style + tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]] + + //Allow color picks + var/current_pri_color = rgb(r_tail,g_tail,b_tail) + + var/new_pri_color = input("Pick primary tail color:","Tail Color (Pri)", current_pri_color) as null|color + if(new_pri_color) + var/list/new_color_rgb_list = hex2rgb(new_pri_color) + r_tail = new_color_rgb_list[1] + g_tail = new_color_rgb_list[2] + b_tail = new_color_rgb_list[3] + + //Indented inside positive primary color choice, don't bother if they clicked cancel + var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2) + + var/new_sec_color = input("Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color) as null|color + if(new_sec_color) + new_color_rgb_list = hex2rgb(new_sec_color) + r_tail2 = new_color_rgb_list[1] + g_tail2 = new_color_rgb_list[2] + b_tail2 = new_color_rgb_list[3] + + update_tail_showing() + +/mob/living/carbon/human/proc/shapeshifter_select_wings() + set name = "Select Wings" + set category = "Abilities" + + if(stat || world.time < last_special) + return + + last_special = world.time + 10 + // Construct the list of names allowed for this user. + var/list/pretty_wing_styles = list("None" = null) + for(var/path in wing_styles_list) + var/datum/sprite_accessory/wing/instance = wing_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_wing_styles[instance.name] = path + + // Present choice to user + var/new_wing_style = input(src, "Pick some wings!", "Character Preference", wing_style ? wing_style.name : null) as null|anything in pretty_wing_styles + if(!new_wing_style) + return + + //Set new style + wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]] + + //Allow color picks + var/current_color = rgb(r_wing,g_wing,b_wing) + + var/new_color = input("Pick wing color:","Wing Color", current_color) as null|color + if(new_color) + var/list/new_color_rgb_list = hex2rgb(new_color) + r_wing = new_color_rgb_list[1] + g_wing = new_color_rgb_list[2] + b_wing = new_color_rgb_list[3] + + update_wing_showing() diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 6cefffb7de..f2847a1523 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -7,7 +7,7 @@ var/trashcan = 0 //It's always sunny in the wrestling ring. /datum/species/custom - name = "Custom Species" + name = SPECIES_CUSTOM name_plural = "Custom" var/base_species = "Human" diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 40dd6a7971..b2d839f762 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -86,6 +86,9 @@ var/datum/species/shapeshifter/promethean/prometheans /mob/living/carbon/human/proc/shapeshifter_select_eye_colour, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, /mob/living/carbon/human/proc/shapeshifter_select_gender, + /mob/living/carbon/human/proc/shapeshifter_select_wings, //VOREStation Add, + /mob/living/carbon/human/proc/shapeshifter_select_tail, //VOREStation Add, + /mob/living/carbon/human/proc/shapeshifter_select_ears, //VOREStation Add, /mob/living/carbon/human/proc/regenerate ) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 75d956eb54..ca0d32a502 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -47,6 +47,8 @@ player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you!" + can_buckle = TRUE //Blobsurfing + //Constructor allows passing the human to sync damages /mob/living/simple_animal/protean_blob/New(var/newloc, var/mob/living/carbon/human/H) ..() @@ -54,7 +56,6 @@ humanform = H updatehealth() refactory = locate() in humanform.internal_organs - verbs |= /mob/living/proc/nano_set_size //verbs |= /mob/living/proc/ventcrawl YAWN Edit: Too OP verbs |= /mob/living/proc/hide else @@ -184,6 +185,8 @@ if(potentials.len) var/mob/living/target = pick(potentials) if(istype(target) && vore_selected) + if(target.buckled) + target.buckled.unbuckle_mob(target, force = TRUE) target.forceMove(vore_selected) to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") @@ -212,6 +215,9 @@ /mob/living/carbon/human/proc/nano_intoblob() if(buckled) buckled.unbuckle_mob() + if(LAZYLEN(buckled_mobs)) + for(var/buckledmob in buckled_mobs) + unbuckle_mob(buckledmob, force = TRUE) if(pulledby) pulledby.stop_pulling() stop_pulling() @@ -256,6 +262,9 @@ return if(buckled) buckled.unbuckle_mob() + if(LAZYLEN(buckled_mobs)) + for(var/buckledmob in buckled_mobs) + unbuckle_mob(buckledmob, force = TRUE) if(pulledby) pulledby.stop_pulling() stop_pulling() diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 6240c4a44d..598bea3edb 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -196,10 +196,14 @@ var/substance = matstack.material.name var/actually_added = refactory.add_stored_material(substance,howmuch*matstack.perunit) matstack.use(Ceiling(actually_added/matstack.perunit)) - if(actually_added < howmuch) + if(actually_added && actually_added < howmuch) to_chat(src,"Your refactory module is now full, so only [actually_added] units were stored.") - else + visible_message(src,"[src] nibbles some of the [substance] right off the stack!") + else if(actually_added) to_chat(src,"You store [actually_added] units of [substance].") + visible_message(src,"[src] devours some of the [substance] right off the stack!") + else + to_chat(src,"You're completely capped out on [substance]!") //// // Blob Form @@ -216,7 +220,6 @@ to_chat(temporary_form,"You need to regenerate more nanites first!") else if(temporary_form.stat) to_chat(temporary_form,"You can only do this while not stunned.") - return else nano_outofblob(temporary_form) @@ -247,26 +250,28 @@ //// // Change size //// -/mob/living/proc/nano_set_size() +/mob/living/carbon/human/proc/nano_set_size() set name = "Adjust Volume" set category = "Abilities" set hidden = TRUE + var/mob/living/user = temporary_form || src + var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory() //Missing the organ that does this if(!istype(refactory)) - to_chat(src,"You don't have a working refactory module!") + to_chat(user,"You don't have a working refactory module!") return var/nagmessage = "Adjust your mass to be a size between 25 to 200%. Up-sizing consumes metal, downsizing returns metal." - var/new_size = input(src, nagmessage, "Pick a Size", size_multiplier*100) as num|null + var/new_size = input(user, nagmessage, "Pick a Size", user.size_multiplier*100) as num|null if(!new_size || !IsInRange(new_size,25,200)) return var/size_factor = new_size/100 //Will be: -1.75 for 200->25, and 1.75 for 25->200 - var/sizediff = size_factor - size_multiplier + var/sizediff = size_factor - user.size_multiplier //Negative if shrinking, positive if growing //Will be (PLSC*2)*-1.75 to 1.75 @@ -276,17 +281,18 @@ //Sizing up if(cost > 0) if(refactory.use_stored_material("steel",cost)) - resize(size_factor) + user.resize(size_factor) else - to_chat(src,"That size change would cost [cost] steel, which you don't have.") - return + to_chat(user,"That size change would cost [cost] steel, which you don't have.") //Sizing down (or not at all) - if(cost <= 0) + else if(cost <= 0) cost = abs(cost) var/actually_added = refactory.add_stored_material("steel",cost) - resize(size_factor) + user.resize(size_factor) if(actually_added != cost) - to_chat(src,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") + to_chat(user,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") + + user.visible_message("Black mist swirls around [user] as they change size.") /// /// /// A helper to reuse /mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R) @@ -330,12 +336,10 @@ //Blobform using it else var/mob/living/simple_animal/protean_blob/blob = usr - if(!blob.humanform) - return do_ability(blob.humanform) /obj/effect/protean_ability/proc/do_ability(var/mob/living/L) - if(istype(L) && !L.stat) + if(istype(L)) call(L,to_call)() return FALSE @@ -350,7 +354,7 @@ ability_name = "Change Volume" desc = "Alter your size by consuming steel to produce additional nanites, or regain steel by reducing your size and reclaiming them." icon_state = "volume" - to_call = /mob/living/proc/nano_set_size + to_call = /mob/living/carbon/human/proc/nano_set_size /obj/effect/protean_ability/reform_limb ability_name = "Ref - Single Limb" diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 80d62c1946..618382f3a8 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -1,4 +1,5 @@ #define DAM_SCALE_FACTOR 0.01 +#define METAL_PER_TICK 150 /datum/species/protean name = "Protean" name_plural = "Proteans" @@ -58,6 +59,8 @@ siemens_coefficient = 3 //Very bad zappy times rarity_value = 5 + darksight = 3 // Equivalent to the minor trait + has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, @@ -86,12 +89,16 @@ /mob/living/carbon/human/proc/nano_partswap, /mob/living/carbon/human/proc/nano_metalnom, /mob/living/carbon/human/proc/nano_blobform, - /mob/living/proc/nano_set_size, + /mob/living/carbon/human/proc/nano_set_size, /mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally, /mob/living/carbon/human/proc/shapeshifter_select_hair, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, /mob/living/carbon/human/proc/shapeshifter_select_colour, - /mob/living/carbon/human/proc/shapeshifter_select_eye_colour + /mob/living/carbon/human/proc/shapeshifter_select_eye_colour, + /mob/living/carbon/human/proc/shapeshifter_select_gender, + /mob/living/carbon/human/proc/shapeshifter_select_wings, + /mob/living/carbon/human/proc/shapeshifter_select_tail, + /mob/living/carbon/human/proc/shapeshifter_select_ears ) var/global/list/abilities = list() @@ -167,15 +174,15 @@ if(refactory && !(refactory.status & ORGAN_DEAD)) //MHydrogen adds speeeeeed - if(refactory.get_stored_material("mhydrogen") >= 100) + if(refactory.get_stored_material("mhydrogen") >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/mhydrogen, origin = refactory) //Plasteel adds brute armor - if(refactory.get_stored_material("plasteel") >= 100) + if(refactory.get_stored_material("plasteel") >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/plasteel, origin = refactory) //Diamond adds burn armor - if(refactory.get_stored_material("diamond") >= 100) + if(refactory.get_stored_material("diamond") >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/diamond, origin = refactory) return ..() @@ -204,7 +211,7 @@ // Various modifiers /datum/modifier/protean stacks = MODIFIER_STACK_FORBID - var/material_use = 100 + var/material_use = METAL_PER_TICK var/material_name = DEFAULT_WALL_MATERIAL /datum/modifier/protean/on_applied() @@ -217,7 +224,7 @@ if(holder.temporary_form) to_chat(holder.temporary_form,on_expired_text) -/datum/modifier/protean/tick() +/datum/modifier/protean/check_if_valid() //No origin set if(!istype(origin)) expire() @@ -238,7 +245,6 @@ on_created_text = "You feel yourself accelerate, the metallic hydrogen increasing your speed temporarily." on_expired_text = "Your refactory finishes consuming the metallic hydrogen, and you return to normal speed." - material_use = 100 material_name = "mhydrogen" slowdown = -1 @@ -250,7 +256,6 @@ on_created_text = "You feel yourself become nearly impervious to physical attacks as plasteel nanites are made." on_expired_text = "Your refactory finishes consuming the plasteel, and you return to your normal nanites." - material_use = 100 material_name = "plasteel" incoming_brute_damage_percent = 0.5 @@ -262,7 +267,6 @@ on_created_text = "You feel yourself become more reflective, able to resist heat and fire better for a time." on_expired_text = "Your refactory finishes consuming the diamond, and you return to your normal nanites." - material_use = 100 material_name = "diamond" incoming_fire_damage_percent = 0.2 @@ -274,7 +278,6 @@ on_created_text = "You feel new nanites being produced from your stockpile of steel, healing you slowly." on_expired_text = "Your steel supply has either run out, or is no longer needed, and your healing stops." - material_use = 100 material_name = "steel" /datum/modifier/protean/steel/tick() @@ -303,4 +306,5 @@ src.name += " ([new_name])" desc += "\nVALID THROUGH END OF: [time2text(world.timeofday, "Month") +" "+ num2text(text2num(time2text(world.timeofday, "YYYY"))+544)]\nREGISTRANT: [new_name]" -#undef DAM_SCALE_FACTOR \ No newline at end of file +#undef DAM_SCALE_FACTOR +#undef METAL_PER_TICK \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 7815460ea9..624c9e8614 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -120,7 +120,7 @@ inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, - /mob/living/carbon/human/proc/hide_humanoid + /mob/living/proc/hide ) /datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 5e12a0907f..6a87626d1b 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -407,3 +407,33 @@ qdel(D) H.visible_message("\The [H] splits apart with a wet slithering noise!") + +/datum/species/diona/handle_environment_special(var/mob/living/carbon/human/H) + if(H.inStasisNow()) + return + + var/obj/item/organ/internal/diona/node/light_organ = locate() in H.internal_organs + + if(light_organ && !light_organ.is_broken()) + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(H.loc)) //else, there's considered to be no light + var/turf/T = H.loc + light_amount = T.get_lumcount() * 10 + H.nutrition += light_amount + H.shock_stage -= light_amount + + if(H.nutrition > 450) + H.nutrition = 450 + if(light_amount >= 3) //if there's enough light, heal + H.adjustBruteLoss(-(round(light_amount/2))) + H.adjustFireLoss(-(round(light_amount/2))) + H.adjustToxLoss(-(light_amount)) + H.adjustOxyLoss(-(light_amount)) + //TODO: heal wounds, heal broken limbs. + + else if(H.nutrition < 200) + H.take_overall_damage(2,0) + + //traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter. + //Not that it matters much for diona, who have NO_PAIN. + H.shock_stage++ diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 610794883e..4886a66130 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -337,7 +337,7 @@ inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, - /mob/living/carbon/human/proc/hide_humanoid, + /mob/living/proc/hide, /mob/living/proc/shred_limb, /mob/living/proc/toggle_pass_table ) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index e5287dc96b..adb2338aa1 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -16,7 +16,7 @@ name = "Apex Metabolism" desc = "Finally a proper excuse for your predatory actions. Also makes you process reagents faster but that's totally irrelevant. May cause excessive immersions with large/taur characters. Not recommended for efficient law-abiding workers or eco-aware NIF users." cost = 0 - var_changes = list("metabolic_rate" = 2, "hunger_factor" = 0.5, "metabolism" = 0.010) //Big boy level + var_changes = list("metabolic_rate" = 1.5, "hunger_factor" = 0.3, "metabolism" = 0.0075) excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_down) /datum/trait/cold_discomfort diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 63adbdc2f5..2fdab4d529 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -10,10 +10,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //////////////////////////////////////////////////////////////////////////////////////////////// // # Human Icon Updating System // -// This system takes care of the "icon" for human mobs. Of course humans don't just have a single -// icon+icon_state, but a combination of dozens of little sprites including including the body, +// This system takes care of the "icon" for human mobs. Of course humans don't just have a single +// icon+icon_state, but a combination of dozens of little sprites including including the body, // clothing, equipment, in-universe HUD images, etc. -// +// // # Basic Operation // Whenever you do something that should update the on-mob appearance of a worn or held item, You // will need to call the relevant update_inv_* proc. All of these are named after the variable they @@ -25,14 +25,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // only get assigned to the mob once per tick.) // As a corrolary, this means users of this system do NOT need to tell the system when you're done // making changes. -// +// // There are also these special cases: // update_icons_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc // UpdateDamageIcon() //Handles damage overlays for brute/burn damage //(will rename this when I geta round to it) ~Carn // update_skin() //Handles updating skin for species that have a skin overlay. // update_bloodied() //Handles adding/clearing the blood overlays for hands & feet. Call when bloodied or cleaned. // update_underwear() //Handles updating the sprite for underwear. -// update_hair() //Handles updating your hair and eyes overlay +// update_hair() //Handles updating your hair and eyes overlay // update_mutations() //Handles updating your appearance for certain mutations. e.g TK head-glows // update_fire() //Handles overlay from being on fire. // update_water() //Handles overlay from being submerged. @@ -138,11 +138,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // Regular stuff again. var/matrix/M = matrix() var/anim_time = 3 - + //Due to some involuntary means, you're laying now if(lying && !resting && !sleeping) anim_time = 1 //Thud - + if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone. M.Turn(90) M.Scale(desired_scale) @@ -356,7 +356,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(SKIN_LAYER) - + var/image/skin = species.update_skin(src) if(skin) skin.layer = BODY_LAYER+SKIN_LAYER @@ -372,7 +372,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+BLOOD_LAYER) - + //Bloody hands if(blood_DNA) var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "bloodyhands", layer = BODY_LAYER+BLOOD_LAYER) @@ -503,7 +503,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(MUTATIONS_LAYER) - + if(!LAZYLEN(mutations)) return //No mutations, no icons. @@ -514,7 +514,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/image/standing = image(icon = 'icons/effects/genetics.dmi', layer = BODY_LAYER+MUTATIONS_LAYER) var/g = gender == FEMALE ? "f" : "m" - + for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue @@ -577,7 +577,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //Shoes can be affected by uniform being drawn onto them update_inv_shoes() - + if(!w_uniform) return @@ -593,7 +593,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(ID_LAYER) - + if(!wear_id) return //Not wearing an ID @@ -602,7 +602,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/obj/item/clothing/under/U = w_uniform if(U.displays_id) overlays_standing[ID_LAYER] = wear_id.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_wear_id_str, default_icon = INV_WEAR_ID_DEF_ICON, default_layer = ID_LAYER) - + apply_layer(ID_LAYER) /mob/living/carbon/human/update_inv_gloves() @@ -615,7 +615,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //No gloves, no reason to be here. overlays_standing[GLOVES_LAYER] = gloves.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_gloves_str, default_icon = INV_GLOVES_DEF_ICON, default_layer = GLOVES_LAYER) - + apply_layer(GLOVES_LAYER) /mob/living/carbon/human/update_inv_glasses() @@ -628,7 +628,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //Not wearing glasses, no need to update anything. overlays_standing[GLASSES_LAYER] = glasses.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_gloves_str, default_icon = INV_EYES_DEF_ICON, default_layer = GLASSES_LAYER) - + apply_layer(GLASSES_LAYER) /mob/living/carbon/human/update_inv_ears() @@ -642,7 +642,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!l_ear && !r_ear) return //Why bother, if no ear sprites - + // Blank image upon which to layer left & right overlays. var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+EARS_LAYER) @@ -676,10 +676,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //NB: the use of a var for the layer on this one overlays_standing[shoe_layer] = shoes.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_shoes_str, default_icon = INV_FEET_DEF_ICON, default_layer = shoe_layer) - + apply_layer(SHOES_LAYER) apply_layer(SHOES_LAYER_ALT) - + /mob/living/carbon/human/update_inv_s_store() if(QDESTROYING(src)) return @@ -688,14 +688,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!s_store) return //Why bother, nothing there. - + //TODO, this is unlike the rest of the things //Basically has no variety in slot icon choices at all. WHY SPECIES ONLY?? var/t_state = s_store.item_state if(!t_state) t_state = s_store.icon_state overlays_standing[SUIT_STORE_LAYER] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER) - + apply_layer(SUIT_STORE_LAYER) /mob/living/carbon/human/update_inv_head() @@ -703,12 +703,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(HEAD_LAYER) - + if(!head) return //No head item, why bother. overlays_standing[HEAD_LAYER] = head.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_head_str, default_icon = INV_HEAD_DEF_ICON, default_layer = HEAD_LAYER) - + apply_layer(HEAD_LAYER) /mob/living/carbon/human/update_inv_belt() @@ -720,7 +720,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!belt) return //No belt, why bother. - + //Toggle for belt layering with uniform var/belt_layer = BELT_LAYER if(istype(belt, /obj/item/weapon/storage/belt)) @@ -730,7 +730,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //NB: this uses a var from above overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer) - + apply_layer(belt_layer) /mob/living/carbon/human/update_inv_wear_suit() @@ -749,7 +749,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //No point, no suit. overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_wear_suit_str, default_icon = INV_SUIT_DEF_ICON, default_layer = SUIT_LAYER) - + apply_layer(SUIT_LAYER) /mob/living/carbon/human/update_inv_pockets() @@ -763,9 +763,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!wear_mask || (head && head.flags_inv & HIDEMASK)) return //Why bother, nothing in mask slot. - + overlays_standing[FACEMASK_LAYER] = wear_mask.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_wear_mask_str, default_icon = INV_MASK_DEF_ICON, default_layer = FACEMASK_LAYER) - + apply_layer(FACEMASK_LAYER) /mob/living/carbon/human/update_inv_back() @@ -778,7 +778,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //Why do anything overlays_standing[BACK_LAYER] = back.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_back_str, default_icon = INV_BACK_DEF_ICON, default_layer = BACK_LAYER) - + apply_layer(BACK_LAYER) //TODO: Carbon procs in my human update_icons?? @@ -811,7 +811,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //Not cuffed, why bother overlays_standing[HANDCUFF_LAYER] = handcuffed.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_handcuffed_str, default_icon = INV_HCUFF_DEF_ICON, default_layer = HANDCUFF_LAYER) - + apply_layer(HANDCUFF_LAYER) /mob/living/carbon/human/update_inv_legcuffed() @@ -823,8 +823,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!legcuffed) return //Not legcuffed, why bother. - overlays_standing[LEGCUFF_LAYER] = handcuffed.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER) - + overlays_standing[LEGCUFF_LAYER] = legcuffed.make_worn_icon(body_type = species.get_bodytype(), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER) + apply_layer(LEGCUFF_LAYER) /mob/living/carbon/human/update_inv_r_hand() @@ -837,7 +837,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //No hand, no bother. overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(body_type = species.get_bodytype(), inhands = TRUE, slot_name = slot_r_hand_str, default_icon = INV_R_HAND_DEF_ICON, default_layer = R_HAND_LAYER) - + apply_layer(R_HAND_LAYER) /mob/living/carbon/human/update_inv_l_hand() @@ -892,8 +892,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // The following will not work with animated tails. var/use_species_tail = species.get_tail_hair(src) if(use_species_tail) - var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]") - hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]_s") //VOREStation edit -- Suffix icon state string with '_s' to compensate for diff in .dmi b/w us & Polaris. + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //VOREStation edit -- Check for species color_mult tail_icon.Blend(hair_icon, ICON_OVERLAY) tail_icon_cache[icon_key] = tail_icon @@ -902,16 +902,16 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() /mob/living/carbon/human/proc/set_tail_state(var/t_state) var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - START - Alt Tail Layer var/image/tail_overlay = overlays_standing[used_tail_layer] - + remove_layer(TAIL_LAYER) remove_layer(TAIL_LAYER_ALT) - + if(tail_overlay) overlays_standing[used_tail_layer] = tail_overlay if(species.get_tail_animation(src)) tail_overlay.icon_state = t_state . = tail_overlay - + apply_layer(used_tail_layer) // VOREStation Edit - END //Not really once, since BYOND can't do that. @@ -994,7 +994,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() effects.overlays += I //TODO, this compositing is annoying. overlays_standing[MODIFIER_EFFECTS_LAYER] = effects - + apply_layer(MODIFIER_EFFECTS_LAYER) /mob/living/carbon/human/update_fire() @@ -1002,12 +1002,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(FIRE_LAYER) - + if(!on_fire) return - + overlays_standing[FIRE_LAYER] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER) - + apply_layer(FIRE_LAYER) /mob/living/carbon/human/update_water() @@ -1021,7 +1021,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return overlays_standing[WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve - + apply_layer(WATER_LAYER) /mob/living/carbon/human/proc/update_surgery() diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 5fdea4a0e6..31fe6b3152 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -6,7 +6,8 @@ var/is_adult = 0 speak_emote = list("chirps") - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER maxHealth = 150 health = 150 gender = NEUTER diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 27b6d55ba8..6425081167 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -6,11 +6,12 @@ if (transforming) return + handle_modifiers() //VOREStation Edit - Needs to be done even if in nullspace. if(!loc) return var/datum/gas_mixture/environment = loc.return_air() - handle_modifiers() // Do this early since it might affect other things later. + //handle_modifiers() // Do this early since it might affect other things later. //VOREStation Edit handle_light() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4dc4681d20..5b45938753 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -13,7 +13,6 @@ var/mutable_appearance/dsma = new(dsoverlay) //Changing like ten things, might as well. dsma.alpha = 0 dsma.plane = PLANE_LIGHTING - dsma.layer = LIGHTING_LAYER + 0.1 dsma.blend_mode = BLEND_ADD dsoverlay.appearance = dsma @@ -881,7 +880,6 @@ default behaviour is: for(var/atom/A in M.contents) if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) return - M.status_flags &= ~PASSEMOTES else if(istype(H.loc,/obj/item/clothing/accessory/holster)) var/obj/item/clothing/accessory/holster/holster = H.loc @@ -1064,7 +1062,16 @@ default behaviour is: if(lying != lying_prev) lying_prev = lying update_transform() - + //VOREStation Add + if(lying && LAZYLEN(buckled_mobs)) + for(var/rider in buckled_mobs) + var/mob/living/L = rider + if(riding_datum) + riding_datum.force_dismount(L) + else + unbuckle_mob(L) + L.Stun(5) + //VOREStation Add End return canmove // Adds overlays for specific modifiers. @@ -1092,10 +1099,10 @@ default behaviour is: /mob/living/proc/is_sentient() return TRUE -/* //VOREStation Edit. We have a better system in place. + /mob/living/update_transform() // First, get the correct size. - var/desired_scale = icon_scale + var/desired_scale = size_multiplier //VOREStation edit for(var/datum/modifier/M in modifiers) if(!isnull(M.icon_scale_percent)) desired_scale *= M.icon_scale_percent @@ -1105,8 +1112,8 @@ default behaviour is: M.Scale(desired_scale) M.Translate(0, 16*(desired_scale-1)) src.transform = M - animate(src, transform = M, time = 10) -*/ //VOREStation Edit + //animate(src, transform = M, time = 10) //VOREStation edit + // This handles setting the client's color variable, which makes everything look a specific color. // This proc is here so it can be called without needing to check if the client exists, or if the client relogs. @@ -1228,7 +1235,7 @@ default behaviour is: return UNDERWATER else return ..() - + //Add an entry to overlays, assuming it exists /mob/living/proc/apply_hud(cache_index, var/image/I) hud_list[cache_index] = I diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index d2c2d72e4e..1442c80f9b 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -6,9 +6,12 @@ if(stat == DEAD || paralysis || weakened || stunned || restrained()) return - if(layer == HIDING_LAYER) - layer = MOB_LAYER - src << text("You have stopped hiding.") + if(status_flags & HIDING) + status_flags &= ~HIDING + reset_plane_and_layer() + to_chat(src,"You have stopped hiding.") else + status_flags |= HIDING layer = HIDING_LAYER //Just above cables with their 2.44 - src << text("You are now hiding.") + plane = OBJ_PLANE + to_chat(src,"You are now hiding.") diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 9eeeb05d4a..88072dc2cf 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -308,7 +308,6 @@ proc/get_radio_key_from_channel(var/channel) var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons images_to_clients[speech_bubble] = list() - // Attempt Multi-Z Talking var/mob/above = src.shadow while(!QDELETED(above)) @@ -375,8 +374,11 @@ proc/get_radio_key_from_channel(var/channel) return 1 /mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language) - for (var/mob/O in viewers(src, null)) - O.hear_signlang(message, verb, language, src) + var/list/potentials = get_mobs_and_objs_in_view_fast(src, world.view) + var/list/mobs = potentials["mobs"] + for(var/hearer in mobs) + var/mob/M = hearer + M.hear_signlang(message, verb, language, src) return 1 /obj/effect/speech_bubble diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index bfeea5e1b4..7a7df5513b 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -131,7 +131,7 @@ ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! - ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600) + ui = new(user, user, id, "crew_manifest.tmpl", "Crew Manifest", 450, 600) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 6d4cfbe976..db790db8b0 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -22,6 +22,7 @@ var/synced = FALSE var/startdrain = 500 var/max_item_count = 1 + var/gulpsound = 'sound/vore/gulp.ogg' /obj/item/device/dogborg/sleeper/New() ..() @@ -55,7 +56,7 @@ if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) user.visible_message("[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.", "Your internal analyzer groans lightly as [target] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(istype(target,/obj/item)) var/obj/item/tech_item = target for(var/T in tech_item.origin_tech) @@ -79,7 +80,7 @@ trashman.reset_view(src) processing_objects |= src user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -96,7 +97,7 @@ if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -109,7 +110,7 @@ trashmouse.forceMove(src) trashmouse.reset_view(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -129,7 +130,7 @@ trashman.reset_view(src) processing_objects |= src user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -157,7 +158,7 @@ processing_objects |= src user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.") message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(UI_open == TRUE) sleeperUI(usr) @@ -462,9 +463,22 @@ //Belly is entirely empty if(!length(contents)) + var/finisher = pick( + 'sound/vore/death1.ogg', + 'sound/vore/death2.ogg', + 'sound/vore/death3.ogg', + 'sound/vore/death4.ogg', + 'sound/vore/death5.ogg', + 'sound/vore/death6.ogg', + 'sound/vore/death7.ogg', + 'sound/vore/death8.ogg', + 'sound/vore/death9.ogg', + 'sound/vore/death10.ogg') + playsound(hound, finisher, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) to_chat(hound, "Your [src.name] is now clean. Ending self-cleaning cycle.") cleaning = 0 update_patient() + playsound(hound, 'sound/machines/ding.ogg', vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) return if(prob(20)) @@ -481,10 +495,7 @@ 'sound/vore/digest10.ogg', 'sound/vore/digest11.ogg', 'sound/vore/digest12.ogg') - for(var/mob/outhearer in range(1,hound)) - outhearer << sound(churnsound) - for(var/mob/inhearer in contents) - inhearer << sound(churnsound) + playsound(hound, churnsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) //If the timing is right, and there are items to be touched if(air_master.current_cycle%3==1 && length(touchable_items)) @@ -523,9 +534,7 @@ 'sound/vore/death8.ogg', 'sound/vore/death9.ogg', 'sound/vore/death10.ogg') - for(var/mob/hearer in range(1,src.hound)) - hearer << deathsound - T << deathsound + playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) if(is_vore_predator(T)) for(var/belly in T.vore_organs) var/obj/belly/B = belly diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index e8d3e0ad2c..ac78f5aab9 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -199,6 +199,21 @@ wrapped = null //update_icon() +/obj/item/weapon/gripper/proc/drop_item_nm() + + if(!wrapped) + for(var/obj/item/thing in src.contents) + thing.loc = get_turf(src) + return + + if(wrapped.loc != src) + wrapped = null + return + + wrapped.loc = get_turf(src) + wrapped = null + //update_icon() + /obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack(). force_holder = wrapped.force diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 83cc1aef0b..08c6d755ae 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -222,7 +222,7 @@ m_type = 1 if("law") - if (istype(module,/obj/item/weapon/robot_module/robot/security)) + if (istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9 message = "shows its legal authorization barcode." playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) @@ -231,7 +231,7 @@ src << "You are not THE LAW, pal." if("halt") - if (istype(module,/obj/item/weapon/robot_module/robot/security)) + if (istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9 message = "'s speakers skreech, \"Halt! Security!\"." playsound(src.loc, 'sound/voice/halt.ogg', 50, 0) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4b45c0a34e..3136fb6cc8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1114,4 +1114,10 @@ return /mob/living/silicon/robot/is_sentient() - return braintype != "Drone" \ No newline at end of file + return braintype != "Drone" + + +/mob/living/silicon/robot/drop_item() + if(module_active && istype(module_active,/obj/item/weapon/gripper)) + var/obj/item/weapon/gripper/G = module_active + G.drop_item_nm() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/bear.dm b/code/modules/mob/living/simple_animal/animals/bear.dm index 3ffd495ff7..4f627a76f0 100644 --- a/code/modules/mob/living/simple_animal/animals/bear.dm +++ b/code/modules/mob/living/simple_animal/animals/bear.dm @@ -2,6 +2,7 @@ /mob/living/simple_animal/hostile/bear name = "space bear" desc = "RawrRawr!!" + tt_desc = "Ursinae aetherius" //...bearspace? Maybe. icon_state = "bear" icon_living = "bear" icon_dead = "bear_dead" diff --git a/code/modules/mob/living/simple_animal/animals/cat_vr.dm b/code/modules/mob/living/simple_animal/animals/cat_vr.dm index 1c9203126a..9cb954f538 100644 --- a/code/modules/mob/living/simple_animal/animals/cat_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/cat_vr.dm @@ -20,14 +20,6 @@ "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") - B.emote_lists[DM_ITEMWEAK] = list( - "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.", - "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.", - "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.", - "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.", - "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", - "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") - B.digest_messages_prey = list( "Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.", "After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.", diff --git a/code/modules/mob/living/simple_animal/animals/fox_vr.dm b/code/modules/mob/living/simple_animal/animals/fox_vr.dm index 587a64d14c..84a9a1ca26 100644 --- a/code/modules/mob/living/simple_animal/animals/fox_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/fox_vr.dm @@ -61,14 +61,6 @@ "The fox's stomach churns hungrily over your form, trying to take you.", "With a loud glorp, the stomach spills more acids onto you.") - B.emote_lists[DM_ITEMWEAK] = list( - "The guts knead at you, trying to work you into thick soup.", - "You're ground on by the slimey walls, treated like a mouse.", - "The acrid air is hard to breathe, and stings at your lungs.", - "You can feel the acids coating you, ground in by the slick walls.", - "The fox's stomach churns hungrily over your form, trying to take you.", - "With a loud glorp, the stomach spills more acids onto you.") - // All them complicated fox procedures. /mob/living/simple_animal/fox/Life() . = ..() @@ -209,14 +201,6 @@ "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") - B.emote_lists[DM_ITEMWEAK] = list( - "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", - "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", - "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", - "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", - "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", - "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") - /mob/living/simple_animal/fox/syndicate name = "syndi-fox" desc = "It's a DASTARDLY fox! The horror! Call the shuttle!" diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index b89e2f2af6..e4add4d749 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -168,9 +168,6 @@ host.reset_view(null) host.machine = null - - var/mob/living/H = host - H.status_flags &= ~PASSEMOTES host = null return diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 311b013ef8..b75da20cc4 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -104,7 +104,6 @@ M << "Something disgusting and slimy wiggles into your ear!" src.host = M - src.host.status_flags |= PASSEMOTES src.forceMove(M) //Update their traitor status. diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm index c0034b1908..26ab3a1260 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm @@ -1,22 +1,39 @@ /mob/living/simple_animal/construct name = "Construct" real_name = "Construct" + var/construct_type = "shade" desc = "" speak_emote = list("hisses") emote_hear = list("wails","screeches") + + ui_icons = 'icons/mob/screen1_construct.dmi' + has_hands = 1 + hand_form = "stone manipulators" + response_help = "thinks better of touching" response_disarm = "flailed at" response_harm = "punched" + intelligence_level = SA_HUMANOID // Player controlled. + hovering = TRUE + softfall = TRUE //Beings made of Hellmarble and powered by the tears of the damned are not concerned with mortal things such as 'gravity'. + parachuting = TRUE + icon_dead = "shade_dead" + var/do_glow = 1 + speed = -1 a_intent = I_HURT stop_automated_movement = 1 + status_flags = CANPUSH + universal_speak = 0 universal_understand = 1 + attack_sound = 'sound/weapons/spiderlunge.ogg' + min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -25,11 +42,16 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 + minbodytemp = 0 show_stat_health = 1 + faction = "cult" supernatural = 1 + see_invisible = SEE_INVISIBLE_NOLIGHTING + see_in_dark = 7 + var/nullblock = 0 mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY @@ -39,6 +61,51 @@ can_be_antagged = TRUE + taser_kill = 0 // no + + shock_resistance = 0.9 //Electricity isn't very effective on stone, especially that from hell. + + armor = list( + "melee" = 10, + "bullet" = 10, + "laser" = 10, + "energy" = 10, + "bomb" = 10, + "bio" = 100, + "rad" = 100) + +/mob/living/simple_animal/construct/place_spell_in_hand(var/path) + if(!path || !ispath(path)) + return 0 + + //var/obj/item/weapon/spell/S = new path(src) + var/obj/item/weapon/spell/construct/S = new path(src) + + //No hands needed for innate casts. + if(S.cast_methods & CAST_INNATE) + if(S.run_checks()) + S.on_innate_cast(src) + + if(l_hand && r_hand) //Make sure our hands aren't full. + if(istype(r_hand, /obj/item/weapon/spell)) //If they are full, perhaps we can still be useful. + var/obj/item/weapon/spell/r_spell = r_hand + if(r_spell.aspect == ASPECT_CHROMATIC) //Check if we can combine the new spell with one in our hands. + r_spell.on_combine_cast(S, src) + else if(istype(l_hand, /obj/item/weapon/spell)) + var/obj/item/weapon/spell/l_spell = l_hand + if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too. + l_spell.on_combine_cast(S, src) + else //Welp + to_chat(src, "You require a free manipulator to use this power.") + return 0 + + if(S.run_checks()) + put_in_hands(S) + return 1 + else + qdel(S) + return 0 + /mob/living/simple_animal/construct/cultify() return @@ -51,7 +118,17 @@ for(var/spell in construct_spells) src.add_spell(new spell, "const_spell_ready") updateicon() - add_glow() + +/mob/living/simple_animal/construct/updateicon() + overlays.Cut() + ..() + if(do_glow) + add_glow() + +/mob/living/simple_animal/construct/update_icon() + ..() + if(do_glow) + add_glow() /mob/living/simple_animal/construct/death() new /obj/item/weapon/ectoplasm (src.loc) @@ -61,11 +138,15 @@ /mob/living/simple_animal/construct/attack_generic(var/mob/user) if(istype(user, /mob/living/simple_animal/construct/builder)) + var/mob/living/simple_animal/construct/builder/B = user if(health < getMaxHealth()) - adjustBruteLoss(-5) + var/repair_lower_bound = B.melee_damage_lower * -1 + var/repair_upper_bound = B.melee_damage_upper * -1 + adjustBruteLoss(rand(repair_lower_bound, repair_upper_bound)) + adjustFireLoss(rand(repair_lower_bound, repair_upper_bound)) user.visible_message("\The [user] mends some of \the [src]'s wounds.") else - user << "\The [src] is undamaged." + to_chat(user, "\The [src] is undamaged.") return return ..() @@ -83,6 +164,8 @@ user << msg +/mob/living/simple_animal/construct/Process_Spacemove() + return 1 //Constructs levitate, can fall from a shuttle with no harm, and are piloted by either damned spirits or some otherworldly entity. It's not hard to believe. /////////////////Juggernaut/////////////// @@ -91,48 +174,83 @@ /mob/living/simple_animal/construct/armoured name = "Juggernaut" real_name = "Juggernaut" + construct_type = "juggernaut" desc = "A possessed suit of armour driven by the will of the restless dead" icon = 'icons/mob/mob.dmi' icon_state = "behemoth" icon_living = "behemoth" - maxHealth = 250 - health = 250 + maxHealth = 300 + health = 300 response_harm = "harmlessly punches" harm_intent_damage = 0 melee_damage_lower = 30 - melee_damage_upper = 30 + melee_damage_upper = 40 + attack_armor_pen = 60 //Being punched by a living, floating statue. attacktext = list("smashed their armoured gauntlet into") + friendly = list("pats") mob_size = MOB_HUGE - speed = 3 + speed = 2 //Not super fast, but it might catch up to someone in armor who got punched once or twice. environment_smash = 2 attack_sound = 'sound/weapons/heavysmash.ogg' status_flags = 0 resistance = 10 - construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) + construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser, + /spell/targeted/fortify, + /spell/targeted/construct_advanced/slam + ) + + armor = list( + "melee" = 70, + "bullet" = 30, + "laser" = 30, + "energy" = 30, + "bomb" = 10, + "bio" = 100, + "rad" = 100) /mob/living/simple_animal/construct/armoured/Life() weakened = 0 ..() /mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P) - if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) - var/reflectchance = 80 - round(P.damage/3) - if(prob(reflectchance)) - adjustBruteLoss(P.damage * 0.5) +// if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) //If it's going to be slow, it's probably going to need every reflect it can get. + var/reflectchance = 80 - round(P.damage/3) + if(prob(reflectchance)) + var/damage_mod = rand(2,4) + var/projectile_dam_type = P.damage_type + var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3))) + var/armorcheck = run_armor_check(null, P.check_armour) + var/soakedcheck = get_armor_soak(null, P.check_armour) + if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))) + visible_message("The [P.name] bounces off of [src]'s shell!", \ + "The [P.name] bounces off of [src]'s shell!") + new /obj/item/weapon/material/shard/shrapnel(src.loc) + if(!(P.damage_type == BRUTE || P.damage_type == BURN)) + projectile_dam_type = BRUTE + incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased. + apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P) + return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect. + else visible_message("The [P.name] gets reflected by [src]'s shell!", \ - "The [P.name] gets reflected by [src]'s shell!") + "The [P.name] gets reflected by [src]'s shell!") + damage_mod = rand(3,5) + incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3))) + if(!(P.damage_type == BRUTE || P.damage_type == BURN)) + projectile_dam_type = BURN + incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased. + apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P) - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/turf/curloc = get_turf(src) + // Find a turf near or on the original location to bounce to + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/turf/curloc = get_turf(src) - // redirect the projectile - P.redirect(new_x, new_y, curloc, src) - P.reflected = 1 + // redirect the projectile + P.redirect(new_x, new_y, curloc, src) + P.reflected = 1 - return -1 // complete projectile permutation + return -1 // complete projectile permutation return (..(P)) @@ -145,21 +263,32 @@ /mob/living/simple_animal/construct/wraith name = "Wraith" real_name = "Wraith" - desc = "A wicked bladed shell contraption piloted by a bound spirit" + construct_type = "wraith" + desc = "A wicked bladed shell contraption piloted by a bound spirit." icon = 'icons/mob/mob.dmi' icon_state = "floating" icon_living = "floating" - maxHealth = 75 - health = 75 + maxHealth = 200 + health = 200 melee_damage_lower = 25 - melee_damage_upper = 25 + melee_damage_upper = 30 + attack_armor_pen = 15 + attack_sharp = 1 + attack_edge = 1 attacktext = list("slashed") + friendly = list("pinches") speed = -1 environment_smash = 1 - see_in_dark = 7 attack_sound = 'sound/weapons/rapidslice.ogg' - construct_spells = list(/spell/targeted/ethereal_jaunt/shift) + construct_spells = list(/spell/targeted/ethereal_jaunt/shift, + /spell/targeted/ambush_mode + ) +/mob/living/simple_animal/construct/wraith/DoPunch(var/atom/A) + . = ..() + if(. && isliving(A)) + var/mob/living/L = A + L.add_modifier(/datum/modifier/deep_wounds, 30 SECONDS) /////////////////////////////Artificer///////////////////////// @@ -168,35 +297,43 @@ /mob/living/simple_animal/construct/builder name = "Artificer" real_name = "Artificer" - desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" + construct_type = "artificer" + desc = "A bulbous construct dedicated to building and maintaining temples to their otherworldly lords." icon = 'icons/mob/mob.dmi' icon_state = "artificer" icon_living = "artificer" - maxHealth = 50 - health = 50 + maxHealth = 150 + health = 150 response_harm = "viciously beaten" harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 + melee_damage_lower = 15 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you. + melee_damage_upper = 20 attacktext = list("rammed") speed = 0 - environment_smash = 1 + environment_smash = 2 attack_sound = 'sound/weapons/rapidslice.ogg' construct_spells = list(/spell/aoe_turf/conjure/construct/lesser, /spell/aoe_turf/conjure/wall, /spell/aoe_turf/conjure/floor, /spell/aoe_turf/conjure/soulstone, - /spell/aoe_turf/conjure/pylon + /spell/aoe_turf/conjure/pylon, + /spell/aoe_turf/conjure/door, + /spell/aoe_turf/conjure/grille, + /spell/targeted/occult_repair_aura, + /spell/targeted/construct_advanced/mend_acolyte ) /////////////////////////////Behemoth///////////////////////// - +/* + * The Behemoth. Admin-allowance only, still try to keep it in some guideline of 'Balanced', even if it means Security has to be fully geared to be so. + */ /mob/living/simple_animal/construct/behemoth name = "Behemoth" real_name = "Behemoth" - desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." + construct_type = "juggernaut" + desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force." icon = 'icons/mob/mob.dmi' icon_state = "behemoth" icon_living = "behemoth" @@ -208,38 +345,84 @@ melee_damage_lower = 50 melee_damage_upper = 50 attacktext = list("brutally crushed") + friendly = list("pokes") //Anything nice the Behemoth would do would still Kill the Human. Leave it at poke. speed = 5 environment_smash = 2 attack_sound = 'sound/weapons/heavysmash.ogg' resistance = 10 + icon_scale = 2 var/energy = 0 var/max_energy = 1000 - construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) + armor = list( + "melee" = 60, + "bullet" = 60, + "laser" = 60, + "energy" = 30, + "bomb" = 10, + "bio" = 100, + "rad" = 100) + construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser, + /spell/targeted/fortify, + /spell/targeted/construct_advanced/slam + ) + +/mob/living/simple_animal/construct/behemoth/bullet_act(var/obj/item/projectile/P) + var/reflectchance = 80 - round(P.damage/3) + if(prob(reflectchance)) + visible_message("The [P.name] gets reflected by [src]'s shell!", \ + "The [P.name] gets reflected by [src]'s shell!") + + // Find a turf near or on the original location to bounce to + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) + var/turf/curloc = get_turf(src) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, src) + P.reflected = 1 + + return -1 // complete projectile permutation + + return (..(P)) ////////////////////////Harvester//////////////////////////////// - - +/* + * Master of Spells and Ranged Abilities. Not as fragile as the Wraith, but nowhere near as maneuverable and deadly in melee. + */ /mob/living/simple_animal/construct/harvester name = "Harvester" real_name = "Harvester" - desc = "The promised reward of the livings who follow narsie. Obtained by offering their bodies to the geometer of blood" + construct_type = "harvester" + desc = "A tendril-laden construct piloted by a chained mind." icon = 'icons/mob/mob.dmi' icon_state = "harvester" icon_living = "harvester" maxHealth = 150 health = 150 - melee_damage_lower = 25 + melee_damage_lower = 20 melee_damage_upper = 25 + attack_sharp = 1 attacktext = list("violently stabbed") - speed = -1 + friendly = list("caresses") + speed = 0 environment_smash = 1 - see_in_dark = 7 attack_sound = 'sound/weapons/pierce.ogg' + armor = list( + "melee" = 10, + "bullet" = 20, + "laser" = 20, + "energy" = 20, + "bomb" = 20, + "bio" = 100, + "rad" = 100) + construct_spells = list( - /spell/targeted/harvest, /spell/aoe_turf/knock/harvester, + /spell/targeted/construct_advanced/inversion_beam, + /spell/targeted/construct_advanced/agonizing_sphere, /spell/rune_write ) @@ -250,6 +433,9 @@ overlays += eye_glow set_light(2, -2, l_color = "#FFFFFF") +/mob/living/simple_animal/construct/proc/remove_glow() + overlays.Cut() + ////////////////HUD////////////////////// /mob/living/simple_animal/construct/Life() @@ -268,71 +454,35 @@ silence_spells(purge) -/mob/living/simple_animal/construct/armoured/Life() - ..() +/mob/living/simple_animal/construct/updatehealth() //Special icons. + health = getMaxHealth() - getToxLoss() - getFireLoss() - getBruteLoss() + + //Alive, becoming dead + if((stat < DEAD) && (health <= 0)) + death() + + //Overhealth + if(health > getMaxHealth()) + health = getMaxHealth() + + //Update our hud if we have one if(healths) - switch(health) - if(250 to INFINITY) healths.icon_state = "juggernaut_health0" - if(208 to 249) healths.icon_state = "juggernaut_health1" - if(167 to 207) healths.icon_state = "juggernaut_health2" - if(125 to 166) healths.icon_state = "juggernaut_health3" - if(84 to 124) healths.icon_state = "juggernaut_health4" - if(42 to 83) healths.icon_state = "juggernaut_health5" - if(1 to 41) healths.icon_state = "juggernaut_health6" - else healths.icon_state = "juggernaut_health7" - - -/mob/living/simple_animal/construct/behemoth/Life() - ..() - if(healths) - switch(health) - if(750 to INFINITY) healths.icon_state = "juggernaut_health0" - if(625 to 749) healths.icon_state = "juggernaut_health1" - if(500 to 624) healths.icon_state = "juggernaut_health2" - if(375 to 499) healths.icon_state = "juggernaut_health3" - if(250 to 374) healths.icon_state = "juggernaut_health4" - if(125 to 249) healths.icon_state = "juggernaut_health5" - if(1 to 124) healths.icon_state = "juggernaut_health6" - else healths.icon_state = "juggernaut_health7" - -/mob/living/simple_animal/construct/builder/Life() - ..() - if(healths) - switch(health) - if(50 to INFINITY) healths.icon_state = "artificer_health0" - if(42 to 49) healths.icon_state = "artificer_health1" - if(34 to 41) healths.icon_state = "artificer_health2" - if(26 to 33) healths.icon_state = "artificer_health3" - if(18 to 25) healths.icon_state = "artificer_health4" - if(10 to 17) healths.icon_state = "artificer_health5" - if(1 to 9) healths.icon_state = "artificer_health6" - else healths.icon_state = "artificer_health7" - - - -/mob/living/simple_animal/construct/wraith/Life() - ..() - if(healths) - switch(health) - if(75 to INFINITY) healths.icon_state = "wraith_health0" - if(62 to 74) healths.icon_state = "wraith_health1" - if(50 to 61) healths.icon_state = "wraith_health2" - if(37 to 49) healths.icon_state = "wraith_health3" - if(25 to 36) healths.icon_state = "wraith_health4" - if(12 to 24) healths.icon_state = "wraith_health5" - if(1 to 11) healths.icon_state = "wraith_health6" - else healths.icon_state = "wraith_health7" - - -/mob/living/simple_animal/construct/harvester/Life() - ..() - if(healths) - switch(health) - if(150 to INFINITY) healths.icon_state = "harvester_health0" - if(125 to 149) healths.icon_state = "harvester_health1" - if(100 to 124) healths.icon_state = "harvester_health2" - if(75 to 99) healths.icon_state = "harvester_health3" - if(50 to 74) healths.icon_state = "harvester_health4" - if(25 to 49) healths.icon_state = "harvester_health5" - if(1 to 24) healths.icon_state = "harvester_health6" - else healths.icon_state = "harvester_health7" + if(stat != DEAD) + var/heal_per = (health / getMaxHealth()) * 100 + switch(heal_per) + if(100 to INFINITY) + healths.icon_state = "[construct_type]_health0" + if(80 to 100) + healths.icon_state = "[construct_type]_health1" + if(60 to 80) + healths.icon_state = "[construct_type]_health2" + if(40 to 60) + healths.icon_state = "[construct_type]_health3" + if(20 to 40) + healths.icon_state = "[construct_type]_health4" + if(0 to 20) + healths.icon_state = "[construct_type]_health5" + else + healths.icon_state = "[construct_type]_health6" + else + healths.icon_state = "[construct_type]_health7" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index baf99ec0e4..6f13789dfc 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -11,6 +11,7 @@ slot_flags = SLOT_BELT origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4) var/imprinted = "empty" + var/possible_constructs = list("Juggernaut","Wraith","Artificer","Harvester") //////////////////////////////Capturing//////////////////////////////////////////////////////// @@ -145,9 +146,9 @@ src.icon_state = "soulstone2" src.name = "Soul Stone: [S.real_name]" - S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." - U << "Capture successful! : [T.real_name]'s soul has been ripped from their body and stored within the soul stone." - U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls." + to_chat(S, "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs.") + to_chat(U, "Capture successful! : [T.real_name]'s soul has been ripped from their body and stored within the soul stone.") + to_chat(U, "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls.") src.imprinted = "[S.name]" qdel(T) @@ -155,13 +156,13 @@ if(!istype(T)) return; if (T.stat == DEAD) - U << "Capture failed!: The shade has already been banished!" + to_chat(U, "Capture failed!: The shade has already been banished!") return if(src.contents.len) - U << "Capture failed!: The soul stone is full! Use or free an existing soul to make room." + to_chat(U, "Capture failed!: The soul stone is full! Use or free an existing soul to make room.") return if(T.name != src.imprinted) - U << "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!" + to_chat(U, "Capture failed!: The soul stone has already been imprinted with [src.imprinted]'s mind!") return T.forceMove(src) //put shade in stone @@ -170,14 +171,15 @@ T.health = T.getMaxHealth() src.icon_state = "soulstone2" - T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" - U << "Capture successful! : [T.name]'s has been recaptured and stored within the soul stone." + to_chat(T, "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form") + to_chat(U, "Capture successful! : [T.name]'s has been recaptured and stored within the soul stone.") + /obj/item/device/soulstone/proc/transfer_construct(var/obj/structure/constructshell/T,var/mob/U) var/mob/living/simple_animal/shade/A = locate() in src if(!A) - U << "Capture failed!: The soul stone is empty! Go kill someone!" + to_chat(U,"Capture failed!: The soul stone is empty! Go kill someone!") return; - var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") + var/construct_class = input(U, "Please choose which type of construct you wish to create.") as null|anything in possible_constructs switch(construct_class) if("Juggernaut") var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) @@ -185,8 +187,8 @@ if(iscultist(U)) cult.add_antagonist(Z.mind) qdel(T) - Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(Z,"You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike.") + to_chat(Z,"You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") Z.cancel_camera() qdel(src) if("Wraith") @@ -195,8 +197,8 @@ if(iscultist(U)) cult.add_antagonist(Z.mind) qdel(T) - Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(Z,"You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.") + to_chat(Z,"You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") Z.cancel_camera() qdel(src) if("Artificer") @@ -205,10 +207,31 @@ if(iscultist(U)) cult.add_antagonist(Z.mind) qdel(T) - Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs" - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + to_chat(Z,"You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs") + to_chat(Z,"You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") Z.cancel_camera() qdel(src) + if("Harvester") + var/mob/living/simple_animal/construct/harvester/Z = new /mob/living/simple_animal/construct/harvester (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + to_chat(Z,"You are playing a Harvester. You are relatively weak, but your physical frailty is made up for by your ranged abilities.") + to_chat(Z,"You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + Z.cancel_camera() + qdel(src) + if("Behemoth") + var/mob/living/simple_animal/construct/behemoth/Z = new /mob/living/simple_animal/construct/behemoth (get_turf(T.loc)) + Z.key = A.key + if(iscultist(U)) + cult.add_antagonist(Z.mind) + qdel(T) + to_chat(Z,"You are playing a Behemoth. You are incredibly slow, though your slowness is made up for by the fact your shell is far larger than any of your bretheren. You are the Unstoppable Force, and Immovable Object.") + to_chat(Z,"You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.") + Z.cancel_camera() + qdel(src) + /obj/item/device/soulstone/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob) switch(choice) if("VICTIM") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 450580fbb4..4580643574 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -20,6 +20,8 @@ var/show_stat_health = 1 // Does the percentage health show in the stat panel for the mob var/ai_inactive = 0 // Set to 1 to turn off most AI actions var/has_hands = 0 // Set to 1 to enable the use of hands and the hands hud + var/humanoid_hands = 0 // Can a player in this mob use things like guns or AI cards? + var/hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'. var/list/hud_gears // Slots to show on the hud (typically none) var/ui_icons // Icon file path to use for the HUD, otherwise generic icons are used var/r_hand_sprite // If they have hands, @@ -139,6 +141,7 @@ var/astar_adjacent_proc = /turf/proc/CardinalTurfsWithAccess // Proc to use when A* pathfinding. Default makes them bound to cardinals. //Damage resistances + var/shock_resistance = 0 // Siemens modifier, directly subtracted from 1. Value of 0.4 means 0.6 siemens on shocks. var/resistance = 0 // Damage reduction for all types var/list/armor = list( // Values for normal getarmor() checks "melee" = 0, @@ -314,6 +317,12 @@ else ma.icon_state = initial(icon_state) + //VOREStation edit start + var/vore_icon_state = update_vore_icon() + if(vore_icon_state) + ma.icon_state = vore_icon_state + //VOREStation edit end + if(has_hands) if(r_hand_sprite) ma.overlays += r_hand_sprite @@ -806,6 +815,9 @@ return verb /mob/living/simple_animal/put_in_hands(var/obj/item/W) // No hands. + if(has_hands) + put_in_active_hand(W) + return 1 W.forceMove(get_turf(src)) return 1 @@ -1286,7 +1298,7 @@ // This is the actual act of 'punching'. Override for special behaviour. /mob/living/simple_animal/proc/DoPunch(var/atom/A) - if(!Adjacent(A)) // They could've moved in the meantime. + if(!Adjacent(A) && !istype(A, /obj/structure/window) && !istype(A, /obj/machinery/door/window)) // They could've moved in the meantime. But a Window probably wouldn't have. This allows player simple-mobs to attack windows. return FALSE var/damage_to_do = rand(melee_damage_lower, melee_damage_upper) @@ -1521,7 +1533,7 @@ //Touches a wire, etc /mob/living/simple_animal/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) - shock_damage *= siemens_coeff + shock_damage *= max(siemens_coeff - shock_resistance, 0) if (shock_damage < 1) return 0 @@ -1587,11 +1599,11 @@ hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" hud_used.r_hand_hud_object.icon_state = "r_hand_active" return - +/* /mob/living/simple_animal/put_in_active_hand(var/obj/item/I) if(!has_hands || !istype(I)) return - +*/ //Puts the item into our active hand if possible. returns 1 on success. /mob/living/simple_animal/put_in_active_hand(var/obj/item/W) if(!has_hands) @@ -1700,6 +1712,23 @@ /mob/living/simple_animal/IsAdvancedToolUser() return has_hands +/mob/living/simple_animal/proc/IsHumanoidToolUser(var/atom/tool) + if(!humanoid_hands) + var/display_name = null + if(tool) + display_name = tool + else + display_name = "object" + to_chat(src, "Your [hand_form] are not fit for use of \the [display_name].") + return humanoid_hands + +/mob/living/simple_animal/drop_from_inventory(var/obj/item/W, var/atom/target = null) + . = ..(W, target) + if(!target) + target = src.loc + if(.) + W.forceMove(src.loc) + //Commands, reactions, etc /mob/living/simple_animal/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index 90d899fa08..883c43e30f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -15,7 +15,8 @@ var/vore_standing_too = 0 // Can also eat non-stunned mobs var/vore_ignores_undigestable = 1 // Refuse to eat mobs who are undigestable by the prefs toggle. - var/vore_default_mode = DM_ITEMWEAK // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) + var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) + var/vore_default_flags = DM_FLAG_ITEMWEAK // Itemweak by default var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted var/vore_absorb_chance = 0 // Chance to switch to absorb mode if resisted var/vore_escape_chance = 25 // Chance of resisting out of mob @@ -44,21 +45,21 @@ var/obj/belly/B = belly for(var/mob/living/M in B) new_fullness += M.size_multiplier - new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry. + new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry. vore_fullness = min(vore_capacity, new_fullness) -/mob/living/simple_animal/update_icon() - . = ..() // Call sideways "parent" to decide state - if(vore_active) - update_fullness() - if(!vore_fullness) - return - else if(icon_state == icon_living && (vore_icons & SA_ICON_LIVING)) - icon_state = "[icon_state]-[vore_fullness]" - else if(icon_state == icon_dead && (vore_icons & SA_ICON_DEAD)) - icon_state = "[icon_state]-[vore_fullness]" - else if(icon_state == icon_rest && (vore_icons & SA_ICON_REST)) - icon_state = "[icon_state]-[vore_fullness]" +/mob/living/simple_animal/proc/update_vore_icon() + if(!vore_active) + return 0 + update_fullness() + if(!vore_fullness) + return 0 + else if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED)) && (vore_icons & SA_ICON_LIVING)) + return "[icon_living]-[vore_fullness]" + else if(stat >= DEAD && (vore_icons & SA_ICON_DEAD)) + return "[icon_dead]-[vore_fullness]" + else if(((stat == UNCONSCIOUS) || resting || incapacitated(INCAPACITATION_DISABLED) ) && icon_rest && (vore_icons & SA_ICON_REST)) + return "[icon_rest]-[vore_fullness]" /mob/living/simple_animal/proc/will_eat(var/mob/living/M) if(client) //You do this yourself, dick! @@ -147,6 +148,7 @@ B.name = vore_stomach_name ? vore_stomach_name : "stomach" B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." B.digest_mode = vore_default_mode + B.mode_flags = vore_default_flags B.escapable = vore_escape_chance > 0 B.escapechance = vore_escape_chance B.digestchance = vore_digest_chance @@ -174,16 +176,6 @@ "The juices pooling beneath you sizzle against your sore skin.", "The churning walls slowly pulverize you into meaty nutrients.", "The stomach glorps and gurgles as it tries to work you into slop.") - B.emote_lists[DM_ITEMWEAK] = list( - "The burning acids eat away at your form.", - "The muscular stomach flesh grinds harshly against you.", - "The caustic air stings your chest when you try to breathe.", - "The slimy guts squeeze inward to help the digestive juices soften you up.", - "The onslaught against your body doesn't seem to be letting up; you're food now.", - "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", - "The juices pooling beneath you sizzle against your sore skin.", - "The churning walls slowly pulverize you into meaty nutrients.", - "The stomach glorps and gurgles as it tries to work you into slop.") /mob/living/simple_animal/Bumped(var/atom/movable/AM, yes) if(ismob(AM)) diff --git a/code/modules/mob/living/simple_animal/slime/ai.dm b/code/modules/mob/living/simple_animal/slime/ai.dm index b35ebb6e03..3a8718c997 100644 --- a/code/modules/mob/living/simple_animal/slime/ai.dm +++ b/code/modules/mob/living/simple_animal/slime/ai.dm @@ -5,9 +5,46 @@ return ..() +/mob/living/simple_animal/slime/Found(mob/living/L) + if(isliving(L)) + if(SA_attackable(L)) + if(L.faction == faction && !attack_same) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too. + return H // Monkeys are always food. + else + return + + if(L in friends) + return + + if(istype(L, /mob/living/simple_animal/slime)) + var/mob/living/simple_animal/slime/buddy = L + if(buddy.slime_color == src.slime_color || discipline || unity || buddy.unity) + return // Don't hurt same colored slimes. + else + return buddy //do hurt others + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too. + return H // Monkeys are always food. + + if(issilicon(L) || isbot(L)) + if(discipline && !rabid) + return // We're a good slime. For now at least. + return + return + /mob/living/simple_animal/slime/special_target_check(mob/living/L) - if(L.faction == faction && !attack_same) - return FALSE + if(L.faction == faction && !attack_same && !istype(L, /mob/living/simple_animal/slime)) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too. + return TRUE // Monkeys are always food. + else + return FALSE if(L in friends) return FALSE diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 21e7c62820..691b880574 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -112,6 +112,11 @@ if(!speaker.client) return + //Are all slimes being referred to? + var/mass_order = 0 + if(findtext(message, "slimes")) + mass_order = 1 + // Say hello back. if(findtext(message, "hello") || findtext(message, "hi") || findtext(message, "greetings")) delayed_say(pick("Hello...", "Hi..."), speaker) @@ -165,13 +170,14 @@ var/list/valid_names = splittext(L.name, " ") // Should output list("John", "Doe") as an example. for(var/line in valid_names) // Check each part of someone's name. if(findtext(message, lowertext(line))) // If part of someone's name is in the command, the slime targets them if allowed to. - if(special_target_check(L)) - delayed_say("Okay... I attack \the [L]...", speaker) - LoseFollow() - set_target(L) - return - else - delayed_say("No... I won't attack \the [L].", speaker) - return - // If we're here, it couldn't find anyone with that name. - delayed_say("No... I don't know who to attack...", speaker) + if(!(mass_order && line == "slime")) //don't think random other slimes are target + if(special_target_check(L)) + delayed_say("Okay... I attack \the [L]...", speaker) + LoseFollow() + set_target(L, 1) + return + else + delayed_say("No... I won't attack \the [L].", speaker) + return + // If we're here, it couldn't find anyone with that name. + delayed_say("No... I don't know who to attack...", speaker) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 93b1f0e9c6..219074dc6c 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -356,10 +356,13 @@ baby.mutation_chance = mutation_chance baby.power_charge = round(power_charge / 4) baby.resentment = max(resentment - 1, 0) - baby.discipline = max(discipline - 1, 0) - baby.obedience = max(obedience - 1, 0) - baby.unity = unity + if(!istype(baby, /mob/living/simple_animal/slime/light_pink)) + baby.discipline = max(discipline - 1, 0) + baby.obedience = max(obedience - 1, 0) + if(!istype(baby, /mob/living/simple_animal/slime/rainbow)) + baby.unity = unity baby.faction = faction + baby.attack_same = attack_same baby.friends = friends.Copy() if(rabid) baby.enrage() diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm index 486c04866f..d30bdf0d7d 100644 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -120,7 +120,7 @@ /mob/living/simple_animal/slime/dark_purple desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it." - color = "#CC23FF" + color = "#660088" slime_color = "dark purple" coretype = /obj/item/slime_extract/dark_purple reagent_injected = "phoron" diff --git a/code/modules/mob/living/simple_animal/vore/badboi.dm b/code/modules/mob/living/simple_animal/vore/badboi.dm index 11ede1c105..735d593891 100644 --- a/code/modules/mob/living/simple_animal/vore/badboi.dm +++ b/code/modules/mob/living/simple_animal/vore/badboi.dm @@ -51,7 +51,7 @@ vore_active = TRUE vore_capacity = 1 vore_pounce_chance = 30 - vore_icons = SA_ICON_LIVING + vore_icons = SA_ICON_LIVING | SA_ICON_REST vore_stomach_name = "fuel processor" vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..." diff --git a/code/modules/mob/living/simple_animal/vore/otie.dm b/code/modules/mob/living/simple_animal/vore/otie.dm index 26057fc87b..766ed7a4ae 100644 --- a/code/modules/mob/living/simple_animal/vore/otie.dm +++ b/code/modules/mob/living/simple_animal/vore/otie.dm @@ -56,7 +56,7 @@ vore_active = 1 vore_capacity = 1 vore_pounce_chance = 20 - vore_icons = SA_ICON_LIVING + vore_icons = SA_ICON_LIVING | SA_ICON_REST /mob/living/simple_animal/otie/feral //gets the pet2tame feature. starts out hostile tho so get gamblin' name = "mutated feral otie" diff --git a/code/modules/mob/living/simple_animal/vore/panther.dm b/code/modules/mob/living/simple_animal/vore/panther.dm index 3e723e68fc..454ef4d927 100644 --- a/code/modules/mob/living/simple_animal/vore/panther.dm +++ b/code/modules/mob/living/simple_animal/vore/panther.dm @@ -32,4 +32,4 @@ vore_active = 1 vore_capacity = 2 vore_pounce_chance = 10 - vore_icons = SA_ICON_LIVING + vore_icons = SA_ICON_LIVING | SA_ICON_REST diff --git a/code/modules/mob/living/simple_animal/vore/rous.dm b/code/modules/mob/living/simple_animal/vore/rous.dm new file mode 100644 index 0000000000..9b47810f36 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/rous.dm @@ -0,0 +1,46 @@ +/mob/living/simple_animal/hostile/rous + name = "giant rat" + desc = "In what passes for a hierarchy among verminous rodents, this one is king." + tt_desc = "Mus muscular" + icon = 'icons/mob/vore64x32.dmi' + icon_state = "rous" + icon_living = "rous" + icon_dead = "rous-dead" + icon_rest = "rous_rest" + faction = "mouse" + + maxHealth = 150 + health = 150 + + investigates = TRUE + melee_damage_lower = 5 + melee_damage_upper = 15 + grab_resist = 100 + + speak_chance = 4 + speak = list("Squeek!","SQUEEK!","Squeek?") + speak_emote = list("squeeks","squeeks","squiks") + emote_hear = list("squeeks","squeaks","squiks") + emote_see = list("runs in a circle", "shakes", "scritches at something") + say_maybe_target = list("Squeek?") + say_got_target = list("SQUEEK!") + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("ravaged") + friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") + + old_x = -16 + old_y = 0 + default_pixel_x = -16 + pixel_x = -16 + pixel_y = 0 + + vore_active = TRUE + vore_capacity = 1 + vore_pounce_chance = 45 + vore_icons = SA_ICON_LIVING | SA_ICON_REST + +/mob/living/simple_animal/hostile/rous/death() + playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1) + ..() diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm index 24053b4bca..7fa04db5de 100644 --- a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm @@ -1,6 +1,6 @@ /mob/living/simple_animal/shadekin //Spawning the prototype spawns a random one, see initialize() name = "shadekin" - desc = "Some sort of fluffer. Big ears, long tail. " + desc = "Some sort of fluffer. Big ears, long tail." icon = 'icons/mob/vore_shadekin.dmi' icon_state = "map_example" icon_living = "map_example" @@ -62,7 +62,7 @@ vore_bump_chance = 0 //They follow people, this would be DENGEROUS var/eye_state = RED_EYES //Eye color/energy gain/loss mode - var/eye_icon_state = "e_red" //Default, changed in init + var/eye_icon_state = null //Default, changed in init var/eye_desc //Eye color description added to examine var/mob/living/carbon/human/henlo_human //Human we're stalking currently @@ -72,9 +72,7 @@ var/shy_approach = FALSE //Do we creep up slowly on humans to boop them //Icon handling - var/image/tailimage //Cached tail icon - var/image/eyeimage //Cached eye icon - var/prev_fullness = null //Used to avoid needless icon changes when we don't need them + var/image/tailimage //Cached tail image //Darknesssss var/energy = 100 //For abilities @@ -108,8 +106,27 @@ icon_living = icon_state + switch(eye_state) + if(BLUE_EYES) + eye_icon_state = "e_blue" + if(RED_EYES) + eye_icon_state = "e_red" + if(PURPLE_EYES) + eye_icon_state = "e_purple" + if(YELLOW_EYES) + eye_icon_state = "e_yellow" + if(GREEN_EYES) + eye_icon_state = "e_green" + if(ORANGE_EYES) + eye_icon_state = "e_orange" + else + eye_icon_state = "e_red" + + tailimage = image('icons/mob/vore_shadekin64.dmi',null,icon_state) + tailimage.pixel_x = -16 + if(eye_desc) - desc += "This one has [eye_desc]!" + desc += " This one has [eye_desc]!" var/list/ability_types = subtypesof(/obj/effect/shadekin_ability) shadekin_abilities = list() @@ -154,12 +171,6 @@ "The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!", "The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!" ) - B.emote_lists[DM_ITEMWEAK] = list( - "The walls slop thick slime across your body! It tingles briefly before the sting and ache sets in!", - "The sound of your body slipping and sliding against the powerfully churning stomach fills the air!", - "The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!", - "The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!" - ) B.emote_lists[DM_ABSORB] = list( "The walls cling to you awfully close... It's almost like you're sinking into them.", "You can feel the walls press in tightly against you, clinging to you posessively!", @@ -197,33 +208,13 @@ /mob/living/simple_animal/shadekin/update_icon() . = ..() + + cut_overlay(tailimage) - if(!tailimage || prev_fullness != vore_fullness) - prev_fullness = vore_fullness - tailimage = image('icons/mob/vore_shadekin64.dmi',null,icon_state) - tailimage.pixel_x = -16 tailimage.icon_state = icon_state - if(!eyeimage || !eye_icon_state) - switch(eye_state) - if(BLUE_EYES) - eye_icon_state = "e_blue" - if(RED_EYES) - eye_icon_state = "e_red" - if(PURPLE_EYES) - eye_icon_state = "e_purple" - if(YELLOW_EYES) - eye_icon_state = "e_yellow" - if(GREEN_EYES) - eye_icon_state = "e_green" - if(ORANGE_EYES) - eye_icon_state = "e_orange" - eyeimage = image(icon,null,eye_icon_state) - - var/mutable_appearance/ma = new(src) - ma.overlays += tailimage - ma.overlays += eyeimage - appearance = ma + add_overlay(tailimage) + add_overlay(eye_icon_state) /mob/living/simple_animal/shadekin/Stat() . = ..() diff --git a/code/modules/mob/living/simple_animal/vore/solargrub.dm b/code/modules/mob/living/simple_animal/vore/solargrub.dm index 2c7d518e1f..6e34a1c2d1 100644 --- a/code/modules/mob/living/simple_animal/vore/solargrub.dm +++ b/code/modules/mob/living/simple_animal/vore/solargrub.dm @@ -77,8 +77,8 @@ List of things solar grubs should be able to do: sparks.start() anchored = 1 PN = attached.powernet - PN.draw_power(150000) - var/apc_drain_rate = 4000 //5000 seems a bit high, knocking it down to 4000 + PN.draw_power(100000) // previous value 150000 + var/apc_drain_rate = 750 //Going to see if grubs are better as a minimal bother. previous value : 4000 for(var/obj/machinery/power/terminal/T in PN.nodes) if(istype(T.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = T.master @@ -96,7 +96,7 @@ List of things solar grubs should be able to do: vore_active = 1 vore_capacity = 1 vore_pounce_chance = 0 //grubs only eat incapacitated targets - vore_default_mode = DM_ITEMWEAK //item friendly digestions, they just want your chemical energy :3 + vore_default_mode = DM_DIGEST /mob/living/simple_animal/retaliate/solargrub/PunchTarget() . = ..() @@ -116,4 +116,4 @@ List of things solar grubs should be able to do: . = ..() if(. == 0 && !is_dead()) set_light(2.5, 1, COLOR_YELLOW) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm index c71cc1d36e..3b4074e455 100644 --- a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm @@ -65,7 +65,7 @@ icon_state = "queen_s" icon_living = "queen_s" icon_dead = "queen_dead" - vore_icons = SA_ICON_LIVING + vore_icons = SA_ICON_LIVING | SA_ICON_REST old_x = -16 old_y = 0 default_pixel_x = -16 @@ -77,6 +77,7 @@ /mob/living/simple_animal/hostile/alien/sentinel/praetorian icon = 'icons/mob/vore64x64.dmi' + vore_icons = SA_ICON_LIVING | SA_ICON_REST /mob/living/simple_animal/hostile/alien/queen/empress/mother vore_icons = 0 // NO VORE SPRITES @@ -226,11 +227,22 @@ /mob/living/simple_animal/hostile/carp/holodeck vore_icons = 0 // NO VORE SPRITES + vore_digest_chance = 0 + vore_absorb_chance = 0 + // Override stuff for holodeck carp to make them not digest when set to safe! +/mob/living/simple_animal/hostile/carp/holodeck/init_vore() + . = ..() + var/safe = (faction == "neutral") + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.digest_mode = safe ? DM_HOLD : vore_default_mode + /mob/living/simple_animal/hostile/carp/holodeck/set_safety(var/safe) . = ..() for(var/belly in vore_organs) var/obj/belly/B = belly B.digest_mode = safe ? DM_HOLD : vore_default_mode - B.digestchance = safe ? 0 : vore_digest_chance - B.absorbchance = safe ? 0 : vore_absorb_chance + +/mob/living/simple_animal/mouse + faction = "mouse" //Giving mice a faction so certain mobs can get along with them. \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a06a0b1f69..32902d7d48 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -1,6 +1,7 @@ /mob density = 1 - layer = 4.0 + layer = MOB_LAYER + plane = MOB_PLANE animate_movement = 2 flags = PROXMOVE var/datum/mind/mind diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 58c530d06c..b5cc72fd19 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -31,7 +31,6 @@ var/force_down //determines if the affecting mob will be pinned to the ground var/dancing //determines if assailant and affecting keep looking at each other. Basically a wrestling position - layer = 21 abstract = 1 item_state = "nothing" w_class = ITEMSIZE_HUGE @@ -194,7 +193,7 @@ return var/shift = 0 var/adir = get_dir(assailant, affecting) - affecting.layer = 4 + affecting.layer = MOB_LAYER switch(state) if(GRAB_PASSIVE) shift = 8 @@ -217,7 +216,7 @@ switch(adir) if(NORTH) animate(affecting, pixel_x = 0, pixel_y =-shift, 5, 1, LINEAR_EASING) - affecting.layer = 3.9 + affecting.layer = BELOW_MOB_LAYER if(SOUTH) animate(affecting, pixel_x = 0, pixel_y = shift, 5, 1, LINEAR_EASING) if(WEST) @@ -396,7 +395,7 @@ /obj/item/weapon/grab/Destroy() animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING) - affecting.layer = 4 + affecting.reset_plane_and_layer() if(affecting) affecting.grabbed_by -= src affecting = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 38b8bbe4d6..10be531825 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -635,7 +635,7 @@ var/global/image/backplane else var/area/A = get_area(src) return A.sound_env - + /mob/proc/position_hud_item(var/obj/item/item, var/slot) if(!istype(hud_used) || !slot || !LAZYLEN(hud_used.slot_info)) return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index a64be018fb..c2b0aaf0f1 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -288,7 +288,7 @@ tickcomp = ((1/(world.tick_lag))*1.3) - 1.3 move_delay = move_delay + tickcomp - if(istype(mob.buckled, /obj/vehicle)) + if(istype(mob.buckled))// VOREStation Removal - , /obj/vehicle)) //manually set move_delay for vehicles so we don't inherit any mob movement penalties //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm move_delay = world.time + tickcomp diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm index 1252ed6649..8ffc15bc9f 100644 --- a/code/modules/mob/mob_planes.dm +++ b/code/modules/mob/mob_planes.dm @@ -135,7 +135,7 @@ //Lighting is weird and has matrix shenanigans. Think of this as turning on/off darkness. /obj/screen/plane_master/fullbright plane = PLANE_LIGHTING - layer = LIGHTING_LAYER+1 + layer = LAYER_HUD_BASE+1 // This MUST be above the lighting plane_master color = null //To break lighting when visible (this is sorta backwards) alpha = 0 //Starts full opaque invisibility = 101 diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 8c4b66bfa0..3cbf856cf3 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -209,6 +209,13 @@ icon_state = "hair_messy" species_allowed = list(SPECIES_TAJ, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) + teshari_fluffymohawk + name = "Teshari Fluffy Mohawk" + icon = 'icons/mob/human_face_vr.dmi' + icon_add = 'icons/mob/human_face_vr_add.dmi' + icon_state = "teshari_fluffymohawk" + species_allowed = list(SPECIES_TESHARI) + //Teshari things teshari icon_add = 'icons/mob/human_face_vr_add.dmi' @@ -909,3 +916,15 @@ icon_state = "catwomanleft" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG) + + teshi_fluff + name = "Teshari underfluff" + icon_state = "teshi_fluff" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_GROIN,BP_TORSO,BP_HEAD) + + teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) \ No newline at end of file diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 99381c254d..124ad77dd7 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -86,6 +86,9 @@ /mob/living/carbon/human/can_overcome_gravity() return species && species.can_overcome_gravity(src) +/mob/living/simple_animal/construct/can_overcome_gravity() + return 1 //They care not for standard physics. + /mob/observer/zMove(direction) var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(destination) @@ -116,6 +119,9 @@ /mob/observer/can_ztravel() return 1 +/mob/living/simple_animal/construct/can_ztravel() + return 1 + /mob/living/carbon/human/can_ztravel() if(incapacitated()) return 0 @@ -263,6 +269,9 @@ /mob/living/simple_animal/hostile/carp/can_fall() // So can carp apparently. return FALSE +/mob/living/simple_animal/construct/can_fall() //As do Constructs. + return FALSE + // Check if this atom prevents things standing on it from falling. Return TRUE to allow the fall. /obj/proc/CanFallThru(atom/movable/mover as mob|obj, turf/target as turf) if(!isturf(mover.loc)) // VORESTATION EDIT. We clearly didn't have enough backup checks. diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 8d03c8f862..e2796ccff8 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -201,7 +201,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/scrubbers desc = "A scrubbers pipe segment to connect upwards." connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -211,7 +211,7 @@ obj/machinery/atmospherics/pipe/zpipe/up/supply desc = "A supply pipe segment to connect upwards." connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE @@ -221,7 +221,7 @@ obj/machinery/atmospherics/pipe/zpipe/down/scrubbers desc = "A scrubbers pipe segment to connect downwards." connect_types = CONNECT_TYPE_SCRUBBER piping_layer = PIPING_LAYER_SCRUBBER - layer = 2.38 + layer = PIPES_SCRUBBER_LAYER icon_connect_type = "-scrubbers" color = PIPE_COLOR_RED @@ -231,6 +231,6 @@ obj/machinery/atmospherics/pipe/zpipe/down/supply desc = "A supply pipe segment to connect downwards." connect_types = CONNECT_TYPE_SUPPLY piping_layer = PIPING_LAYER_SUPPLY - layer = 2.39 + layer = PIPES_SUPPLY_LAYER icon_connect_type = "-supply" color = PIPE_COLOR_BLUE diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index ec003a813e..310bbfa9c5 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -519,3 +519,8 @@ nanoui is used to open and update nano browser uis */ /datum/nanoui/proc/update(var/force_open = 0) src_object.ui_interact(user, ui_key, src, force_open, master_ui, state) + +/datum/nanoui/proc/append_template(var/key, var/filename) + add_template(key, filename) + open() + update(1) diff --git a/code/modules/nifsoft/software/01_vision.dm b/code/modules/nifsoft/software/01_vision.dm index 2ce33c1c88..b0006888bd 100644 --- a/code/modules/nifsoft/software/01_vision.dm +++ b/code/modules/nifsoft/software/01_vision.dm @@ -102,7 +102,7 @@ a_drain = 0.1 access = access_engine tick_flags = NIF_ACTIVETICK - planes_enabled = list(VIS_FULLBRIGHT) + planes_enabled = list(VIS_FULLBRIGHT, VIS_MESONS) vision_flags = (NIF_V_MESONS) incompatible_with = list(NIF_MATERIAL,NIF_THERMALS,NIF_NIGHTVIS) diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/organ_internal.dm index 43b3a4c4d7..58ed176505 100644 --- a/code/modules/organs/internal/organ_internal.dm +++ b/code/modules/organs/internal/organ_internal.dm @@ -52,13 +52,13 @@ . = ..() //Should be an interger value for infection level if(!.) return - var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") + var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] - if(. >= 2 && antibiotics < 5) //INFECTION_LEVEL_TWO + if(. >= 2 && antibiotics < ANTIBIO_NORM) //INFECTION_LEVEL_TWO if (prob(3)) take_damage(1,silent=prob(30)) - if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE + if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE if (prob(50)) take_damage(1,silent=prob(15)) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 9378869815..b10decab9a 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -621,13 +621,13 @@ Note that amputating the affected organ does in fact remove the infection from t handle_germ_effects() /obj/item/organ/external/proc/handle_germ_sync() - var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") + var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] for(var/datum/wound/W in wounds) //Open wounds can become infected if (owner.germ_level > W.germ_level && W.infection_check()) W.germ_level++ - if (antibiotics < 5) + if (antibiotics < ANTIBIO_NORM) for(var/datum/wound/W in wounds) //Infected wounds raise the organ's germ level if (W.germ_level > germ_level) @@ -638,9 +638,9 @@ Note that amputating the affected organ does in fact remove the infection from t . = ..() //May be null or an infection level, if null then no specific processing needed here if(!.) return - var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin") + var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] - if(. >= 2 && antibiotics < 5) //INFECTION_LEVEL_TWO + if(. >= 2 && antibiotics < ANTIBIO_NORM) //INFECTION_LEVEL_TWO //spread the infection to internal organs var/obj/item/organ/target_organ = null //make internal organs become infected one at a time instead of all at once for (var/obj/item/organ/I in internal_organs) @@ -672,7 +672,7 @@ Note that amputating the affected organ does in fact remove the infection from t if (parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30)) parent.germ_level++ - if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE + if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE if (!(status & ORGAN_DEAD)) status |= ORGAN_DEAD owner << "You can't feel your [name] anymore..." diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 776ec1c012..b664600bfd 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -58,7 +58,7 @@ var/global/list/limb_icon_cache = list() //Every 'addon' below requires information from species if(!owner || !owner.species) return - + //Eye color/icon var/should_have_eyes = owner.should_have_organ(O_EYES) var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index cdb963e35b..c0e4e60c98 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -50,7 +50,7 @@ /obj/item/organ/external/diona/arm name = "left upper tendril" - organ_tag = "l_arm" + organ_tag = BP_L_ARM icon_name = "l_arm" max_damage = 30 min_broken_damage = 20 @@ -61,13 +61,13 @@ /obj/item/organ/external/diona/arm/right name = "right upper tendril" - organ_tag = "r_arm" + organ_tag = BP_R_ARM icon_name = "r_arm" body_part = ARM_RIGHT /obj/item/organ/external/diona/leg name = "left lower tendril" - organ_tag = "l_leg" + organ_tag = BP_L_LEG icon_name = "l_leg" max_damage = 30 min_broken_damage = 20 @@ -79,50 +79,50 @@ /obj/item/organ/external/diona/leg/right name = "right lower tendril" - organ_tag = "r_leg" + organ_tag = BP_R_LEG icon_name = "r_leg" body_part = LEG_RIGHT icon_position = RIGHT /obj/item/organ/external/diona/foot name = "left foot" - organ_tag = "l_foot" + organ_tag = BP_L_FOOT icon_name = "l_foot" max_damage = 25 min_broken_damage = 10 w_class = ITEMSIZE_SMALL body_part = FOOT_LEFT icon_position = LEFT - parent_organ = "l_leg" + parent_organ = BP_R_LEG can_stand = 1 /obj/item/organ/external/diona/foot/right name = "right foot" - organ_tag = "r_foot" + organ_tag = BP_R_FOOT icon_name = "r_foot" body_part = FOOT_RIGHT icon_position = RIGHT - parent_organ = "r_leg" + parent_organ = BP_R_LEG joint = "right ankle" amputation_point = "right ankle" /obj/item/organ/external/diona/hand name = "left grasper" - organ_tag = "l_hand" + organ_tag = BP_L_HAND icon_name = "l_hand" max_damage = 25 min_broken_damage = 15 w_class = ITEMSIZE_SMALL body_part = HAND_LEFT - parent_organ = "l_arm" + parent_organ = BP_L_ARM can_grasp = 1 /obj/item/organ/external/diona/hand/right name = "right grasper" - organ_tag = "r_hand" + organ_tag = BP_R_HAND icon_name = "r_hand" body_part = HAND_RIGHT - parent_organ = "r_arm" + parent_organ = BP_R_ARM //DIONA ORGANS. /obj/item/organ/external/diona/removed() @@ -157,26 +157,32 @@ /obj/item/organ/internal/diona/strata name = "neural strata" parent_organ = BP_TORSO + organ_tag = O_STRATA /obj/item/organ/internal/diona/bladder name = "gas bladder" parent_organ = BP_HEAD + organ_tag = O_GBLADDER /obj/item/organ/internal/diona/polyp name = "polyp segment" parent_organ = BP_GROIN + organ_tag = O_POLYP /obj/item/organ/internal/diona/ligament name = "anchoring ligament" parent_organ = BP_GROIN + organ_tag = O_ANCHOR /obj/item/organ/internal/diona/node name = "receptor node" parent_organ = BP_HEAD + organ_tag = O_RESPONSE /obj/item/organ/internal/diona/nutrients name = O_NUTRIENT parent_organ = BP_TORSO + organ_tag = O_NUTRIENT // These are different to the standard diona organs as they have a purpose in other // species (absorbing radiation and light respectively) @@ -191,8 +197,8 @@ /obj/item/organ/internal/diona/node name = "response node" - parent_organ = "head" - organ_tag = "receptor node" + parent_organ = BP_HEAD + organ_tag = O_RESPONSE icon = 'icons/mob/alien.dmi' icon_state = "claw" diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 35cdc6a51a..449d7c5137 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -72,7 +72,7 @@ owner.custom_pain("A jolt of pain surges through your [name]!",1) /obj/item/organ/external/arm - organ_tag = "l_arm" + organ_tag = BP_L_ARM name = "left arm" icon_name = "l_arm" max_damage = 80 @@ -98,13 +98,13 @@ if (. >= 2) if(prob(.)) owner.custom_pain("A jolt of pain surges through your [name]!",1) - if(organ_tag == "l_arm") //Specific level 2 'feature + if(organ_tag == BP_L_ARM) //Specific level 2 'feature owner.drop_l_hand() - else if(organ_tag == "r_arm") + else if(organ_tag == BP_R_ARM) owner.drop_r_hand() /obj/item/organ/external/arm/right - organ_tag = "r_arm" + organ_tag = BP_R_ARM name = "right arm" icon_name = "r_arm" body_part = ARM_RIGHT @@ -112,7 +112,7 @@ amputation_point = "right shoulder" /obj/item/organ/external/leg - organ_tag = "l_leg" + organ_tag = BP_L_LEG name = "left leg" icon_name = "l_leg" max_damage = 80 @@ -142,7 +142,7 @@ owner.Weaken(5) /obj/item/organ/external/leg/right - organ_tag = "r_leg" + organ_tag = BP_R_LEG name = "right leg" icon_name = "r_leg" body_part = LEG_RIGHT @@ -151,7 +151,7 @@ amputation_point = "right hip" /obj/item/organ/external/foot - organ_tag = "l_foot" + organ_tag = BP_L_FOOT name = "left foot" icon_name = "l_foot" max_damage = 50 @@ -159,7 +159,7 @@ w_class = ITEMSIZE_SMALL body_part = FOOT_LEFT icon_position = LEFT - parent_organ = "l_leg" + parent_organ = BP_L_LEG joint = "left ankle" amputation_point = "left ankle" can_stand = 1 @@ -186,24 +186,24 @@ owner.Weaken(5) /obj/item/organ/external/foot/right - organ_tag = "r_foot" + organ_tag = BP_R_FOOT name = "right foot" icon_name = "r_foot" body_part = FOOT_RIGHT icon_position = RIGHT - parent_organ = "r_leg" + parent_organ = BP_R_LEG joint = "right ankle" amputation_point = "right ankle" /obj/item/organ/external/hand - organ_tag = "l_hand" + organ_tag = BP_L_HAND name = "left hand" icon_name = "l_hand" max_damage = 50 min_broken_damage = 15 w_class = ITEMSIZE_SMALL body_part = HAND_LEFT - parent_organ = "l_arm" + parent_organ = BP_L_ARM joint = "left wrist" amputation_point = "left wrist" can_grasp = 1 @@ -229,17 +229,17 @@ if (. >= 2) if(prob(.)) owner.custom_pain("A jolt of pain surges through your [name]!",1) - if(organ_tag == "l_hand") //Specific level 2 'feature + if(organ_tag == BP_L_HAND) //Specific level 2 'feature owner.drop_l_hand() - else if(organ_tag == "r_hand") + else if(organ_tag == BP_R_HAND) owner.drop_r_hand() /obj/item/organ/external/hand/right - organ_tag = "r_hand" + organ_tag = BP_R_HAND name = "right hand" icon_name = "r_hand" body_part = HAND_RIGHT - parent_organ = "r_arm" + parent_organ = BP_R_ARM joint = "right wrist" amputation_point = "right wrist" diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 0e549897c1..957cf5927f 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -1,5 +1,5 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() -var/list/admin_departments = list("[using_map.boss_name]", "Virgo Prime Governmental Authority", "Supply") +var/list/admin_departments = list("[using_map.boss_name]", "Virgo-Prime Governmental Authority", "Supply") // Vorestation Edit var/list/alldepartments = list() var/list/adminfaxes = list() //cache for faxes that have been sent to admins @@ -182,7 +182,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins //message badmins that a fax has arrived if (destination == using_map.boss_name) message_admins(sender, "[uppertext(using_map.boss_short)] FAX", rcvdcopy, "CentComFaxReply", "#006100") - else if (destination == "Virgo Prime Governmental Authority") + else if (destination == "Virgo-Prime Governmental Authority") // Vorestation Edit message_admins(sender, "VIRGO GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0") else if (destination == "Supply") message_admins(sender, "[uppertext(using_map.boss_short)] SUPPLY FAX", rcvdcopy, "CentComFaxReply", "#5F4519") diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 9e090c2095..816b62a099 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -13,7 +13,8 @@ w_class = ITEMSIZE_TINY throw_range = 1 throw_speed = 1 - layer = 4 + plane = MOB_PLANE + layer = MOB_LAYER pressure_resistance = 1 slot_flags = SLOT_HEAD body_parts_covered = HEAD diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 23ac5ace63..2e3bfb2f79 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -8,7 +8,8 @@ w_class = ITEMSIZE_SMALL throw_range = 2 throw_speed = 1 - layer = 4 + plane = MOB_PLANE + layer = MOB_LAYER pressure_resistance = 1 attack_verb = list("bapped") var/page = 1 // current page diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index bb37a380b6..3b4833a533 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -19,7 +19,11 @@ internalPaper = newPaper flags = newPaper.flags color = newPaper.color - newPaper.forceMove(src) + if(isstorage(newPaper.loc)) + var/obj/item/weapon/storage/S = newPaper.loc + S.remove_from_storage(newPaper, src) + else + newPaper.forceMove(src) else internalPaper = new /obj/item/weapon/paper(src) update_icon() diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index d29dc212ac..3f585f323b 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -184,11 +184,18 @@ var/instant = 0 var/colourName = "red" //for updateIcon purposes - suicide_act(mob/user) - var/datum/gender/TU = gender_datums[user.get_visible_gender()] - viewers(user) << "[user] is jamming the [src.name] up [TU.his] nose and into [TU.his] brain. It looks like [TU.he] [TU.is] trying to commit suicide." - return (BRUTELOSS|OXYLOSS) +/obj/item/weapon/pen/crayon/suicide_act(mob/user) + var/datum/gender/TU = gender_datums[user.get_visible_gender()] + viewers(user) << "[user] is jamming the [src.name] up [TU.his] nose and into [TU.his] brain. It looks like [TU.he] [TU.is] trying to commit suicide." + return (BRUTELOSS|OXYLOSS) - New() - name = "[colourName] crayon" - ..() +/obj/item/weapon/pen/crayon/New() + name = "[colourName] crayon" + +/obj/item/weapon/pen/crayon/marker + name = "marker" + desc = "A chisel-tip permanent marker. Hopefully non-toxic." + icon_state = "markerred" + +/obj/item/weapon/pen/crayon/marker/New() + name = "[colourName] marker" diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 853705abed..5ad1e727da 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -53,7 +53,8 @@ var/list/possible_cable_coil_colours = list( icon_state = "0-1" var/d1 = 0 var/d2 = 1 - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + plane = PLATING_PLANE + layer = WIRES_LAYER color = COLOR_RED var/obj/machinery/power/breakerbox/breaker_box diff --git a/code/modules/power/cable_ender.dm b/code/modules/power/cable_ender.dm index 3276855271..d6975091ea 100644 --- a/code/modules/power/cable_ender.dm +++ b/code/modules/power/cable_ender.dm @@ -8,7 +8,8 @@ icon = 'icons/obj/power_cond_heavy.dmi' name = "large power cable" desc = "This cable is tough. It cannot be cut with simple hand tools." - layer = 2.39 //Just below pipes, which are at 2.4 + plane = PLATING_PLANE + layer = PIPES_LAYER - 0.05 //Just below pipes color = null unacidable = 1 var/id = null diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index 99c91a6b74..a286517965 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -7,7 +7,8 @@ icon = 'icons/obj/power_cond_heavy.dmi' name = "large power cable" desc = "This cable is tough. It cannot be cut with simple hand tools." - layer = 2.39 //Just below pipes, which are at 2.4 + plane = PLATING_PLANE + layer = PIPES_LAYER - 0.05 //Just below pipes color = null /obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 1c08294b6a..4db4d40c4c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -24,6 +24,11 @@ var/charge_delay = 0 // How long it takes for the cell to start recharging after last use matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) + // Overlay stuff. + var/overlay_half_state = "cell-o1" // Overlay used when not fully charged but not empty. + var/overlay_full_state = "cell-o2" // Overlay used when fully charged. + var/last_overlay_state = null // Used to optimize update_icon() calls. + /obj/item/weapon/cell/New() ..() charge = maxcharge @@ -55,15 +60,38 @@ return use(cell_amt) / CELLRATE -/obj/item/weapon/cell/update_icon() - overlays.Cut() +#define OVERLAY_FULL 2 +#define OVERLAY_PARTIAL 1 +#define OVERLAY_EMPTY 0 - if(charge < 0.01) - return - else if(charge/maxcharge >=0.995) - overlays += image('icons/obj/power.dmi', "cell-o2") - else - overlays += image('icons/obj/power.dmi', "cell-o1") +/obj/item/weapon/cell/update_icon() + var/new_overlay = null // The overlay that is needed. + // If it's different than the current overlay, then it'll get changed. + // Otherwise nothing happens, to save on CPU. + + if(charge < 0.01) // Empty. + new_overlay = OVERLAY_EMPTY + if(last_overlay_state != new_overlay) + cut_overlays() + + else if(charge/maxcharge >= 0.995) // Full + new_overlay = OVERLAY_FULL + if(last_overlay_state != new_overlay) + cut_overlay(overlay_half_state) + add_overlay(overlay_full_state) + + + else // Inbetween. + new_overlay = OVERLAY_PARTIAL + if(last_overlay_state != new_overlay) + cut_overlay(overlay_full_state) + add_overlay(overlay_half_state) + + last_overlay_state = new_overlay + +#undef OVERLAY_FULL +#undef OVERLAY_PARTIAL +#undef OVERLAY_EMPTY /obj/item/weapon/cell/proc/percent() // return % charge of cell return 100.0*charge/maxcharge diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm index ef1c3716fa..1efb09d777 100644 --- a/code/modules/power/fusion/core/core_field.dm +++ b/code/modules/power/fusion/core/core_field.dm @@ -9,7 +9,8 @@ icon = 'icons/obj/machines/power/fusion.dmi' icon_state = "emfield_s1" alpha = 50 - layer = 4 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER light_color = "#cc7700" var/size = 1 diff --git a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm index 468f24510a..29d9362015 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm @@ -2,7 +2,6 @@ name = "fuel rod assembly" icon = 'icons/obj/machines/power/fusion.dmi' icon_state = "fuel_assembly" - layer = 4 var/material_name diff --git a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm index 6a0f1bc205..375af68696 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm @@ -4,7 +4,6 @@ icon_state = "fuel_compressor1" density = 1 anchored = 1 - layer = 4 circuit = /obj/item/weapon/circuitboard/fusion_fuel_compressor diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index e90b78cf23..5a7d8b363b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -16,7 +16,8 @@ icon = 'icons/obj/lighting.dmi' icon_state = "tube-construct-stage1" anchored = 1 - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER var/stage = 1 var/fixture_type = "tube" var/sheets_refunded = 2 @@ -132,7 +133,6 @@ icon = 'icons/obj/lighting.dmi' icon_state = "bulb-construct-stage1" anchored = 1 - layer = 5 stage = 1 fixture_type = "bulb" sheets_refunded = 1 @@ -143,6 +143,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "flamp-construct-stage1" anchored = 0 + plane = OBJ_PLANE layer = OBJ_LAYER stage = 1 fixture_type = "flamp" @@ -156,7 +157,8 @@ icon_state = "tube1" desc = "A lighting fixture." anchored = 1 - layer = 5 // They were appearing under mobs which is a little weird - Ostaf + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER use_power = 2 idle_power_usage = 2 active_power_usage = 20 @@ -197,6 +199,7 @@ fitting = "bulb" brightness_range = 5 brightness_power = 2 + plane = OBJ_PLANE layer = OBJ_LAYER brightness_color = "#FFF4E5" desc = "A floor lamp." @@ -204,11 +207,6 @@ shows_alerts = FALSE var/lamp_shade = 1 -//Vorestation addition, to override the New() proc further below, since this is a lamp. -/obj/machinery/light/flamp/New() - ..() - layer = OBJ_LAYER - /obj/machinery/light/small/emergency brightness_range = 4 brightness_power = 2 @@ -259,9 +257,6 @@ broken(1) spawn(1) update(0) - //Vorestation addition, so large mobs stop looking stupid in front of lights. - if (dir == 2) - layer = 5 /obj/machinery/light/Destroy() var/area/A = get_area(src) diff --git a/code/modules/power/lighting_vr.dm b/code/modules/power/lighting_vr.dm index 5583716d57..fb4a15a883 100644 --- a/code/modules/power/lighting_vr.dm +++ b/code/modules/power/lighting_vr.dm @@ -1,26 +1,19 @@ // I hate the way macros look stupid standing near lights. I don't care how absurd this looks. /obj/machinery/light_construct - layer = 4 - -/obj/machinery/light_construct/small - layer = 4 - -/obj/machinery/light_construct/flamp - layer = 4 - + layer = BELOW_MOB_LAYER /obj/machinery/light - layer = 4 + layer = BELOW_MOB_LAYER //Vorestation addition, to override the New() proc further below, since this is a lamp. /obj/machinery/light/flamp/New() ..() - layer = 4 + layer = initial(layer) // create a new lighting fixture /obj/machinery/light/New() ..() //Vorestation addition, so large mobs stop looking stupid in front of lights. - if (dir == 2) - layer = 5 \ No newline at end of file + if (dir == SOUTH) // Lights are backwards, SOUTH lights face north (they are on south wall) + layer = ABOVE_MOB_LAYER diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm index d082b17922..20c8837b32 100644 --- a/code/modules/power/sensors/powernet_sensor.dm +++ b/code/modules/power/sensors/powernet_sensor.dm @@ -12,7 +12,7 @@ desc = "Small machine which transmits data about specific powernet" anchored = 1 density = 0 - layer = 2.46 // Above cables, but should be below floors. + layer = ABOVE_UTILITY icon = 'icons/obj/objects.dmi' icon_state = "floor_beacon" // If anyone wants to make better sprite, feel free to do so without asking me. diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 827bd9aefd..eaca5bd663 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -165,6 +165,7 @@ "You undo the external reinforcing bolts.", \ "You hear a ratchet.") src.anchored = 0 + disconnect_from_network() if(2) user << "\The [src] needs to be unwelded from the floor." return diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index a98c0d3718..df5d8997f3 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -7,7 +7,7 @@ icon_state = "singularity_s1" anchored = 1 density = 1 - layer = 6 + plane = ABOVE_PLANE light_range = 6 unacidable = 1 //Don't comment this out. diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index a1f2fbf030..2c01476a7a 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -8,10 +8,10 @@ icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." level = 1 - layer = TURF_LAYER var/obj/machinery/power/master = null anchored = 1 - layer = 2.6 // a bit above wires + plane = PLATING_PLANE + layer = WIRES_LAYER+0.01 /obj/machinery/power/terminal/New() diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 0e9cf95eb6..94cf0ab21e 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -50,6 +50,7 @@ /obj/item/ammo_magazine/s38/rubber name = "speedloader (.38 rubber)" + icon_state = "T38" ammo_type = /obj/item/ammo_casing/a38r /obj/item/ammo_magazine/s38/emp @@ -493,6 +494,23 @@ max_ammo = 9 multiple_sprites = 1 +/obj/item/ammo_magazine/s44 + name = "speedloader (.44)" + icon_state = "44" + ammo_type = /obj/item/ammo_casing/a44 + matter = list(DEFAULT_WALL_MATERIAL = 1260) //metal costs are very roughly based around 1 .45 casing = 75 metal + caliber = ".44" + max_ammo = 6 + multiple_sprites = 1 + +/obj/item/ammo_magazine/s44/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/s44/rubber + name = "speedloader (.44 rubber)" + icon_state = "R44" + ammo_type = /obj/item/ammo_casing/a44r + ///////// 7.62mm ///////// /obj/item/ammo_magazine/m762 diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm index 330e11d89b..028d1cac1e 100644 --- a/code/modules/projectiles/ammunition/rounds.dm +++ b/code/modules/projectiles/ammunition/rounds.dm @@ -59,6 +59,12 @@ caliber = ".44" projectile_type = /obj/item/projectile/bullet/pistol/strong +/obj/item/ammo_casing/a44r + icon_state = "r-casing" + desc = "A .44 rubber bullet casing." + caliber = ".44" + projectile_type = /obj/item/projectile/bullet/pistol/rubber/strong + /* * .75 (aka Gyrojet Rockets, aka admin abuse) */ diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index ba6a749ebe..da21427eff 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -1,7 +1,7 @@ /obj/effect/projectile icon = 'icons/effects/projectiles.dmi' icon_state = "bolt" - layer = 20 + plane = ABOVE_PLANE /obj/effect/projectile/New(var/turf/location) if(istype(location)) @@ -267,4 +267,25 @@ icon_state = "impact_darkb" light_range = 2 light_power = 0.5 - light_color = "#8837A3" \ No newline at end of file + light_color = "#8837A3" + +//---------------------------- +// Inversion / Cult +//---------------------------- +/obj/effect/projectile/inversion/tracer + icon_state = "invert" + light_range = 2 + light_power = -2 + light_color = "#FFFFFF" + +/obj/effect/projectile/inversion/muzzle + icon_state = "muzzle_invert" + light_range = 2 + light_power = -2 + light_color = "#FFFFFF" + +/obj/effect/projectile/inversion/impact + icon_state = "impact_invert" + light_range = 2 + light_power = -2 + light_color = "#FFFFFF" \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index aa3faa7468..ffe7f898da 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -58,6 +58,7 @@ var/move_delay = 1 var/fire_sound = 'sound/weapons/Gunshot.ogg' var/fire_sound_text = "gunshot" + var/fire_anim = null var/recoil = 0 //screen shake var/silenced = 0 var/muzzle_flash = 3 @@ -171,6 +172,10 @@ return 0 if(!user.IsAdvancedToolUser()) return 0 + if(isanimal(user)) + var/mob/living/simple_animal/S = user + if(!S.IsHumanoidToolUser(src)) + return 0 var/mob/living/M = user if(dna_lock && attached_lock.stored_dna) @@ -492,7 +497,7 @@ if(!(target && target.loc)) target = targloc //pointblank = 0 - + var/target_for_log if(ismob(target)) target_for_log = target @@ -533,6 +538,9 @@ //called after successfully firing /obj/item/weapon/gun/proc/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0) + if(fire_anim) + flick(fire_anim, src) + if(silenced) if(reflex) user.visible_message( diff --git a/code/modules/projectiles/guns/energy/nuclear_vr.dm b/code/modules/projectiles/guns/energy/nuclear_vr.dm new file mode 100644 index 0000000000..313fcd37d5 --- /dev/null +++ b/code/modules/projectiles/guns/energy/nuclear_vr.dm @@ -0,0 +1,14 @@ +/* +// Virgo's very own file for overriding Polaris' eguns! Should include: Regular egun, Advanced egun, burst egun, mounted egun +// +// NOTICE: All the eguns are child objects of the base thing. If you modify the base egun, all the other eguns will inherit it unless they explicitly override it. +*/ + +/obj/item/weapon/gun/energy/gun + icon = 'icons/obj/eguns_vr.dmi' //makes the egun look for icons here instead. ALL of the eguns. + +/obj/item/weapon/gun/energy/gun/burst + icon = 'icons/obj/gun.dmi' //Points it back at the default file so eguns_vr.dmi doesn't need to mirror all the sprites + +/obj/item/weapon/gun/energy/gun/nuclear + icon = 'icons/obj/gun.dmi' //Points it back at the default file so eguns_vr.dmi doesn't need to mirror all the sprites \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index b33cf11950..481530856f 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -118,7 +118,6 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun() return 1 - // Blade Runner pistol. /obj/item/weapon/gun/projectile/revolver/deckard name = "\improper Deckard .38" @@ -259,3 +258,24 @@ obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun() to_chat(user, "\The [src] has a secondary barrel loaded with \a [to_print]") else to_chat(user, "\The [src] has a secondary barrel that is empty.") + + +//Ported from Bay +/obj/item/weapon/gun/projectile/revolver/webley + name = "service revolver" + desc = "A rugged top break revolver based on the Webley Mk. VI model, with modern improvements. Uses .44 magnum rounds." + icon_state = "webley2" + item_state = "webley2" + caliber = ".44" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + handle_casings = CYCLE_CASINGS + max_shells = 6 + ammo_type = /obj/item/ammo_casing/a44 + +/obj/item/weapon/gun/projectile/revolver/webley/auto + name = "autorevolver" + icon_state = "mosley" + desc = "A shiny Mosley Autococker automatic revolver, with black accents. Marketed as the 'Revolver for the Modern Era'. Uses .44 magnum rounds." + fire_delay = 5.7 //Autorevolver. Also synced with the animation + fire_anim = "mosley_fire" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8afe135876..b398de7d2f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -49,6 +49,7 @@ //Effects var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 maybe later for burst of fire around the impact point. - Mech var/flammability = 0 //Amount of fire stacks to add for the above. + var/combustion = TRUE //Does this set off flammable objects on fire/hit? var/stun = 0 var/weaken = 0 var/paralyze = 0 @@ -90,6 +91,10 @@ //called when the projectile stops flying because it collided with something /obj/item/projectile/proc/on_impact(var/atom/A) impact_effect(effect_transform) // generate impact effect + if(damage && damage_type == BURN) + var/turf/T = get_turf(A) + if(T) + T.hotspot_expose(700, 5) return //Checks if the projectile is eligible for embedding. Not that it necessarily will. @@ -132,6 +137,9 @@ if (!istype(targloc) || !istype(curloc)) return 1 + if(combustion) + curloc.hotspot_expose(700, 5) + if(targloc == curloc) //Shooting something in the same turf target.bullet_act(src, target_zone) on_impact(target) diff --git a/code/modules/projectiles/projectile/animate.dm b/code/modules/projectiles/projectile/animate.dm index c09b98a32b..e88e6faa33 100644 --- a/code/modules/projectiles/projectile/animate.dm +++ b/code/modules/projectiles/projectile/animate.dm @@ -8,6 +8,7 @@ light_range = 2 light_power = 0.5 light_color = "#55AAFF" + combustion = FALSE /obj/item/projectile/animate/Bump(var/atom/change) if((istype(change, /obj/item) || istype(change, /obj/structure)) && !is_type_in_list(change, protected_objects)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 6fee571544..9755f604ab 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -122,6 +122,8 @@ check_armour = "laser" light_color = "#0066FF" + combustion = FALSE + muzzle_type = /obj/effect/projectile/laser_blue/muzzle tracer_type = /obj/effect/projectile/laser_blue/tracer impact_type = /obj/effect/projectile/laser_blue/impact @@ -142,6 +144,8 @@ check_armour = "laser" light_color = "#FF0D00" + combustion = FALSE + /obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0) if(istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/M = target @@ -157,6 +161,8 @@ check_armour = "laser" light_color = "#00C6FF" + combustion = FALSE + muzzle_type = /obj/effect/projectile/laser_omni/muzzle tracer_type = /obj/effect/projectile/laser_omni/tracer impact_type = /obj/effect/projectile/laser_omni/impact @@ -190,6 +196,8 @@ damage_type = HALLOSS light_color = "#FFFFFF" + combustion = FALSE + muzzle_type = /obj/effect/projectile/stun/muzzle tracer_type = /obj/effect/projectile/stun/tracer impact_type = /obj/effect/projectile/stun/impact diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 02eab7e93a..36a93a89b0 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -147,6 +147,14 @@ fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg' damage = 60 +/obj/item/projectile/bullet/pistol/rubber/strong //"rubber" bullets for revolvers and matebas + fire_sound = 'sound/weapons/gunshot/gunshot_strong.ogg' + damage = 10 + agony = 60 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + /obj/item/projectile/bullet/pistol/rubber //"rubber" bullets name = "rubber bullet" damage = 5 @@ -191,6 +199,8 @@ sharp = 0 check_armour = "melee" + combustion = FALSE + /obj/item/projectile/bullet/shotgun/ion/on_hit(var/atom/target, var/blocked = 0) ..() empulse(target, 0, 0, 0, 0) //Only affects what it hits @@ -325,6 +335,8 @@ embed_chance = 0 sharp = 0 + combustion = FALSE + /obj/item/projectile/bullet/pistol/cap/process() loc = null qdel(src) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 6f19b29bbb..0beffe46a3 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -6,6 +6,8 @@ nodamage = 1 check_armour = "energy" + combustion = FALSE + /obj/item/projectile/change/on_hit(var/atom/change) wabbajack(change) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 0cbb96a2e0..d5bae0dc22 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -92,6 +92,7 @@ light_power = 0.5 light_color = "#33CC00" + combustion = FALSE /obj/item/projectile/energy/dart name = "dart" @@ -101,6 +102,7 @@ agony = 120 check_armour = "energy" + combustion = FALSE /obj/item/projectile/energy/bolt name = "bolt" @@ -122,6 +124,8 @@ agony = 10 check_armour = "bio" + combustion = FALSE + /obj/item/projectile/energy/neurotoxin name = "neurotoxic spit" icon_state = "neurotoxin" @@ -130,6 +134,8 @@ agony = 80 check_armour = "bio" + combustion = FALSE + /obj/item/projectile/energy/neurotoxin/toxic //New alien mob projectile to match the player-variant's projectiles. name = "neurotoxic spit" icon_state = "neurotoxin" @@ -149,6 +155,8 @@ light_power = 0.5 light_color = "#33CC00" + combustion = FALSE + /obj/item/projectile/energy/plasmastun name = "plasma pulse" icon_state = "plasma_stun" diff --git a/code/modules/projectiles/projectile/force.dm b/code/modules/projectiles/projectile/force.dm index 71b7d34d04..550aab6113 100644 --- a/code/modules/projectiles/projectile/force.dm +++ b/code/modules/projectiles/projectile/force.dm @@ -5,6 +5,8 @@ damage = 20 check_armour = "energy" + combustion = FALSE + /obj/item/projectile/forcebolt/strong name = "force bolt" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 4e366bed6d..f7ecddb0eb 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -9,6 +9,9 @@ light_range = 2 light_power = 0.5 light_color = "#55AAFF" + + combustion = FALSE + var/sev1_range = 0 var/sev2_range = 1 var/sev3_range = 1 @@ -56,6 +59,8 @@ light_power = 0.5 light_color = "#55AAFF" + combustion = FALSE + /obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE) ..() if(isliving(target)) @@ -85,6 +90,8 @@ name = "heat beam" target_temperature = 1000 + combustion = TRUE + /obj/item/projectile/meteor name = "meteor" icon = 'icons/obj/meteor.dmi' @@ -127,6 +134,8 @@ light_power = 0.5 light_color = "#33CC00" + combustion = FALSE + /obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0) var/mob/living/M = target if(ishuman(target)) @@ -196,6 +205,8 @@ /obj/item/projectile/beam/mindflayer name = "flayer ray" + combustion = FALSE + /obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) var/mob/living/carbon/human/M = target @@ -218,6 +229,8 @@ damage_type = HALLOSS muzzle_type = null + combustion = FALSE + /obj/item/projectile/bola/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) var/mob/living/carbon/human/M = target @@ -235,6 +248,8 @@ damage_type = BRUTE muzzle_type = null + combustion = FALSE + /obj/item/projectile/webball/on_hit(var/atom/target, var/blocked = 0) if(isturf(target.loc)) var/obj/effect/spider/stickyweb/W = locate() in get_turf(target) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 1ac48546f5..3587e2f36a 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -281,7 +281,6 @@ name = "All-In-One Grinder" icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" - layer = 2.9 density = 0 anchored = 0 use_power = 1 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index d07480735a..ea27e02e4d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -453,6 +453,9 @@ if(adj_temp < 0 && M.bodytemperature > 310) M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT)) +/datum/reagent/drink/overdose(var/mob/living/carbon/M, var/alien) //Add special interactions here in the future if desired. + ..() + // Juices /datum/reagent/drink/juice/banana @@ -1047,11 +1050,14 @@ adj_dizzy = -5 adj_drowsy = -3 adj_sleepy = -2 - overdose = 45 + glass_name = "Coffee Milkshake" glass_desc = "An energizing coffee milkshake, perfect for hot days at work.." +/datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien) + M.make_jittery(5) + /datum/reagent/drink/rewriter name = "Rewriter" id = "rewriter" @@ -2847,4 +2853,4 @@ adj_temp = -5 glass_name = "Mint Julep" - glass_desc = "Minty and refreshing, perfect for a hot day." \ No newline at end of file + glass_desc = "Minty and refreshing, perfect for a hot day." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index dbe729ccdb..0b74e5aaf3 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -549,7 +549,7 @@ /datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER) - + //Based roughly on Levofloxacin's rather severe side-effects if(prob(20)) M.Confuse(5) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 9b15c07b70..6c83b0e26d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -49,6 +49,60 @@ id = "crayon_dust_brown" color = "#846F35" +/datum/reagent/marker_ink + name = "Marker ink" + id = "marker_ink" + description = "Intensely coloured ink used in markers." + taste_description = "extremely bitter" + reagent_state = LIQUID + color = "#888888" + overdose = 5 + +/datum/reagent/marker_ink/black + name = "Black marker ink" + id = "marker_ink_black" + color = "#000000" + +/datum/reagent/marker_ink/red + name = "Red marker ink" + id = "marker_ink_red" + color = "#FE191A" + +/datum/reagent/marker_ink/orange + name = "Orange marker ink" + id = "marker_ink_orange" + color = "#FFBE4F" + +/datum/reagent/marker_ink/yellow + name = "Yellow marker ink" + id = "marker_ink_yellow" + color = "#FDFE7D" + +/datum/reagent/marker_ink/green + name = "Green marker ink" + id = "marker_ink_green" + color = "#18A31A" + +/datum/reagent/marker_ink/blue + name = "Blue marker ink" + id = "marker_ink_blue" + color = "#247CFF" + +/datum/reagent/marker_ink/purple + name = "Purple marker ink" + id = "marker_ink_purple" + color = "#CC0099" + +/datum/reagent/marker_ink/grey //Mime + name = "Grey marker ink" + id = "marker_ink_grey" + color = "#808080" + +/datum/reagent/marker_ink/brown //Rainbow + name = "Brown marker ink" + id = "marker_ink_brown" + color = "#846F35" + /datum/reagent/paint name = "Paint" id = "paint" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 4ecce09475..4a4265838f 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -881,7 +881,7 @@ name = "Red paint" id = "red_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_red" = 1) result_amount = 5 /datum/chemical_reaction/red_paint/send_data() @@ -891,7 +891,7 @@ name = "Orange paint" id = "orange_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_orange" = 1) result_amount = 5 /datum/chemical_reaction/orange_paint/send_data() @@ -901,7 +901,7 @@ name = "Yellow paint" id = "yellow_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_yellow" = 1) result_amount = 5 /datum/chemical_reaction/yellow_paint/send_data() @@ -911,7 +911,7 @@ name = "Green paint" id = "green_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_green" = 1) result_amount = 5 /datum/chemical_reaction/green_paint/send_data() @@ -921,7 +921,7 @@ name = "Blue paint" id = "blue_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_blue" = 1) result_amount = 5 /datum/chemical_reaction/blue_paint/send_data() @@ -931,7 +931,7 @@ name = "Purple paint" id = "purple_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_purple" = 1) result_amount = 5 /datum/chemical_reaction/purple_paint/send_data() @@ -941,7 +941,7 @@ name = "Grey paint" id = "grey_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_grey" = 1) result_amount = 5 /datum/chemical_reaction/grey_paint/send_data() @@ -951,7 +951,7 @@ name = "Brown paint" id = "brown_paint" result = "paint" - required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1) + required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_brown" = 1) result_amount = 5 /datum/chemical_reaction/brown_paint/send_data() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 28b06a862d..68cc9d6921 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -216,7 +216,8 @@ if(trans) to_chat(user, "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.") - add_attack_logs(user,target,"Injected with [src.name] containing [contained], trasferred [trans] units") + if(ismob(target)) + add_attack_logs(user,target,"Injected with [src.name] containing [contained], trasferred [trans] units") else to_chat(user, "The syringe is empty.") diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 2933ee9727..dd431e2de9 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -6,7 +6,8 @@ icon_state = "conveyor0" name = "conveyor belt" desc = "A conveyor belt." - layer = 2 // so they appear under stuff + plane = TURF_PLANE + layer = ABOVE_TURF_LAYER anchored = 1 circuit = /obj/item/weapon/circuitboard/conveyor var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off @@ -22,8 +23,8 @@ id = "round_end_belt" // create a conveyor -/obj/machinery/conveyor/New(loc, newdir, on = 0) - ..(loc) +/obj/machinery/conveyor/initialize(mapload, newdir, on = 0) + . = ..() if(newdir) set_dir(newdir) @@ -104,7 +105,7 @@ id = input for(var/obj/machinery/conveyor_switch/C in world) if(C.id == id) - C.conveyors += src + C.conveyors |= src return user.drop_item(get_turf(src)) @@ -157,12 +158,6 @@ if(C) C.set_operable(stepdir, id, op) -/* -/obj/machinery/conveyor/verb/destroy() - set src in view() - src.broken() -*/ - /obj/machinery/conveyor/power_change() ..() update() @@ -188,15 +183,16 @@ -/obj/machinery/conveyor_switch/New() +/obj/machinery/conveyor_switch/initialize() ..() update() + return INITIALIZE_HINT_LATELOAD - spawn(5) // allow map load - conveyors = list() - for(var/obj/machinery/conveyor/C in world) - if(C.id == id) - conveyors += C +/obj/machinery/conveyor_switch/LateInitialize() + conveyors = list() + for(var/obj/machinery/conveyor/C in world) + if(C.id == id) + conveyors += C // update the icon depending on the position @@ -272,6 +268,7 @@ usr << "No input found please hang up and try your call again." return id = input + conveyors = list() // Clear list so they aren't double added. for(var/obj/machinery/conveyor/C in world) if(C.id == id) conveyors += C diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index e9b59dd14f..07c8429bfb 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -663,7 +663,8 @@ var/dpdir = 0 // bitmask of pipe directions dir = 0 // dir will contain dominant direction for junction pipes var/health = 10 // health points 0-10 - layer = 2.3 // slightly lower than wires and other pipes + plane = PLATING_PLANE + layer = DISPOSAL_LAYER // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map var/sortType = "" var/subtype = 0 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 649d041db2..f90fd1c313 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1802,6 +1802,22 @@ CIRCUITS BELOW build_path = /obj/item/device/universal_translator/ear sort_string = "HABQB" +/datum/design/obj/item/device/xenoarch_multi_tool + name = "xenoarcheology multitool" + id = "xenoarch_multitool" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) + build_path = /obj/item/device/xenoarch_multi_tool + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) + sort_string = "HABQC" + +/datum/design/excavationdrill + name = "Excavation Drill" + id = "excavationdrill" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/weapon/pickaxe/excavationdrill + /* Uncomment if someone makes these buildable /datum/design/circuit/general_alert name = "general alert console" diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index b2f21d58c4..02b71645da 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -1,11 +1,3 @@ -/datum/design/excavationdrill - name = "Excavation Drill" - desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The silver tip is adjustable from 1 to 30 cm." - id = "excavationdrill" - req_tech = list(TECH_MATERIAL = 4, TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) //They were never used before. Now they'll be used. Hopefully. - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 1000, "silver" = 1000) - build_path = /obj/item/weapon/pickaxe/excavationdrill /* Make language great again /datum/design/item/implant/language name = "Language implant" @@ -181,6 +173,13 @@ build_path = /obj/item/weapon/circuitboard/bomb_tester sort_string = "HABAG" +/datum/design/circuit/quantum_pad + name = "Quantum Pad" + id = "quantum_pad" + req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/weapon/circuitboard/quantumpad + sort_string = "HABAH" + ////// RIGSuit Stuff /* /datum/design/item/rig diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index e558a2621e..023d5fee95 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -15,7 +15,8 @@ icon_state = "shield" alpha = 100 anchored = 1 - layer = 4.1 //just above mobs + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER density = 0 var/obj/machinery/shield_gen/my_gen = null var/strength = 0 // in Renwicks diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm index 1302513bfe..e96985e9bb 100644 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -56,7 +56,8 @@ How they spawn stuff is decided by behaviour vars, which are explained below animation.density = 0 animation.anchored = 1 animation.icon = 'icons/effects/effects.dmi' - animation.layer = 3 + animation.plane = OBJ_PLANE + animation.layer = ABOVE_JUNK_LAYER animation.master = summoned_object for(var/varName in newVars) diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/code/modules/spells/aoe_turf/conjure/construct.dm index 3885e16ad8..82bba0198a 100644 --- a/code/modules/spells/aoe_turf/conjure/construct.dm +++ b/code/modules/spells/aoe_turf/conjure/construct.dm @@ -1,5 +1,9 @@ //////////////////////////////Construct Spells///////////////////////// +/* + * This has been moved to game/gamemodes/cult/construct_spells.dm. This is here for posterity. + */ +/* /spell/aoe_turf/conjure/construct name = "Artificer" desc = "This spell conjures a construct which may be controlled by Shades" @@ -110,6 +114,44 @@ continue return +/spell/aoe_turf/conjure/door + name = "Stone Door" + desc = "This spell conjures a massive stone door." + + charge_max = 100 + spell_flags = CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + hud_state = "const_rune" + +/spell/aoe_turf/conjure/door/cast(list/targets) + ..() + var/turf/spawn_place = pick(targets) + if(spawn_place) + new /obj/structure/simple_door/cult(spawn_place) + return + +/spell/aoe_turf/conjure/grille + name = "Arcane Grille" + desc = "This spell conjures an airtight grille." + + charge_max = 100 + spell_flags = CONSTRUCT_CHECK + invocation = "none" + invocation_type = SpI_NONE + range = 0 + + hud_state = "const_rune" + +/spell/aoe_turf/conjure/grille/cast(list/targets) + ..() + var/turf/spawn_place = pick(targets) + if(spawn_place) + new /obj/structure/grille/cult(spawn_place) + return + /spell/aoe_turf/conjure/forcewall/lesser name = "Shield" desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats" @@ -135,3 +177,4 @@ /obj/effect/forcefield/cult/cultify() return +*/ \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm index 3b3cae83d6..6766a42eb9 100644 --- a/code/modules/spells/aoe_turf/knock.dm +++ b/code/modules/spells/aoe_turf/knock.dm @@ -22,7 +22,7 @@ door.open() return - +/* Moved to game/gamemodes/cult/construct_spells.dm. //Construct version /spell/aoe_turf/knock/harvester name = "Disintegrate Doors" @@ -41,4 +41,5 @@ for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) spawn door.cultify() - return \ No newline at end of file + return +*/ \ No newline at end of file diff --git a/code/modules/spells/construct_spells.dm b/code/modules/spells/construct_spells.dm index b2cec77dbc..aac7592f33 100644 --- a/code/modules/spells/construct_spells.dm +++ b/code/modules/spells/construct_spells.dm @@ -1,5 +1,8 @@ //////////////////////////////Construct Spells///////////////////////// - +/* + * Moved to game/gamemodes/cult/construct_spells.dm. Here for posterity. + */ +/* proc/findNullRod(var/atom/target) if(istype(target,/obj/item/weapon/nullrod)) return 1 @@ -8,3 +11,4 @@ proc/findNullRod(var/atom/target) if(findNullRod(A)) return 1 return 0 +*/ \ No newline at end of file diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index e48db592ad..68cf35e9a4 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -26,7 +26,8 @@ animation.density = 0 animation.anchored = 1 animation.icon = 'icons/mob/mob.dmi' - animation.layer = 5 + animation.plane = MOB_PLANE + animation.layer = ABOVE_MOB_LAYER animation.master = holder target.ExtinguishMob() if(target.buckled) diff --git a/code/modules/spells/targeted/harvest.dm b/code/modules/spells/targeted/harvest.dm index 6903efbfd9..7a8d986a02 100644 --- a/code/modules/spells/targeted/harvest.dm +++ b/code/modules/spells/targeted/harvest.dm @@ -1,3 +1,10 @@ + +/* + * Here for posterity. Moved to game/gamemodes/cult/construct_spells.dm, though it has been disabled there. + */ + + +/* /spell/targeted/harvest name = "Harvest" desc = "Back to where I come from, and you're coming with me." @@ -34,3 +41,4 @@ user << "You warp back to Nar-Sie[prey ? " along with your prey":""]." else user << "...something's wrong!"//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world. +*/ \ No newline at end of file diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm index 8f8ef57e51..f6634640dc 100644 --- a/code/modules/spells/targeted/shift.dm +++ b/code/modules/spells/targeted/shift.dm @@ -1,3 +1,8 @@ +/* + * This has been moved to game/gamemodes/cult/construct_spells.dm. This is here for posterity. + */ + +/* /spell/targeted/ethereal_jaunt/shift name = "Phase Shift" desc = "This spell allows you to pass through walls" @@ -21,4 +26,5 @@ flick("phase_shift2",animation) /spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) - return \ No newline at end of file + return +*/ \ No newline at end of file diff --git a/code/modules/tables/flipping.dm b/code/modules/tables/flipping.dm index 670edd01d8..5de58c1354 100644 --- a/code/modules/tables/flipping.dm +++ b/code/modules/tables/flipping.dm @@ -84,7 +84,8 @@ set_dir(direction) if(dir != NORTH) - layer = 5 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER climbable = 0 //flipping tables allows them to be used as makeshift barriers flipped = 1 flags |= ON_BORDER @@ -102,7 +103,7 @@ verbs -=/obj/structure/table/proc/do_put verbs +=/obj/structure/table/verb/do_flip - layer = initial(layer) + reset_plane_and_layer() flipped = 0 climbable = initial(climbable) flags &= ~ON_BORDER diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 428dd386a4..24e599cc31 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -8,7 +8,7 @@ var/list/table_icon_cache = list() density = 1 anchored = 1 climbable = 1 - layer = 2.8 + layer = TABLE_LAYER throwpass = 1 surgery_odds = 66 var/flipped = 0 @@ -176,6 +176,21 @@ var/list/table_icon_cache = list() visible_message("\The [user] tears apart \the [src]!") src.break_to_parts() +/obj/structure/table/attack_generic(mob/user as mob, var/damage) + if(damage >= 10) + if(reinforced && prob(70)) + visible_message("\The [user] smashes against \the [src]!") + take_damage(damage/2) + user.do_attack_animation(src) + ..() + else + visible_message("\The [user] tears apart \the [src]!") + src.break_to_parts() + user.do_attack_animation(src) + return 1 + visible_message("\The [user] scratches at \the [src]!") + return ..() + /obj/structure/table/MouseDrop_T(obj/item/stack/material/what) if(can_reinforce && isliving(usr) && (!usr.stat) && istype(what) && usr.get_active_hand() == what && Adjacent(usr)) reinforce_table(what, usr) diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm index ac5d7becd7..5143733a47 100644 --- a/code/modules/telesci/construction.dm +++ b/code/modules/telesci/construction.dm @@ -20,6 +20,18 @@ /obj/item/stack/cable_coil = 5, /obj/item/weapon/stock_parts/console_screen = 1) +// Bamfpads! Ported from /tg/ +/obj/item/weapon/circuitboard/quantumpad + name = T_BOARD("quantum pad") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/power/quantumpad + origin_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 4, TECH_BLUESPACE = 4) + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 1, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 5) + // The Designs /datum/design/circuit/telesci_console @@ -44,10 +56,17 @@ build_path = /obj/item/device/gps/advanced sort_string = "HAAEB" +/datum/design/circuit/quantum_pad + name = "Quantum Pad" + id = "quantum_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/quantumpad + sort_string = "HAAC" + /datum/design/item/bluespace_crystal name = "Artificial Bluespace Crystal" id = "bluespace_crystal" req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) materials = list("diamond" = 1500, "phoron" = 1500) build_path = /obj/item/weapon/ore/bluespace_crystal/artificial - sort_string = "HAAEC" + sort_string = "HAAED" \ No newline at end of file diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm new file mode 100644 index 0000000000..6919dc795f --- /dev/null +++ b/code/modules/telesci/quantum_pad.dm @@ -0,0 +1,189 @@ +/obj/machinery/power/quantumpad + name = "quantum pad" + desc = "A bluespace quantum-linked telepad used for teleporting objects to other quantum pads." + icon = 'icons/obj/telescience.dmi' + icon_state = "qpad-idle" + anchored = TRUE + use_power = 1 + idle_power_usage = 200 + active_power_usage = 5000 + circuit = /obj/item/weapon/circuitboard/quantumpad + var/teleport_cooldown = 400 //30 seconds base due to base parts + var/teleport_speed = 50 + var/last_teleport //to handle the cooldown + var/teleporting = 0 //if it's in the process of teleporting + var/power_efficiency = 1 + var/obj/machinery/power/quantumpad/linked_pad + + //mapping + var/static/list/mapped_quantum_pads = list() + var/map_pad_id = "" as text //what's my name + var/map_pad_link_id = "" as text //who's my friend + +/obj/machinery/power/quantumpad/initialize() + . = ..() + default_apply_parts() + connect_to_network() + if(map_pad_id) + mapped_quantum_pads[map_pad_id] = src + +/obj/machinery/power/quantumpad/Destroy() + mapped_quantum_pads -= map_pad_id + return ..() + +/obj/machinery/power/quantumpad/RefreshParts() + var/E = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + E += M.rating + power_efficiency = E + + E = 0 + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + E += C.rating + + teleport_speed = initial(teleport_speed) + teleport_speed -= (E*10) + teleport_cooldown = initial(teleport_cooldown) + teleport_cooldown -= (E * 100) + +/obj/machinery/power/quantumpad/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, I)) + return + + if(istype(I, /obj/item/device/multitool)) + if(panel_open) + var/obj/item/device/multitool/M = I + M.buffer = src + to_chat(user, "You save the data in [I]'s buffer.") + return 1 + else + var/obj/item/device/multitool/M = I + if(istype(M.buffer, /obj/machinery/power/quantumpad)) + linked_pad = M.buffer + to_chat(user, "You link [src] to the one in [I]'s buffer.") + return 1 + + if(default_part_replacement(user, I)) + return + + if(default_deconstruction_crowbar(I)) + return + + return ..() + +/obj/machinery/power/quantumpad/update_icon() + . = ..() + + if(inoperable() || panel_open) + icon_state = "pad-idle-o" + else + icon_state = initial(icon_state) + +/obj/machinery/power/quantumpad/attack_hand(mob/user) + . = ..() + if(.) + return + if(panel_open) + to_chat(user, "The panel must be closed before operating this machine!") + return + + if(istype(get_area(src), /area/shuttle)) + to_chat(user, "This is too unstable a platform for \the [src] to operate on!") + return + + if(!powernet) + to_chat(user, "[src] is not attached to a powernet!") + return + + if(!linked_pad || QDELETED(linked_pad)) + if(!map_pad_link_id || !initMappedLink()) + to_chat(user, "There is no linked pad!") + return + + if(world.time < last_teleport + teleport_cooldown) + to_chat(user, "[src] is recharging power. Please wait [round((last_teleport + teleport_cooldown - world.time)/10)] seconds.") + return + + if(teleporting) + to_chat(user, "[src] is charging up. Please wait.") + return + + if(linked_pad.teleporting) + to_chat(user, "Linked pad is busy. Please wait.") + return + + if(linked_pad.inoperable()) + to_chat(user, "Linked pad is not responding to ping.") + return + src.add_fingerprint(user) + doteleport(user) + +/obj/machinery/power/quantumpad/proc/sparks() + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(5, 1, get_turf(src)) + sparks.start() + +/obj/machinery/power/quantumpad/attack_ghost(mob/observer/dead/ghost) + . = ..() + if(.) + return + if(!linked_pad && map_pad_link_id) + initMappedLink() + if(linked_pad && !QDELETED(linked_pad)) + ghost.forceMove(get_turf(linked_pad)) + +/obj/machinery/power/quantumpad/proc/doteleport(mob/user) + if(!linked_pad) + return + playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1) + teleporting = 1 + + spawn(teleport_speed) + if(!src || QDELETED(src)) + teleporting = 0 + return + if(inoperable()) + to_chat(user, "[src] is nonfunctional!") + teleporting = 0 + return + if(!linked_pad || QDELETED(linked_pad) || linked_pad.inoperable()) + to_chat(user, "Linked pad is not responding to ping. Teleport aborted.") + teleporting = 0 + return + + teleporting = 0 + last_teleport = world.time + + // use a lot of power + var/power_to_use = 10000 / power_efficiency + if(draw_power(power_to_use) != power_to_use) + to_chat(user, "Power is not sufficient to complete a teleport. Teleport aborted.") + return + sparks() + linked_pad.sparks() + + flick("qpad-beam", src) + playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + flick("qpad-beam", linked_pad) + playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + for(var/atom/movable/ROI in get_turf(src)) + // if is anchored, don't let through + if(ROI.anchored) + if(isliving(ROI)) + var/mob/living/L = ROI + if(L.buckled) + // TP people on office chairs + if(L.buckled.anchored) + continue + else + continue + else if(!isobserver(ROI)) + continue + do_teleport(ROI, get_turf(linked_pad), local = FALSE) + +/obj/machinery/power/quantumpad/proc/initMappedLink() + . = FALSE + var/obj/machinery/power/quantumpad/link = mapped_quantum_pads[map_pad_link_id] + if(link) + linked_pad = link + . = TRUE diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index ed701aa9e0..b0e5eca83b 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -22,17 +22,13 @@ // Based on the distance used var/teleport_cooldown = 0 var/teleporting = 0 - var/starting_crystals = 2 + var/starting_crystals = 0 var/max_crystals = 4 // Used to adjust OP-ness: (4 crystals * 6 efficiency * 12.5 coefficient) = 300 range. var/powerCoefficient = 12.5 var/list/crystals = list() var/obj/item/device/gps/inserted_gps -/obj/machinery/computer/telescience/New() - ..() - recalibrate() - /obj/machinery/computer/telescience/Destroy() eject() if(inserted_gps) @@ -46,6 +42,7 @@ /obj/machinery/computer/telescience/initialize() . = ..() + recalibrate() for(var/i = 1; i <= starting_crystals; i++) crystals += new /obj/item/weapon/ore/bluespace_crystal/artificial(src) // starting crystals diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index e77447c0d2..cb9e93f4fb 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/turbolift.dmi' anchored = 1 density = 0 - layer = 4 + plane = MOB_PLANE var/datum/turbolift/lift diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 13dc84f0e4..0b454f6bc5 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -40,7 +40,7 @@ var/load_offset_y = 0 //pixel_y offset for item overlay var/mob_offset_y = 0 //pixel_y offset for mob overlay - var/datum/riding/riding_datum = null + //var/datum/riding/riding_datum = null //VOREStation Edit - Moved to movables. //------------------------------------------- // Standard procs diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 0c382b52d6..1a4271050d 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -182,7 +182,8 @@ var/list/ventcrawl_machinery = list( for(var/datum/pipeline/pipeline in network.line_members) for(var/obj/machinery/atmospherics/A in (pipeline.members || pipeline.edges)) if(!A.pipe_image) - A.pipe_image = image(A, A.loc, layer = 20, dir = A.dir) + A.pipe_image = image(A, A.loc, dir = A.dir) + A.pipe_image.plane = PLANE_LIGHTING_ABOVE pipes_shown += A.pipe_image client.images += A.pipe_image if(client) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 1b8ab86fd6..3670f60bea 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -82,7 +82,7 @@ majormutate() //Space antibiotics have a good chance to stop disease completely - if(mob.reagents.has_reagent("spaceacillin")) + if(mob.chem_effects[CE_ANTIBIOTIC]) if(stage == 1 && prob(70-resistance)) src.cure(mob) else diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index d10fdbfb68..64790fdfc5 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -81,7 +81,7 @@ proc/airborne_can_reach(turf/source, turf/target) var/list/antibodies_in_common = M.antibodies & disease.antigen if(antibodies_in_common.len) return - if(M.reagents.has_reagent("spaceacillin")) + if(M.chem_effects[CE_ANTIBIOTIC]) if(prob(disease.resistance)) var/datum/disease2/disease/D = disease.getcopy() D.minormutate() diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm new file mode 100644 index 0000000000..de528fb2f8 --- /dev/null +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -0,0 +1,418 @@ +/datum/riding/taur + keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. + key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. + only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. + +/datum/riding/taur/handle_vehicle_layer() + if(ridden.dir != NORTH) + ridden.layer = ABOVE_MOB_LAYER + else + ridden.layer = initial(ridden.layer) + +/datum/riding/taur/ride_check(mob/living/M) + var/mob/living/L = ridden + if(L.stat) + force_dismount(M) + return FALSE + return TRUE + +/datum/riding/taur/force_dismount(mob/M) + . =..() + ridden.visible_message("[M] stops riding [ridden]!") + +//Hoooo boy. +/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) + var/mob/living/L = ridden + var/scale = L.size_multiplier + + var/list/values = list( + "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), + "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), + "[EAST]" = list(-10*scale, 8*scale, BELOW_MOB_LAYER), + "[WEST]" = list(10*scale, 8*scale, BELOW_MOB_LAYER)) + + return values + +//Human overrides for taur riding +/mob/living/carbon/human + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + +/mob/living/carbon/human/New() + ..() + riding_datum = new /datum/riding/taur(src) + +/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) + if(!isTaurTail(tail_style)) + return FALSE + if(lying) + return FALSE + if(!ishuman(M)) + return FALSE + if(M.size_multiplier > size_multiplier) + to_chat(M,"This isn't a pony show! They need to be bigger to ride.") + return FALSE + + var/mob/living/carbon/human/H = M + + if(isTaurTail(H.tail_style)) + to_chat(H,"Too many legs. TOO MANY LEGS!!") + return FALSE + + . = ..() + +/mob/living/carbon/human/MouseDrop_T(var/atom/movable/C, mob/user) + if(user_buckle_mob(C, user, silent = TRUE)) + visible_message("[C] starts riding [name]!") + +/mob/living/carbon/human/attack_hand(mob/user as mob) + if(LAZYLEN(buckled_mobs)) + //We're getting off! + if(user in buckled_mobs) + riding_datum.force_dismount(user) + //We're kicking everyone off! + if(user == src) + for(var/rider in buckled_mobs) + riding_datum.force_dismount(rider) + else + . = ..() + +/* +//////////////////////////// +/ =--------------------= / +/ == Taur Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Taur sprites are now a subtype of tail since they are mutually exclusive anyway. + +/datum/sprite_accessory/tail/taur + name = "You should not see this..." + icon = 'icons/mob/vore/taurs_vr.dmi' + do_colouration = 1 // Yes color, using tail color + color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY + + + //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to + //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! + + //Messages to owner when stepping on/over + var/msg_owner_help_walk = "You carefully step over %prey." + var/msg_owner_help_run = "You carefully step over %prey." + var/msg_owner_harm_walk = "You methodically place your foot down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + var/msg_owner_harm_run = "You carelessly step down onto %prey, crushing them!" + var/msg_owner_disarm_walk = "You firmly push your foot down on %prey, painfully but harmlessly pinning them to the ground!" + var/msg_owner_disarm_run = "You quickly push %prey to the ground with your foot!" + var/msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + var/msg_owner_grab_success = "You pin %prey down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!" + + //Messages to prey when stepping on/over + var/msg_prey_help_walk = "%owner steps over you carefully!" + var/msg_prey_help_run = "%owner steps over you carefully!" + var/msg_prey_harm_walk = "%owner methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!" + var/msg_prey_harm_run = "%owner steps carelessly on your body, crushing you!" + var/msg_prey_disarm_walk = "%owner firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!" + var/msg_prey_disarm_run = "%owner pushes you down to the ground with their foot!" + var/msg_prey_grab_fail = "%owner steps down and squishes you with their foot, forcing you down to the ground!" + var/msg_prey_grab_success = "%owner pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!" + + //Messages for smalls moving under larges + var/msg_owner_stepunder = "%owner runs between your legs." //Weird becuase in the case this is used, %owner is the 'bumper' (src) + var/msg_prey_stepunder = "You run between %prey's legs." //Same, inverse + +/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite. + name = "Long Lizard Tail (Roiz Lizden)" + icon_state = "roiz_tail_s" + do_colouration = 0 + ckeys_allowed = list("spoopylizz") + +/datum/sprite_accessory/tail/taur/wolf + name = "Wolf (Taur)" + icon_state = "wolf_s" + +/datum/sprite_accessory/tail/taur/wolf/wolf_2c + name = "Wolf dual-color (Taur)" + icon_state = "wolf_s" + extra_overlay = "wolf_markings" + +/datum/sprite_accessory/tail/taur/wolf/synthwolf + name = "SynthWolf dual-color (Taur)" + icon_state = "synthwolf_s" + extra_overlay = "synthwolf_markings" + +/datum/sprite_accessory/tail/taur/naga + name = "Naga (Taur)" + icon_state = "naga_s" + + msg_owner_help_walk = "You carefully slither around %prey." + msg_prey_help_walk = "%owner's huge tail slithers past beside you!" + + msg_owner_help_run = "You carefully slither around %prey." + msg_prey_help_run = "%owner's huge tail slithers past beside you!" + + msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" + msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" + + msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" + msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" + + msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" + + msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" + msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" + + msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" + msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" + + msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" + msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" + + msg_prey_stepunder = "You jump over %prey's thick tail." + msg_owner_stepunder = "%owner bounds over your tail." + +/datum/sprite_accessory/tail/taur/naga/naga_2c + name = "Naga dual-color (Taur)" + icon_state = "naga_s" + extra_overlay = "naga_markings" + +/datum/sprite_accessory/tail/taur/horse + name = "Horse (Taur)" + icon_state = "horse_s" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" + + msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" + +/datum/sprite_accessory/tail/taur/horse/synthhorse + name = "SynthHorse dual-color (Taur)" + icon_state = "synthhorse_s" + extra_overlay = "synthhorse_markings" + +/datum/sprite_accessory/tail/taur/cow + name = "Cow (Taur)" + icon_state = "cow_s" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" + + msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" + +/datum/sprite_accessory/tail/taur/deer + name = "Deer dual-color (Taur)" + icon_state = "deer_s" + extra_overlay = "deer_markings" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" + + msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" + +/datum/sprite_accessory/tail/taur/lizard + name = "Lizard (Taur)" + icon_state = "lizard_s" + +/datum/sprite_accessory/tail/taur/lizard/lizard_2c + name = "Lizard dual-color (Taur)" + icon_state = "lizard_s" + extra_overlay = "lizard_markings" + +/datum/sprite_accessory/tail/taur/lizard/synthlizard + name = "SynthLizard dual-color (Taur)" + icon_state = "synthlizard_s" + extra_overlay = "synthlizard_markings" + +/datum/sprite_accessory/tail/taur/spider + name = "Spider (Taur)" + icon_state = "spider_s" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" + +/datum/sprite_accessory/tail/taur/tents + name = "Tentacles (Taur)" + icon_state = "tent_s" + + msg_prey_stepunder = "You run between %prey's tentacles." + msg_owner_stepunder = "%owner runs between your tentacles." + + msg_owner_disarm_run = "You quickly push %prey to the ground with some of your tentacles!" + msg_prey_disarm_run = "%owner pushes you down to the ground with some of their tentacles!" + + msg_owner_disarm_walk = "You push down on %prey with some of your tentacles, pinning them down firmly under you!" + msg_prey_disarm_walk = "%owner pushes down on you with some of their tentacles, pinning you down firmly below them!" + + msg_owner_harm_run = "Your tentacles carelessly slide past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their tentacles!" + + msg_owner_harm_walk = "Your tentacles methodically apply pressure on %prey's body, crushing them against the floor below!" + msg_prey_harm_walk = "%owner's thick tentacles methodically apply pressure on your body, crushing you into the floor below!" + + msg_owner_grab_success = "You slide over %prey with your tentacles, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your tentacles!" + msg_prey_grab_success = "%owner slides over you with their tentacles, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their tentacles!" + + msg_owner_grab_fail = "You step down onto %prey with one of your tentacles, forcing them onto the ground!" + msg_prey_grab_fail = "%owner steps down onto you with one of their tentacles, squishing you and forcing you onto the ground!" + +/datum/sprite_accessory/tail/taur/feline + name = "Feline (Taur)" + icon_state = "feline_s" + +/datum/sprite_accessory/tail/taur/feline/feline_2c + name = "Feline dual-color (Taur)" + icon_state = "feline_s" + extra_overlay = "feline_markings" + +/datum/sprite_accessory/tail/taur/feline/synthfeline + name = "SynthFeline dual-color (Taur)" + icon_state = "synthfeline_s" + extra_overlay = "synthfeline_markings" + +/datum/sprite_accessory/tail/taur/slug + name = "Slug (Taur)" + icon_state = "slug_s" + + msg_owner_help_walk = "You carefully slither around %prey." + msg_prey_help_walk = "%owner's huge tail slithers past beside you!" + + msg_owner_help_run = "You carefully slither around %prey." + msg_prey_help_run = "%owner's huge tail slithers past beside you!" + + msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" + msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" + + msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" + msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" + + msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" + + msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" + msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" + + msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" + msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" + + msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" + msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" + + msg_prey_stepunder = "You jump over %prey's thick tail." + msg_owner_stepunder = "%owner bounds over your tail." + +/datum/sprite_accessory/tail/taur/frog + name = "Frog (Taur)" + icon_state = "frog_s" + +/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above. + name = "Drake (Taur)" + icon_state = "drake_s" + extra_overlay = "drake_markings" + +/datum/sprite_accessory/tail/taur/otie + name = "Otie (Taur)" + icon_state = "otie_s" + extra_overlay = "otie_markings" + +//wickedtemp: Chakat Tempest +/datum/sprite_accessory/tail/taur/feline/tempest + name = "Feline (wickedtemp) (Taur)" + icon_state = "tempest_s" + ckeys_allowed = list("wickedtemp") + +//silencedmp5a5: Serdykov Antoz +/datum/sprite_accessory/tail/taur/wolf/serdy + name = "CyberSerdy (silencedmp5a5) (Taur)" + icon_state = "serdy_s" + ckeys_allowed = list("silencedmp5a5") + +//liquidfirefly: Ariana Scol +/datum/sprite_accessory/tail/taur/centipede + name = "Centipede (liquidfirefly) (Taur)" + icon_state = "ariana_s" + ckeys_allowed = list("liquidfirefly") + do_colouration = 0 + + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" + +//liquidfirefly: Ariana Scol +/datum/sprite_accessory/tail/taur/alraune + name = "Alraune (natje) (Taur)" + icon_state = "alraune_s" + ani_state = "alraune_closed_s" + ckeys_allowed = list("natje") + do_colouration = 0 + + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 71c81fb9e7..5ea245462c 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -270,6 +270,31 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable fluff)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable fluff)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable fluff)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + + // Special snowflake ears go below here. /datum/sprite_accessory/ears/molenar_kitsune @@ -896,6 +921,14 @@ color_blend_mode = ICON_MULTIPLY extra_overlay = "deertail_mark" +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + extra_overlay = "teshari_fluffytail_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //For all species tails. Includes haircolored tails. /datum/sprite_accessory/tail/special name = "Blank tail. Do not select." @@ -976,7 +1009,8 @@ /datum/sprite_accessory/tail/special/seromitailfeathered name = "seromi tail w/ feathers" desc = "" - icon_state = "seromitail_feathers_s" + icon_state = "seromitail_s" + extra_overlay = "seromitail_feathers_s" do_colouration = 1 color_blend_mode = ICON_MULTIPLY @@ -1092,334 +1126,4 @@ desc = "" icon_state = "zenghu_taj" -/* -//////////////////////////// -/ =--------------------= / -/ == Taur Definitions == / -/ =--------------------= / -//////////////////////////// -*/ - -// Taur sprites are now a subtype of tail since they are mutually exclusive anyway. - -/datum/sprite_accessory/tail/taur - name = "You should not see this..." - icon = 'icons/mob/vore/taurs_vr.dmi' - do_colouration = 1 // Yes color, using tail color - color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY - - //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to - //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! - - //Messages to owner when stepping on/over - var/msg_owner_help_walk = "You carefully step over %prey." - var/msg_owner_help_run = "You carefully step over %prey." - var/msg_owner_harm_walk = "You methodically place your foot down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - var/msg_owner_harm_run = "You carelessly step down onto %prey, crushing them!" - var/msg_owner_disarm_walk = "You firmly push your foot down on %prey, painfully but harmlessly pinning them to the ground!" - var/msg_owner_disarm_run = "You quickly push %prey to the ground with your foot!" - var/msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - var/msg_owner_grab_success = "You pin %prey down onto the floor with your foot and curl your toes up around their body, trapping them inbetween them!" - - //Messages to prey when stepping on/over - var/msg_prey_help_walk = "%owner steps over you carefully!" - var/msg_prey_help_run = "%owner steps over you carefully!" - var/msg_prey_harm_walk = "%owner methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!" - var/msg_prey_harm_run = "%owner steps carelessly on your body, crushing you!" - var/msg_prey_disarm_walk = "%owner firmly pushes their foot down on you, quite painfully but harmlessly pinning you to the ground!" - var/msg_prey_disarm_run = "%owner pushes you down to the ground with their foot!" - var/msg_prey_grab_fail = "%owner steps down and squishes you with their foot, forcing you down to the ground!" - var/msg_prey_grab_success = "%owner pins you down to the floor with their foot and curls their toes up around your body, trapping you inbetween them!" - - //Messages for smalls moving under larges - var/msg_owner_stepunder = "%owner runs between your legs." //Weird becuase in the case this is used, %owner is the 'bumper' (src) - var/msg_prey_stepunder = "You run between %prey's legs." //Same, inverse - -/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite. - name = "Long Lizard Tail (Roiz Lizden)" - icon_state = "roiz_tail_s" - do_colouration = 0 - ckeys_allowed = list("spoopylizz") - -/datum/sprite_accessory/tail/taur/wolf - name = "Wolf (Taur)" - icon_state = "wolf_s" - -/datum/sprite_accessory/tail/taur/wolf/wolf_2c - name = "Wolf dual-color (Taur)" - icon_state = "wolf_s" - extra_overlay = "wolf_markings" - -/datum/sprite_accessory/tail/taur/wolf/synthwolf - name = "SynthWolf dual-color (Taur)" - icon_state = "synthwolf_s" - extra_overlay = "synthwolf_markings" - -/datum/sprite_accessory/tail/taur/naga - name = "Naga (Taur)" - icon_state = "naga_s" - - msg_owner_help_walk = "You carefully slither around %prey." - msg_prey_help_walk = "%owner's huge tail slithers past beside you!" - - msg_owner_help_run = "You carefully slither around %prey." - msg_prey_help_run = "%owner's huge tail slithers past beside you!" - - msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" - msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" - - msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" - msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" - - msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" - msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" - - msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" - msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" - - msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" - msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" - - msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" - msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" - - msg_prey_stepunder = "You jump over %prey's thick tail." - msg_owner_stepunder = "%owner bounds over your tail." - -/datum/sprite_accessory/tail/taur/naga/naga_2c - name = "Naga dual-color (Taur)" - icon_state = "naga_s" - extra_overlay = "naga_markings" - -/datum/sprite_accessory/tail/taur/horse - name = "Horse (Taur)" - icon_state = "horse_s" - - msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" - msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" - - msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" - msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" - - msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" - - msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" - msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" - - msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" - -/datum/sprite_accessory/tail/taur/horse/synthhorse - name = "SynthHorse dual-color (Taur)" - icon_state = "synthhorse_s" - extra_overlay = "synthhorse_markings" - -/datum/sprite_accessory/tail/taur/cow - name = "Cow (Taur)" - icon_state = "cow_s" - - msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" - msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" - - msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" - msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" - - msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" - - msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" - msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" - - msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" - -/datum/sprite_accessory/tail/taur/lizard - name = "Lizard (Taur)" - icon_state = "lizard_s" - -/datum/sprite_accessory/tail/taur/lizard/lizard_2c - name = "Lizard dual-color (Taur)" - icon_state = "lizard_s" - extra_overlay = "lizard_markings" - -/datum/sprite_accessory/tail/taur/lizard/synthlizard - name = "SynthLizard dual-color (Taur)" - icon_state = "synthlizard_s" - extra_overlay = "synthlizard_markings" - -/datum/sprite_accessory/tail/taur/spider - name = "Spider (Taur)" - icon_state = "spider_s" - - msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" - msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" - - msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" - msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" - - msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" - - msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" - msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" - - msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" - -/datum/sprite_accessory/tail/taur/tents - name = "Tentacles (Taur)" - icon_state = "tent_s" - - msg_prey_stepunder = "You run between %prey's tentacles." - msg_owner_stepunder = "%owner runs between your tentacles." - - msg_owner_disarm_run = "You quickly push %prey to the ground with some of your tentacles!" - msg_prey_disarm_run = "%owner pushes you down to the ground with some of their tentacles!" - - msg_owner_disarm_walk = "You push down on %prey with some of your tentacles, pinning them down firmly under you!" - msg_prey_disarm_walk = "%owner pushes down on you with some of their tentacles, pinning you down firmly below them!" - - msg_owner_harm_run = "Your tentacles carelessly slide past %prey, crushing them!" - msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their tentacles!" - - msg_owner_harm_walk = "Your tentacles methodically apply pressure on %prey's body, crushing them against the floor below!" - msg_prey_harm_walk = "%owner's thick tentacles methodically apply pressure on your body, crushing you into the floor below!" - - msg_owner_grab_success = "You slide over %prey with your tentacles, smushing them against the ground before wrapping one up around them, trapping them within the tight confines of your tentacles!" - msg_prey_grab_success = "%owner slides over you with their tentacles, smushing you against the ground before wrapping one up around you, trapping you within the tight confines of their tentacles!" - - msg_owner_grab_fail = "You step down onto %prey with one of your tentacles, forcing them onto the ground!" - msg_prey_grab_fail = "%owner steps down onto you with one of their tentacles, squishing you and forcing you onto the ground!" - -/datum/sprite_accessory/tail/taur/feline - name = "Feline (Taur)" - icon_state = "feline_s" - -/datum/sprite_accessory/tail/taur/feline/feline_2c - name = "Feline dual-color (Taur)" - icon_state = "feline_s" - extra_overlay = "feline_markings" - -/datum/sprite_accessory/tail/taur/feline/synthfeline - name = "SynthFeline dual-color (Taur)" - icon_state = "synthfeline_s" - extra_overlay = "synthfeline_markings" - -/datum/sprite_accessory/tail/taur/slug - name = "Slug (Taur)" - icon_state = "slug_s" - - msg_owner_help_walk = "You carefully slither around %prey." - msg_prey_help_walk = "%owner's huge tail slithers past beside you!" - - msg_owner_help_run = "You carefully slither around %prey." - msg_prey_help_run = "%owner's huge tail slithers past beside you!" - - msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" - msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" - - msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" - msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" - - msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" - msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" - - msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" - msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" - - msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" - msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" - - msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" - msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" - - msg_prey_stepunder = "You jump over %prey's thick tail." - msg_owner_stepunder = "%owner bounds over your tail." - -/datum/sprite_accessory/tail/taur/frog - name = "Frog (Taur)" - icon_state = "frog_s" - -/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above. - name = "Drake (Taur)" - icon_state = "drake_s" - extra_overlay = "drake_markings" - -/datum/sprite_accessory/tail/taur/otie - name = "Otie (Taur)" - icon_state = "otie_s" - extra_overlay = "otie_markings" - -/datum/sprite_accessory/tail/taur/wolf2 - name = "Wolf2" - icon_state = "wolf2_s" - -/datum/sprite_accessory/tail/taur/wolf2f - name = "Wolf2 (fat)" - icon_state = "wolf2f_s" - -/datum/sprite_accessory/tail/taur/husky2 - name = "Husky" - icon_state = "husky_s" - -/datum/sprite_accessory/tail/taur/husky2f - name = "Husky (fat)" - icon_state = "huskyf_s" - -//wickedtemp: Chakat Tempest -/datum/sprite_accessory/tail/taur/feline/tempest - name = "Feline (wickedtemp) (Taur)" - icon_state = "tempest_s" - ckeys_allowed = list("wickedtemp") - -//silencedmp5a5: Serdykov Antoz -/datum/sprite_accessory/tail/taur/wolf/serdy - name = "CyberSerdy (silencedmp5a5) (Taur)" - icon_state = "serdy_s" - ckeys_allowed = list("silencedmp5a5") - -//liquidfirefly: Ariana Scol -/datum/sprite_accessory/tail/taur/centipede - name = "Centipede (liquidfirefly) (Taur)" - icon_state = "ariana_s" - ckeys_allowed = list("liquidfirefly") - do_colouration = 0 - - msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" - msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" - - msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" - msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" - - msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" - - msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" - msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" - - msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" - -//liquidfirefly: Ariana Scol -/datum/sprite_accessory/tail/taur/alraune - name = "Alraune (natje) (Taur)" - icon_state = "alraune_s" - ani_state = "alraune_closed_s" - ckeys_allowed = list("natje") - do_colouration = 0 - - msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" - msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" - - msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" - msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" - - msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!" - msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!" - - msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" - msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" - - msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" - msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" +//Taurs moved to a separate file due to extra code around them diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index c9321880bc..531422bf63 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -1,4 +1,3 @@ -#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) var/global/list/wing_icon_cache = list() /mob/living/carbon/human/proc/get_ears_overlay() diff --git a/code/modules/vore/eating/belly_dat_vr.dm b/code/modules/vore/eating/belly_dat_vr.dm index 9453edc66f..accd3c9bf2 100644 --- a/code/modules/vore/eating/belly_dat_vr.dm +++ b/code/modules/vore/eating/belly_dat_vr.dm @@ -30,7 +30,7 @@ var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. - var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes + var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) // Possible digest modes var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 8affcb171d..0d4c9705f9 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -32,14 +32,22 @@ var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. var/transferlocation // Location that the prey is released if they struggle and get dropped off. var/release_sound = TRUE // Boolean for now, maybe replace with something else later + var/mode_flags = 0 // Stripping, numbing, etc. //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. - var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes + //Actual full digest modes + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) + //Digest mode addon flags + var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Itemweak" = DM_FLAG_ITEMWEAK, "Stripping" = DM_FLAG_STRIPPING) + //Transformation modes var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) + + //List of slots that stripping handles strips var/tmp/static/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear) var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) + var/tmp/tf_mode = DM_TRANSFORM_REPLICA // Current transformation mode. var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again. var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick # @@ -127,7 +135,8 @@ "digest_messages_owner", "digest_messages_prey", "examine_messages", - "emote_lists" + "emote_lists", + "mode_flags" ) /obj/belly/New(var/newloc) @@ -359,9 +368,12 @@ brain.forceMove(src) items_preserved += brain for(var/slot in slots) - var/obj/item/thingy = M.get_equipped_item(slot = slot) - if(thingy) - M.unEquip(thingy,force = TRUE) + var/obj/item/I = M.get_equipped_item(slot = slot) + if(I) + M.unEquip(I,force = TRUE) + I.gurgle_contaminate(contents, owner) //We do an initial contamination pass to get stuff like IDs wet. + if(mode_flags & DM_FLAG_ITEMWEAK) + items_preserved |= I //Reagent transfer if(ishuman(owner)) @@ -383,6 +395,8 @@ M.absorbed = 1 to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.") to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.") + if(M.noisy) //Mute drained absorbee hunger if enabled. + M.noisy = FALSE if(ishuman(M) && ishuman(owner)) var/mob/living/carbon/human/Prey = M @@ -533,17 +547,12 @@ digest_mode = DM_ABSORB return - else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. + else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...") to_chat(owner,"You feel your [lowertext(name)] beginning to become active!") - digest_mode = DM_ITEMWEAK - return - - else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice! - to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!") - to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!") digest_mode = DM_DIGEST return + else //Nothing interesting happened. to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)].") to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)].") @@ -601,6 +610,7 @@ dupe.transferlocation = transferlocation dupe.bulge_size = bulge_size dupe.shrink_grow_size = shrink_grow_size + dupe.mode_flags = mode_flags //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_tf_vr.dm b/code/modules/vore/eating/bellymodes_tf_vr.dm new file mode 100644 index 0000000000..1f638f4f98 --- /dev/null +++ b/code/modules/vore/eating/bellymodes_tf_vr.dm @@ -0,0 +1,237 @@ +/obj/belly/proc/process_tf(var/mode,var/list/touchable_mobs) //We pass mode so it's mega-ultra local. + /* May not be necessary... Transform only shows up in the panel for humans. + if(!ishuman(owner)) + return //Need DNA and junk for this. + */ + + //Cast here for reduced duplication + var/mob/living/carbon/human/O = owner + +///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES ///////////////////////////// + if(mode == DM_TRANSFORM_HAIR_AND_EYES) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P) || check_hair(P)) + change_eyes(P) + change_hair(P,1) + +///////////////////////////// DM_TRANSFORM_MALE ///////////////////////////// + else if(mode == DM_TRANSFORM_MALE) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,MALE)) + change_gender(P,MALE,1) + +///////////////////////////// DM_TRANSFORM_FEMALE ///////////////////////////// + else if(mode == DM_TRANSFORM_FEMALE) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,FEMALE)) + change_gender(P,FEMALE,1) + +///////////////////////////// DM_TRANSFORM_KEEP_GENDER ///////////////////////////// + else if(mode == DM_TRANSFORM_KEEP_GENDER) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + +///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR ///////////////////////////// + else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P) || check_species(P)) + change_ears(P) + change_tail_nocolor(P) + change_wing_nocolor(P) + change_species(P,1) + +///////////////////////////// DM_TRANSFORM_REPLICA ///////////////////////////// + else if(mode == DM_TRANSFORM_REPLICA) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) + change_ears(P) + change_tail(P) + change_wing(P) + change_species(P,1) + +///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P)|| check_species(P)) + change_ears(P) + change_tail_nocolor(P) + change_wing_nocolor(P) + change_species(P,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_KEEP_GENDER_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_REPLICA_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_REPLICA_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) + change_ears(P) + change_tail(P) + change_wing(P) + change_species(P,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_MALE_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_MALE_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,MALE)) + change_gender(P,MALE,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_FEMALE_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_FEMALE_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,MALE)) + change_gender(P,MALE,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_EGG ///////////////////////////// + else if(mode == DM_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.absorbed || P.stat == DEAD) + continue + + put_in_egg(P,1) + diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 6a0796f665..1dff971638 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -13,6 +13,7 @@ next_process = times_fired + (6 SECONDS/wait) //Set up our next process time. var/play_sound //Potential sound to play at the end to avoid code duplication. + var/to_update = FALSE //Did anything update worthy happen? /////////////////////////// Auto-Emotes /////////////////////////// if(contents.len && next_emote <= times_fired) @@ -20,30 +21,73 @@ var/list/EL = emote_lists[digest_mode] if(LAZYLEN(EL)) for(var/mob/living/M in contents) - if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people + if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people to_chat(M,"[pick(EL)]") /////////////////////////// Exit Early //////////////////////////// - var/list/touchable_items = contents - items_preserved - if(!length(touchable_items)) + var/list/touchable_atoms = contents - items_preserved + if(!length(touchable_atoms)) return SSBELLIES_PROCESSED -//////////////////////// Absorbed Handling //////////////////////// - for(var/mob/living/M in contents) - if(M.absorbed) - M.Weaken(5) + var/list/touchable_mobs = list() + +///////////////////// Early Non-Mode Handling ///////////////////// + var/did_an_item = FALSE + for(var/A in touchable_atoms) + //Handle stray items + if(isitem(A) && !did_an_item) + var/obj/item/I = A + if(mode_flags & DM_FLAG_ITEMWEAK) + I.gurgle_contaminate(contents, owner) + items_preserved |= I + else + digest_item(I) + to_update = TRUE + did_an_item = TRUE + + //Handle eaten mobs + else if(isliving(A)) + var/mob/living/L = A + touchable_mobs += L + + if(L.absorbed) + L.Weaken(5) + + //Handle 'human' + if(ishuman(L)) + var/mob/living/carbon/human/H = L + + //Numbing flag + if(mode_flags & DM_FLAG_NUMBING) + if(H.bloodstr.get_reagent_amount("numbenzyme") < 2) + H.bloodstr.add_reagent("numbenzyme",4) + + //Stripping flag + if(mode_flags & DM_FLAG_STRIPPING) + for(var/slot in slots) + var/obj/item/I = H.get_equipped_item(slot = slot) + if(I) + H.unEquip(I,force = TRUE) + if(mode_flags & DM_FLAG_ITEMWEAK) + I.gurgle_contaminate(contents, owner) + items_preserved |= I + else + digest_item(I) + to_update = TRUE + break ///////////////////////////// DM_HOLD ///////////////////////////// if(digest_mode == DM_HOLD) return SSBELLIES_PROCESSED //Pretty boring, huh //////////////////////////// DM_DIGEST //////////////////////////// - else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK) + else if(digest_mode == DM_DIGEST) if(prob(50)) //Was SO OFTEN. AAAA. play_sound = pick(digestion_sounds) - for (var/mob/living/M in contents) + for (var/target in touchable_mobs) + var/mob/living/M = target //Pref protection! if (!M.digestable || M.absorbed) continue @@ -69,13 +113,9 @@ play_sound = pick(death_sounds) digestion_death(M) owner.update_icons() + to_update = TRUE continue - if(digest_mode == DM_DIGEST_NUMB && ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.bloodstr.get_reagent_amount("numbenzyme") < 5) - H.bloodstr.add_reagent("numbenzyme",10) - // Deal digestion damage (and feed the pred) M.adjustBruteLoss(digest_brute) M.adjustFireLoss(digest_burn) @@ -89,51 +129,12 @@ owner.nutrition += offset*(2*(digest_brute+digest_burn)/difference) // 9.5 nutrition per digestion tick if they're 130 pounds and it's same size. 10.2 per digestion tick if they're 140 and it's same size. Etc etc. else owner.nutrition += 2*(digest_brute+digest_burn)/difference - M.updateVRPanel() - - //Contaminate or gurgle items - var/obj/item/T = pick(touchable_items) - if(istype(T)) - if(digest_mode == DM_ITEMWEAK) - if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ)) - digest_item(T) - else - T.gurgle_contaminate(contents, owner) - items_preserved |= T - else - digest_item(T) - - owner.updateVRPanel() - -//////////////////////////// DM_STRIPDIGEST //////////////////////////// - else if(digest_mode == DM_STRIPDIGEST) // Only gurgle the gear off your prey. - - if(prob(50)) - play_sound = pick(digestion_sounds) - - // Handle loose items first. - var/obj/item/T = pick(touchable_items) - if(istype(T)) - digest_item(T) - - for(var/mob/living/carbon/human/M in contents) - if (M.absorbed) - continue - for(var/slot in slots) - var/obj/item/thingy = M.get_equipped_item(slot = slot) - if(thingy) - M.unEquip(thingy,force = TRUE) - digest_item(thingy) - break - M.updateVRPanel() - - owner.updateVRPanel() //////////////////////////// DM_ABSORB //////////////////////////// else if(digest_mode == DM_ABSORB) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target if(prob(10)) //Less often than gurgles. People might leave this on forever. play_sound = pick(digestion_sounds) @@ -146,22 +147,27 @@ owner.nutrition += oldnutrition else if(M.nutrition < 100) //When they're finally drained. absorb_living(M) + to_update = TRUE //////////////////////////// DM_UNABSORB //////////////////////////// else if(digest_mode == DM_UNABSORB) - for (var/mob/living/M in contents) + for (var/target in touchable_mobs) + var/mob/living/M = target + if(M.absorbed && owner.nutrition >= 100) M.absorbed = 0 to_chat(M,"You suddenly feel solid again ") to_chat(owner,"You feel like a part of you is missing.") owner.nutrition -= 100 + to_update = TRUE //////////////////////////// DM_DRAIN //////////////////////////// else if(digest_mode == DM_DRAIN) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) //Less often than gurgles. People might leave this on forever. play_sound = pick(digestion_sounds) @@ -173,13 +179,15 @@ //////////////////////////// DM_SHRINK //////////////////////////// else if(digest_mode == DM_SHRINK) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) //Infinite gurgles! play_sound = pick(digestion_sounds) if(M.size_multiplier > shrink_grow_size) //Shrink until smol. M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick. + if(M.nutrition >= 100) //Absorbing bodymass results in nutrition if possible. var/oldnutrition = (M.nutrition * 0.05) M.nutrition = (M.nutrition * 0.95) @@ -188,8 +196,9 @@ //////////////////////////// DM_GROW //////////////////////////// else if(digest_mode == DM_GROW) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) play_sound = pick(digestion_sounds) @@ -201,14 +210,16 @@ //////////////////////////// DM_SIZE_STEAL //////////////////////////// else if(digest_mode == DM_SIZE_STEAL) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) play_sound = pick(digestion_sounds) if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small. owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick. M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick + if(M.nutrition >= 100) var/oldnutrition = (M.nutrition * 0.05) M.nutrition = (M.nutrition * 0.95) @@ -216,261 +227,38 @@ ///////////////////////////// DM_HEAL ///////////////////////////// else if(digest_mode == DM_HEAL) - if(prob(50)) //Wet heals! + + if(prob(50)) //Wet heals! The secret is you can leave this on for gurgle noises for fun. play_sound = pick(digestion_sounds) - for (var/mob/living/M in contents) - if(M.stat != DEAD) - if(owner.nutrition > 90 && (M.health < M.maxHealth)) - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - owner.nutrition -= 2 - if(M.nutrition <= 400) - M.nutrition += 1 - else if(owner.nutrition > 90 && (M.nutrition <= 400)) - owner.nutrition -= 1 + for (var/target in touchable_mobs) + var/mob/living/M = target + + if(M.stat == DEAD) + continue + + if(owner.nutrition > 90 && (M.health < M.maxHealth)) + M.adjustBruteLoss(-5) + M.adjustFireLoss(-5) + owner.nutrition -= 2 + if(M.nutrition <= 400) M.nutrition += 1 + else if(owner.nutrition > 90 && (M.nutrition <= 400)) + owner.nutrition -= 1 + M.nutrition += 1 -///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_HAIR_AND_EYES && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P) || check_hair(P)) - change_eyes(P) - change_hair(P,1) - -///////////////////////////// DM_TRANSFORM_MALE ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_MALE && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,MALE)) - change_gender(P,MALE,1) - -///////////////////////////// DM_TRANSFORM_FEMALE ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_FEMALE && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,FEMALE)) - change_gender(P,FEMALE,1) - -///////////////////////////// DM_TRANSFORM_KEEP_GENDER ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_KEEP_GENDER && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - -///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P) || check_species(P)) - change_ears(P) - change_tail_nocolor(P) - change_wing_nocolor(P) - change_species(P,1) - -///////////////////////////// DM_TRANSFORM_REPLICA ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_REPLICA && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) - change_ears(P) - change_tail(P) - change_wing(P) - change_species(P,1) - -///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P)|| check_species(P)) - change_ears(P) - change_tail_nocolor(P) - change_wing_nocolor(P) - change_species(P,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_KEEP_GENDER_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_REPLICA_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_REPLICA_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) - change_ears(P) - change_tail(P) - change_wing(P) - change_species(P,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_MALE_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_MALE_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,MALE)) - change_gender(P,MALE,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_FEMALE_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_FEMALE_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,MALE)) - change_gender(P,MALE,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_EGG ///////////////////////////// - else if(digest_mode == DM_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.absorbed || P.stat == DEAD) - continue - - put_in_egg(P,1) +/////////////////////////// DM_TRANSFORM /////////////////////////// + else if(digest_mode == DM_TRANSFORM) + process_tf(tf_mode, touchable_mobs) +/////////////////////////// Make any noise /////////////////////////// if(play_sound) playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) - return SSBELLIES_PROCESSED \ No newline at end of file + if(to_update) + for(var/mob/living/M in contents) + if(M.client) + M.updateVRPanel() + if(owner.client) + owner.updateVRPanel() + + return SSBELLIES_PROCESSED diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 78512bf09c..bbaa5fab33 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -49,7 +49,7 @@ . = ..() /obj/item/weapon/card/id/digest_act(var/atom/movable/item_storage = null) - desc = "A partially digested card that has seen better days. Much of it's data has been destroyed." + desc = "A partially digested card that has seen better days. Much of it's data has been destroyed, but the card itself is still completely salvageable. Please recycle it at crew resources office." icon = 'icons/obj/card_vr.dmi' icon_state = "digested" access = list() // No access @@ -82,7 +82,7 @@ /obj/item/weapon/storage/digest_act(var/atom/movable/item_storage = null) for(var/obj/item/I in contents) I.screen_loc = null - + . = ..() ///////////// diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index d3f37842bf..31a9e7e476 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -18,7 +18,7 @@ var/dat = picker_holder.gen_ui(src) - picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder) + picker_holder.popup = new(src, "insidePanel","Inside!", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() src.openpanel = 1 @@ -31,7 +31,7 @@ var/dat = picker_holder.gen_ui(src) - picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder) + picker_holder.popup = new(src, "insidePanel","Inside!", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() @@ -110,46 +110,44 @@ spanstyle = "" if(DM_DIGEST) spanstyle = "color:red;" - if(DM_ITEMWEAK) - spanstyle = "color:red;" - if(DM_STRIPDIGEST) - spanstyle = "color:red;" - if(DM_HEAL) - spanstyle = "color:green;" if(DM_ABSORB) spanstyle = "color:purple;" if(DM_DRAIN) spanstyle = "color:purple;" + if(DM_HEAL) + spanstyle = "color:green;" if(DM_SHRINK) spanstyle = "color:purple;" if(DM_GROW) spanstyle = "color:purple;" if(DM_SIZE_STEAL) spanstyle = "color:purple;" - if(DM_TRANSFORM_MALE) - spanstyle = "color:purple;" - if(DM_TRANSFORM_HAIR_AND_EYES) - spanstyle = "color:purple;" - if(DM_TRANSFORM_FEMALE) - spanstyle = "color:purple;" - if(DM_TRANSFORM_KEEP_GENDER) - spanstyle = "color:purple;" - if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) - spanstyle = "color:purple;" - if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_REPLICA) - spanstyle = "color:purple;" - if(DM_TRANSFORM_REPLICA_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_KEEP_GENDER_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_MALE_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_FEMALE_EGG) - spanstyle = "color:purple;" - if(DM_EGG) - spanstyle = "color:purple;" + if(DM_TRANSFORM) + switch(B.tf_mode) + if(DM_TRANSFORM_MALE) + spanstyle = "color:purple;" + if(DM_TRANSFORM_HAIR_AND_EYES) + spanstyle = "color:purple;" + if(DM_TRANSFORM_FEMALE) + spanstyle = "color:purple;" + if(DM_TRANSFORM_KEEP_GENDER) + spanstyle = "color:purple;" + if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) + spanstyle = "color:purple;" + if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_REPLICA) + spanstyle = "color:purple;" + if(DM_TRANSFORM_REPLICA_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_KEEP_GENDER_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_MALE_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_FEMALE_EGG) + spanstyle = "color:purple;" + if(DM_EGG) + spanstyle = "color:purple;" dat += " ([B.contents.len])" @@ -193,7 +191,19 @@ //Digest Mode Button dat += "
Belly Mode:" - dat += " [selected.digest_mode]" + var/mode = selected.digest_mode + dat += " [mode == DM_TRANSFORM ? selected.tf_mode : mode]" + + //Mode addons button + dat += "
Mode Addons:" + var/list/flag_list = list() + for(var/flag_name in selected.mode_flag_list) + if(selected.mode_flags & selected.mode_flag_list[flag_name]) + flag_list += flag_name + if(flag_list.len) + dat += " [english_list(flag_list)]" + else + dat += " None" //Belly verb dat += "
Vore Verb:" @@ -497,16 +507,32 @@ selected.name = new_name if(href_list["b_mode"]) - var/list/menu_list = selected.digest_modes + var/list/menu_list = selected.digest_modes.Copy() if(istype(usr,/mob/living/carbon/human)) - menu_list += selected.transform_modes + menu_list += DM_TRANSFORM var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list if(!new_mode) return 0 + + if(new_mode == DM_TRANSFORM) //Snowflek submenu + var/list/tf_list = selected.transform_modes + var/new_tf_mode = input("Choose TF Mode (currently [selected.tf_mode])") as null|anything in tf_list + if(!new_tf_mode) + return 0 + selected.tf_mode = new_tf_mode + selected.digest_mode = new_mode selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change + if(href_list["b_addons"]) + var/list/menu_list = selected.mode_flag_list.Copy() + var/toggle_addon = input("Toggle Addon") as null|anything in menu_list + if(!toggle_addon) + return 0 + selected.mode_flags ^= selected.mode_flag_list[toggle_addon] + selected.items_preserved.Cut() //Re-evaltuate all items in belly on addon toggle + if(href_list["b_desc"]) var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null) diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 1776ca6eeb..57b83c9876 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -172,27 +172,6 @@ can_hold = list(/obj/item/clothing/under/swimsuit/) has_items = list(/obj/item/clothing/under/swimsuit/fluff/penelope) -//Arokha:Aronai Kadigan -/obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai - name = "blue medical satchel" - desc = "A medical satchel done up in blue and white." - - New() - ..() //Might look like a lot... but all small items. - //Centcom stuff and permit - new /obj/item/weapon/card/id/centcom/station/fluff/aronai(src) - //new /obj/item/clothing/accessory/permit/gun/fluff/aronai_kadigan(src) - //Gun and holster - //new /obj/item/weapon/gun/projectile/nsfw(src) - //new /obj/item/ammo_magazine/nsfw_mag(src) - //new /obj/item/ammo_casing/nsfw_batt/stun(src) - //new /obj/item/ammo_casing/nsfw_batt/stun(src) - //new /obj/item/ammo_casing/nsfw_batt/net(src) - //new /obj/item/clothing/accessory/holster(src) - -/obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai/digest_act(...) - return FALSE //I get eaten a lot, okay - //Aerowing:Sebastian Aji /obj/item/weapon/storage/box/fluff/sebastian_aji name = "Sebastian's Lumoco Arms P3 Box" diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 45ac6dd99e..539d9f2613 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1760,3 +1760,51 @@ Departamental Swimsuits, for general use icon_state = "tronsiren_shoes" icon = 'icons/vore/custom_clothes_vr.dmi' icon_override = 'icons/vore/custom_onmob_vr.dmi' + +/obj/item/clothing/head/helmet/space/void/security/hasd + name = "HASD EVA faceplate" + desc = "It's a faceplate that slots into the HASD EVA bodyplate assembly. Functionally useless alone." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "hasd_helm" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "hasd_helm" + species_restricted = null + + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(H.ckey != "silencedmp5a5") + H << "...The faceplate is clearly not made for your anatomy, thus, does not fit." + return 0 + else + return 1 + +/obj/item/clothing/suit/space/void/security/hasd + name = "HASD EVA bodyplates" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + desc = "A series of armor plates painted black, deployed from a back-mounted module. They fit smoothly over the unit's armor plates and projects a skintight bubble shield over the unit's uncovered parts. Faceplate and coolant unit not included." + species_restricted = null + icon = 'icons/mob/taursuits_vr.dmi' + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "hasd_suit" + item_state = "hasd_suit" + pixel_x = -16 + + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..() && istype(H) && H.ckey == "silencedmp5a5" && istype(H.tail_style, /datum/sprite_accessory/tail/taur/lizard/synthlizard)) + return 1 + else + H << "This suit is not designed for you." + return 0 + +//Zigfe:Zaoozaoo Xrimxuqmqixzix +/obj/item/clothing/head/fluff/zao + name = "Zao's Hat" + desc = "A black hat that has an uncanny similarity to the HoS's hat. There's a small letter Z sewn on the inside of the brim." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "zao_cap" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "zao_cap_mob" \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index b42c15cc8c..50f238fd59 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -347,6 +347,11 @@ name = "\improper MEUSOC .45" desc = "Some serious drywall work, coming up!" */ +//hzdonut:Jesse Soemmer +/obj/item/weapon/gun/projectile/revolver/fluff/jesselemat + name = "Modified LeMat" + desc = "The LeMat Revolver is a 9 shot revolver with a secondary firing barrel for loading shotgun shells. Uses .38-Special and 12g rounds depending on the barrel. This one appears to have had it's secondary barrel sealed off and looks to be in pristine condition. Either it's brand new, or its owner takes very good care of it." + icon_state = "lemat" //////////////////// Energy Weapons //////////////////// @@ -794,4 +799,4 @@ if(T.z in using_map.map_levels) to_chat(user, "The safety device prevents the gun from firing this close to the facility.") return 0 - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 6cc09b19b2..5f653f71e1 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -1447,24 +1447,27 @@ //Destination beacon vore checking var/atom/real_dest = dT - var/televored = FALSE //UR GONNA GET VORED var/atom/real_loc = destination.loc if(isbelly(real_loc)) real_dest = real_loc - televored = TRUE if(isliving(real_loc)) var/mob/living/L = real_loc if(L.vore_selected) real_dest = L.vore_selected - televored = TRUE else if(L.vore_organs.len) real_dest = pick(L.vore_organs) + + //Confirm televore + var/televored = FALSE + if(isbelly(real_dest)) + var/obj/belly/B = real_dest + if(!target.can_be_drop_prey && B.owner != user) + to_chat(target,"\The [src] narrowly avoids teleporting you right into \a [lowertext(real_dest.name)]!") + real_dest = dT //Nevermind! + else televored = TRUE - - //Televore fluff stuff - if(televored) - to_chat(target,"\The [src] teleports you right into \a [lowertext(real_dest.name)]!") + to_chat(target,"\The [src] teleports you right into \a [lowertext(real_dest.name)]!") //Phase-out effect phase_out(target,get_turf(target)) @@ -1495,7 +1498,7 @@ ready = 1 update_icon() - logged_events["[world.time]"] = "[user] teleported [target] to [real_dest] [televored ? "(Belly: [lowertext(real_loc.name)])" : null]" + logged_events["[world.time]"] = "[user] teleported [target] to [real_dest] [televored ? "(Belly: [lowertext(real_dest.name)])" : null]" /obj/item/device/perfect_tele/proc/phase_out(var/mob/M,var/turf/T) @@ -1897,7 +1900,7 @@ user.visible_message(pick("\The [user] is slitting \his stomach open with \the [src]! It looks like [tempgender] trying to commit seppuku.",\ "\The [user] is falling on \the [src]! It looks like [tempgender] trying to commit suicide.")) return (BRUTELOSS|FIRELOSS) - + /obj/item/weapon/melee/fluffstuff/awoosword name = "Wolfgirl Sword Replica" desc = "A replica of a large, scimitar-like sword with a dull edge. Ceremonial... until it isn't." @@ -1941,3 +1944,15 @@ ..() attack_verb = list("bapped", "thwapped", "bonked", "whacked") icon_state = initial(icon_state) + +//SilencedMP5A5 - Serdykov Antoz +/obj/item/device/modkit_conversion/hasd + name = "HASD EVA modification kit" + desc = "A kit containing all the needed tools and parts to modify a suit and helmet into something a HASD unit can use for EVA operations." + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "modkit" + + from_helmet = /obj/item/clothing/head/helmet/space/void/security + from_suit = /obj/item/clothing/suit/space/void/security/taur + to_helmet = /obj/item/clothing/head/helmet/space/void/security/hasd + to_suit = /obj/item/clothing/suit/space/void/security/hasd \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_permits_vr.dm b/code/modules/vore/fluffstuff/custom_permits_vr.dm index f5afc8aaec..c96783e246 100644 --- a/code/modules/vore/fluffstuff/custom_permits_vr.dm +++ b/code/modules/vore/fluffstuff/custom_permits_vr.dm @@ -51,6 +51,11 @@ name = "Sorrel Cavalet's Sidearm Permit" desc = "A card indicating that the owner is allowed to carry a sidearm. It is issued by CentCom, so it is valid until it expires on September 26th, 2562." +// hzdonut:Jesse Soemmer +/obj/item/clothing/accessory/permit/gun/fluff/JesseSoemmer + name = "Jesse Soemmer's Sidearm Permit" + desc = "A card indicating that the owner is allowed to carry a sidearm. It is issued by CentCom, so it is valid until it expires on March 4, 2563." + /* Legacy Permits // BEGIN - PROTOTYPE /obj/item/clothing/accessory/permit/gun/fluff diff --git a/code/modules/vore/fluffstuff/guns/sickshot.dm b/code/modules/vore/fluffstuff/guns/sickshot.dm index f7d5a4b291..ea0820a908 100644 --- a/code/modules/vore/fluffstuff/guns/sickshot.dm +++ b/code/modules/vore/fluffstuff/guns/sickshot.dm @@ -3,7 +3,7 @@ name = "\improper MPA6 \'Sickshot\'" desc = "Need to stun someone? Don't mind having to clean up the mess afterwards? The Sickshot is the answer to your prayers. \ Using a short-range concentrated blast of disruptive sound, the Sickshot will nauseate and confuse the target for several seconds. NOTE: Not suitable \ - for use in vacuum, or on animals. May cause contraction and release of various 'things' from various 'orifices'." + for use in vacuum. Usage on animals may cause panic and rage without stunning. May cause contraction and release of various 'things' from various 'orifices', even if the target is already dead." description_info = "This gun causes nausea in targets, stunning them briefly and causing vomiting. It will also cause them to vomit up prey, sometimes. Repeated shots may help in that case." description_fluff = "" diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 28f398ff99..9e957955b8 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -64,7 +64,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 /mob/living/proc/resize(var/new_size, var/animate = TRUE) if(size_multiplier == new_size) return 1 - + size_multiplier = new_size //Change size_multiplier so that other items can interact with them if(animate) var/change = new_size - size_multiplier diff --git a/code/modules/xenoarcheaology/artifacts/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm index 42c7288d2d..b6c665cb66 100644 --- a/code/modules/xenoarcheaology/artifacts/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm @@ -7,7 +7,7 @@ var/drill_time = 10 var/turf/drilling_turf density = 1 - layer = 3.1 //to go over ores + layer = ABOVE_JUNK_LAYER /obj/machinery/giga_drill/attack_hand(mob/user as mob) if(active) diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm index 4c0bafd707..09b9d398ea 100644 --- a/code/modules/xenoarcheaology/boulder.dm +++ b/code/modules/xenoarcheaology/boulder.dm @@ -29,11 +29,22 @@ C.scan_atom(user, src) return + if(istype(I, /obj/item/device/xenoarch_multi_tool)) + var/obj/item/device/xenoarch_multi_tool/C = I + if(C.mode) //Mode means scanning. + C.depth_scanner.scan_atom(user, src) + return + else + user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!") + if(do_after(user, 15)) + to_chat(user, "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.") + return + if(istype(I, /obj/item/device/measuring_tape)) var/obj/item/device/measuring_tape/P = I user.visible_message("\The [user] extends \the [P] towards \the [src].", "You extend \the [P] towards \the [src].") if(do_after(user, 15)) - user << "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm." + to_chat(user, "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.") return if(istype(I, /obj/item/weapon/pickaxe)) @@ -43,12 +54,12 @@ return last_act = world.time - user << "You start [P.drill_verb] [src]." + to_chat(user, "You start [P.drill_verb] [src].") if(!do_after(user, P.digspeed)) return - user << "You finish [P.drill_verb] [src]." + to_chat(user, "You finish [P.drill_verb] [src].") excavation_level += P.excavation_amount if(excavation_level > 100) @@ -87,4 +98,4 @@ else if(istype(AM,/obj/mecha)) var/obj/mecha/M = AM if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) - M.selected.action(src) \ No newline at end of file + M.selected.action(src) diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 17412b4a8b..5f8c30ecad 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -80,13 +80,13 @@ SSxenoarch.digsite_spawning_turfs.Remove(T) if(nearestTargetDist >= 0) - user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]" + to_chat(user, "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]") else if(nearestSimpleTargetDist >= 0) - user << "Small anomaly detected in a radius of [nearestSimpleTargetDist]m." + to_chat(user, "Small anomaly detected in a radius of [nearestSimpleTargetDist]m.") else - user << "Background radiation levels detected." + to_chat(user, "Background radiation levels detected.") else - user << "Scanning array is recharging." + to_chat(user, "Scanning array is recharging.") /obj/item/device/depth_scanner name = "depth analysis scanner" @@ -133,7 +133,7 @@ positive_locations.Add(D) - user << "\icon[src] [src] pings." + to_chat(user, "\icon[src] [src] pings.") else if(istype(A, /obj/structure/boulder)) var/obj/structure/boulder/B = A @@ -151,7 +151,7 @@ positive_locations.Add(D) - user << "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!" + to_chat(user, "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!") /obj/item/device/depth_scanner/attack_self(var/mob/living/user) interact(user) @@ -310,3 +310,39 @@ usr << browse(null, "window=locater") updateSelfDialog() + +/obj/item/device/xenoarch_multi_tool + name = "xenoarcheology multitool" + desc = "Has the features of the Alden-Saraspova counter, a measuring tape, and a depth analysis scanner all in one!" + icon_state = "ano_scanner2" + item_state = "lampgreen" + icon = 'icons/obj/xenoarchaeology.dmi' + origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2) + matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + var/mode = 1 //Start off scanning. 1 = scanning, 0 = measuring + var/obj/item/device/ano_scanner/anomaly_scanner = null + var/obj/item/device/depth_scanner/depth_scanner = null + +/obj/item/device/xenoarch_multi_tool/New() + anomaly_scanner = new/obj/item/device/ano_scanner(src) + depth_scanner = new/obj/item/device/depth_scanner(src) + +/obj/item/device/xenoarch_multi_tool/attack_self(var/mob/living/user) + depth_scanner.interact(user) + +/obj/item/device/xenoarch_multi_tool/verb/swap_settings(var/mob/living/user) + set name = "Swap Functionality" + set desc = "Swap between the scanning and measuring functionality.." + mode = !mode + if(mode) + to_chat(user, "The device will now scan for artifacts.") + else + to_chat(user, "The device will now measure depth dug.") + +/obj/item/device/xenoarch_multi_tool/verb/scan_for_anomalies(var/mob/living/user) + set name = "Scan for Anomalies" + set desc = "Scan for artifacts and anomalies within your vicinity." + anomaly_scanner.interact(user) + diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index b954d5eb05..d911843cca 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -149,3 +149,43 @@ smallest.loc = src picksToSort -= smallest orient2hud() + +/obj/item/weapon/pickaxe/excavationdrill + name = "excavation drill" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "excavationdrill2" + item_state = "syringe_0" + excavation_amount = 15 + digspeed = 30 + desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The tip is adjustable from 1 to 30 cm." + drill_sound = 'sound/weapons/thudswoosh.ogg' + drill_verb = "drilling" + force = 5 + w_class = 2 + attack_verb = list("drilled") + +/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob) + var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num + if(depth>30 || depth<1) + to_chat(user, "Invalid depth.") + return + excavation_amount = depth + to_chat(user, "You set the depth to [depth]cm.") + switch(depth) + if(1 to 5) + icon_state = "excavationdrill0" + if(6 to 10) + icon_state = "excavationdrill1" + if(11 to 15) + icon_state = "excavationdrill2" + if(16 to 20) + icon_state = "excavationdrill3" + if(21 to 25) + icon_state = "excavationdrill4" + if(25 to 30) + icon_state = "excavationdrill5" //The other 2 sprites are comically long. Let's just cut it at 5. + +/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user) + ..() + var/depth = excavation_amount + to_chat(user, "It is currently set at [depth]cms.") \ No newline at end of file diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe_vr.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe_vr.dm index ffdb7dc2c9..3a1ff22b1c 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe_vr.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe_vr.dm @@ -21,47 +21,3 @@ /obj/item/weapon/pickaxe/hand icon = 'icons/obj/xenoarchaeology_vr.dmi' - -/obj/item/weapon/pickaxe/excavationdrill - name = "excavation drill" - icon = 'icons/obj/xenoarchaeology_vr.dmi' - icon_state = "excavationdrill0" - item_state = "syringe_0" - excavation_amount = 15 - digspeed = 30 - desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The diamond tip is adjustable from 1 to 30 cms." - drill_sound = 'sound/weapons/thudswoosh.ogg' - drill_verb = "drilling" - force = 15.0 - w_class = ITEMSIZE_SMALL - attack_verb = list("drilled") - hitsound = 'sound/weapons/circsawhit.ogg' - -/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob) - var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num - if(depth>30 || depth<1) - user << "Invalid depth." - return - excavation_amount = depth - user << "You set the depth to [depth]cm." - if (depth<4) - icon_state = "excavationdrill0" - else if (depth >=4 && depth <8) - icon_state = "excavationdrill1" - else if (depth >=8 && depth <12) - icon_state = "excavationdrill2" - else if (depth >=12 && depth <16) - icon_state = "excavationdrill3" - else if (depth >=16 && depth <20) - icon_state = "excavationdrill4" - else if (depth >=20 && depth <24) - icon_state = "excavationdrill5" - else if (depth >=24 && depth <28) - icon_state = "excavationdrill6" - else - icon_state = "excavationdrill7" - -/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user) - ..() - var/depth = excavation_amount - user << "It is currently set at [depth]cms." diff --git a/config/example/motd.txt b/config/example/motd.txt index 122dc6f7ef..20b67d09c9 100644 --- a/config/example/motd.txt +++ b/config/example/motd.txt @@ -1,7 +1,5 @@ - -

Welcome to the Virgo Orbital Research Establishment

-

-You must be 18 or older to play here. No exceptions.
-This server is running VOREstation's modification of the Baystation 12 SS13 code. +

Welcome to Space Station 13!

-Code was recently updated to a 2015 version of Baystation's code. We will no longer be syncing with Bay's code, and will be producing our own code branch on Github. Please report any issues on the VOREstation forums, as the code is still not fully tested. \ No newline at end of file +-This server is running the Polaris modification of the Baystation12 SS13 code. +

+Bugtracker: for posting of bugs and issues. diff --git a/html/changelog.html b/html/changelog.html index 1b54f6e327..e81411a62c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,85 @@ -->
+

01 April 2018

+

Anewbe updated:

+ +

Cameron653 updated:

+ +

Heroman3003 updated:

+ +

MistyLuminescence updated:

+ +

Woodrat updated:

+ +

battlefieldCommander updated:

+ + +

15 March 2018

+

Anewbe updated:

+ +

Cerebulon updated:

+ +

MisterLayne updated:

+ +

Nerezza updated:

+ +

Woodrat updated:

+ +

05 March 2018

Anewbe updated: