Merge remote-tracking branch 'refs/remotes/origin/master' into detective-sidearm

This commit is contained in:
Spades
2018-01-18 18:24:25 -05:00
447 changed files with 22678 additions and 4014 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ sudo: false
env:
BYOND_MAJOR="512"
BYOND_MINOR="1392"
BYOND_MINOR="1403"
MACRO_COUNT=4
cache:
+14 -11
View File
@@ -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
View File
@@ -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"
+7 -1
View File
@@ -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
+76 -8
View File
@@ -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))
+7
View File
@@ -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
+26 -1
View File
@@ -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
View File
@@ -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
+5
View File
@@ -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
View File
@@ -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.
+8
View File
@@ -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
+1
View File
@@ -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
View File
+2 -1
View File
@@ -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
+4 -1
View File
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
+7
View File
@@ -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
+2
View File
@@ -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 -5
View File
@@ -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
View File
@@ -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
+6 -16
View File
@@ -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
+1 -1
View File
@@ -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)
+3 -1
View File
@@ -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.
+4
View File
@@ -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)
+6 -2
View File
@@ -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()
+25 -13
View File
@@ -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
+1 -1
View File
@@ -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"
+138
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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"
+224
View File
@@ -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))
+1 -1
View File
@@ -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
)
)
+2 -2
View File
@@ -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,
+9
View File
@@ -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
+22 -2
View File
@@ -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
-89
View File
@@ -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
-60
View File
@@ -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]
+1 -1
View File
@@ -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)
+1
View File
@@ -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)
+1 -1
View File
@@ -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 -1
View File
@@ -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
+1
View File
@@ -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,
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+2
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -1
View File
@@ -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"
+8 -8
View File
@@ -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)
+8 -8
View File
@@ -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 = ""
+194
View File
@@ -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)
+1 -1
View File
@@ -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
+5 -2
View File
@@ -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
+3 -10
View File
@@ -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()
..()
+2 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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,
+3 -3
View File
@@ -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,
+1 -1
View File
@@ -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>")
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+18 -8
View File
@@ -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)
+5 -3
View File
@@ -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
+35
View File
@@ -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."
+81 -32
View File
@@ -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])")
+23 -3
View File
@@ -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.
..()
+1 -1
View File
@@ -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
+4 -2
View File
@@ -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.
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+6 -4
View File
@@ -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")
+2 -2
View File
@@ -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
..()
+2 -2
View File
@@ -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