mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-26 13:39:16 +01:00
Merge remote-tracking branch 'refs/remotes/origin/master' into detective-sidearm
This commit is contained in:
+1
-1
@@ -4,7 +4,7 @@ sudo: false
|
||||
|
||||
env:
|
||||
BYOND_MAJOR="512"
|
||||
BYOND_MINOR="1392"
|
||||
BYOND_MINOR="1403"
|
||||
MACRO_COUNT=4
|
||||
|
||||
cache:
|
||||
|
||||
@@ -71,20 +71,23 @@
|
||||
else if(istype(loc, /turf/space/))
|
||||
parent.radiate_heat_to_space(surface, 1)
|
||||
|
||||
if(buckled_mob)
|
||||
var/hc = pipe_air.heat_capacity()
|
||||
var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500)
|
||||
pipe_air.temperature = avg_temp
|
||||
buckled_mob.bodytemperature = avg_temp
|
||||
if(has_buckled_mobs())
|
||||
for(var/M in buckled_mobs)
|
||||
var/mob/living/L = M
|
||||
|
||||
var/heat_limit = 1000
|
||||
var/hc = pipe_air.heat_capacity()
|
||||
var/avg_temp = (pipe_air.temperature * hc + L.bodytemperature * 3500) / (hc + 3500)
|
||||
pipe_air.temperature = avg_temp
|
||||
L.bodytemperature = avg_temp
|
||||
|
||||
var/mob/living/carbon/human/H = buckled_mob
|
||||
if(istype(H) && H.species)
|
||||
heat_limit = H.species.heat_level_3
|
||||
var/heat_limit = 1000
|
||||
|
||||
if(pipe_air.temperature > heat_limit + 1)
|
||||
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO, used_weapon = "Excessive Heat")
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(istype(H) && H.species)
|
||||
heat_limit = H.species.heat_level_3
|
||||
|
||||
if(pipe_air.temperature > heat_limit + 1)
|
||||
L.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO, used_weapon = "Excessive Heat")
|
||||
|
||||
//fancy radiation glowing
|
||||
if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K
|
||||
|
||||
+37
-68
@@ -1,3 +1,6 @@
|
||||
//
|
||||
// Base type of pipes
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe
|
||||
|
||||
var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke
|
||||
@@ -100,7 +103,7 @@
|
||||
qdel(meter)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/atmospherics/proc/change_color(var/new_color)
|
||||
/obj/machinery/atmospherics/pipe/proc/change_color(var/new_color)
|
||||
//only pass valid pipe colors please ~otherwise your pipe will turn invisible
|
||||
if(!pipe_color_check(new_color))
|
||||
return
|
||||
@@ -108,21 +111,6 @@
|
||||
pipe_color = new_color
|
||||
update_icon()
|
||||
|
||||
/*
|
||||
/obj/machinery/atmospherics/pipe/add_underlay(var/obj/machinery/atmospherics/node, var/direction)
|
||||
if(istype(src, /obj/machinery/atmospherics/pipe/tank)) //todo: move tanks to unary devices
|
||||
return ..()
|
||||
|
||||
if(node)
|
||||
var/temp_dir = get_dir(src, node)
|
||||
underlays += icon_manager.get_atmos_icon("pipe_underlay_intact", temp_dir, color_cache_name(node))
|
||||
return temp_dir
|
||||
else if(direction)
|
||||
underlays += icon_manager.get_atmos_icon("pipe_underlay_exposed", direction, pipe_color)
|
||||
else
|
||||
return null
|
||||
*/
|
||||
|
||||
/obj/machinery/atmospherics/pipe/color_cache_name(var/obj/machinery/atmospherics/node)
|
||||
if(istype(src, /obj/machinery/atmospherics/pipe/tank))
|
||||
return ..()
|
||||
@@ -137,6 +125,20 @@
|
||||
else
|
||||
return pipe_color
|
||||
|
||||
/obj/machinery/atmospherics/pipe/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/process()
|
||||
if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
//
|
||||
// Simple Pipes - Just a tube, maybe bent
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/simple
|
||||
icon = 'icons/atmos/pipes.dmi'
|
||||
icon_state = ""
|
||||
@@ -166,17 +168,6 @@
|
||||
icon = null
|
||||
alpha = 255
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/process()
|
||||
if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure)
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
@@ -411,7 +402,9 @@
|
||||
|
||||
level = 2
|
||||
|
||||
|
||||
//
|
||||
// Manifold Pipes - Three way "T" joints
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/manifold
|
||||
icon = 'icons/atmos/manifold.dmi'
|
||||
icon_state = ""
|
||||
@@ -444,20 +437,9 @@
|
||||
if(WEST)
|
||||
initialize_directions = NORTH|EAST|SOUTH
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion()
|
||||
return list(node1, node2, node3)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
@@ -674,6 +656,10 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/purple
|
||||
color = PIPE_COLOR_PURPLE
|
||||
|
||||
|
||||
//
|
||||
// 4-Way Manifold Pipes - 4 way "cross" junction
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/manifold4w
|
||||
icon = 'icons/atmos/manifold.dmi'
|
||||
icon_state = ""
|
||||
@@ -699,12 +685,6 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/pipeline_expansion()
|
||||
return list(node1, node2, node3, node4)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
@@ -813,11 +793,6 @@
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/atmos_init()
|
||||
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,1))
|
||||
@@ -939,6 +914,9 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple
|
||||
color = PIPE_COLOR_PURPLE
|
||||
|
||||
//
|
||||
// Pipe Cap - They go on the end
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/cap
|
||||
name = "pipe endcap"
|
||||
desc = "An endcap for pipes"
|
||||
@@ -957,19 +935,9 @@
|
||||
/obj/machinery/atmospherics/pipe/cap/init_dir()
|
||||
initialize_directions = dir
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/pipeline_expansion()
|
||||
return list(node)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
/obj/machinery/atmospherics/pipe/cap/Destroy()
|
||||
if(node)
|
||||
node.disconnect(src)
|
||||
@@ -1061,7 +1029,9 @@
|
||||
icon_connect_type = "-supply"
|
||||
color = PIPE_COLOR_BLUE
|
||||
|
||||
|
||||
//
|
||||
// Tanks - These are implemented as pipes with large volume
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/tank
|
||||
icon = 'icons/atmos/tank_vr.dmi' //VOREStation Edit - New Icons
|
||||
icon_state = "air_map"
|
||||
@@ -1084,12 +1054,6 @@
|
||||
/obj/machinery/atmospherics/pipe/tank/init_dir()
|
||||
initialize_directions = dir
|
||||
|
||||
/obj/machinery/atmospherics/pipe/tank/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/tank/Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
@@ -1227,6 +1191,9 @@
|
||||
..()
|
||||
icon_state = "n2o"
|
||||
|
||||
//
|
||||
// Vent Pipe - Unpowered vent
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/vent
|
||||
icon = 'icons/obj/atmospherics/pipe_vent.dmi'
|
||||
icon_state = "intact"
|
||||
@@ -1308,7 +1275,9 @@
|
||||
else
|
||||
icon_state = "exposed"
|
||||
|
||||
|
||||
//
|
||||
// Universal Pipe Adapter - Designed for connecting scrubbers, normal, and supply pipes together.
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/simple/visible/universal
|
||||
name="Universal pipe adapter"
|
||||
desc = "An adapter for regular, supply and scrubbers pipes"
|
||||
|
||||
@@ -5,4 +5,10 @@
|
||||
0 to allow using external resources or on-demand behaviour;
|
||||
1 to use the default behaviour (preload compiled in recourses, not player uploaded ones);
|
||||
2 for preloading absolutely everything;
|
||||
*/
|
||||
*/
|
||||
|
||||
// If we are doing the map test build, do not include the main maps, only the submaps.
|
||||
#if MAP_TEST
|
||||
#define USING_MAP_DATUM /datum/map
|
||||
#define MAP_OVERRIDE 1
|
||||
#endif
|
||||
|
||||
@@ -40,15 +40,83 @@ What is the naming convention for planes or layers?
|
||||
|
||||
*/
|
||||
|
||||
#define DEFAULT_PLANE 0 // BYOND's default value for plane, the "base plane"
|
||||
#define PLANE_ADMIN1 -92 //Purely for shenanigans
|
||||
#define PLANE_ADMIN2 -91 //And adminbuse
|
||||
#define PLANE_ADMIN3 -90 //And generating salt
|
||||
|
||||
#define SPACE_PLANE -32 // Reserved for use in space/parallax
|
||||
|
||||
#define PARALLAX_PLANE -30 // Reserved for use in space/parallax
|
||||
#define SPACE_PLANE -32 // Reserved for use in space/parallax
|
||||
#define PARALLAX_PLANE -30 // Reserved for use in space/parallax
|
||||
|
||||
// OPENSPACE_PLANE reserves all planes between OPENSPACE_PLANE_START and OPENSPACE_PLANE_END inclusive
|
||||
#define OPENSPACE_PLANE_START -23
|
||||
#define OPENSPACE_PLANE_END -8
|
||||
#define OPENSPACE_PLANE -25 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17)
|
||||
#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 OVER_OPENSPACE_PLANE -7
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
#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 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 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 OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||
|
||||
#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
|
||||
|
||||
#define PLANE_GHOSTS 10 //Spooooooooky ghooooooosts
|
||||
#define PLANE_AI_EYE 11 //The AI eye lives here
|
||||
|
||||
// "Character HUDs", aka HUDs, but not the game's UI. Things like medhuds. I know Planes say they must be intergers, but it's lies.
|
||||
#define PLANE_CH_STATUS 15 //Status icon
|
||||
#define PLANE_CH_HEALTH 16 //Health icon
|
||||
#define PLANE_CH_LIFE 17 //Health bar
|
||||
#define PLANE_CH_ID 18 //Job icon
|
||||
#define PLANE_CH_WANTED 19 //Arrest icon
|
||||
#define PLANE_CH_IMPLOYAL 20 //Loyalty implant icon
|
||||
#define PLANE_CH_IMPTRACK 21 //Tracking implant icon
|
||||
#define PLANE_CH_IMPCHEM 22 //Chemical implant icon
|
||||
#define PLANE_CH_SPECIAL 23 //Special role icon (revhead or w/e)
|
||||
#define PLANE_CH_STATUS_OOC 24 //OOC status hud for spooks
|
||||
|
||||
|
||||
//Fullscreen overlays under inventory
|
||||
#define PLANE_FULLSCREEN 90 //Blindness, mesons, druggy, etc
|
||||
#define FULLSCREEN_LAYER 18
|
||||
#define DAMAGE_LAYER 18.1
|
||||
#define BLIND_LAYER 18.2
|
||||
#define CRIT_LAYER 18.3
|
||||
|
||||
//Client UI HUD stuff
|
||||
#define PLANE_PLAYER_HUD 95 //The character's UI is on this plane
|
||||
#define LAYER_HUD_UNDER 1 //Under the HUD items
|
||||
#define LAYER_HUD_BASE 2 //The HUD items themselves
|
||||
#define LAYER_HUD_ITEM 3 //Things sitting on HUD items (largely irrelevant because PLANE_PLAYER_HUD_ITEMS)
|
||||
#define LAYER_HUD_ABOVE 4 //Things that reside above items (highlights)
|
||||
#define PLANE_PLAYER_HUD_ITEMS 96 //Separate layer with which to apply colorblindness
|
||||
|
||||
|
||||
//////////////////////////
|
||||
/atom/proc/hud_layerise()
|
||||
plane = PLANE_PLAYER_HUD_ITEMS
|
||||
layer = LAYER_HUD_ITEM
|
||||
|
||||
/atom/proc/reset_plane_and_layer()
|
||||
plane = initial(plane)
|
||||
layer = initial(layer)
|
||||
|
||||
|
||||
// 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))
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
// "Character HUDs", aka HUDs, but not the game's UI. Things like medhuds.
|
||||
#define PLANE_CH_HEALTH_VR 27 //Hidden healthbar when at full health
|
||||
#define PLANE_CH_STATUS_R 28 //Right-side status icon
|
||||
#define PLANE_CH_BACKUP 29 //Backup implant
|
||||
#define PLANE_CH_VANTAG 30 //Vore Antag hud
|
||||
|
||||
#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable
|
||||
@@ -9,7 +9,7 @@
|
||||
#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_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
|
||||
|
||||
@@ -49,3 +49,28 @@
|
||||
#define CL_MATRIX_CG 18
|
||||
#define CL_MATRIX_CB 19
|
||||
#define CL_MATRIX_CA 20
|
||||
|
||||
//Some defines to generalise colours used in lighting.
|
||||
//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated
|
||||
#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130)
|
||||
#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100)
|
||||
#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250)
|
||||
|
||||
#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175)
|
||||
#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225)
|
||||
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255)
|
||||
#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248)
|
||||
#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225)
|
||||
#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125)
|
||||
#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50)
|
||||
#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50)
|
||||
#define LIGHT_COLOR_PURPLE "#952CF4" //Light Purple. rgb(149, 44, 244)
|
||||
#define LIGHT_COLOR_LAVENDER "#9B51FF" //Less-saturated light purple. rgb(155, 81, 255)
|
||||
|
||||
//These ones aren't a direct colour like the ones above, because nothing would fit
|
||||
#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
|
||||
#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24)
|
||||
#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75)
|
||||
#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75)
|
||||
#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
|
||||
#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250)
|
||||
+5
-13
@@ -87,7 +87,6 @@
|
||||
#define SHUTTLE_IDLE 0
|
||||
#define SHUTTLE_WARMUP 1
|
||||
#define SHUTTLE_INTRANSIT 2
|
||||
#define SHUTTLE_CRASHED 3 // VOREStation Edit - Yup that can happen now
|
||||
|
||||
// Sound defines for shuttles.
|
||||
#define HYPERSPACE_WARMUP 0
|
||||
@@ -121,18 +120,6 @@
|
||||
|
||||
//Area flags, possibly more to come
|
||||
#define RAD_SHIELDED 1 //shielded from radiation, clearly
|
||||
// VOREStation Edit Begin
|
||||
#define BLUE_SHIELDED 2 // shield from bluespace teleportation (telescience)
|
||||
// VOREStation Edit End
|
||||
|
||||
// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc.
|
||||
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
||||
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
|
||||
#define LIGHTING_LAYER 11
|
||||
#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 OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||
#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable // VOREStation Edit
|
||||
|
||||
// Convoluted setup so defines can be supplied by Bay12 main server compile script.
|
||||
// Should still work fine for people jamming the icons into their repo.
|
||||
@@ -160,6 +147,10 @@
|
||||
#define MAT_PHORON "phoron"
|
||||
#define MAT_DIAMOND "diamond"
|
||||
#define MAT_SNOW "snow"
|
||||
#define MAT_WOOD "wood"
|
||||
#define MAT_LOG "log"
|
||||
#define MAT_SIFWOOD "alien wood"
|
||||
#define MAT_SIFLOG "alien log"
|
||||
|
||||
#define SHARD_SHARD "shard"
|
||||
#define SHARD_SHRAPNEL "shrapnel"
|
||||
@@ -228,6 +219,7 @@
|
||||
#define MAP_MAXX 4
|
||||
#define MAP_MAXY 5
|
||||
#define MAP_MAXZ 6
|
||||
|
||||
// /atom/proc/use_check flags
|
||||
#define USE_ALLOW_NONLIVING 1
|
||||
#define USE_ALLOW_NON_ADV_TOOL_USR 2
|
||||
|
||||
@@ -24,3 +24,8 @@
|
||||
#define MR_NORMAL 0
|
||||
#define MR_UNSURE 1
|
||||
#define MR_DEAD 2
|
||||
|
||||
//Shuttle madness!
|
||||
#define SHUTTLE_CRASHED 3 // Yup that can happen now
|
||||
|
||||
#define BLUE_SHIELDED 2 // Shield from bluespace teleportation (telescience)
|
||||
|
||||
+33
-8
@@ -102,14 +102,14 @@
|
||||
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
|
||||
#define MAX_SUPPLIED_LAW_NUMBER 50
|
||||
|
||||
// NT's alignment towards the character
|
||||
#define COMPANY_LOYAL "Loyal"
|
||||
#define COMPANY_SUPPORTATIVE "Supportive"
|
||||
#define COMPANY_NEUTRAL "Neutral"
|
||||
#define COMPANY_SKEPTICAL "Skeptical"
|
||||
#define COMPANY_OPPOSED "Opposed"
|
||||
// Character's economic class
|
||||
#define CLASS_UPPER "Wealthy"
|
||||
#define CLASS_UPMID "Well-off"
|
||||
#define CLASS_MIDDLE "Average"
|
||||
#define CLASS_LOWMID "Underpaid"
|
||||
#define CLASS_LOWER "Poor"
|
||||
|
||||
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)
|
||||
#define ECONOMIC_CLASS list(CLASS_UPPER,CLASS_UPMID,CLASS_MIDDLE,CLASS_LOWMID,CLASS_LOWER)
|
||||
|
||||
|
||||
// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc.
|
||||
@@ -227,4 +227,29 @@
|
||||
// For slime commanding. Higher numbers allow for more actions.
|
||||
#define SLIME_COMMAND_OBEY 1 // When disciplined.
|
||||
#define SLIME_COMMAND_FACTION 2 // When in the same 'faction'.
|
||||
#define SLIME_COMMAND_FRIEND 3 // When befriended with a slime friendship agent.
|
||||
#define SLIME_COMMAND_FRIEND 3 // When befriended with a slime friendship agent.
|
||||
|
||||
//Vision flags, for dealing with plane visibility
|
||||
#define VIS_FULLBRIGHT 1
|
||||
#define VIS_GHOSTS 2
|
||||
#define VIS_AI_EYE 3
|
||||
|
||||
#define VIS_CH_STATUS 4
|
||||
#define VIS_CH_HEALTH 5
|
||||
#define VIS_CH_LIFE 6
|
||||
#define VIS_CH_ID 7
|
||||
#define VIS_CH_WANTED 8
|
||||
#define VIS_CH_IMPLOYAL 9
|
||||
#define VIS_CH_IMPTRACK 10
|
||||
#define VIS_CH_IMPCHEM 11
|
||||
#define VIS_CH_SPECIAL 12
|
||||
#define VIS_CH_STATUS_OOC 13
|
||||
|
||||
#define VIS_D_COLORBLIND 14
|
||||
#define VIS_D_COLORBLINDI 15
|
||||
|
||||
#define VIS_ADMIN1 16
|
||||
#define VIS_ADMIN2 17
|
||||
#define VIS_ADMIN3 18
|
||||
|
||||
#define VIS_COUNT 18 //Must be highest number from above.
|
||||
@@ -0,0 +1,8 @@
|
||||
#undef VIS_COUNT
|
||||
|
||||
#define VIS_CH_STATUS_R 18
|
||||
#define VIS_CH_HEALTH_VR 19
|
||||
#define VIS_CH_BACKUP 20
|
||||
#define VIS_CH_VANTAG 21
|
||||
|
||||
#define VIS_COUNT 21
|
||||
@@ -9,6 +9,7 @@
|
||||
#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever
|
||||
#define NO_BLOOD 0x100 // Never bleed, never show blood amount
|
||||
#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons
|
||||
#define NO_INFECT 0x400 // Don't allow infections in limbs or organs, similar to IS_PLANT, without other strings.
|
||||
// unused: 0x8000 - higher than this will overflow
|
||||
|
||||
// Species spawn flags
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
#define ARCHAEO_REMAINS_ROBOT 33
|
||||
#define ARCHAEO_REMAINS_XENO 34
|
||||
#define ARCHAEO_GASMASK 35
|
||||
#define MAX_ARCHAEO 35
|
||||
#define ARCHAEO_ALIEN_ITEM 36
|
||||
#define MAX_ARCHAEO 36
|
||||
|
||||
#define DIGSITE_GARDEN 1
|
||||
#define DIGSITE_ANIMAL 2
|
||||
|
||||
@@ -26,6 +26,7 @@ var/global/list/vantag_choices_list = list(
|
||||
VANTAG_KIDNAP = "Be Kidnapped",
|
||||
VANTAG_KILL = "Be Killed")
|
||||
|
||||
/* Time to finally undo this. Replaced with digest_act on these items.
|
||||
//Important items that are preserved when people are digested, etc.
|
||||
//On Polaris, different from Cryo list as MMIs need to be removed for FBPs to be logged out.
|
||||
var/global/list/important_items = list(
|
||||
@@ -40,7 +41,9 @@ var/global/list/important_items = list(
|
||||
/obj/item/blueprints,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/weapon/disk/nuclear,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz,
|
||||
/obj/item/device/perfect_tele_beacon)
|
||||
*/
|
||||
|
||||
var/global/list/digestion_sounds = list(
|
||||
'sound/vore/digest1.ogg',
|
||||
|
||||
+12
-2
@@ -635,7 +635,7 @@ The _flatIcons list is a cache for generated icon files.
|
||||
*/
|
||||
|
||||
proc // Creates a single icon from a given /atom or /image. Only the first argument is required.
|
||||
getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT, always_use_defdir = 0)
|
||||
getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT, always_use_defdir = 0, picture_planes = list(PLANE_WORLD))
|
||||
// We start with a blank canvas, otherwise some icon procs crash silently
|
||||
var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon
|
||||
if(!A)
|
||||
@@ -700,6 +700,10 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu
|
||||
if(curIndex<=process.len)
|
||||
current = process[curIndex]
|
||||
if(current)
|
||||
var/currentPlane = current:plane
|
||||
if (currentPlane != FLOAT_PLANE && !(currentPlane in picture_planes))
|
||||
curIndex++
|
||||
continue;
|
||||
currentLayer = current:layer
|
||||
if(currentLayer<0) // Special case for FLY_LAYER
|
||||
if(currentLayer <= -1000) return flat
|
||||
@@ -760,7 +764,7 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu
|
||||
// Pull the default direction.
|
||||
add = icon(I:icon, I:icon_state)
|
||||
else // 'I' is an appearance object.
|
||||
add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend)
|
||||
add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend, picture_planes = picture_planes)
|
||||
|
||||
// Find the new dimensions of the flat icon to fit the added overlay
|
||||
addX1 = min(flatX1, I:pixel_x+1)
|
||||
@@ -873,3 +877,9 @@ proc/sort_atoms_by_layer(var/list/atoms)
|
||||
result.Swap(i, gap + i)
|
||||
swapped = 1
|
||||
return result
|
||||
|
||||
/proc/gen_hud_image(var/file, var/person, var/state, var/plane)
|
||||
var/image/img = image(file, person, state)
|
||||
img.plane = plane //Thanks Byond.
|
||||
img.appearance_flags = APPEARANCE_UI|KEEP_APART
|
||||
return img
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
return occupant
|
||||
|
||||
/obj/vehicle/train/get_mob()
|
||||
return buckled_mob
|
||||
return buckled_mobs
|
||||
|
||||
/mob/get_mob()
|
||||
return src
|
||||
@@ -129,7 +129,7 @@ proc/age2agedescription(age)
|
||||
else return "unknown"
|
||||
|
||||
/proc/RoundHealth(health)
|
||||
var/list/icon_states = icon_states('icons/mob/hud_med.dmi')
|
||||
var/list/icon_states = icon_states(ingame_hud_med)
|
||||
for(var/icon_state in icon_states)
|
||||
if(health >= text2num(icon_state))
|
||||
return icon_state
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/atom/proc/living_mobs(var/range = world.view)
|
||||
var/list/viewers = oviewers(src,range)
|
||||
var/list/living = list()
|
||||
for(var/mob/living/L in viewers)
|
||||
living += L
|
||||
|
||||
return living
|
||||
@@ -59,6 +59,8 @@
|
||||
#define to_world_log(message) world.log << message
|
||||
// TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later.
|
||||
#define log_world(message) world.log << message
|
||||
#define to_file(file_entry, source_var) file_entry << source_var
|
||||
#define from_file(file_entry, target_var) file_entry >> target_var
|
||||
|
||||
|
||||
#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE)
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
#define FULLSCREEN_LAYER 18
|
||||
#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1
|
||||
#define BLIND_LAYER DAMAGE_LAYER + 0.1
|
||||
#define CRIT_LAYER BLIND_LAYER + 0.1
|
||||
|
||||
/mob
|
||||
var/list/screens = list()
|
||||
|
||||
@@ -68,6 +63,7 @@
|
||||
icon_state = "default"
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
layer = FULLSCREEN_LAYER
|
||||
plane = PLANE_FULLSCREEN
|
||||
mouse_opacity = 0
|
||||
var/severity = 0
|
||||
|
||||
|
||||
+21
-13
@@ -13,6 +13,7 @@ var/list/global_huds = list(
|
||||
global_hud.thermal,
|
||||
global_hud.meson,
|
||||
global_hud.science,
|
||||
global_hud.material,
|
||||
global_hud.holomap
|
||||
)
|
||||
|
||||
@@ -31,6 +32,7 @@ var/list/global_huds = list(
|
||||
var/obj/screen/thermal
|
||||
var/obj/screen/meson
|
||||
var/obj/screen/science
|
||||
var/obj/screen/material
|
||||
var/obj/screen/holomap
|
||||
|
||||
/datum/global_hud/proc/setup_overlay(var/icon_state)
|
||||
@@ -39,37 +41,36 @@ var/list/global_huds = list(
|
||||
screen.icon = 'icons/obj/hud_full.dmi'
|
||||
screen.icon_state = icon_state
|
||||
screen.layer = SCREEN_LAYER
|
||||
screen.plane = PLANE_FULLSCREEN
|
||||
screen.mouse_opacity = 0
|
||||
|
||||
return screen
|
||||
|
||||
/obj/screen/global_screen
|
||||
screen_loc = ui_entire_screen
|
||||
layer = 17
|
||||
plane = PLANE_FULLSCREEN
|
||||
mouse_opacity = 0
|
||||
|
||||
/datum/global_hud/New()
|
||||
//420erryday psychedellic colours screen overlay for when you are high
|
||||
druggy = new /obj/screen()
|
||||
druggy.screen_loc = ui_entire_screen
|
||||
druggy = new /obj/screen/global_screen()
|
||||
druggy.icon_state = "druggy"
|
||||
druggy.layer = 17
|
||||
druggy.mouse_opacity = 0
|
||||
|
||||
//that white blurry effect you get when you eyes are damaged
|
||||
blurry = new /obj/screen()
|
||||
blurry.screen_loc = ui_entire_screen
|
||||
blurry = new /obj/screen/global_screen()
|
||||
blurry.icon_state = "blurry"
|
||||
blurry.layer = 17
|
||||
blurry.mouse_opacity = 0
|
||||
|
||||
//static overlay effect for cameras and the like
|
||||
whitense = new /obj/screen()
|
||||
whitense.screen_loc = ui_entire_screen
|
||||
whitense = new /obj/screen/global_screen()
|
||||
whitense.icon = 'icons/effects/static.dmi'
|
||||
whitense.icon_state = "1 light"
|
||||
whitense.layer = 17
|
||||
whitense.mouse_opacity = 0
|
||||
|
||||
nvg = setup_overlay("nvg_hud")
|
||||
thermal = setup_overlay("thermal_hud")
|
||||
meson = setup_overlay("meson_hud")
|
||||
science = setup_overlay("science_hud")
|
||||
material = setup_overlay("material_hud")
|
||||
|
||||
// The holomap screen object is actually totally invisible.
|
||||
// Station maps work by setting it as an images location before sending to client, not
|
||||
@@ -89,12 +90,16 @@ var/list/global_huds = list(
|
||||
vimpaired = newlist(/obj/screen,/obj/screen,/obj/screen,/obj/screen)
|
||||
O = vimpaired[1]
|
||||
O.screen_loc = "1,1 to 5,15"
|
||||
O.plane = PLANE_FULLSCREEN
|
||||
O = vimpaired[2]
|
||||
O.screen_loc = "5,1 to 10,5"
|
||||
O.plane = PLANE_FULLSCREEN
|
||||
O = vimpaired[3]
|
||||
O.screen_loc = "6,11 to 10,15"
|
||||
O.plane = PLANE_FULLSCREEN
|
||||
O = vimpaired[4]
|
||||
O.screen_loc = "11,1 to 15,15"
|
||||
O.plane = PLANE_FULLSCREEN
|
||||
|
||||
//welding mask overlay black/dither
|
||||
darkMask = newlist(/obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen, /obj/screen)
|
||||
@@ -119,18 +124,21 @@ var/list/global_huds = list(
|
||||
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.mouse_opacity = 0
|
||||
O.plane = PLANE_FULLSCREEN
|
||||
O.mouse_opacity = 2
|
||||
|
||||
/*
|
||||
The hud datum
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
src.adding = list()
|
||||
src.other = list()
|
||||
src.hotkeybuttons = list() //These can be disabled for hotkey usersx
|
||||
src.hotkeybuttons = list() //These can be disabled for hotkey users
|
||||
|
||||
var/list/hud_elements = list()
|
||||
var/obj/screen/using
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.icon = ui_style
|
||||
inv_box.layer = 19
|
||||
inv_box.color = ui_color
|
||||
inv_box.alpha = ui_alpha
|
||||
|
||||
@@ -50,7 +49,7 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "other"
|
||||
using.screen_loc = ui_inventory
|
||||
using.layer = 20
|
||||
using.hud_layerise()
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.adding += using
|
||||
@@ -65,7 +64,6 @@
|
||||
using.screen_loc = ui_acti
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 20
|
||||
src.adding += using
|
||||
action_intent = using
|
||||
|
||||
@@ -82,7 +80,7 @@
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
using.layer = LAYER_HUD_ITEM //These sit on the intent box
|
||||
src.adding += using
|
||||
help_intent = using
|
||||
|
||||
@@ -94,7 +92,7 @@
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
using.layer = LAYER_HUD_ITEM
|
||||
src.adding += using
|
||||
disarm_intent = using
|
||||
|
||||
@@ -106,7 +104,7 @@
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
using.layer = LAYER_HUD_ITEM
|
||||
src.adding += using
|
||||
grab_intent = using
|
||||
|
||||
@@ -118,7 +116,7 @@
|
||||
using.icon = ico
|
||||
using.screen_loc = ui_acti
|
||||
using.alpha = ui_alpha
|
||||
using.layer = 21
|
||||
using.layer = LAYER_HUD_ITEM
|
||||
src.adding += using
|
||||
hurt_intent = using
|
||||
//end intent small hud objects
|
||||
@@ -129,7 +127,6 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
|
||||
using.screen_loc = ui_movi
|
||||
using.layer = 20
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.adding += using
|
||||
@@ -141,7 +138,6 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "act_drop"
|
||||
using.screen_loc = ui_drop_throw
|
||||
using.layer = 19
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.hotkeybuttons += using
|
||||
@@ -153,7 +149,6 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "act_equip"
|
||||
using.screen_loc = ui_equip
|
||||
using.layer = 20
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.adding += using
|
||||
@@ -167,7 +162,6 @@
|
||||
inv_box.icon_state = "r_hand_active"
|
||||
inv_box.screen_loc = ui_rhand
|
||||
inv_box.slot_id = slot_r_hand
|
||||
inv_box.layer = 19
|
||||
inv_box.color = ui_color
|
||||
inv_box.alpha = ui_alpha
|
||||
|
||||
@@ -183,7 +177,6 @@
|
||||
inv_box.icon_state = "l_hand_active"
|
||||
inv_box.screen_loc = ui_lhand
|
||||
inv_box.slot_id = slot_l_hand
|
||||
inv_box.layer = 19
|
||||
inv_box.color = ui_color
|
||||
inv_box.alpha = ui_alpha
|
||||
src.l_hand_hud_object = inv_box
|
||||
@@ -194,7 +187,6 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "hand1"
|
||||
using.screen_loc = ui_swaphand1
|
||||
using.layer = 19
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.adding += using
|
||||
@@ -204,7 +196,6 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "hand2"
|
||||
using.screen_loc = ui_swaphand2
|
||||
using.layer = 19
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.adding += using
|
||||
@@ -215,7 +206,6 @@
|
||||
using.icon = ui_style
|
||||
using.icon_state = "act_resist"
|
||||
using.screen_loc = ui_pull_resist
|
||||
using.layer = 19
|
||||
using.color = ui_color
|
||||
using.alpha = ui_alpha
|
||||
src.hotkeybuttons += using
|
||||
|
||||
@@ -258,7 +258,7 @@ var/obj/screen/robot_inventory
|
||||
A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
|
||||
else
|
||||
A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
|
||||
A.layer = 20
|
||||
A.hud_layerise()
|
||||
|
||||
x++
|
||||
if(x == 4)
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
/obj/screen
|
||||
name = ""
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
layer = 20.0
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|NO_CLIENT_COLOR
|
||||
layer = LAYER_HUD_BASE
|
||||
plane = PLANE_PLAYER_HUD
|
||||
unacidable = 1
|
||||
var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
|
||||
var/datum/hud/hud = null // A reference to the owner HUD, if any.
|
||||
|
||||
@@ -81,6 +81,7 @@ var/list/gamemode_cache = list()
|
||||
var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active.
|
||||
|
||||
var/character_slots = 10 // The number of available character slots
|
||||
var/loadout_slots = 3 // The number of loadout slots per character
|
||||
|
||||
var/max_maint_drones = 5 //This many drones can spawn,
|
||||
var/allow_drone_spawn = 1 //assuming the admin allow them to.
|
||||
@@ -653,6 +654,9 @@ var/list/gamemode_cache = list()
|
||||
if("character_slots")
|
||||
config.character_slots = text2num(value)
|
||||
|
||||
if("loadout_slots")
|
||||
config.loadout_slots = text2num(value)
|
||||
|
||||
if("allow_drone_spawn")
|
||||
config.allow_drone_spawn = text2num(value)
|
||||
|
||||
|
||||
@@ -8,8 +8,12 @@ var/global/datum/shuttle_controller/shuttle_controller
|
||||
|
||||
/datum/shuttle_controller/proc/process()
|
||||
//process ferry shuttles
|
||||
for (var/datum/shuttle/ferry/shuttle in process_shuttles)
|
||||
if (shuttle.process_state || shuttle.always_process)
|
||||
for (var/datum/shuttle/shuttle in process_shuttles)
|
||||
if(istype(shuttle, /datum/shuttle/ferry))
|
||||
var/datum/shuttle/ferry/F = shuttle
|
||||
if(F.process_state || F.always_process)
|
||||
F.process()
|
||||
else
|
||||
shuttle.process()
|
||||
|
||||
|
||||
|
||||
@@ -81,17 +81,7 @@
|
||||
|
||||
/////// 9mm
|
||||
|
||||
/obj/item/ammo_magazine/m9mm/flash
|
||||
ammo_type =/obj/item/ammo_casing/a9mmf
|
||||
|
||||
/obj/item/ammo_magazine/m9mm/rubber
|
||||
name = "magazine (9mm rubber)"
|
||||
ammo_type =/obj/item/ammo_casing/a9mmr
|
||||
|
||||
/obj/item/ammo_magazine/m9mm/practice
|
||||
name = "magazine (9mm practice)"
|
||||
ammo_type =/obj/item/ammo_casing/a9mmp
|
||||
|
||||
// Full size pistol mags.
|
||||
/datum/category_item/autolathe/arms/pistol_9mm
|
||||
name = "pistol magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mm
|
||||
@@ -109,6 +99,28 @@
|
||||
name = "pistol magazine (9mm flash)"
|
||||
path =/obj/item/ammo_magazine/m9mm/flash
|
||||
|
||||
// Small mags for small or old guns.
|
||||
/datum/category_item/autolathe/arms/pistol_9mm_compact
|
||||
name = "compact pistol magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mmr_compact
|
||||
name = "compact pistol magazine (9mm rubber)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact/rubber
|
||||
hidden = 1 // These are all hidden because they are traitor mags and will otherwise just clutter the Autolathe.
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mmp_compact
|
||||
name = "compact pistol magazine (9mm practice)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact/practice
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mmf_compact
|
||||
name = "compact pistol magazine (9mm flash)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact/flash
|
||||
hidden = 1
|
||||
|
||||
// SMG mags
|
||||
/datum/category_item/autolathe/arms/smg_9mm
|
||||
name = "top-mounted SMG magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mmt
|
||||
@@ -157,7 +169,7 @@
|
||||
hidden = 1
|
||||
|
||||
/*/datum/category_item/autolathe/arms/machinegun_545_hunter //VOREStation Edit Start. By request of Ace
|
||||
name = "machinegun box magazine (5.56 hunting)"
|
||||
name = "machinegun box magazine (5.45 hunting)"
|
||||
path =/obj/item/ammo_magazine/m545saw/hunter
|
||||
hidden = 1*/ //VOREStation Edit End.
|
||||
|
||||
@@ -409,7 +421,7 @@
|
||||
|
||||
/datum/category_item/autolathe/arms/tacknife
|
||||
name = "tactical knife"
|
||||
path =/obj/item/weapon/material/hatchet/tacknife
|
||||
path =/obj/item/weapon/material/knife/tacknife
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/flamethrower
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
/datum/category_item/autolathe/tools/hatchet
|
||||
name = "hatchet"
|
||||
path =/obj/item/weapon/material/hatchet
|
||||
path =/obj/item/weapon/material/knife/machete/hatchet
|
||||
|
||||
/datum/category_item/autolathe/tools/minihoe
|
||||
name = "mini hoe"
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
//Beam Datum and effect
|
||||
/datum/beam
|
||||
var/atom/origin = null
|
||||
var/atom/target = null
|
||||
var/list/elements = list()
|
||||
var/icon/base_icon = null
|
||||
var/icon
|
||||
var/icon_state = "" //icon state of the main segments of the beam
|
||||
var/max_distance = 0
|
||||
var/endtime = 0
|
||||
var/sleep_time = 3
|
||||
var/finished = 0
|
||||
var/target_oldloc = null
|
||||
var/origin_oldloc = null
|
||||
var/static_beam = 0
|
||||
var/beam_type = /obj/effect/ebeam //must be subtype
|
||||
|
||||
/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam,beam_sleep_time=3)
|
||||
endtime = world.time+time
|
||||
origin = beam_origin
|
||||
origin_oldloc = get_turf(origin)
|
||||
target = beam_target
|
||||
target_oldloc = get_turf(target)
|
||||
sleep_time = beam_sleep_time
|
||||
if(origin_oldloc == origin && target_oldloc == target)
|
||||
static_beam = 1
|
||||
max_distance = maxdistance
|
||||
base_icon = new(beam_icon,beam_icon_state)
|
||||
icon = beam_icon
|
||||
icon_state = beam_icon_state
|
||||
beam_type = btype
|
||||
|
||||
/datum/beam/proc/Start()
|
||||
Draw()
|
||||
while(!finished && origin && target && world.time < endtime && get_dist(origin,target)<max_distance && origin.z == target.z)
|
||||
var/origin_turf = get_turf(origin)
|
||||
var/target_turf = get_turf(target)
|
||||
if(!static_beam && (origin_turf != origin_oldloc || target_turf != target_oldloc))
|
||||
origin_oldloc = origin_turf //so we don't keep checking against their initial positions, leading to endless Reset()+Draw() calls
|
||||
target_oldloc = target_turf
|
||||
Reset()
|
||||
Draw()
|
||||
sleep(sleep_time)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/datum/beam/proc/End()
|
||||
finished = TRUE
|
||||
|
||||
/datum/beam/proc/Reset()
|
||||
for(var/obj/effect/ebeam/B in elements)
|
||||
qdel(B)
|
||||
elements.Cut()
|
||||
|
||||
/datum/beam/Destroy()
|
||||
Reset()
|
||||
target = null
|
||||
origin = null
|
||||
return ..()
|
||||
|
||||
/datum/beam/proc/Draw()
|
||||
var/Angle = round(Get_Angle(origin,target))
|
||||
|
||||
var/matrix/rot_matrix = matrix()
|
||||
rot_matrix.Turn(Angle)
|
||||
|
||||
//Translation vector for origin and target
|
||||
var/DX = (32*target.x+target.pixel_x)-(32*origin.x+origin.pixel_x)
|
||||
var/DY = (32*target.y+target.pixel_y)-(32*origin.y+origin.pixel_y)
|
||||
var/N = 0
|
||||
var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement
|
||||
|
||||
for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X
|
||||
if(QDELETED(src) || finished)
|
||||
break
|
||||
var/obj/effect/ebeam/X = new beam_type(origin_oldloc)
|
||||
X.owner = src
|
||||
elements |= X
|
||||
|
||||
//Assign icon, for main segments it's base_icon, for the end, it's icon+icon_state
|
||||
//cropped by a transparent box of length-N pixel size
|
||||
if(N+32>length)
|
||||
var/icon/II = new(icon, icon_state)
|
||||
II.DrawBox(null,1,(length-N),32,32)
|
||||
X.icon = II
|
||||
else
|
||||
X.icon = base_icon
|
||||
X.transform = rot_matrix
|
||||
|
||||
//Calculate pixel offsets (If necessary)
|
||||
var/Pixel_x
|
||||
var/Pixel_y
|
||||
if(DX == 0)
|
||||
Pixel_x = 0
|
||||
else
|
||||
Pixel_x = round(sin(Angle)+32*sin(Angle)*(N+16)/32)
|
||||
if(DY == 0)
|
||||
Pixel_y = 0
|
||||
else
|
||||
Pixel_y = round(cos(Angle)+32*cos(Angle)*(N+16)/32)
|
||||
|
||||
//Position the effect so the beam is one continous line
|
||||
var/a
|
||||
if(abs(Pixel_x)>32)
|
||||
a = Pixel_x > 0 ? round(Pixel_x/32) : Ceiling(Pixel_x/32)
|
||||
X.x += a
|
||||
Pixel_x %= 32
|
||||
if(abs(Pixel_y)>32)
|
||||
a = Pixel_y > 0 ? round(Pixel_y/32) : Ceiling(Pixel_y/32)
|
||||
X.y += a
|
||||
Pixel_y %= 32
|
||||
|
||||
X.pixel_x = Pixel_x
|
||||
X.pixel_y = Pixel_y
|
||||
|
||||
/obj/effect/ebeam
|
||||
mouse_opacity = 0
|
||||
anchored = TRUE
|
||||
var/datum/beam/owner
|
||||
|
||||
/obj/effect/ebeam/Destroy()
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/ebeam/singularity_pull()
|
||||
return
|
||||
/obj/effect/ebeam/singularity_act()
|
||||
return
|
||||
|
||||
/obj/effect/ebeam/deadly/Crossed(atom/A)
|
||||
..()
|
||||
A.ex_act(1)
|
||||
|
||||
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3)
|
||||
var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time)
|
||||
spawn(0)
|
||||
newbeam.Start()
|
||||
return newbeam
|
||||
@@ -14,7 +14,7 @@
|
||||
if(target_belly)
|
||||
teleatom.forceMove(destination.loc)
|
||||
playSpecials(destination,effectout,soundout)
|
||||
target_belly.internal_contents += teleatom
|
||||
target_belly.internal_contents |= teleatom
|
||||
playsound(destination, target_belly.vore_sound, 100, 1)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
l_ear = /obj/item/device/radio/headset
|
||||
glasses = /obj/item/clothing/glasses/thermal/plain/monocle
|
||||
suit = /obj/item/clothing/suit/storage/apron
|
||||
l_pocket = /obj/item/weapon/material/hatchet/tacknife
|
||||
l_pocket = /obj/item/weapon/material/knife/tacknife
|
||||
r_pocket = /obj/item/weapon/surgical/scalpel
|
||||
r_hand = /obj/item/weapon/material/twohanded/fireaxe
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
uniform = /obj/item/clothing/under/rank/chef
|
||||
suit = /obj/item/clothing/suit/chef
|
||||
r_hand = /obj/item/weapon/material/kitchen/rollingpin
|
||||
l_pocket = /obj/item/weapon/material/hatchet/tacknife
|
||||
r_pocket = /obj/item/weapon/material/hatchet/tacknife
|
||||
l_pocket = /obj/item/weapon/material/knife/tacknife
|
||||
r_pocket = /obj/item/weapon/material/knife/tacknife
|
||||
|
||||
/decl/hierarchy/outfit/tournament_gear/janitor
|
||||
name = "Tournament gear - Janitor"
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
// This is used to make things that are supposed to move while buckled more consistant and easier to handle code-wise.
|
||||
|
||||
/datum/riding
|
||||
var/next_vehicle_move = 0 // Used for move delays
|
||||
var/vehicle_move_delay = 2 // Tick delay between movements, lower = faster, higher = slower
|
||||
var/keytype = null // Can give this a type to require the rider to hold the item type inhand to move the ridden atom.
|
||||
var/nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
|
||||
var/key_name = "the keys" // What the 'keys' for the thing being rided on would be called.
|
||||
var/atom/movable/ridden = null // The thing that the datum is attached to.
|
||||
var/only_one_driver = FALSE // If true, only the person in 'front' (first on list of riding mobs) can drive.
|
||||
|
||||
/datum/riding/New(atom/movable/_ridden)
|
||||
ridden = _ridden
|
||||
|
||||
/datum/riding/Destroy()
|
||||
ridden = null
|
||||
return ..()
|
||||
|
||||
/datum/riding/proc/handle_vehicle_layer()
|
||||
if(ridden.dir != NORTH)
|
||||
ridden.layer = ABOVE_MOB_LAYER
|
||||
else
|
||||
ridden.layer = OBJ_LAYER
|
||||
|
||||
/datum/riding/proc/on_vehicle_move()
|
||||
for(var/mob/living/M in ridden.buckled_mobs)
|
||||
ride_check(M)
|
||||
handle_vehicle_offsets()
|
||||
handle_vehicle_layer()
|
||||
|
||||
/datum/riding/proc/ride_check(mob/living/M)
|
||||
return TRUE
|
||||
|
||||
/datum/riding/proc/force_dismount(mob/living/M)
|
||||
ridden.unbuckle_mob(M)
|
||||
|
||||
/datum/riding/proc/handle_vehicle_offsets()
|
||||
var/ridden_dir = "[ridden.dir]"
|
||||
var/passindex = 0
|
||||
if(ridden.has_buckled_mobs())
|
||||
for(var/m in ridden.buckled_mobs)
|
||||
passindex++
|
||||
var/mob/living/buckled_mob = m
|
||||
var/list/offsets = get_offsets(passindex)
|
||||
var/rider_dir = get_rider_dir(passindex)
|
||||
buckled_mob.set_dir(rider_dir)
|
||||
dir_loop:
|
||||
for(var/offsetdir in offsets)
|
||||
if(offsetdir == ridden_dir)
|
||||
var/list/diroffsets = offsets[offsetdir]
|
||||
buckled_mob.pixel_x = diroffsets[1]
|
||||
if(diroffsets.len >= 2)
|
||||
buckled_mob.pixel_y = diroffsets[2]
|
||||
if(diroffsets.len == 3)
|
||||
buckled_mob.layer = diroffsets[3]
|
||||
break dir_loop
|
||||
|
||||
// Override this to set your vehicle's various pixel offsets
|
||||
/datum/riding/proc/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
return list("[NORTH]" = list(0, 0), "[SOUTH]" = list(0, 0), "[EAST]" = list(0, 0), "[WEST]" = list(0, 0))
|
||||
|
||||
// Override this to set the passengers/riders dir based on which passenger they are.
|
||||
// ie: rider facing the vehicle's dir, but passenger 2 facing backwards, etc.
|
||||
/datum/riding/proc/get_rider_dir(pass_index)
|
||||
return ridden.dir
|
||||
|
||||
// KEYS
|
||||
/datum/riding/proc/keycheck(mob/user)
|
||||
if(keytype)
|
||||
if(nonhuman_key_exemption && !ishuman(user))
|
||||
return TRUE
|
||||
|
||||
if(user.is_holding_item_of_type(keytype))
|
||||
return TRUE
|
||||
else
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// BUCKLE HOOKS
|
||||
/datum/riding/proc/restore_position(mob/living/buckled_mob)
|
||||
if(istype(buckled_mob))
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = 0
|
||||
buckled_mob.layer = initial(buckled_mob.layer)
|
||||
|
||||
// MOVEMENT
|
||||
/datum/riding/proc/handle_ride(mob/user, direction)
|
||||
if(user.incapacitated())
|
||||
Unbuckle(user)
|
||||
return
|
||||
|
||||
if(only_one_driver && ridden.buckled_mobs.len)
|
||||
var/mob/living/driver = ridden.buckled_mobs[1]
|
||||
if(driver != user)
|
||||
to_chat(user, "<span class='warning'>\The [ridden] can only be controlled by one person at a time, and is currently being controlled by \the [driver].</span>")
|
||||
return
|
||||
|
||||
if(world.time < next_vehicle_move)
|
||||
return
|
||||
next_vehicle_move = world.time + vehicle_move_delay
|
||||
if(keycheck(user))
|
||||
if(!Process_Spacemove(direction) || !isturf(ridden.loc))
|
||||
return
|
||||
step(ridden, direction)
|
||||
|
||||
handle_vehicle_layer()
|
||||
handle_vehicle_offsets()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You'll need [key_name] in one of your hands to move \the [ridden].</span>")
|
||||
|
||||
/datum/riding/proc/Unbuckle(atom/movable/M)
|
||||
// addtimer(CALLBACK(ridden, /atom/movable/.proc/unbuckle_mob, M), 0, TIMER_UNIQUE)
|
||||
spawn(0)
|
||||
// On /tg/ this uses the fancy CALLBACK system. Not entirely sure why they needed to do so with a duration of 0,
|
||||
// so if there is a reason, this should replicate it close enough. Hopefully.
|
||||
ridden.unbuckle_mob(M)
|
||||
|
||||
/datum/riding/proc/Process_Spacemove(direction)
|
||||
if(ridden.has_gravity())
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
/datum/riding/space/Process_Spacemove(direction)
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
// SUBTYPES
|
||||
|
||||
// I'm on a
|
||||
/datum/riding/boat
|
||||
keytype = /obj/item/weapon/oar
|
||||
key_name = "an oar"
|
||||
nonhuman_key_exemption = TRUE // Borgs can't hold oars.
|
||||
only_one_driver = TRUE // Would be pretty crazy if five people try to move at the same time.
|
||||
|
||||
/datum/riding/boat/handle_ride(mob/user, direction)
|
||||
var/turf/next = get_step(ridden, direction)
|
||||
var/turf/current = get_turf(ridden)
|
||||
|
||||
if(istype(next, /turf/simulated/floor/water) || istype(current, /turf/simulated/floor/water)) //We can move from land to water, or water to land, but not from land to land
|
||||
..()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Boats don't go on land!</span>")
|
||||
return FALSE
|
||||
|
||||
/datum/riding/boat/small // 'Small' boats can hold up to two people.
|
||||
|
||||
/datum/riding/boat/small/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
var/H = 7 // Horizontal seperation.
|
||||
var/V = 5 // Vertical seperation.
|
||||
var/O = 2 // Vertical offset.
|
||||
switch(pass_index)
|
||||
if(1) // Person in front.
|
||||
return list(
|
||||
"[NORTH]" = list( 0, O+V, MOB_LAYER),
|
||||
"[SOUTH]" = list( 0, O, ABOVE_MOB_LAYER),
|
||||
"[EAST]" = list( H, O, MOB_LAYER),
|
||||
"[WEST]" = list(-H, O, MOB_LAYER)
|
||||
)
|
||||
if(2) // Person in back.
|
||||
return list(
|
||||
"[NORTH]" = list( 0, O, ABOVE_MOB_LAYER),
|
||||
"[SOUTH]" = list( 0, O+V, MOB_LAYER),
|
||||
"[EAST]" = list(-H, O, MOB_LAYER),
|
||||
"[WEST]" = list( H, O, MOB_LAYER)
|
||||
)
|
||||
else
|
||||
return null // This will runtime, but we want that since this is out of bounds.
|
||||
|
||||
/datum/riding/boat/small/handle_vehicle_layer()
|
||||
ridden.layer = ABOVE_MOB_LAYER
|
||||
|
||||
/datum/riding/boat/big // 'Big' boats can hold up to five people.
|
||||
|
||||
/datum/riding/boat/big/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
var/H = 12 // Horizontal seperation. Halved when facing up-down.
|
||||
var/V = 4 // Vertical seperation.
|
||||
var/O = 7 // Vertical offset.
|
||||
switch(pass_index)
|
||||
if(1) // Person in center front, first row.
|
||||
return list(
|
||||
"[NORTH]" = list( 0, O+V, MOB_LAYER+0.1),
|
||||
"[SOUTH]" = list( 0, O-V, MOB_LAYER+0.3),
|
||||
"[EAST]" = list( H, O, MOB_LAYER+0.1),
|
||||
"[WEST]" = list(-H, O, MOB_LAYER+0.1)
|
||||
)
|
||||
if(2) // Person in left, second row.
|
||||
return list(
|
||||
"[NORTH]" = list( H/2, O, MOB_LAYER+0.2),
|
||||
"[SOUTH]" = list(-H/2, O, MOB_LAYER+0.2),
|
||||
"[EAST]" = list( 0, O-V, MOB_LAYER+0.2),
|
||||
"[WEST]" = list( 0, O+V, MOB_LAYER)
|
||||
)
|
||||
if(3) // Person in right, second row.
|
||||
return list(
|
||||
"[NORTH]" = list(-H/2, O, MOB_LAYER+0.2),
|
||||
"[SOUTH]" = list( H/2, O, MOB_LAYER+0.2),
|
||||
"[EAST]" = list( 0, O+V, MOB_LAYER),
|
||||
"[WEST]" = list( 0, O-V, MOB_LAYER+0.2)
|
||||
)
|
||||
if(4) // Person in left, third row.
|
||||
return list(
|
||||
"[NORTH]" = list( H/2, O-V, MOB_LAYER+0.3),
|
||||
"[SOUTH]" = list(-H/2, O+V, MOB_LAYER+0.1),
|
||||
"[EAST]" = list(-H, O-V, MOB_LAYER+0.2),
|
||||
"[WEST]" = list( H, O+V, MOB_LAYER)
|
||||
)
|
||||
if(5) // Person in right, third row.
|
||||
return list(
|
||||
"[NORTH]" = list(-H/2, O-V, MOB_LAYER+0.3),
|
||||
"[SOUTH]" = list( H/2, O+V, MOB_LAYER+0.1),
|
||||
"[EAST]" = list(-H, O+V, MOB_LAYER),
|
||||
"[WEST]" = list( H, O-V, MOB_LAYER+0.2)
|
||||
)
|
||||
else
|
||||
return null // This will runtime, but we want that since this is out of bounds.
|
||||
|
||||
/datum/riding/boat/big/handle_vehicle_layer()
|
||||
ridden.layer = MOB_LAYER+0.4
|
||||
|
||||
/datum/riding/boat/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
return list("[NORTH]" = list(1, 2), "[SOUTH]" = list(1, 2), "[EAST]" = list(1, 2), "[WEST]" = list(1, 2))
|
||||
@@ -96,7 +96,7 @@
|
||||
/obj/item/clothing/glasses/thermal/syndi,
|
||||
/obj/item/weapon/card/emag,
|
||||
/obj/item/ammo_magazine/m45/ap,
|
||||
/obj/item/weapon/material/hatchet/tacknife/combatknife,
|
||||
/obj/item/weapon/material/knife/tacknife/combatknife,
|
||||
/obj/item/clothing/mask/balaclava
|
||||
)
|
||||
)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 2,
|
||||
/obj/item/weapon/material/hatchet,
|
||||
/obj/item/weapon/material/knife/machete/hatchet,
|
||||
/obj/item/weapon/material/minihoe,
|
||||
/obj/item/device/analyzer/plant_analyzer,
|
||||
/obj/item/clothing/gloves/botanic_leather,
|
||||
@@ -110,7 +110,7 @@
|
||||
/datum/supply_packs/hydro/weedcontrol
|
||||
name = "Weed control crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/material/hatchet = 2,
|
||||
/obj/item/weapon/material/knife/machete/hatchet = 2,
|
||||
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/weapon/grenade/chem_grenade/antiweed = 2,
|
||||
|
||||
@@ -10,10 +10,19 @@
|
||||
name = ".357 Speedloader"
|
||||
path = /obj/item/ammo_magazine/s357
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm_compact
|
||||
name = "Compact Pistol Magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mm/compact
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm
|
||||
name = "Pistol Magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mm
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm_large
|
||||
name = "Large Capacity Pistol Magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mm/large
|
||||
item_cost = 40
|
||||
|
||||
/datum/uplink_item/item/ammo/c45m
|
||||
name = "Pistol Magazine (.45)"
|
||||
path = /obj/item/ammo_magazine/m45
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
/datum/uplink_item/item/visible_weapons/tactknife
|
||||
name = "Tactical Knife"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/material/hatchet/tacknife
|
||||
path = /obj/item/weapon/material/knife/tacknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/combatknife
|
||||
name = "Combat Knife"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/material/hatchet/tacknife/combatknife
|
||||
path = /obj/item/weapon/material/knife/tacknife/combatknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword
|
||||
name = "Energy Sword, Random"
|
||||
@@ -44,11 +44,21 @@
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/pirate
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_spear
|
||||
name = "Energy Spear"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/melee/energy/spear
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/claymore
|
||||
name = "Claymore"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/material/sword
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/chainsaw
|
||||
name = "Chainsaw"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/chainsaw
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/katana
|
||||
name = "Katana"
|
||||
item_cost = 40
|
||||
@@ -89,6 +99,16 @@
|
||||
item_cost = 70
|
||||
path = /obj/item/weapon/gun/projectile/revolver/judge
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/pistol_standard_capacity
|
||||
name = "9mm Pistol"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/gun/projectile/p92x
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/pistol_large_capacity
|
||||
name = "9mm Pistol (with large capacity magazine)"
|
||||
item_cost = 70
|
||||
path = /obj/item/weapon/gun/projectile/p92x/large
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/lemat
|
||||
name = "LeMat"
|
||||
item_cost = 60
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
/* Using the HUD procs is simple. Call these procs in the life.dm of the intended mob.
|
||||
Use the regular_hud_updates() proc before process_med_hud(mob) or process_sec_hud(mob) so
|
||||
the HUD updates properly! */
|
||||
|
||||
// hud overlay image type, used for clearing client.images precisely
|
||||
/image/hud_overlay
|
||||
appearance_flags = APPEARANCE_UI // Don't get scaled with macro/micros. VOREStation edit
|
||||
|
||||
//Medical HUD outputs. Called by the Life() proc of the mob using it, usually.
|
||||
proc/process_med_hud(var/mob/M, var/local_scanner, var/mob/Alt)
|
||||
if(!can_process_hud(M))
|
||||
return
|
||||
|
||||
var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, med_hud_users)
|
||||
for(var/mob/living/carbon/human/patient in P.Mob.in_view(P.Turf))
|
||||
if(P.Mob.see_invisible < patient.invisibility)
|
||||
continue
|
||||
|
||||
if(local_scanner)
|
||||
P.Client.images += patient.hud_list[HEALTH_HUD]
|
||||
P.Client.images += patient.hud_list[STATUS_HUD]
|
||||
P.Client.images += patient.hud_list[BACKUP_HUD] //VOREStation Edit - Backup implant indicator
|
||||
else
|
||||
var/sensor_level = getsensorlevel(patient)
|
||||
if(sensor_level >= SUIT_SENSOR_VITAL)
|
||||
P.Client.images += patient.hud_list[HEALTH_HUD]
|
||||
if(sensor_level >= SUIT_SENSOR_BINARY)
|
||||
P.Client.images += patient.hud_list[LIFE_HUD]
|
||||
|
||||
//Security HUDs. Pass a value for the second argument to enable implant viewing or other special features.
|
||||
proc/process_sec_hud(var/mob/M, var/advanced_mode, var/mob/Alt)
|
||||
if(!can_process_hud(M))
|
||||
return
|
||||
var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, sec_hud_users)
|
||||
for(var/mob/living/carbon/human/perp in P.Mob.in_view(P.Turf))
|
||||
if(P.Mob.see_invisible < perp.invisibility)
|
||||
continue
|
||||
|
||||
P.Client.images += perp.hud_list[ID_HUD]
|
||||
if(advanced_mode)
|
||||
P.Client.images += perp.hud_list[WANTED_HUD]
|
||||
P.Client.images += perp.hud_list[IMPTRACK_HUD]
|
||||
P.Client.images += perp.hud_list[IMPLOYAL_HUD]
|
||||
P.Client.images += perp.hud_list[IMPCHEM_HUD]
|
||||
|
||||
datum/arranged_hud_process
|
||||
var/client/Client
|
||||
var/mob/Mob
|
||||
var/turf/Turf
|
||||
|
||||
proc/arrange_hud_process(var/mob/M, var/mob/Alt, var/list/hud_list)
|
||||
hud_list |= M
|
||||
var/datum/arranged_hud_process/P = new
|
||||
P.Client = M.client
|
||||
P.Mob = Alt ? Alt : M
|
||||
P.Turf = get_turf(P.Mob)
|
||||
return P
|
||||
|
||||
proc/can_process_hud(var/mob/M)
|
||||
if(!M)
|
||||
return 0
|
||||
if(!M.client)
|
||||
return 0
|
||||
if(M.stat != CONSCIOUS)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
//Deletes the current HUD images so they can be refreshed with new ones.
|
||||
mob/proc/handle_regular_hud_updates() //Used in the life.dm of mobs that can use HUDs.
|
||||
if(client)
|
||||
for(var/image/hud_overlay/hud in client.images)
|
||||
client.images -= hud
|
||||
med_hud_users -= src
|
||||
sec_hud_users -= src
|
||||
//VOREStation Add - HUD lists
|
||||
eng_hud_users -= src
|
||||
sci_hud_users -= src
|
||||
gen_hud_users -= src
|
||||
if(vantag_hud) process_vantag_hud(src) //VOREStation Add - So any mob can have the vantag hud, observer or not.
|
||||
//VOREStation Add End
|
||||
mob/proc/in_view(var/turf/T)
|
||||
return view(T)
|
||||
|
||||
/mob/observer/eye/in_view(var/turf/T)
|
||||
var/list/viewed = new
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(get_dist(H, T) <= 7)
|
||||
viewed += H
|
||||
return viewed
|
||||
@@ -1,60 +0,0 @@
|
||||
var/global/list/gen_hud_users = list() // List of all entities using a generic AR shades.
|
||||
var/global/list/eng_hud_users = list() // List of all entities using a engineer HUD.
|
||||
var/global/list/sci_hud_users = list() // List of all entities using a science HUD.
|
||||
|
||||
var/global/list/vantag_hud_users = list() // List of all mobs with the VANTAG hud on.
|
||||
|
||||
/proc/broadcast_engineering_hud_message(var/message, var/broadcast_source)
|
||||
broadcast_hud_message(message, broadcast_source, eng_hud_users, /obj/item/clothing/glasses/omnihud/eng)
|
||||
|
||||
/proc/broadcast_science_hud_message(var/message, var/broadcast_source)
|
||||
broadcast_hud_message(message, broadcast_source, sci_hud_users, /obj/item/clothing/glasses/omnihud/rnd)
|
||||
|
||||
proc/process_omni_hud(var/mob/M, var/mode, var/mob/Alt)
|
||||
if(!can_process_hud(M))
|
||||
return
|
||||
|
||||
var/datum/arranged_hud_process/P
|
||||
switch(mode)
|
||||
if("med")
|
||||
P = arrange_hud_process(M, Alt, med_hud_users)
|
||||
if("sec")
|
||||
P = arrange_hud_process(M, Alt, sec_hud_users)
|
||||
if("eng")
|
||||
P = arrange_hud_process(M, Alt, eng_hud_users)
|
||||
if("sci")
|
||||
P = arrange_hud_process(M, Alt, sci_hud_users)
|
||||
if("best")
|
||||
P = arrange_hud_process(M, Alt, sec_hud_users)
|
||||
else
|
||||
P = arrange_hud_process(M, Alt, gen_hud_users)
|
||||
|
||||
for(var/mob/living/carbon/human/guy in P.Mob.in_view(P.Turf))
|
||||
if(P.Mob.see_invisible < guy.invisibility)
|
||||
continue
|
||||
|
||||
P.Client.images += guy.hud_list[ID_HUD]
|
||||
P.Client.images += guy.hud_list[HEALTH_VR_HUD]
|
||||
|
||||
if(mode == "med") //Medical advanced version
|
||||
P.Client.images += guy.hud_list[STATUS_R_HUD]
|
||||
P.Client.images += guy.hud_list[BACKUP_HUD]
|
||||
if(mode == "sec") //Security advanced version
|
||||
P.Client.images += guy.hud_list[WANTED_HUD]
|
||||
if(mode == "best") //Command/omni advanced version
|
||||
P.Client.images += guy.hud_list[WANTED_HUD]
|
||||
P.Client.images += guy.hud_list[STATUS_R_HUD]
|
||||
P.Client.images += guy.hud_list[BACKUP_HUD]
|
||||
|
||||
|
||||
proc/process_vantag_hud(var/mob/M)
|
||||
if(!M.vantag_hud || !can_process_hud(M))
|
||||
return
|
||||
|
||||
var/datum/arranged_hud_process/P = arrange_hud_process(M, null, vantag_hud_users)
|
||||
|
||||
for(var/mob/living/carbon/human/guy in P.Mob.in_view(P.Turf))
|
||||
if(P.Mob.see_invisible < guy.invisibility)
|
||||
continue
|
||||
|
||||
P.Client.images += guy.hud_list[VANTAG_HUD]
|
||||
@@ -50,7 +50,7 @@ var/datum/antagonist/mercenary/mercs
|
||||
var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT)
|
||||
player.put_in_hands(U)
|
||||
|
||||
player.update_icons()
|
||||
player.update_icons_layers()
|
||||
|
||||
create_id("Mercenary", player)
|
||||
create_radio(SYND_FREQ, player)
|
||||
|
||||
@@ -91,6 +91,7 @@ var/datum/antagonist/raider/raiders
|
||||
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn,
|
||||
/obj/item/weapon/gun/projectile/colt/detective,
|
||||
/obj/item/weapon/gun/projectile/pistol,
|
||||
/obj/item/weapon/gun/projectile/p92x,
|
||||
/obj/item/weapon/gun/projectile/revolver,
|
||||
/obj/item/weapon/gun/projectile/pirate,
|
||||
/obj/item/weapon/gun/projectile/revolver/judge,
|
||||
|
||||
@@ -47,7 +47,7 @@ var/datum/antagonist/technomancer/technomancers
|
||||
technomancer_mob.equip_to_slot_or_del(new /obj/item/device/flashlight(technomancer_mob), slot_belt)
|
||||
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(technomancer_mob), slot_shoes)
|
||||
technomancer_mob.equip_to_slot_or_del(new /obj/item/clothing/head/technomancer/master(technomancer_mob), slot_head)
|
||||
technomancer_mob.update_icons()
|
||||
technomancer_mob.update_icons_layers()
|
||||
return 1
|
||||
|
||||
/datum/antagonist/technomancer/proc/equip_apprentice(var/mob/living/carbon/human/technomancer_mob)
|
||||
|
||||
@@ -87,7 +87,7 @@ var/datum/antagonist/wizard/wizards
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)
|
||||
wizard_mob.update_icons()
|
||||
wizard_mob.update_icons_layers()
|
||||
return 1
|
||||
|
||||
/datum/antagonist/wizard/check_victory()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Infiltrator is a varient of Traitor, except that the traitors are in a team and can communicate with a special headset.
|
||||
// Infiltrator is a variant of Traitor, except that the traitors are in a team and can communicate with a special headset.
|
||||
|
||||
var/datum/antagonist/traitor/infiltrator/infiltrators
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ var/datum/antagonist/renegade/renegades
|
||||
/obj/item/weapon/gun/projectile/sec/wood,
|
||||
/obj/item/weapon/gun/projectile/silenced,
|
||||
/obj/item/weapon/gun/projectile/pistol,
|
||||
/obj/item/weapon/gun/projectile/p92x,
|
||||
/obj/item/weapon/gun/projectile/revolver,
|
||||
/obj/item/weapon/gun/projectile/derringer,
|
||||
/obj/item/weapon/gun/projectile/shotgun/pump,
|
||||
|
||||
@@ -2741,7 +2741,7 @@ area/space/atmosalert()
|
||||
for(var/mob/living/carbon/human/H in src)
|
||||
if(H.s_tone > -55)
|
||||
H.s_tone--
|
||||
H.update_body()
|
||||
H.update_icons_body()
|
||||
if(H.client)
|
||||
mysound.status = SOUND_UPDATE
|
||||
H << mysound
|
||||
@@ -2862,7 +2862,7 @@ var/list/the_station_areas = list (
|
||||
for(var/mob/living/carbon/human/H in src)
|
||||
// if(H.s_tone > -55) //ugh...nice/novel idea but please no.
|
||||
// H.s_tone--
|
||||
// H.update_body()
|
||||
// H.update_icons_body()
|
||||
if(H.client)
|
||||
mysound.status = SOUND_UPDATE
|
||||
H << mysound
|
||||
|
||||
@@ -309,7 +309,7 @@ var/list/mob/living/forced_ambiance_list = new
|
||||
for(var/obj/machinery/door/window/temp_windoor in src)
|
||||
temp_windoor.open()
|
||||
|
||||
/area/proc/has_gravity()
|
||||
/area/has_gravity()
|
||||
return has_gravity
|
||||
|
||||
/area/space/has_gravity()
|
||||
|
||||
+11
-73
@@ -127,78 +127,6 @@
|
||||
found += A.search_contents_for(path,filter_path)
|
||||
return found
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Beam code by Gunbuddy
|
||||
|
||||
Beam() proc will only allow one beam to come from a source at a time. Attempting to call it more than
|
||||
once at a time per source will cause graphical errors.
|
||||
Also, the icon used for the beam will have to be vertical and 32x32.
|
||||
The math involved assumes that the icon is vertical to begin with so unless you want to adjust the math,
|
||||
its easier to just keep the beam vertical.
|
||||
*/
|
||||
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10)
|
||||
//BeamTarget represents the target for the beam, basically just means the other end.
|
||||
//Time is the duration to draw the beam
|
||||
//Icon is obviously which icon to use for the beam, default is beam.dmi
|
||||
//Icon_state is what icon state is used. Default is b_beam which is a blue beam.
|
||||
//Maxdistance is the longest range the beam will persist before it gives up.
|
||||
var/EndTime=world.time+time
|
||||
while(BeamTarget&&world.time<EndTime&&get_dist(src,BeamTarget)<maxdistance&&z==BeamTarget.z)
|
||||
//If the BeamTarget gets deleted, the time expires, or the BeamTarget gets out
|
||||
//of range or to another z-level, then the beam will stop. Otherwise it will
|
||||
//continue to draw.
|
||||
|
||||
set_dir(get_dir(src,BeamTarget)) //Causes the source of the beam to rotate to continuosly face the BeamTarget.
|
||||
|
||||
for(var/obj/effect/overlay/beam/O in orange(10,src)) //This section erases the previously drawn beam because I found it was easier to
|
||||
if(O.BeamSource==src) //just draw another instance of the beam instead of trying to manipulate all the
|
||||
qdel(O) //pieces to a new orientation.
|
||||
var/Angle=round(Get_Angle(src,BeamTarget))
|
||||
var/icon/I=new(icon,icon_state)
|
||||
I.Turn(Angle)
|
||||
var/DX=(32*BeamTarget.x+BeamTarget.pixel_x)-(32*x+pixel_x)
|
||||
var/DY=(32*BeamTarget.y+BeamTarget.pixel_y)-(32*y+pixel_y)
|
||||
var/N=0
|
||||
var/length=round(sqrt((DX)**2+(DY)**2))
|
||||
for(N,N<length,N+=32)
|
||||
var/obj/effect/overlay/beam/X=new(loc)
|
||||
X.BeamSource=src
|
||||
if(N+32>length)
|
||||
var/icon/II=new(icon,icon_state)
|
||||
II.DrawBox(null,1,(length-N),32,32)
|
||||
II.Turn(Angle)
|
||||
X.icon=II
|
||||
else X.icon=I
|
||||
var/Pixel_x=round(sin(Angle)+32*sin(Angle)*(N+16)/32)
|
||||
var/Pixel_y=round(cos(Angle)+32*cos(Angle)*(N+16)/32)
|
||||
if(DX==0) Pixel_x=0
|
||||
if(DY==0) Pixel_y=0
|
||||
if(Pixel_x>32)
|
||||
for(var/a=0, a<=Pixel_x,a+=32)
|
||||
X.x++
|
||||
Pixel_x-=32
|
||||
if(Pixel_x<-32)
|
||||
for(var/a=0, a>=Pixel_x,a-=32)
|
||||
X.x--
|
||||
Pixel_x+=32
|
||||
if(Pixel_y>32)
|
||||
for(var/a=0, a<=Pixel_y,a+=32)
|
||||
X.y++
|
||||
Pixel_y-=32
|
||||
if(Pixel_y<-32)
|
||||
for(var/a=0, a>=Pixel_y,a-=32)
|
||||
X.y--
|
||||
Pixel_y+=32
|
||||
X.pixel_x=Pixel_x
|
||||
X.pixel_y=Pixel_y
|
||||
sleep(3) //Changing this to a lower value will cause the beam to follow more smoothly with movement, but it will also be more laggy.
|
||||
//I've found that 3 ticks provided a nice balance for my use.
|
||||
for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) qdel(O)
|
||||
|
||||
|
||||
//All atoms
|
||||
/atom/proc/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
|
||||
//This reformat names to get a/an properly working on item descriptions when they are bloody
|
||||
@@ -476,7 +404,7 @@ its easier to just keep the beam vertical.
|
||||
O.show_message(message, 1, blind_message, 2)
|
||||
else if(ismob(I))
|
||||
var/mob/M = I
|
||||
if(M.see_invisible >= invisibility) // Cannot view the invisible
|
||||
if(M.see_invisible >= invisibility && MOB_CAN_SEE_PLANE(M, plane)) // Cannot view the invisible
|
||||
M.show_message(message, 1, blind_message, 2)
|
||||
else if (blind_message)
|
||||
M.show_message(blind_message, 2)
|
||||
@@ -519,3 +447,13 @@ its easier to just keep the beam vertical.
|
||||
|
||||
/atom/proc/InsertedContents()
|
||||
return contents
|
||||
|
||||
/atom/proc/has_gravity(turf/T)
|
||||
if(!T || !isturf(T))
|
||||
T = get_turf(src)
|
||||
if(istype(T, /turf/space)) // Turf never has gravity
|
||||
return FALSE
|
||||
var/area/A = get_area(T)
|
||||
if(A && A.has_gravity())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -93,6 +93,8 @@
|
||||
AM.Crossed(src)
|
||||
if(is_new_area && is_destination_turf)
|
||||
destination.loc.Entered(src, origin)
|
||||
|
||||
Moved(origin)
|
||||
return 1
|
||||
|
||||
//called when src is thrown into hit_atom
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
visible_message("<span class='warning'>[src] pulls on their clothes, peeling it off along with parts of their skin attached!</span>",
|
||||
"<span class='notice'>We remove and deform our equipment.</span>")
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
M.mind.changeling.armor_deployed = 0
|
||||
return success
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_head)
|
||||
grown_items_list.Add("a helmet")
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_w_uniform)
|
||||
grown_items_list.Add("a uniform")
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_gloves)
|
||||
grown_items_list.Add("some gloves")
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_shoes)
|
||||
grown_items_list.Add("shoes")
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_belt)
|
||||
grown_items_list.Add("a belt")
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_glasses)
|
||||
grown_items_list.Add("some glasses")
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_wear_mask)
|
||||
grown_items_list.Add("a mask")
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_back)
|
||||
grown_items_list.Add("a backpack")
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -218,7 +218,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_wear_suit)
|
||||
grown_items_list.Add("an exosuit")
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
M.equip_to_slot_or_del(I, slot_wear_id)
|
||||
grown_items_list.Add("an ID card")
|
||||
playsound(src, 'sound/effects/splat.ogg', 30, 1)
|
||||
M.update_icons()
|
||||
M.update_icons_layers()
|
||||
success = 1
|
||||
sleep(1 SECOND)
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/datum/power/changeling/enrage
|
||||
name = "Enrage"
|
||||
desc = "We evolve modifications to our mind and body, allowing us to call on intense periods of rage for our benefit."
|
||||
helptext = "Berserks us, giving massive bonuses to fighting in close quarters for thirty seconds, and losing the ability to \
|
||||
be accurate at ranged while active. Afterwards, we will suffer extreme amounts of exhaustion for a period of two minutes, \
|
||||
during which we will be much weaker and slower than before. We cannot berserk again while exhausted. This ability requires \
|
||||
a significant amount of nutrition to use, and cannot be used if too hungry. Using this ability will end most forms of disables."
|
||||
enhancedtext = "The length of exhaustion after berserking is reduced to one minute, from two, and requires half as much nutrition."
|
||||
ability_icon_state = "ling_berserk"
|
||||
genomecost = 2
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/living/proc/changeling_berserk
|
||||
|
||||
// Makes the ling very upset.
|
||||
/mob/living/proc/changeling_berserk()
|
||||
set category = "Changeling"
|
||||
set name = "Enrage (30)"
|
||||
set desc = "Causes you to go Berserk."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(30,0,100)
|
||||
if(!changeling)
|
||||
return 0
|
||||
|
||||
var/modifier_to_use = /datum/modifier/berserk/changeling
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
modifier_to_use = /datum/modifier/berserk/changeling/recursive
|
||||
to_chat(src, "<span class='notice'>We optimize our levels of anger, which will avoid excessive stress on ourselves.</span>")
|
||||
|
||||
if(add_modifier(modifier_to_use, 30 SECONDS))
|
||||
changeling.chem_charges -= 30
|
||||
|
||||
feedback_add_details("changeling_powers","EN")
|
||||
return 1
|
||||
@@ -56,7 +56,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/clothing/head/chameleon/changeling
|
||||
name = "malformed head"
|
||||
@@ -78,7 +78,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/clothing/suit/chameleon/changeling
|
||||
name = "chitinous chest"
|
||||
@@ -104,7 +104,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/clothing/shoes/chameleon/changeling
|
||||
name = "malformed feet"
|
||||
@@ -130,7 +130,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/weapon/storage/backpack/chameleon/changeling
|
||||
name = "backpack"
|
||||
@@ -158,7 +158,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
for(var/atom/movable/AM in src.contents) //Dump whatever's in the bag before deleting.
|
||||
AM.forceMove(get_turf(loc))
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/clothing/gloves/chameleon/changeling
|
||||
name = "malformed hands"
|
||||
@@ -185,7 +185,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
|
||||
/obj/item/clothing/mask/chameleon/changeling
|
||||
@@ -213,7 +213,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/clothing/glasses/chameleon/changeling
|
||||
name = "chitin goggles"
|
||||
@@ -235,7 +235,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/weapon/storage/belt/chameleon/changeling
|
||||
name = "waist pouch"
|
||||
@@ -261,7 +261,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/changeling
|
||||
name = "chitinous card"
|
||||
@@ -288,7 +288,7 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
visible_message("<span class='warning'>[H] tears off [src]!</span>",
|
||||
"<span class='notice'>We remove [src].</span>")
|
||||
qdel(src)
|
||||
H.update_icons()
|
||||
H.update_icons_layers()
|
||||
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/changeling/Click() //Since we can't hold it in our hands, and attack_hand() doesn't work if it in inventory...
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
H.restore_blood()
|
||||
H.mutations.Remove(HUSK)
|
||||
H.status_flags -= DISFIGURED
|
||||
H.update_body(1)
|
||||
H.update_icons_body()
|
||||
for(var/limb in H.organs_by_name)
|
||||
var/obj/item/organ/external/current_limb = H.organs_by_name[limb]
|
||||
if(current_limb)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
//luminosity = 5
|
||||
//l_color="#0066FF"
|
||||
layer = LIGHTING_LAYER+1
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
|
||||
var/spawned=0 // DIR mask
|
||||
var/next_check=0
|
||||
|
||||
@@ -514,9 +514,9 @@ proc/get_nt_opposed()
|
||||
var/list/dudes = list()
|
||||
for(var/mob/living/carbon/human/man in player_list)
|
||||
if(man.client)
|
||||
if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||
if(man.client.prefs.economic_status == CLASS_LOWER)
|
||||
dudes += man
|
||||
else if(man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(50))
|
||||
else if(man.client.prefs.economic_status == CLASS_LOWMID && prob(50))
|
||||
dudes += man
|
||||
if(dudes.len == 0) return null
|
||||
return pick(dudes)
|
||||
|
||||
@@ -185,7 +185,8 @@ var/global/datum/controller/gameticker/ticker
|
||||
cinematic = new(src)
|
||||
cinematic.icon = 'icons/effects/station_explosion.dmi'
|
||||
cinematic.icon_state = "station_intact"
|
||||
cinematic.layer = 20
|
||||
cinematic.layer = 100
|
||||
cinematic.plane = PLANE_PLAYER_HUD
|
||||
cinematic.mouse_opacity = 0
|
||||
cinematic.screen_loc = "1,0"
|
||||
|
||||
|
||||
@@ -63,28 +63,28 @@ datum/hSB
|
||||
var/mob/living/carbon/human/P = usr
|
||||
if(P.wear_suit)
|
||||
P.wear_suit.loc = P.loc
|
||||
P.wear_suit.layer = initial(P.wear_suit.layer)
|
||||
P.wear_suit.reset_plane_and_layer()
|
||||
P.wear_suit = null
|
||||
P.wear_suit = new/obj/item/clothing/suit/space(P)
|
||||
P.wear_suit.layer = 20
|
||||
P.wear_suit.hud_layerise()
|
||||
if(P.head)
|
||||
P.head.loc = P.loc
|
||||
P.head.layer = initial(P.head.layer)
|
||||
P.head.reset_plane_and_layer()
|
||||
P.head = null
|
||||
P.head = new/obj/item/clothing/head/helmet/space(P)
|
||||
P.head.layer = 20
|
||||
P.head.hud_layerise()
|
||||
if(P.wear_mask)
|
||||
P.wear_mask.loc = P.loc
|
||||
P.wear_mask.layer = initial(P.wear_mask.layer)
|
||||
P.wear_mask.reset_plane_and_layer()
|
||||
P.wear_mask = null
|
||||
P.wear_mask = new/obj/item/clothing/mask/gas(P)
|
||||
P.wear_mask.layer = 20
|
||||
P.wear_mask.hud_layerise()
|
||||
if(P.back)
|
||||
P.back.loc = P.loc
|
||||
P.back.layer = initial(P.back.layer)
|
||||
P.back.reset_plane_and_layer()
|
||||
P.back = null
|
||||
P.back = new/obj/item/weapon/tank/jetpack(P)
|
||||
P.back.layer = 20
|
||||
P.back.hud_layerise()
|
||||
P.internal = P.back
|
||||
if("hsbmetal")
|
||||
var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/metal
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
|
||||
name = "purity hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This varient excels at \
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at \
|
||||
resolving viruses, infections, radiation, and genetic maladies."
|
||||
filled_reagents = list("spaceacillin" = 9, "arithrazine" = 5, "ryetalyn" = 1)
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ
|
||||
name = "organ hypo"
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. Organ damage is resolved by this varient."
|
||||
desc = "A refined version of the standard autoinjector, allowing greater capacity. Organ damage is resolved by this variant."
|
||||
filled_reagents = list("alkysine" = 1, "imidazoline" = 1, "peridaxon" = 13)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat
|
||||
|
||||
@@ -25,5 +25,6 @@
|
||||
/obj/effect/temporary_effect/darkness
|
||||
name = "darkness"
|
||||
time_to_die = 2 MINUTES
|
||||
new_light_range = 6
|
||||
new_light_power = -20
|
||||
invisibility = 101
|
||||
light_range = 6
|
||||
light_power = -20
|
||||
@@ -26,13 +26,11 @@
|
||||
/obj/effect/temporary_effect/destablize
|
||||
name = "destablizing disturbance"
|
||||
desc = "This can't be good..."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "blueshatter"
|
||||
time_to_die = null
|
||||
invisibility = 0
|
||||
new_light_range = 6
|
||||
new_light_power = 20
|
||||
new_light_color = "#C26DDE"
|
||||
light_range = 6
|
||||
light_power = 20
|
||||
light_color = "#C26DDE"
|
||||
var/pulses_remaining = 40 // Lasts 20 seconds.
|
||||
var/instability_power = 5
|
||||
var/instability_range = 6
|
||||
|
||||
@@ -22,13 +22,11 @@
|
||||
/obj/effect/temporary_effect/fire_blast
|
||||
name = "fire blast"
|
||||
desc = "Run!"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "at_shield1"
|
||||
time_to_die = 2.5 SECONDS // After which we go boom.
|
||||
invisibility = 0
|
||||
new_light_range = 4
|
||||
new_light_power = 5
|
||||
new_light_color = "#FF6A00"
|
||||
light_range = 4
|
||||
light_power = 5
|
||||
light_color = "#FF6A00"
|
||||
|
||||
/obj/effect/temporary_effect/fire_blast/Destroy()
|
||||
explosion(get_turf(src), -1, 1, 2, 5, adminlog = 1)
|
||||
|
||||
@@ -28,13 +28,11 @@
|
||||
/obj/effect/temporary_effect/pulsar
|
||||
name = "pulsar"
|
||||
desc = "Not a real pulsar, but still emits loads of EMP."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "shield2"
|
||||
time_to_die = null
|
||||
invisibility = 0
|
||||
new_light_range = 4
|
||||
new_light_power = 5
|
||||
new_light_color = "#2ECCFA"
|
||||
light_range = 4
|
||||
light_power = 5
|
||||
light_color = "#2ECCFA"
|
||||
var/pulses_remaining = 3
|
||||
|
||||
/obj/effect/temporary_effect/pulsar/New()
|
||||
|
||||
@@ -6,22 +6,6 @@
|
||||
aspect = null
|
||||
var/obj/effect/spawner_type = null
|
||||
|
||||
/obj/effect/temporary_effect
|
||||
name = "self deleting effect"
|
||||
desc = "How are you examining what which cannot be seen?"
|
||||
invisibility = 101
|
||||
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
|
||||
var/new_light_range = 6
|
||||
var/new_light_power = 6
|
||||
var/new_light_color = "#FFFFFF"
|
||||
|
||||
/obj/effect/temporary_effect/New()
|
||||
..()
|
||||
set_light(new_light_range, new_light_power, l_color = new_light_color)
|
||||
if(time_to_die)
|
||||
spawn(time_to_die)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spell/spawner/on_ranged_cast(atom/hit_atom, mob/user)
|
||||
var/turf/T = get_turf(hit_atom)
|
||||
if(T)
|
||||
|
||||
@@ -51,17 +51,17 @@
|
||||
if(!account_allowed || (H.mind && H.mind.initial_account))
|
||||
return
|
||||
|
||||
var/loyalty = 1
|
||||
var/income = 1
|
||||
if(H.client)
|
||||
switch(H.client.prefs.nanotrasen_relation)
|
||||
if(COMPANY_LOYAL) loyalty = 1.30
|
||||
if(COMPANY_SUPPORTATIVE)loyalty = 1.15
|
||||
if(COMPANY_NEUTRAL) loyalty = 1
|
||||
if(COMPANY_SKEPTICAL) loyalty = 0.85
|
||||
if(COMPANY_OPPOSED) loyalty = 0.70
|
||||
switch(H.client.prefs.economic_status)
|
||||
if(CLASS_UPPER) income = 1.30
|
||||
if(CLASS_UPMID) income = 1.15
|
||||
if(CLASS_MIDDLE) income = 1
|
||||
if(CLASS_LOWMID) income = 0.75
|
||||
if(CLASS_LOWER) income = 0.50
|
||||
|
||||
//give them an account in the station database
|
||||
var/money_amount = (rand(15,40) + rand(15,40)) * loyalty * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks.
|
||||
var/money_amount = (rand(15,40) + rand(15,40)) * income * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks.
|
||||
var/datum/money_account/M = create_account(H.real_name, money_amount, null)
|
||||
if(H.mind)
|
||||
var/remembered_info = ""
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
//These are a copy of Polaris' Southern Cross jobs
|
||||
|
||||
var/const/access_pilot = 67
|
||||
var/const/access_explorer = 43
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/access/pilot
|
||||
id = access_pilot
|
||||
desc = "Pilot"
|
||||
region = ACCESS_REGION_SUPPLY
|
||||
|
||||
/datum/access/explorer
|
||||
id = access_explorer
|
||||
desc = "Explorer"
|
||||
region = ACCESS_REGION_GENERAL
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/weapon/card/id/medical/sar
|
||||
assignment = "Search and Rescue"
|
||||
rank = "Search and Rescue"
|
||||
job_access_type = /datum/job/sar
|
||||
|
||||
/obj/item/weapon/card/id/civilian/pilot
|
||||
assignment = "Pilot"
|
||||
rank = "Pilot"
|
||||
job_access_type = /datum/job/pilot
|
||||
|
||||
/obj/item/weapon/card/id/civilian/explorer
|
||||
assignment = "Explorer"
|
||||
rank = "Explorer"
|
||||
job_access_type = /datum/job/explorer
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/job/pilot
|
||||
title = "Pilot"
|
||||
flag = PILOT
|
||||
department = "Civilian"
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/pilot
|
||||
economic_modifier = 4
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
access = list(access_pilot, access_cargo, access_mining, access_mining_station)
|
||||
minimal_access = list(access_pilot, access_cargo, access_mining, access_mining_station)
|
||||
outfit_type = /decl/hierarchy/outfit/job/pilot
|
||||
|
||||
/datum/job/explorer
|
||||
title = "Explorer"
|
||||
flag = EXPLORER
|
||||
department = "Science"
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
supervisors = "the explorer leader and the head of personnel"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/civilian/explorer
|
||||
economic_modifier = 4
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
access = list(access_pilot, access_explorer)
|
||||
minimal_access = list(access_pilot, access_explorer)
|
||||
outfit_type = /decl/hierarchy/outfit/job/explorer2
|
||||
/* I split this into multiple jobs because it's set to latejoin_only, which means you can't see it to select alt titles.
|
||||
alt_titles = list(
|
||||
"Explorer Technician" = /decl/hierarchy/outfit/job/explorer2/technician,
|
||||
"Explorer Medic" = /decl/hierarchy/outfit/job/explorer2/medic)
|
||||
*/
|
||||
|
||||
/datum/job/explorer/technician
|
||||
title = "Explorer Technician"
|
||||
flag = EXPLORER_T
|
||||
outfit_type = /decl/hierarchy/outfit/job/explorer2/technician
|
||||
|
||||
/datum/job/explorer/medic
|
||||
title = "Explorer Medic"
|
||||
flag = EXPLORER_M
|
||||
outfit_type = /decl/hierarchy/outfit/job/explorer2/medic
|
||||
|
||||
/datum/job/sar
|
||||
title = "Search and Rescue"
|
||||
flag = SAR
|
||||
department = "Medical"
|
||||
department_flag = MEDSCI
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the chief medical officer"
|
||||
selection_color = "#515151"
|
||||
idtype = /obj/item/weapon/card/id/medical
|
||||
economic_modifier = 4
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_explorer)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_explorer)
|
||||
outfit_type = /decl/hierarchy/outfit/job/medical/sar
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/decl/hierarchy/outfit/job/explorer2
|
||||
name = OUTFIT_JOB_NAME("Explorer")
|
||||
shoes = /obj/item/clothing/shoes/boots/winter/explorer
|
||||
uniform = /obj/item/clothing/under/explorer
|
||||
l_ear = /obj/item/device/radio/headset/explorer
|
||||
id_slot = slot_wear_id
|
||||
pda_slot = slot_l_store
|
||||
pda_type = /obj/item/device/pda/cargo // Brown looks more rugged
|
||||
id_type = /obj/item/weapon/card/id/civilian/explorer
|
||||
id_pda_assignment = "Explorer"
|
||||
|
||||
/decl/hierarchy/outfit/job/explorer2/technician
|
||||
name = OUTFIT_JOB_NAME("Explorer Technician")
|
||||
belt = /obj/item/weapon/storage/belt/utility/full
|
||||
pda_slot = slot_l_store
|
||||
id_pda_assignment = "Explorer Technician"
|
||||
|
||||
/decl/hierarchy/outfit/job/explorer2/medic
|
||||
name = OUTFIT_JOB_NAME("Explorer Medic")
|
||||
l_hand = /obj/item/weapon/storage/firstaid/regular
|
||||
pda_slot = slot_l_store
|
||||
id_pda_assignment = "Explorer Medic"
|
||||
|
||||
/decl/hierarchy/outfit/job/pilot
|
||||
name = OUTFIT_JOB_NAME("Pilot")
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
uniform = /obj/item/clothing/under/color/black
|
||||
suit = /obj/item/clothing/suit/storage/toggle/bomber
|
||||
gloves = /obj/item/clothing/gloves/fingerless
|
||||
glasses = /obj/item/clothing/glasses/fakesunglasses/aviator
|
||||
l_ear = /obj/item/device/radio/headset/pilot
|
||||
id_slot = slot_wear_id
|
||||
pda_slot = slot_belt
|
||||
pda_type = /obj/item/device/pda/cargo // Brown looks more rugged
|
||||
id_type = /obj/item/weapon/card/id/civilian/pilot
|
||||
id_pda_assignment = "Pilot"
|
||||
|
||||
/decl/hierarchy/outfit/job/medical/sar
|
||||
name = OUTFIT_JOB_NAME("Search and Rescue")
|
||||
uniform = /obj/item/clothing/under/utility/blue
|
||||
suit = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar
|
||||
shoes = /obj/item/clothing/shoes/boots/winter/explorer
|
||||
l_hand = /obj/item/weapon/storage/firstaid/adv
|
||||
belt = /obj/item/weapon/storage/belt/medical/emt
|
||||
pda_slot = slot_l_store
|
||||
id_type = /obj/item/weapon/card/id/medical/sar
|
||||
id_pda_assignment = "Search and Rescue"
|
||||
flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/device/encryptionkey/pilot
|
||||
name = "pilot's encryption key"
|
||||
icon_state = "com_cypherkey"
|
||||
channels = list("Supply" = 1, "Explorer" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/explorer
|
||||
name = "explorer radio encryption key"
|
||||
icon_state = "com_cypherkey"
|
||||
channels = list("Explorer" = 1)
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/device/radio/headset/pilot
|
||||
name = "pilot's headset"
|
||||
desc = "A bowman headset used by pilots, has access to supply and explorer channels."
|
||||
icon_state = "cargo_headset_alt"
|
||||
item_state = "headset"
|
||||
ks2type = /obj/item/device/encryptionkey/pilot
|
||||
|
||||
/obj/item/device/radio/headset/explorer
|
||||
name = "explorer's headset"
|
||||
desc = "Headset used by explorers for exploring. Access to the explorer channel."
|
||||
icon_state = "mine_headset"
|
||||
item_state = "headset"
|
||||
ks2type = /obj/item/device/encryptionkey/explorer
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar
|
||||
name = "search and rescue winter coat"
|
||||
desc = "A heavy winter jacket. A white star of life is emblazoned on the back, with the words search and rescue written underneath."
|
||||
icon_state = "coatsar"
|
||||
item_icons = list(slot_wear_suit_str = 'maps/southern_cross/icons/mob/sc_suit.dmi')
|
||||
icon = 'maps/southern_cross/icons/obj/sc_suit.dmi'
|
||||
armor = list(melee = 15, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 5)
|
||||
valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA)
|
||||
@@ -483,7 +483,7 @@ var/global/datum/controller/occupations/job_master
|
||||
H.buckled = W
|
||||
H.update_canmove()
|
||||
W.set_dir(H.dir)
|
||||
W.buckled_mob = H
|
||||
W.buckled_mobs |= H
|
||||
W.add_fingerprint(H)
|
||||
if(R)
|
||||
W.color = R.color
|
||||
|
||||
@@ -26,7 +26,11 @@ var/const/PSYCHIATRIST =(1<<7)
|
||||
var/const/ROBOTICIST =(1<<8)
|
||||
var/const/XENOBIOLOGIST =(1<<9)
|
||||
var/const/PARAMEDIC =(1<<10)
|
||||
|
||||
var/const/SAR =(1<<11) //VOREStation THEFT
|
||||
var/const/PILOT =(1<<12) //VOREStation THEFT
|
||||
var/const/EXPLORER =(1<<13) //VOREStation THEFT
|
||||
var/const/EXPLORER_T =(1<<14) //VOREStation THEFT
|
||||
var/const/EXPLORER_M =(1<<15) //VOREStation THEFT
|
||||
|
||||
var/const/CIVILIAN =(1<<2)
|
||||
|
||||
@@ -46,7 +50,6 @@ var/const/BRIDGE =(1<<12)
|
||||
var/const/CLOWN =(1<<13) //VOREStation Add
|
||||
var/const/MIME =(1<<14) //VOREStation Add
|
||||
|
||||
|
||||
var/list/assistant_occupations = list(
|
||||
)
|
||||
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
|
||||
/obj/machinery/computer/area_atmos/New()
|
||||
..()
|
||||
//So the scrubbers have time to spawn
|
||||
desc += "[range] meters."
|
||||
|
||||
/obj/machinery/computer/area_atmos/initialize()
|
||||
. = ..()
|
||||
scanscrubbers()
|
||||
|
||||
/obj/machinery/computer/area_atmos/attack_ai(var/mob/user as mob)
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
var/mob/M = obj.loc
|
||||
if(ismob(M))
|
||||
M.remove_from_mob(obj)
|
||||
M.update_icons() //so their overlays update
|
||||
M.update_icons_layers() //so their overlays update
|
||||
|
||||
if(!silent)
|
||||
var/obj/oldobj = obj
|
||||
|
||||
@@ -30,16 +30,9 @@
|
||||
var/turf/T = src.loc
|
||||
T.contents += contents
|
||||
if(beaker)
|
||||
beaker.loc = get_step(src.loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
|
||||
..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/initialize()
|
||||
if(node) return
|
||||
var/node_connect = dir
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node = target
|
||||
break
|
||||
beaker.forceMove(get_step(loc, SOUTH)) //Beaker is carefully ejected from the wreckage of the cryotube
|
||||
beaker = null
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/process()
|
||||
..()
|
||||
|
||||
@@ -31,7 +31,8 @@
|
||||
|
||||
/obj/machinery/light_switch/proc/updateicon()
|
||||
if(!overlay)
|
||||
overlay = image(icon, "light1-overlay", LIGHTING_LAYER+0.1)
|
||||
overlay = image(icon, "light1-overlay")
|
||||
overlay.plane = PLANE_LIGHTING_ABOVE
|
||||
|
||||
overlays.Cut()
|
||||
if(stat & NOPOWER)
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
/obj/machinery/porta_turret/ai_defense
|
||||
name = "defense turret"
|
||||
desc = "This varient appears to be much more durable."
|
||||
desc = "This variant appears to be much more durable."
|
||||
installation = /obj/item/weapon/gun/energy/xray // For the armor pen.
|
||||
health = 250 // Since lasers do 40 each.
|
||||
maxhealth = 250
|
||||
|
||||
@@ -985,7 +985,7 @@
|
||||
products = list(
|
||||
/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/material/knife = 3,
|
||||
/obj/item/weapon/material/kitchen/rollingpin = 2,
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
products = list(
|
||||
/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/material/knife = 3,
|
||||
/obj/item/weapon/material/kitchen/rollingpin = 2,
|
||||
@@ -60,7 +60,7 @@
|
||||
icon_deny = "boozeomat-deny"
|
||||
products = list(/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tomatosoup = 8,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup = 8,
|
||||
@@ -94,7 +94,7 @@
|
||||
icon_deny = "boozeomat-deny"
|
||||
products = list(/obj/item/weapon/tray = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup = 3,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 3,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
//loading
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(O.buckled_mob)
|
||||
if(O.has_buckled_mobs())
|
||||
return
|
||||
if(locate(/mob/living) in O)
|
||||
occupant_message("<span class='warning'>You can't load living things into the cargo compartment.</span>")
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
var/speed = 1
|
||||
var/mat_efficiency = 1
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0)
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0)
|
||||
var/res_max_amount = 200000
|
||||
|
||||
var/datum/research/files
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
var/speed = 1
|
||||
var/mat_efficiency = 1
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0)
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0)
|
||||
var/res_max_amount = 200000
|
||||
|
||||
var/datum/research/files
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#define MELEE 1
|
||||
#define RANGED 2
|
||||
|
||||
|
||||
/obj/mecha
|
||||
name = "Mecha"
|
||||
desc = "Exosuit"
|
||||
@@ -1051,6 +1050,17 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/MouseDrop_T(mob/O, mob/user as mob)
|
||||
//Humans can pilot mechs.
|
||||
if(!ishuman(O))
|
||||
return
|
||||
|
||||
//Can't put other people into mechs (can comment this out if you want that to be possible)
|
||||
if(O != user)
|
||||
return
|
||||
|
||||
move_inside()
|
||||
|
||||
/obj/mecha/verb/move_inside()
|
||||
set category = "Object"
|
||||
set name = "Enter Exosuit"
|
||||
@@ -1060,17 +1070,17 @@
|
||||
return
|
||||
|
||||
if (usr.buckled)
|
||||
usr << "<span class='warning'>You can't climb into the exosuit while buckled!</span>"
|
||||
to_chat(usr,"<span class='warning'>You can't climb into the exosuit while buckled!</span>")
|
||||
return
|
||||
|
||||
src.log_message("[usr] tries to move in.")
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
if(C.handcuffed)
|
||||
usr << "<span class='danger'>Kinda hard to climb in while handcuffed don't you think?</span>"
|
||||
to_chat(usr,"<span class='danger'>Kinda hard to climb in while handcuffed don't you think?</span>")
|
||||
return
|
||||
if (src.occupant)
|
||||
usr << "<span class='danger'>The [src.name] is already occupied!</span>"
|
||||
to_chat(usr,"<span class='danger'>The [src.name] is already occupied!</span>")
|
||||
src.log_append_to_last("Permission denied.")
|
||||
return
|
||||
/*
|
||||
@@ -1085,12 +1095,12 @@
|
||||
else if(src.operation_allowed(usr))
|
||||
passed = 1
|
||||
if(!passed)
|
||||
usr << "<span class='warning'>Access denied</span>"
|
||||
to_chat(usr,"<span class='warning'>Access denied</span>")
|
||||
src.log_append_to_last("Permission denied.")
|
||||
return
|
||||
for(var/mob/living/simple_animal/slime/M in range(1,usr))
|
||||
if(M.victim == usr)
|
||||
usr << "You're too busy getting your life sucked out of you."
|
||||
to_chat(usr,"You're too busy getting your life sucked out of you.")
|
||||
return
|
||||
// usr << "You start climbing into [src.name]"
|
||||
|
||||
@@ -1100,9 +1110,9 @@
|
||||
if(!src.occupant)
|
||||
moved_inside(usr)
|
||||
else if(src.occupant!=usr)
|
||||
usr << "[src.occupant] was faster. Try better next time, loser."
|
||||
to_chat(usr,"[src.occupant] was faster. Try better next time, loser.")
|
||||
else
|
||||
usr << "You stop entering the exosuit."
|
||||
to_chat(usr,"You stop entering the exosuit.")
|
||||
return
|
||||
|
||||
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
occupant_message("<font color='red'>[H.glasses] prevent you from using [src] [hud]</font>")
|
||||
else
|
||||
H.glasses = hud
|
||||
H.recalculate_vis()
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
@@ -32,6 +33,7 @@
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
if(H.glasses == hud)
|
||||
H.glasses = null
|
||||
H.recalculate_vis()
|
||||
..()
|
||||
return
|
||||
/*
|
||||
@@ -63,7 +65,7 @@
|
||||
name = "Integrated Medical Hud"
|
||||
|
||||
|
||||
process_hud(var/mob/M)
|
||||
// process_hud(var/mob/M) //TODO VIS
|
||||
/*
|
||||
world<< "view(M)"
|
||||
for(var/mob/mob in view(M))
|
||||
@@ -74,7 +76,7 @@
|
||||
world<< "view(M.loc)"
|
||||
for(var/mob/mob in view(M.loc))
|
||||
world << "[mob]"
|
||||
*/
|
||||
|
||||
|
||||
if(!M || M.stat || !(M in view(M))) return
|
||||
if(!M.client) return
|
||||
@@ -115,7 +117,7 @@
|
||||
holder.icon_state = "hudhealthy"
|
||||
|
||||
C.images += holder
|
||||
|
||||
*/
|
||||
/obj/mecha/medical/odysseus/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/obj/item/weapon/banner
|
||||
name = "banner"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "banner"
|
||||
desc = "A banner that's invisible because it shouldn't exist."
|
||||
|
||||
/obj/item/weapon/banner/red
|
||||
name = "red banner"
|
||||
icon_state = "banner-red"
|
||||
desc = "A red colored banner."
|
||||
|
||||
/obj/item/weapon/banner/blue
|
||||
name = "blue banner"
|
||||
icon_state = "banner-blue"
|
||||
desc = "A blue colored banner."
|
||||
|
||||
/obj/item/weapon/banner/green
|
||||
name = "green banner"
|
||||
icon_state = "banner-green"
|
||||
desc = "A green colored banner."
|
||||
|
||||
/obj/item/weapon/banner/nt
|
||||
name = "\improper NanoTrasen banner"
|
||||
icon_state = "banner-nt"
|
||||
desc = "A banner with NanoTrasen's logo on it."
|
||||
|
||||
/obj/item/weapon/banner/solgov
|
||||
name = "\improper SolGov banner"
|
||||
icon_state = "banner-solgov"
|
||||
desc = "A banner with the symbol of the Solar Confederate Government."
|
||||
|
||||
/obj/item/weapon/banner/virgov
|
||||
name = "\improper VirGov banner"
|
||||
icon_state = "banner-virgov"
|
||||
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as SifGov."
|
||||
@@ -6,26 +6,44 @@
|
||||
var/buckle_dir = 0
|
||||
var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1
|
||||
var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes
|
||||
var/mob/living/buckled_mob = null
|
||||
// var/mob/living/buckled_mob = null
|
||||
var/list/mob/living/buckled_mobs = null //list()
|
||||
var/max_buckled_mobs = 1
|
||||
|
||||
|
||||
/atom/movable/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(can_buckle && buckled_mob)
|
||||
user_unbuckle_mob(user)
|
||||
// if(can_buckle && buckled_mob)
|
||||
// user_unbuckle_mob(user)
|
||||
|
||||
if(can_buckle && has_buckled_mobs())
|
||||
if(buckled_mobs.len > 1)
|
||||
var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs
|
||||
if(user_unbuckle_mob(unbuckled, user))
|
||||
return TRUE
|
||||
else
|
||||
if(user_unbuckle_mob(buckled_mobs[1], user))
|
||||
return TRUE
|
||||
|
||||
/obj/proc/attack_alien(mob/user as mob) //For calling in the event of Xenomorph or other alien checks.
|
||||
return
|
||||
|
||||
/obj/attack_robot(mob/living/user)
|
||||
if(Adjacent(user) && buckled_mob) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
|
||||
if(Adjacent(user) && has_buckled_mobs()) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
|
||||
return attack_hand(user) //Process as if we're a normal person touching the object.
|
||||
return ..() //Otherwise, treat this as an AI click like usual.
|
||||
|
||||
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
. = ..()
|
||||
if(can_buckle && istype(M))
|
||||
user_buckle_mob(M, user)
|
||||
if(user_buckle_mob(M, user))
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/has_buckled_mobs()
|
||||
if(!buckled_mobs)
|
||||
return FALSE
|
||||
if(buckled_mobs.len)
|
||||
return TRUE
|
||||
|
||||
/atom/movable/Destroy()
|
||||
unbuckle_mob()
|
||||
@@ -33,52 +51,81 @@
|
||||
|
||||
|
||||
/atom/movable/proc/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
|
||||
if((!can_buckle && !forced) || !istype(M) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained()))
|
||||
return 0
|
||||
if(!buckled_mobs)
|
||||
buckled_mobs = list()
|
||||
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
|
||||
if(check_loc && M.loc != loc)
|
||||
return 0
|
||||
if(buckled_mob) //Handles trying to buckle yourself to the chair when someone is on it
|
||||
M << "<span class='notice'>\The [src] already has someone buckled to it.</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
|
||||
return FALSE
|
||||
|
||||
if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
|
||||
to_chat(M, "<span class='notice'>\The [src] can't buckle anymore people.</span>")
|
||||
return FALSE
|
||||
|
||||
M.buckled = src
|
||||
M.facing_dir = null
|
||||
M.set_dir(buckle_dir ? buckle_dir : dir)
|
||||
M.update_canmove()
|
||||
M.update_floating( M.Check_Dense_Object() )
|
||||
buckled_mob = M
|
||||
// buckled_mob = M
|
||||
buckled_mobs |= M
|
||||
|
||||
post_buckle_mob(M)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/unbuckle_mob(mob/living/buckled_mob, force = FALSE)
|
||||
if(!buckled_mob) // If we didn't get told which mob needs to get unbuckled, just assume its the first one on the list.
|
||||
if(has_buckled_mobs())
|
||||
buckled_mob = buckled_mobs[1]
|
||||
else
|
||||
return
|
||||
|
||||
/atom/movable/proc/unbuckle_mob()
|
||||
if(buckled_mob && buckled_mob.buckled == src)
|
||||
. = buckled_mob
|
||||
buckled_mob.buckled = null
|
||||
buckled_mob.anchored = initial(buckled_mob.anchored)
|
||||
buckled_mob.update_canmove()
|
||||
buckled_mob.update_floating( buckled_mob.Check_Dense_Object() )
|
||||
buckled_mob = null
|
||||
// buckled_mob = null
|
||||
buckled_mobs -= buckled_mob
|
||||
|
||||
post_buckle_mob(.)
|
||||
|
||||
/atom/movable/proc/unbuckle_all_mobs(force = FALSE)
|
||||
if(!has_buckled_mobs())
|
||||
return
|
||||
for(var/m in buckled_mobs)
|
||||
unbuckle_mob(m, force)
|
||||
|
||||
//Handle any extras after buckling/unbuckling
|
||||
//Called on buckle_mob() and unbuckle_mob()
|
||||
/atom/movable/proc/post_buckle_mob(mob/living/M)
|
||||
return
|
||||
|
||||
//Wrapper procs that handle sanity and user feedback
|
||||
/atom/movable/proc/user_buckle_mob(mob/living/M, mob/user, var/forced = FALSE, var/silent = FALSE)
|
||||
if(!ticker)
|
||||
user << "<span class='warning'>You can't buckle anyone in before the game starts.</span>"
|
||||
return FALSE // Is this really needed?
|
||||
if(!user.Adjacent(M) || user.restrained() || user.stat || istype(user, /mob/living/silicon/pai))
|
||||
return
|
||||
if(M == buckled_mob)
|
||||
return
|
||||
return FALSE
|
||||
if(M in buckled_mobs)
|
||||
to_chat(user, "<span class='warning'>\The [M] is already buckled to \the [src].</span>")
|
||||
return FALSE
|
||||
|
||||
add_fingerprint(user)
|
||||
unbuckle_mob()
|
||||
// unbuckle_mob()
|
||||
|
||||
//can't buckle unless you share locs so try to move M to the obj.
|
||||
if(M.loc != src.loc)
|
||||
step_towards(M, src)
|
||||
if(M.Adjacent(src) && user.Adjacent(src))
|
||||
M.forceMove(get_turf(src))
|
||||
// step_towards(M, src)
|
||||
|
||||
. = buckle_mob(M, forced)
|
||||
if(.)
|
||||
@@ -94,8 +141,8 @@
|
||||
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
|
||||
"<span class='notice'>You hear metal clanking.</span>")
|
||||
|
||||
/atom/movable/proc/user_unbuckle_mob(mob/user)
|
||||
var/mob/living/M = unbuckle_mob()
|
||||
/atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
|
||||
var/mob/living/M = unbuckle_mob(buckled_mob)
|
||||
if(M)
|
||||
if(M != user)
|
||||
M.visible_message(\
|
||||
@@ -111,18 +158,20 @@
|
||||
return M
|
||||
|
||||
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
|
||||
if(buckled_mob)
|
||||
// if(!buckled_mob.Move(newloc, direct))
|
||||
if(!buckled_mob.forceMove(newloc, direct))
|
||||
loc = buckled_mob.loc
|
||||
last_move = buckled_mob.last_move
|
||||
buckled_mob.inertia_dir = last_move
|
||||
return FALSE
|
||||
else
|
||||
buckled_mob.set_dir(dir)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
// if(!L.Move(newloc, direct))
|
||||
if(!L.forceMove(newloc, direct))
|
||||
loc = L.loc
|
||||
last_move = L.last_move
|
||||
L.inertia_dir = last_move
|
||||
return FALSE
|
||||
else
|
||||
L.set_dir(dir)
|
||||
return TRUE
|
||||
|
||||
/atom/movable/Move(atom/newloc, direct = 0)
|
||||
. = ..()
|
||||
if(. && buckled_mob && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
|
||||
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
|
||||
. = 0
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
anchored = 1
|
||||
var/amount = 1
|
||||
|
||||
/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=0)
|
||||
/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=1)
|
||||
if(!nologs)
|
||||
message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[newLoc.x];Y=[newLoc.y];Z=[newLoc.z]'>JMP</a>)")
|
||||
log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
|
||||
|
||||
@@ -7,6 +7,19 @@
|
||||
density = 1
|
||||
anchored = 0
|
||||
|
||||
/obj/effect/temporary_effect
|
||||
name = "self deleting effect"
|
||||
desc = "How are you examining what which cannot be seen?"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
invisibility = 0
|
||||
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
|
||||
|
||||
/obj/effect/temporary_effect/New()
|
||||
..()
|
||||
if(time_to_die)
|
||||
spawn(time_to_die)
|
||||
qdel(src)
|
||||
|
||||
// Shown really briefly when attacking with axes.
|
||||
/obj/effect/temporary_effect/cleave_attack
|
||||
name = "cleaving attack"
|
||||
@@ -16,12 +29,19 @@
|
||||
layer = 6
|
||||
time_to_die = 6
|
||||
alpha = 140
|
||||
invisibility = 0
|
||||
mouse_opacity = 0
|
||||
new_light_range = 0
|
||||
new_light_power = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/temporary_effect/cleave_attack/initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself.
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
|
||||
/obj/effect/temporary_effect/shuttle_landing
|
||||
name = "shuttle landing"
|
||||
desc = "You better move if you don't want to go splat!"
|
||||
icon_state = "shuttle_warning_still"
|
||||
time_to_die = 4.9 SECONDS
|
||||
|
||||
/obj/effect/temporary_effect/shuttle_landing/initialize()
|
||||
flick("shuttle_warning", src) // flick() forces the animation to always begin at the start.
|
||||
..()
|
||||
@@ -158,7 +158,7 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
|
||||
var/safety = 100 // Infinite loop protection.
|
||||
while(!T && safety)
|
||||
var/turf/simulated/candidate = pick(planet.planet_floors)
|
||||
if(!istype(candidate) || istype(candidate, /turf/simulated/sky))
|
||||
if(!istype(candidate) || istype(candidate, /turf/simulated/sky) || !T.outdoors)
|
||||
safety--
|
||||
continue
|
||||
else
|
||||
|
||||
@@ -234,7 +234,9 @@
|
||||
// apparently called whenever an item is removed from a slot, container, or anything else.
|
||||
/obj/item/proc/dropped(mob/user as mob)
|
||||
..()
|
||||
if(zoom) zoom() //binoculars, scope, etc
|
||||
if(zoom)
|
||||
zoom() //binoculars, scope, etc
|
||||
appearance_flags &= ~NO_CLIENT_COLOR
|
||||
|
||||
// called just as an item is picked up (loc is not yet changed)
|
||||
/obj/item/proc/pickup(mob/user)
|
||||
@@ -258,7 +260,7 @@
|
||||
// for items that can be placed in multiple slots
|
||||
// note this isn't called during the initial dressing of a player
|
||||
/obj/item/proc/equipped(var/mob/user, var/slot)
|
||||
layer = 20
|
||||
hud_layerise()
|
||||
if(user.client) user.client.screen |= src
|
||||
if(user.pulling == src) user.stop_pulling()
|
||||
return
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
//Programs nanopaste into NIF repair nanites
|
||||
/obj/item/device/nifrepairer
|
||||
name = "advanced NIF repair tool"
|
||||
desc = "A tool that accepts nanopaste and converts the nanites into NIF repair nanites for injection/ingestion. Insert paste, deposit into container."
|
||||
icon = 'icons/obj/device_alt.dmi'
|
||||
icon_state = "hydro"
|
||||
item_state = "gun"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 3
|
||||
w_class = ITEMSIZE_SMALL
|
||||
throw_speed = 5
|
||||
throw_range = 10
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 6000)
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5)
|
||||
var/datum/reagents/supply
|
||||
var/efficiency = 15 //How many units reagent per 1 unit nanopaste
|
||||
|
||||
|
||||
/obj/item/device/nifrepairer/New()
|
||||
..()
|
||||
|
||||
supply = new(max = 60, A = src)
|
||||
|
||||
/obj/item/device/nifrepairer/attackby(obj/W, mob/user)
|
||||
if(istype(W,/obj/item/stack/nanopaste))
|
||||
var/obj/item/stack/nanopaste/np = W
|
||||
if(np.use(1) && supply.get_free_space() >= efficiency)
|
||||
to_chat(user,"<span class='notice'>You convert some nanopaste into programmed nanites inside \the [src].</span>")
|
||||
supply.add_reagent(id = "nifrepairnanites", amount = efficiency)
|
||||
update_icon()
|
||||
else if(supply.get_free_space() < efficiency)
|
||||
to_chat(user,"<span class='warning'>\The [src] is too full. Empty it into a container first.</span>")
|
||||
return
|
||||
|
||||
/obj/item/device/nifrepairer/update_icon()
|
||||
if(supply.total_volume)
|
||||
icon_state = "[initial(icon_state)]2"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/item/device/nifrepairer/afterattack(var/atom/target, var/mob/user, var/proximity)
|
||||
if(!target.is_open_container() || !target.reagents)
|
||||
return 0
|
||||
|
||||
if(!supply || !supply.total_volume)
|
||||
to_chat(user,"<span class='warning'>[src] is empty. Feed it nanopaste.</span>")
|
||||
return 1
|
||||
|
||||
if(!target.reagents.get_free_space())
|
||||
user << "<span class='warning'>[target] is already full.</span>"
|
||||
return 1
|
||||
|
||||
var/trans = supply.trans_to(target, 15)
|
||||
to_chat(user,"<span class='notice'>You transfer [trans] units of the programmed nanites to [target].</span>")
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/item/device/nifrepairer/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
if(supply.total_volume)
|
||||
to_chat(user,"<span class='notice'>\The [src] contains [supply.total_volume] units of programmed nanites, ready for dispensing.</span>")
|
||||
else
|
||||
to_chat(user,"<span class='notice'>\The [src] is empty and ready to accept nanopaste.</span>")
|
||||
@@ -108,6 +108,7 @@
|
||||
data["note"] = note // current notes
|
||||
data["weather"] = weather
|
||||
data["aircontents"] = src.analyze_air()
|
||||
data["flashlight"] = fon
|
||||
data["injection"] = injection
|
||||
|
||||
// update the ui if it exists, returns null if no ui is passed/found
|
||||
@@ -245,5 +246,9 @@
|
||||
note = ""
|
||||
notehtml = note
|
||||
|
||||
if(href_list["Light"])
|
||||
fon = !fon
|
||||
set_light(fon * flum)
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
add_fingerprint(usr)
|
||||
@@ -32,6 +32,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
var/notehtml = ""
|
||||
|
||||
var/obj/item/weapon/cartridge/cartridge = null //current cartridge
|
||||
var/fon = 0 // Internal light
|
||||
var/flum = 2 // Brightness
|
||||
|
||||
var/list/modules = list(
|
||||
list("module" = "Phone", "icon" = "phone64", "number" = 2),
|
||||
list("module" = "Contacts", "icon" = "person64", "number" = 3),
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
brightness_on = 8 // Pretty bright.
|
||||
light_power = 3
|
||||
light_color = "#e58775"
|
||||
light_color = LIGHT_COLOR_FLARE
|
||||
icon_state = "flare"
|
||||
item_state = "flare"
|
||||
action_button_name = null //just pull it manually, neckbeard.
|
||||
|
||||
@@ -195,7 +195,7 @@ var/list/GPS_list = list()
|
||||
tracking = TRUE // On by default.
|
||||
|
||||
/obj/item/device/gps/internal // Base type for immobile/internal GPS units.
|
||||
icon_state = null
|
||||
icon_state = "internal"
|
||||
gps_tag = "Eerie Signal"
|
||||
desc = "Report to a coder immediately."
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
|
||||
@@ -44,4 +44,4 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "multitool"
|
||||
toolspeed = 0.1
|
||||
origin_tech = list(TECH_MAGNETS = 5, TECH_ENGINEERING = 5)
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 5)
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/device/encryptionkey/heads/hop
|
||||
name = "head of personnel's encryption key"
|
||||
icon_state = "hop_cypherkey"
|
||||
channels = list("Supply" = 1, "Service" = 1, "Command" = 1, "Security" = 0, "Explorer" = 0)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/ai_integrated
|
||||
name = "ai integrated encryption key"
|
||||
desc = "Integrated encryption key"
|
||||
icon_state = "cap_cypherkey"
|
||||
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1, "Explorer" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/heads/captain
|
||||
name = "colony director's encryption key"
|
||||
icon_state = "cap_cypherkey"
|
||||
channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0, "Explorer" = 0)
|
||||
@@ -19,13 +19,15 @@
|
||||
/obj/item/device/uplink/nano_host()
|
||||
return loc
|
||||
|
||||
/obj/item/device/uplink/New(var/location, var/datum/mind/owner, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
|
||||
/obj/item/device/uplink/New(var/location, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
|
||||
..()
|
||||
if(owner) //VOREStation Edit - Owner optional
|
||||
src.uplink_owner = owner
|
||||
uses = owner.tcrystals
|
||||
src.uplink_owner = owner
|
||||
purchase_log = list()
|
||||
world_uplinks += src
|
||||
if(owner)
|
||||
uses = owner.tcrystals
|
||||
else
|
||||
uses = telecrystals
|
||||
processing_objects += src
|
||||
|
||||
/obj/item/device/uplink/Destroy()
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
/*****************Marker Beacons**************************/
|
||||
var/list/marker_beacon_colors = list(
|
||||
"Random" = FALSE, //not a true color, will pick a random color
|
||||
"Burgundy" = LIGHT_COLOR_FLARE,
|
||||
"Bronze" = LIGHT_COLOR_ORANGE,
|
||||
"Yellow" = LIGHT_COLOR_YELLOW,
|
||||
"Lime" = LIGHT_COLOR_SLIME_LAMP,
|
||||
"Olive" = LIGHT_COLOR_GREEN,
|
||||
"Jade" = LIGHT_COLOR_BLUEGREEN,
|
||||
"Teal" = LIGHT_COLOR_LIGHT_CYAN,
|
||||
"Cerulean" = LIGHT_COLOR_BLUE,
|
||||
"Indigo" = LIGHT_COLOR_DARK_BLUE,
|
||||
"Purple" = LIGHT_COLOR_PURPLE,
|
||||
"Violet" = LIGHT_COLOR_LAVENDER,
|
||||
"Fuchsia" = LIGHT_COLOR_PINK
|
||||
)
|
||||
|
||||
/obj/item/stack/marker_beacon
|
||||
name = "marker beacons"
|
||||
singular_name = "marker beacon"
|
||||
desc = "Prismatic path illumination devices. Used by explorers and miners to mark paths and warn of danger."
|
||||
description_info = "Use inhand to drop one marker beacon. You can pick them up again with an empty hand or \
|
||||
hitting them with this marker stack. Alt-click to select a specific color."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "marker"
|
||||
max_amount = 100
|
||||
no_variants = TRUE
|
||||
var/picked_color = "random"
|
||||
|
||||
/obj/item/stack/marker_beacon/ten
|
||||
amount = 10
|
||||
|
||||
/obj/item/stack/marker_beacon/thirty
|
||||
amount = 30
|
||||
|
||||
/obj/item/stack/marker_beacon/hundred
|
||||
amount = 100
|
||||
|
||||
/obj/item/stack/marker_beacon/initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/stack/marker_beacon/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Use in-hand to place a [singular_name].</span>")
|
||||
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
|
||||
|
||||
/obj/item/stack/marker_beacon/update_icon()
|
||||
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
|
||||
|
||||
/obj/item/stack/marker_beacon/attack_self(mob/user)
|
||||
if(!isturf(user.loc))
|
||||
to_chat(user, "<span class='warning'>You need more space to place a [singular_name] here.</span>")
|
||||
return
|
||||
if(locate(/obj/structure/marker_beacon) in user.loc)
|
||||
to_chat(user, "<span class='warning'>There is already a [singular_name] here.</span>")
|
||||
return
|
||||
if(use(1))
|
||||
to_chat(user, "<span class='notice'>You activate and anchor [amount ? "a":"the"] [singular_name] in place.</span>")
|
||||
playsound(user, 'sound/machines/click.ogg', 50, 1)
|
||||
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
|
||||
transfer_fingerprints_to(M)
|
||||
|
||||
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
|
||||
if(user.incapacitated() || !istype(user))
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors
|
||||
if(user.incapacitated() || !istype(user) || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
update_icon()
|
||||
|
||||
/obj/structure/marker_beacon
|
||||
name = "marker beacon"
|
||||
desc = "A prismatic path illumination device. It is anchored in place and glowing steadily."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "marker"
|
||||
// layer = BELOW_OPEN_DOOR_LAYER
|
||||
anchored = TRUE
|
||||
light_range = 2
|
||||
light_power = 3
|
||||
var/remove_speed = 15
|
||||
var/picked_color
|
||||
|
||||
/obj/structure/marker_beacon/New(newloc, set_color)
|
||||
. = ..()
|
||||
picked_color = set_color
|
||||
update_icon()
|
||||
|
||||
/obj/structure/marker_beacon/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
|
||||
|
||||
/obj/structure/marker_beacon/update_icon()
|
||||
while(!picked_color || !marker_beacon_colors[picked_color])
|
||||
picked_color = pick(marker_beacon_colors)
|
||||
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
|
||||
set_light(light_range, light_power, marker_beacon_colors[picked_color])
|
||||
|
||||
/obj/structure/marker_beacon/attack_hand(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
|
||||
if(do_after(user, remove_speed, target = src))
|
||||
var/obj/item/stack/marker_beacon/M = new(loc)
|
||||
M.picked_color = picked_color
|
||||
M.update_icon()
|
||||
transfer_fingerprints_to(M)
|
||||
if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
qdel(src) //otherwise delete us
|
||||
|
||||
/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/stack/marker_beacon))
|
||||
var/obj/item/stack/marker_beacon/M = I
|
||||
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
|
||||
if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount)
|
||||
M.add(1)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/marker_beacon/AltClick(mob/living/user)
|
||||
..()
|
||||
if(user.incapacitated() || !istype(user))
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors
|
||||
if(user.incapacitated() || !istype(user) || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
update_icon()
|
||||
@@ -101,9 +101,8 @@
|
||||
//Step one - dehairing.
|
||||
/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if( istype(W, /obj/item/weapon/material/knife) || \
|
||||
istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || \
|
||||
istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \
|
||||
istype(W, /obj/item/weapon/material/hatchet) )
|
||||
istype(W, /obj/item/weapon/material/knife/machete/hatchet) )
|
||||
|
||||
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
|
||||
usr.visible_message("<span class='notice'>\The [usr] starts cutting hair off \the [src]</span>", "<span class='notice'>You start cutting the hair off \the [src]</span>", "You hear the sound of a knife rubbing against flesh")
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/belly = H.vore_selected
|
||||
var/datum/belly/selected = H.vore_organs[belly]
|
||||
src.forceMove(H)
|
||||
selected.internal_contents += src
|
||||
selected.internal_contents |= src
|
||||
to_chat(H, "<span class='notice'>You can taste the flavor of garbage. Wait what?</span>")
|
||||
return
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
var/belly = R.vore_selected
|
||||
var/datum/belly/selected = R.vore_organs[belly]
|
||||
src.forceMove(R)
|
||||
selected.internal_contents += src // Too many hoops and obstacles to stick it into the sleeper module.
|
||||
selected.internal_contents |= src // Too many hoops and obstacles to stick it into the sleeper module.
|
||||
R.visible_message("<span class='warning'>[user] feeds [R] with [src]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
user.visible_message("<span class='notice'>[user] does their lips with \the [src].</span>", \
|
||||
"<span class='notice'>You take a moment to apply \the [src]. Perfect!</span>")
|
||||
H.lip_style = colour
|
||||
H.update_body()
|
||||
H.update_icons_body()
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins to do [H]'s lips with \the [src].</span>", \
|
||||
"<span class='notice'>You begin to apply \the [src].</span>")
|
||||
@@ -58,7 +58,7 @@
|
||||
user.visible_message("<span class='notice'>[user] does [H]'s lips with \the [src].</span>", \
|
||||
"<span class='notice'>You apply \the [src].</span>")
|
||||
H.lip_style = colour
|
||||
H.update_body()
|
||||
H.update_icons_body()
|
||||
else
|
||||
user << "<span class='notice'>Where are the lips on that?</span>"
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
else
|
||||
if (M.ear_damage >= 5)
|
||||
M << "<span class='danger'>Your ears start to ring!</span>"
|
||||
M.update_icons()
|
||||
M.update_icons() //Forces matrix transform to proc if they are now laying, I guess?
|
||||
|
||||
/obj/item/weapon/grenade/flashbang/Destroy()
|
||||
walk(src, 0) // Because we might have called walk_away, we must stop the walk loop or BYOND keeps an internal reference to us forever.
|
||||
|
||||
@@ -1,19 +1,29 @@
|
||||
obj/item/weapon/chainsaw
|
||||
name = "Chainsaw"
|
||||
name = "chainsaw"
|
||||
desc = "Vroom vroom."
|
||||
icon_state = "chainsaw0"
|
||||
item_state = "chainsaw0"
|
||||
var/on = 0
|
||||
var/max_fuel = 20
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slot_flags = SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slot_flags = SLOT_BACK
|
||||
var/active_force = 55
|
||||
var/inactive_force = 10
|
||||
|
||||
obj/item/weapon/chainsaw/New()
|
||||
var/datum/reagents/R = new/datum/reagents(max_fuel)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
R.add_reagent("fuel", max_fuel)
|
||||
processing_objects |= src
|
||||
..()
|
||||
|
||||
obj/item/weapon/chainsaw/Destroy()
|
||||
processing_objects -= src
|
||||
if(reagents)
|
||||
qdel(reagents)
|
||||
..()
|
||||
|
||||
obj/item/weapon/chainsaw/proc/turnOn()
|
||||
@@ -31,7 +41,7 @@ obj/item/weapon/chainsaw/proc/turnOn()
|
||||
visible_message("You start \the [src] up with a loud grinding!", "[usr] starts \the [src] up with a loud grinding!")
|
||||
attack_verb = list("shreds", "rips", "tears")
|
||||
playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1)
|
||||
force = 55
|
||||
force = active_force
|
||||
edge = 1
|
||||
sharp = 1
|
||||
on = 1
|
||||
@@ -44,7 +54,7 @@ obj/item/weapon/chainsaw/proc/turnOff()
|
||||
to_chat(usr, "You switch the gas nozzle on the chainsaw, turning it off.")
|
||||
attack_verb = list("bluntly hit", "beat", "knocked")
|
||||
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',40,1)
|
||||
force = 10
|
||||
force = inactive_force
|
||||
edge = 0
|
||||
sharp = 0
|
||||
on = 0
|
||||
@@ -87,12 +97,13 @@ obj/item/weapon/chainsaw/process()
|
||||
if(on)
|
||||
if(get_fuel() > 0)
|
||||
reagents.remove_reagent("fuel", 1)
|
||||
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',15,1)
|
||||
if(get_fuel() <= 0)
|
||||
to_chat(usr, "\The [src] sputters to a stop!")
|
||||
on = !on
|
||||
turnOff()
|
||||
|
||||
obj/item/weapon/chainsaw/proc/get_fuel()
|
||||
reagents.get_reagent_amount("fuel")
|
||||
return reagents.get_reagent_amount("fuel")
|
||||
|
||||
obj/item/weapon/chainsaw/examine(mob/user)
|
||||
if(..(user,0))
|
||||
@@ -109,4 +120,4 @@ obj/item/weapon/chainsaw/update_icon()
|
||||
item_state = "chainsaw1"
|
||||
else
|
||||
icon_state = "chainsaw0"
|
||||
icon_state = "chainsaw0"
|
||||
item_state = "chainsaw0"
|
||||
|
||||
@@ -78,16 +78,10 @@
|
||||
/*
|
||||
* Knives
|
||||
*/
|
||||
/obj/item/weapon/material/kitchen/utensil/knife
|
||||
name = "knife"
|
||||
desc = "A knife for eating with. Can cut through any food."
|
||||
icon_state = "knife"
|
||||
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
|
||||
scoop_food = 0
|
||||
|
||||
// Identical to the tactical knife but nowhere near as stabby.
|
||||
// Kind of like the toy esword compared to the real thing.
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/boot
|
||||
/obj/item/weapon/material/knife/boot
|
||||
name = "boot knife"
|
||||
desc = "A small fixed-blade knife for putting inside a boot."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
@@ -95,14 +89,15 @@
|
||||
item_state = "knife"
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
|
||||
/* From the time of Clowns. Commented out for posterity, and sanity.
|
||||
/obj/item/weapon/material/knife/attack(target as mob, mob/living/user as mob)
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "<span class='warning'>You accidentally cut yourself with \the [src].</span>"
|
||||
user.take_organ_damage(20)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/plastic
|
||||
*/
|
||||
/obj/item/weapon/material/knife/plastic
|
||||
default_material = "plastic"
|
||||
|
||||
/*
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user