# Conflicts:
#	code/modules/clothing/gloves/miscellaneous_vr.dm
#	code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
#	code/modules/vore/appearance/sprite_accessories_vr.dm
#	code/modules/vore/eating/bellymodes_vr.dm
#	config/custom_items.txt
#	config/example/motd.txt
#	icons/mob/human_face_or_vr.dmi
#	icons/mob/vore/taurs_vr.dmi
#	vorestation.dme
This commit is contained in:
Repede
2018-04-20 09:03:58 -04:00
458 changed files with 11146 additions and 5161 deletions

View File

@@ -17,7 +17,8 @@ Pipelines + Other Objects -> Pipe network
var/nodealert = 0
var/power_rating //the maximum amount of power the machine can use to do work, affects how powerful the machine is, in Watts
layer = 2.4 //under wires with their 2.44
layer = ATMOS_LAYER
plane = PLATING_PLANE
var/pipe_flags = PIPING_DEFAULT_LAYER_ONLY // Allow other layers by exception basis.
var/connect_types = CONNECT_TYPE_REGULAR
@@ -201,12 +202,12 @@ Pipelines + Other Objects -> Pipe network
if(PIPING_LAYER_SCRUBBER)
icon_state = "[icon_state]-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
if(PIPING_LAYER_SUPPLY)
icon_state = "[icon_state]-supply"
connect_types = CONNECT_TYPE_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
if(pipe_flags & PIPING_ALL_LAYER)
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER

View File

@@ -6,7 +6,6 @@
icon = 'icons/atmos/injector.dmi'
icon_state = "map_injector"
pipe_state = "injector"
layer = 3
name = "air injector"
desc = "Passively injects air into its surroundings. Has a valve attached to it that can control flow rate."

View File

@@ -34,7 +34,8 @@ obj/machinery/atmospherics/pipe/mains_component
obj/machinery/atmospherics/mains_pipe
icon = 'icons/obj/atmospherics/mainspipe.dmi'
layer = 2.4 //under wires with their 2.5
layer = PIPES_LAYER
plane = PLATING_PLANE
var/volume = 0

View File

@@ -7,7 +7,6 @@
icon = 'icons/atmos/pipes.dmi'
icon_state = ""
level = 2
layer = 2.4 //under wires with their 2.44
volume = 35
@@ -80,7 +79,7 @@
icon_state = "cap-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -90,7 +89,7 @@
icon_state = "cap-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -105,7 +104,7 @@
icon_state = "cap-f-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -115,6 +114,6 @@
icon_state = "cap-f-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE

View File

@@ -12,7 +12,7 @@
construction_type = /obj/item/pipe/binary/bendable
pipe_state = "he"
layer = 2.41
layer = PIPES_HE_LAYER
var/initialize_directions_he
var/surface = 2 //surface area in m^2
var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh

View File

@@ -18,7 +18,6 @@
var/obj/machinery/atmospherics/node3
level = 1
layer = 2.4 //under wires with their 2.44
/obj/machinery/atmospherics/pipe/manifold/New()
..()
@@ -166,7 +165,7 @@
icon_state = "map-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -176,7 +175,7 @@
icon_state = "map-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -212,7 +211,7 @@
icon_state = "map-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -222,7 +221,7 @@
icon_state = "map-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE

View File

@@ -19,7 +19,6 @@
var/obj/machinery/atmospherics/node4
level = 1
layer = 2.4 //under wires with their 2.44
/obj/machinery/atmospherics/pipe/manifold4w/New()
..()
@@ -168,7 +167,7 @@
icon_state = "map_4way-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -178,7 +177,7 @@
icon_state = "map_4way-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -214,7 +213,7 @@
icon_state = "map_4way-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -224,7 +223,7 @@
icon_state = "map_4way-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE

View File

@@ -7,7 +7,7 @@
var/datum/pipeline/parent
var/volume = 0
layer = 2.4 //under wires with their 2.44
layer = PIPES_LAYER
use_power = 0
pipe_flags = 0 // Does not have PIPING_DEFAULT_LAYER_ONLY flag.

View File

@@ -173,7 +173,7 @@
icon_state = "intact-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -183,7 +183,7 @@
icon_state = "intact-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -219,7 +219,7 @@
icon_state = "intact-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
layer = 2.38
layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -229,7 +229,7 @@
icon_state = "intact-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
layer = 2.39
layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE

View File

@@ -11,6 +11,7 @@
volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet
var/start_pressure = 75*ONE_ATMOSPHERE //Vorestation edit
layer = ATMOS_LAYER
level = 1
dir = SOUTH
initialize_directions = SOUTH

View File

@@ -40,39 +40,71 @@ What is the naming convention for planes or layers?
*/
#define SPACE_PLANE -32 // Reserved for use in space/parallax
#define PARALLAX_PLANE -30 // Reserved for use in space/parallax
#define SPACE_PLANE -82 // Reserved for use in space/parallax
#define PARALLAX_PLANE -80 // Reserved for use in space/parallax
// OPENSPACE_PLANE reserves all planes between OPENSPACE_PLANE_START and OPENSPACE_PLANE_END inclusive
#define OPENSPACE_PLANE -55 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17)
#define OPENSPACE_PLANE_START -53
#define OPENSPACE_PLANE_END -38
#define OVER_OPENSPACE_PLANE -37
#define OPENSPACE_PLANE -75 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17)
#define OPENSPACE_PLANE_START -73
#define OPENSPACE_PLANE_END -58
#define OVER_OPENSPACE_PLANE -57
// Turf Planes
#define SPACE_PLANE -43 // Space turfs themselves
#define PLATING_PLANE -44 // Plating
#define DISPOSAL_LAYER 2.1 // Under objects, even when planeswapped
#define PIPES_LAYER 2.2 // Under objects, even when planeswapped
#define WIRES_LAYER 2.3 // Under objects, even when planeswapped
#define ATMOS_LAYER 2.4 // Pipe-like atmos machinery that goes on the floor, like filters.
#define ABOVE_UTILITY 2.5 // Above stuff like pipes and wires
#define TURF_PLANE -45 // Turfs themselves, most flooring
#define ABOVE_TURF_LAYER 2.1 // Snow and such
#define DECAL_PLANE -44 // Permanent decals
#define DIRTY_PLANE -43 // Nonpermanent decals
#define BLOOD_PLANE -42 // Blood is really dirty, but we can do special stuff if we separate it
// Obj planes
#define OBJ_PLANE -35
#define HIDING_LAYER 2.6 // Layer at which mobs hide to be under things like tables
#define DOOR_OPEN_LAYER 2.7 // Under all objects if opened. 2.7 due to tables being at 2.6
#define TABLE_LAYER 2.8 // Just under stuff that wants to be slightly below common objects.
#define UNDER_JUNK_LAYER 2.9 // Things that want to be slightly below common objects
// Turf/Obj layer boundary
#define ABOVE_JUNK_LAYER 3.1 // Things that want to be slightly above common objects
#define DOOR_CLOSED_LAYER 3.1 // Doors when closed
#define WINDOW_LAYER 3.2 // Windows
#define ON_WINDOW_LAYER 3.3 // Ontop of a window
#define SHOWER_OPEN_LAYER 3.4 // Showers when open
// Obj/Mob layer boundary
#define SHOWER_CLOSED_LAYER 4.2 // Should be converted to plane swaps
// Mob planes
#define MOB_PLANE -25
#define BELOW_MOB_LAYER 3.9 // Should be converted to plane swaps
#define ABOVE_MOB_LAYER 4.1 // Should be converted to plane swaps
// Top plane (in the sense that it's the highest in 'the world' and not a UI element)
#define ABOVE_PLANE -10
////////////////////////////////////////////////////////////////////////////////////////
#define PLANE_WORLD 0 // BYOND's default value for plane, the "base plane"
////////////////////////////////////////////////////////////////////////////////////////
//#define AREA_LAYER 1 //For easy recordkeeping; this is a byond define
//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
#define DECALS_LAYER 2.01
#define OVERTURF_LAYER 2.1
#define HIDING_LAYER 2.45 //Layer at which mobs hide to be under things like tables
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
#define SHOWER_OPEN_LAYER 3.4
#define BELOW_MOB_LAYER 3.9
//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
#define ABOVE_MOB_LAYER 4.1
#define SHOWER_CLOSED_LAYER 4.2
//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
#define LIGHTING_LAYER 11 //Layer that lighting used to be on (now it's on a plane)
#define HUD_LAYER 20 // Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
#define SCREEN_LAYER 22 // Mob HUD/effects layer
#define PLANE_ADMIN1 3 //Purely for shenanigans (below lighting)
#define PLANE_PLANETLIGHTING 4 //Lighting on planets
#define PLANE_LIGHTING 5 //Where the lighting (and darkness) lives
#define PLANE_LIGHTING_ABOVE 6 //For glowy eyes etc. that shouldn't be affected by darkness
@@ -125,4 +157,4 @@ What is the naming convention for planes or layers?
// Check if a mob can "logically" see an atom plane
#define MOB_CAN_SEE_PLANE(M, P) (P == PLANE_WORLD || (P >= OPENSPACE_PLANE_START && P <= OPENSPACE_PLANE_END) || (P in M.planes_visible))
#define MOB_CAN_SEE_PLANE(M, P) (P <= PLANE_WORLD || (P in M.planes_visible))

View File

@@ -1,11 +1,21 @@
// Belly Mode Constants
// Normal digestion modes
#define DM_HOLD "Hold"
#define DM_DIGEST "Digest"
#define DM_ITEMWEAK "Digest (Item Friendly)"
#define DM_STRIPDIGEST "Strip Digest (Items Only)"
#define DM_DIGEST_NUMB "Digest (Numbing)"
#define DM_HEAL "Heal"
#define DM_ABSORB "Absorb"
#define DM_UNABSORB "Unabsorb"
#define DM_DRAIN "Drain"
#define DM_SHRINK "Shrink"
#define DM_GROW "Grow"
#define DM_SIZE_STEAL "Size Steal"
#define DM_HEAL "Heal"
#define DM_EGG "Encase In Egg"
#define DM_TRANSFORM "Transform"
//#define DM_ITEMWEAK "Digest (Item Friendly)"
//#define DM_STRIPDIGEST "Strip Digest (Items Only)"
//#define DM_DIGEST_NUMB "Digest (Numbing)"
//TF modes
#define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)"
#define DM_TRANSFORM_MALE "Transform (Male)"
#define DM_TRANSFORM_FEMALE "Transform (Female)"
@@ -17,12 +27,12 @@
#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)"
#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)"
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
#define DM_EGG "Encase In Egg"
#define DM_DRAIN "Drain"
#define DM_UNABSORB "Unabsorb"
#define DM_SHRINK "Shrink"
#define DM_GROW "Grow"
#define DM_SIZE_STEAL "Size Steal"
//Addon mode flags
#define DM_FLAG_NUMBING 0x1
#define DM_FLAG_ITEMWEAK 0x2
#define DM_FLAG_STRIPPING 0x4
// Stance for hostile mobs to be in while devouring someone.
#define HOSTILE_STANCE_EATING 99

View File

@@ -27,7 +27,7 @@
#define IS_SLIME 8
#define CE_STABLE "stable" // Inaprovaline
#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin
#define CE_ANTIBIOTIC "antibiotic" // Antibiotics
#define CE_BLOODRESTORE "bloodrestore" // Iron/nutriment
#define CE_PAINKILLER "painkiller"
#define CE_ALCOHOL "alcohol" // Liver filtering
@@ -36,6 +36,7 @@
#define REAGENTS_PER_SHEET 20
// Attached to CE_ANTIBIOTIC
#define ANTIBIO_NORM 1
#define ANTIBIO_OD 2
#define ANTIBIO_SUPER 3

View File

@@ -45,6 +45,11 @@
#define PIPING_LAYER_SCRUBBER 3
#define PIPING_LAYER_DEFAULT PIPING_LAYER_REGULAR
// We offset the layer values of the different pipe types to ensure they look nice
#define PIPES_SCRUBBER_LAYER (PIPES_LAYER - 0.02)
#define PIPES_SUPPLY_LAYER (PIPES_LAYER - 0.01)
#define PIPES_HE_LAYER (PIPES_LAYER + 0.01)
// Pipe flags
#define PIPING_ALL_LAYER 1 //intended to connect with all layers, check for all instead of just one.
#define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already.

View File

@@ -88,17 +88,17 @@
#define slot_back 3
#define slot_belt 4
#define slot_wear_id 5
#define slot_l_store 6
#define slot_r_store 7 //Some things may reference this, try to keep it here
#define slot_s_store 6
#define slot_l_store 7
#define slot_r_store 8 //Some things may reference this, try to keep it here
//Shown when inventory unhidden
#define slot_glasses 8
#define slot_wear_mask 9
#define slot_gloves 10
#define slot_head 11
#define slot_shoes 12
#define slot_wear_suit 13
#define slot_w_uniform 14
#define slot_s_store 15
#define slot_glasses 9
#define slot_wear_mask 10
#define slot_gloves 11
#define slot_head 12
#define slot_shoes 13
#define slot_wear_suit 14
#define slot_w_uniform 15
#define slot_l_ear 16
#define slot_r_ear 17
//Secret slots

View File

@@ -9,7 +9,6 @@
#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
//#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
#define LIGHTING_ICON_STATE_DARK "soft_dark" // Change between "soft_dark" and "dark" to swap soft darkvision

View File

@@ -24,5 +24,6 @@
#define SPECIES_VULPKANIN "Vulpkanin"
#define SPECIES_XENOCHIMERA "Xenochimera"
#define SPECIES_XENOHYBRID "Xenomorph Hybrid"
#define SPECIES_ZORREN_FLAT "Flatlander Zorren"
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species"

View File

@@ -32,7 +32,7 @@ var/global/list/all_species[0]
var/global/list/all_languages[0]
var/global/list/language_keys[0] // Table of say codes for all languages
var/global/list/whitelisted_species = list(SPECIES_HUMAN) // Species that require a whitelist check.
var/global/list/playable_species = list("Custom Species", SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious.
var/global/list/playable_species = list(SPECIES_CUSTOM, SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious.
var/list/mannequins_

View File

@@ -11,6 +11,8 @@ var/global/list/positive_traits = list() // Positive custom species traits, inde
var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup
var/global/list/all_traits = list() // All of 'em at once (same instances)
var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base
//stores numeric player size options indexed by name
var/global/list/player_sizes_list = list(
"Macro" = RESIZE_HUGE,
@@ -195,4 +197,14 @@ var/global/list/edible_trash = list(/obj/item/trash,
if(0.1 to INFINITY)
positive_traits[path] = instance
// Custom species icon bases
var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well.
for(var/species_name in playable_species)
if(species_name in blacklisted_icons)
continue
var/datum/species/S = all_species[species_name]
if(S.spawn_flags & SPECIES_IS_WHITELISTED)
continue
custom_species_bases += species_name
return 1 // Hooks must return 1

View File

@@ -1226,20 +1226,21 @@ proc/is_hot(obj/item/W as obj)
/*
Checks if that loc and dir has a item on the wall
TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana
*/
var/list/WALLITEMS = list(
"/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom",
"/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank",
"/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign",
"/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control",
"/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller",
"/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth",
"/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment"
/obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame,
/obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank,
/obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign,
/obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote,
/obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio,
/obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
/obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment
)
/proc/gotwallitem(loc, dir)
for(var/obj/O in loc)
for(var/item in WALLITEMS)
if(istype(O, text2path(item)))
if(istype(O, item))
//Direction works sometimes
if(O.dir == dir)
return 1
@@ -1263,7 +1264,7 @@ var/list/WALLITEMS = list(
//Some stuff is placed directly on the wallturf (signs)
for(var/obj/O in get_step(loc, dir))
for(var/item in WALLITEMS)
if(istype(O, text2path(item)))
if(istype(O, item))
if(O.pixel_x == 0 && O.pixel_y == 0)
return 1
return 0

View File

@@ -1,2 +1,4 @@
#define isbelly(A) istype(A, /obj/belly)
#define isstorage(A) istype(A, /obj/item/weapon/storage)
#define isitem(A) istype(A, /obj/item)
#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur)

View File

@@ -11,7 +11,7 @@
using.icon = 'icons/mob/screen1_alien.dmi'
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
using.screen_loc = ui_acti
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
move_intent = using

View File

@@ -51,7 +51,6 @@ var/list/global_huds = list(
/obj/screen/global_screen
screen_loc = ui_entire_screen
layer = 17
plane = PLANE_FULLSCREEN
mouse_opacity = 0
@@ -74,7 +73,12 @@ var/list/global_huds = list(
darksight.icon = null
darksight.screen_loc = "1,1"
darksight.plane = PLANE_LIGHTING
darksight.plane = LIGHTING_LAYER + 0.1
//Marks the center of the screen, for things like ventcrawl
centermarker = new /obj/screen()
centermarker.icon = 'icons/mob/screen1.dmi'
centermarker.icon_state = "centermarker"
centermarker.screen_loc = "CENTER,CENTER"
//Marks the center of the screen, for things like ventcrawl
centermarker = new /obj/screen()
@@ -141,20 +145,17 @@ var/list/global_huds = list(
for(i = 1, i <= 4, i++)
O = vimpaired[i]
O.icon_state = "dither50"
O.layer = 17
O.plane = PLANE_FULLSCREEN
O.mouse_opacity = 0
O = darkMask[i]
O.icon_state = "dither50"
O.layer = 17
O.plane = PLANE_FULLSCREEN
O.mouse_opacity = 0
for(i = 5, i <= 8, i++)
O = darkMask[i]
O.icon_state = "black"
O.layer = 17
O.plane = PLANE_FULLSCREEN
O.mouse_opacity = 2

View File

@@ -11,13 +11,13 @@
blobpwrdisplay.name = "blob power"
blobpwrdisplay.icon_state = "block"
blobpwrdisplay.screen_loc = ui_health
blobpwrdisplay.layer = 20
blobpwrdisplay.layer = HUD_LAYER
blobhealthdisplay = new /obj/screen()
blobhealthdisplay.name = "blob health"
blobhealthdisplay.icon_state = "block"
blobhealthdisplay.screen_loc = ui_internal
blobhealthdisplay.layer = 20
blobhealthdisplay.layer = HUD_LAYER
mymob.client.screen = list()
@@ -36,7 +36,7 @@
using.icon = ui_style
using.icon_state = "intent_"+mymob.a_intent
using.screen_loc = ui_zonesel
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
action_intent = using
@@ -50,7 +50,7 @@
using.name = "help"
using.icon = ico
using.screen_loc = ui_zonesel
using.layer = 21
using.layer = HUD_LAYER+0.01
src.adding += using
help_intent = using
@@ -61,7 +61,7 @@
using.name = "disarm"
using.icon = ico
using.screen_loc = ui_zonesel
using.layer = 21
using.layer = HUD_LAYER+0.01
src.adding += using
disarm_intent = using
@@ -72,7 +72,7 @@
using.name = "grab"
using.icon = ico
using.screen_loc = ui_zonesel
using.layer = 21
using.layer = HUD_LAYER+0.01
src.adding += using
grab_intent = using
@@ -83,7 +83,7 @@
using.name = I_HURT
using.icon = ico
using.screen_loc = ui_zonesel
using.layer = 21
using.layer = HUD_LAYER+0.01
src.adding += using
hurt_intent = using
@@ -93,9 +93,12 @@
return
/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD)
HUD.construct_hud()
/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD)
..(HUD)
// HUD.construct_hud() //Archaic.
/*
/datum/hud/proc/construct_hud()
var/constructtype
@@ -109,30 +112,28 @@
constructtype = "harvester"
if(constructtype)
mymob.fire = new /obj/screen()
mymob.fire.icon = 'icons/mob/screen1_construct.dmi'
mymob.fire.icon_state = "fire0"
mymob.fire.name = "fire"
mymob.fire.screen_loc = ui_construct_fire
mymob.healths = new /obj/screen()
mymob.healths.icon = 'icons/mob/screen1_construct.dmi'
mymob.healths.icon_state = "[constructtype]_health0"
mymob.healths.name = "health"
mymob.healths.screen_loc = ui_construct_health
mymob.pullin = new /obj/screen()
mymob.pullin.icon = 'icons/mob/screen1_construct.dmi'
mymob.pullin.icon_state = "pull0"
mymob.pullin.name = "pull"
mymob.pullin.screen_loc = ui_construct_pull
mymob.zone_sel = new /obj/screen/zone_sel()
mymob.zone_sel.icon = 'icons/mob/screen1_construct.dmi'
mymob.zone_sel.overlays.len = 0
mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]")
mymob.purged = new /obj/screen()
mymob.purged.icon = 'icons/mob/screen1_construct.dmi'
mymob.purged.icon_state = "purge0"
mymob.purged.name = "purged"
@@ -142,3 +143,4 @@
mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged)
mymob.client.screen += mymob.client.void
*/

View File

@@ -30,7 +30,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "radio"
using.screen_loc = ui_movi
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
//Module select
@@ -43,7 +43,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "inv1"
using.screen_loc = ui_inv1
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
mymob:inv1 = using
@@ -55,7 +55,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "inv2"
using.screen_loc = ui_inv2
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
mymob:inv2 = using
@@ -67,7 +67,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "inv3"
using.screen_loc = ui_inv3
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
mymob:inv3 = using
@@ -81,7 +81,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = mymob.a_intent
using.screen_loc = ui_acti
using.layer = 20
using.layer = HUD_LAYER
src.adding += using
action_intent = using
@@ -119,7 +119,7 @@ var/obj/screen/robot_inventory
using.icon_state = "panel"
using.alpha = ui_alpha
using.screen_loc = ui_borg_panel
using.layer = 19
using.layer = HUD_LAYER-0.01
src.adding += using
//Store
@@ -276,6 +276,6 @@ var/obj/screen/robot_inventory
r.client.screen -= r.robot_modules_background
/mob/living/silicon/robot/update_hud()
..()
if(modtype)
hands.icon_state = lowertext(modtype)
..()

View File

@@ -92,9 +92,11 @@
if(spattack_min_range <= 1)
SpecialAtkTarget()
else if(melee_damage_upper == 0 && istype(A,/mob/living))
custom_emote(1,"[pick(friendly)] [A]!")
else
DoPunch(A)

View File

@@ -68,7 +68,7 @@ var/const/tk_maxrange = 15
flags = NOBLUDGEON
//item_state = null
w_class = ITEMSIZE_NO_CONTAINER
layer = 20
layer = HUD_LAYER
var/last_throw = 0
var/atom/movable/focus = null

View File

@@ -6,11 +6,11 @@
if(config.kick_inactive)
for(last_object in clients)
var/client/C = last_object
if(C.is_afk(config.kick_inactive MINUTES))
if(!istype(C.mob, /mob/observer/dead) && !istype(C.mob, /mob/new_player))
if(C.is_afk(config.kick_inactive MINUTES) && !C.holder) // VOREStation Edit - Allow admins to idle
to_chat(C,"<span class='warning'>You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.</span>")
var/information
if(C.mob)
if(ishuman(C.mob))
var/job
var/mob/living/carbon/human/H = C.mob

View File

@@ -47,7 +47,8 @@ var/datum/controller/process/planet/planet_controller = null
//Weather style needs redrawing
if(P.needs_work & PLANET_PROCESS_WEATHER)
P.needs_work &= ~PLANET_PROCESS_WEATHER
var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state, layer = LIGHTING_LAYER - 1)
var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state)
new_overlay.plane = PLANE_PLANETLIGHTING
//Redraw weather icons
for(var/T in P.planet_floors)
var/turf/simulated/turf = T

View File

@@ -234,7 +234,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
name = "star"
var/speed = 10
var/direction = SOUTH
layer = 2 // TURF_LAYER
layer = TURF_LAYER
plane = TURF_PLANE
/obj/effect/bgstar/New()
..()

View File

@@ -9,7 +9,7 @@
SUBSYSTEM_DEF(air)
name = "Air"
init_order = INIT_ORDER_AIR
priority = 20
priority = 35
wait = 2 SECONDS // seconds (We probably can speed this up actually)
flags = SS_BACKGROUND // TODO - Should this really be background? It might be important.
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME

View File

@@ -14,7 +14,7 @@ SUBSYSTEM_DEF(airflow)
wait = 2
flags = SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
priority = 15
priority = 30
var/list/processing = list()
var/list/currentrun = list()

View File

@@ -132,3 +132,9 @@
question = "A curious explorer has touched a mysterious rune. \
Would you like to play as the creature it summons?"
cutoff_number = 1
/datum/ghost_query/cursedblade
role_name = "Cursed Sword"
question = "A cursed blade has been discovered by a curious explorer. \
Would you like to play as the soul imprisoned within?"
cutoff_number = 1

View File

@@ -1,5 +1,5 @@
//wrapper
/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit
new /datum/teleport/instant/science(arglist(args))
return
@@ -12,15 +12,16 @@
var/soundin //soundfile to play before teleportation
var/soundout //soundfile to play after teleportation
var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation)
var/local = TRUE //VOREStation Add - If false, can teleport from/to any z-level
/datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
/datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit
..()
if(!initTeleport(arglist(args)))
return 0
return 1
/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout,local) //VOREStation Edit
if(!setTeleatom(ateleatom))
return 0
if(!setDestination(adestination))
@@ -30,6 +31,7 @@
setEffects(aeffectin,aeffectout)
setForceTeleport(afteleport)
setSounds(asoundin,asoundout)
src.local = local // VOREStation Add
return 1
//must succeed
@@ -186,7 +188,7 @@
return 0
*/ //VOREStation Removal End
//VOREStation Edit Start
if(destination.z in using_map.player_levels)
if(!local || (destination.z in using_map.player_levels)) //VOREStation Edit
return 1
if(istype(teleatom, /mob/living))
to_chat(teleatom, "<span class='warning'>The portal refuses to carry you that far away!</span>")

View File

@@ -1,13 +1,17 @@
/datum/teleport/proc/try_televore()
//Destination is in a belly
if(isbelly(destination.loc))
if(isbelly(destination.loc) && isliving(teleatom))
var/mob/living/L = teleatom
var/obj/belly/B = destination.loc
if(!L.can_be_drop_prey) //Overloading this as a pref for 'want to be unexpectedly eaten'
return FALSE
teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything.
playSpecials(destination,effectout,soundout)
teleatom.forceMove(B)
return 1
return TRUE
//No fun!
return 0
return FALSE

View File

@@ -23,8 +23,8 @@
name = OUTFIT_JOB_NAME("Medical Doctor")
uniform = /obj/item/clothing/under/rank/medical
suit = /obj/item/clothing/suit/storage/toggle/labcoat
l_hand = /obj/item/weapon/storage/firstaid/adv
r_pocket = /obj/item/device/healthanalyzer
l_hand = /obj/item/weapon/storage/firstaid/regular
r_pocket = /obj/item/device/flashlight/pen
id_type = /obj/item/weapon/card/id/medical/doctor
/decl/hierarchy/outfit/job/medical/doctor/emergency_physician
@@ -94,7 +94,7 @@
uniform = /obj/item/clothing/under/rank/medical/scrubs/black
suit = /obj/item/clothing/suit/storage/toggle/fr_jacket
shoes = /obj/item/clothing/shoes/boots/jackboots
l_hand = /obj/item/weapon/storage/firstaid/adv
l_hand = /obj/item/weapon/storage/firstaid/regular
belt = /obj/item/weapon/storage/belt/medical/emt
pda_slot = slot_l_store
id_type = /obj/item/weapon/card/id/medical/paramedic

View File

@@ -0,0 +1,264 @@
/datum/supply_packs/costumes/xenowear_vr
name = "Xenowear crate"
contains = list(
/obj/item/clothing/shoes/footwraps,
/obj/item/clothing/shoes/boots/jackboots/toeless,
/obj/item/clothing/shoes/boots/workboots/toeless,
/obj/item/clothing/suit/tajaran/furs,
/obj/item/clothing/head/tajaran/scarf,
/obj/item/clothing/suit/unathi/robe,
/obj/item/clothing/suit/unathi/mantle,
/obj/item/clothing/under/permit,
/obj/item/clothing/under/vox/vox_casual,
/obj/item/clothing/under/vox/vox_robes,
/obj/item/clothing/under/harness,
/obj/item/clothing/under/skirt/loincloth,
/obj/item/clothing/gloves/vox
)
cost = 100
containertype = /obj/structure/closet/crate
containername = "Xenowear crate"
/datum/supply_packs/costumes/tesh_smocks_vr
name = "Teshari smocks"
contains = list(
/obj/item/clothing/under/seromi/smock,
/obj/item/clothing/under/seromi/smock/rainbow,
/obj/item/clothing/under/seromi/smock/red,
/obj/item/clothing/under/seromi/smock/white,
/obj/item/clothing/under/seromi/smock/yellow
)
cost = 25
containertype = /obj/structure/closet/crate
containername = "Teshari smocks crate"
/datum/supply_packs/randomised/costumes/tesh_coats_vr
name = "Teshari undercoats"
num_contained = 4
contains = list(
/obj/item/clothing/under/seromi/undercoat/blue_grey,
/obj/item/clothing/under/seromi/undercoat/brown_grey,
/obj/item/clothing/under/seromi/undercoat/green_grey,
/obj/item/clothing/under/seromi/undercoat/lightgrey_grey,
/obj/item/clothing/under/seromi/undercoat/orange,
/obj/item/clothing/under/seromi/undercoat/orange_grey,
/obj/item/clothing/under/seromi/undercoat/pink_grey,
/obj/item/clothing/under/seromi/undercoat/purple_grey,
/obj/item/clothing/under/seromi/undercoat/rainbow,
/obj/item/clothing/under/seromi/undercoat/red_grey,
/obj/item/clothing/under/seromi/undercoat/white_grey,
/obj/item/clothing/under/seromi/undercoat/yellow_grey
)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Teshari undercoats crate"
/datum/supply_packs/randomised/costumes/tesh_coats_b_vr
name = "Teshari undercoats (black)"
num_contained = 4
contains = list(
/obj/item/clothing/under/seromi/undercoat/black,
/obj/item/clothing/under/seromi/undercoat/black_blue,
/obj/item/clothing/under/seromi/undercoat/black_brown,
/obj/item/clothing/under/seromi/undercoat/black_green,
/obj/item/clothing/under/seromi/undercoat/black_grey,
/obj/item/clothing/under/seromi/undercoat/black_lightgrey,
/obj/item/clothing/under/seromi/undercoat/black_midgrey,
/obj/item/clothing/under/seromi/undercoat/black_orange,
/obj/item/clothing/under/seromi/undercoat/black_pink,
/obj/item/clothing/under/seromi/undercoat/black_purple,
/obj/item/clothing/under/seromi/undercoat/black_red,
/obj/item/clothing/under/seromi/undercoat/black_white,
/obj/item/clothing/under/seromi/undercoat/black_yellow
)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Teshari undercoats crate"
/datum/supply_packs/randomised/costumes/tesh_cloaks_vr
name = "Teshari cloaks"
num_contained = 4
contains = list(
/obj/item/clothing/suit/storage/seromi/cloak/blue_grey,
/obj/item/clothing/suit/storage/seromi/cloak/brown_grey,
/obj/item/clothing/suit/storage/seromi/cloak/green_grey,
/obj/item/clothing/suit/storage/seromi/cloak/lightgrey_grey,
/obj/item/clothing/suit/storage/seromi/cloak/orange,
/obj/item/clothing/suit/storage/seromi/cloak/orange_grey,
/obj/item/clothing/suit/storage/seromi/cloak/pink_grey,
/obj/item/clothing/suit/storage/seromi/cloak/purple_grey,
/obj/item/clothing/suit/storage/seromi/cloak/rainbow,
/obj/item/clothing/suit/storage/seromi/cloak/red_grey,
/obj/item/clothing/suit/storage/seromi/cloak/white_grey,
/obj/item/clothing/suit/storage/seromi/cloak/yellow_grey
)
cost = 40
containertype = /obj/structure/closet/crate
containername = "Teshari cloaks crate"
/datum/supply_packs/randomised/costumes/tesh_cloaks_b_vr
name = "Teshari cloaks (black)"
num_contained = 4
contains = list(
/obj/item/clothing/suit/storage/seromi/cloak/black,
/obj/item/clothing/suit/storage/seromi/cloak/black_blue,
/obj/item/clothing/suit/storage/seromi/cloak/black_brown,
/obj/item/clothing/suit/storage/seromi/cloak/black_green,
/obj/item/clothing/suit/storage/seromi/cloak/black_grey,
/obj/item/clothing/suit/storage/seromi/cloak/black_lightgrey,
/obj/item/clothing/suit/storage/seromi/cloak/black_midgrey,
/obj/item/clothing/suit/storage/seromi/cloak/black_orange,
/obj/item/clothing/suit/storage/seromi/cloak/black_pink,
/obj/item/clothing/suit/storage/seromi/cloak/black_purple,
/obj/item/clothing/suit/storage/seromi/cloak/black_red,
/obj/item/clothing/suit/storage/seromi/cloak/black_white,
/obj/item/clothing/suit/storage/seromi/cloak/black_yellow
)
cost = 40
containertype = /obj/structure/closet/crate
containername = "Teshari cloaks crate"
/datum/supply_packs/costumes/utility_vr
name = "Utility uniforms"
contains = list(
/obj/item/clothing/under/utility,
/obj/item/clothing/under/utility/blue,
/obj/item/clothing/under/utility/grey
)
cost = 30
containertype = /obj/structure/closet/crate
containername = "Utility uniforms crate"
/datum/supply_packs/costumes/skirts_vr
name = "Skirts crate"
contains = list(
/obj/item/clothing/under/skirt,
/obj/item/clothing/under/skirt/blue,
/obj/item/clothing/under/skirt/denim,
/obj/item/clothing/under/skirt/khaki,
/obj/item/clothing/under/skirt/outfit,
/obj/item/clothing/under/skirt/red,
/obj/item/clothing/under/skirt/swept,
/obj/item/clothing/under/skirt/outfit/plaid_blue,
/obj/item/clothing/under/skirt/outfit/plaid_purple,
/obj/item/clothing/under/skirt/outfit/plaid_red
)
cost = 40
containertype = /obj/structure/closet/crate
containername = "Skirts crate"
/datum/supply_packs/costumes/varsity_vr
name = "Varsity jackets"
contains = list(
/obj/item/clothing/suit/varsity,
/obj/item/clothing/suit/varsity/blue,
/obj/item/clothing/suit/varsity/brown,
/obj/item/clothing/suit/varsity/green,
/obj/item/clothing/suit/varsity/purple,
/obj/item/clothing/suit/varsity/red
)
cost = 60
containertype = /obj/structure/closet/crate
containername = "Varsity jackets crate"
/datum/supply_packs/randomised/costumes/leathergear_vr
name = "Leather gear"
num_contained = 5
contains = list(
/obj/item/clothing/suit/leathercoat,
/obj/item/clothing/suit/storage/leather_jacket_alt,
/obj/item/clothing/suit/storage/toggle/leather_jacket,
/obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless,
/obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen,
/obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless,
/obj/item/clothing/under/pants/chaps,
/obj/item/clothing/under/pants/chaps/black,
/obj/item/clothing/under/harness,
/obj/item/clothing/shoes/leather,
/obj/item/clothing/shoes/boots/jungle,
/obj/item/clothing/shoes/boots/jackboots,
/obj/item/clothing/shoes/boots/cowboy,
/obj/item/clothing/shoes/boots/cowboy/classic,
/obj/item/clothing/shoes/boots/cowboy/snakeskin,
/obj/item/clothing/accessory/chaps,
/obj/item/clothing/accessory/chaps/black,
/obj/item/clothing/accessory/collar/spike,
/obj/item/clothing/gloves/fingerless,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/head/cowboy_hat,
/obj/item/clothing/head/cowboy_hat/black
)
cost = 50
containertype = /obj/structure/closet/crate
containername = "Leather gear crate"
/datum/supply_packs/costumes/eyewear_vr
name = "Eyewear crate"
contains = list(
/obj/item/clothing/glasses/eyepatch,
/obj/item/clothing/glasses/fakesunglasses,
/obj/item/clothing/glasses/fakesunglasses/aviator,
/obj/item/clothing/glasses/fluff/science_proper,
/obj/item/clothing/glasses/fluff/spiffygogs,
/obj/item/clothing/glasses/gglasses,
/obj/item/clothing/glasses/monocle,
/obj/item/clothing/glasses/regular,
/obj/item/clothing/glasses/regular/hipster,
/obj/item/clothing/glasses/regular/scanners,
/obj/item/clothing/glasses/threedglasses
)
cost = 50
containertype = /obj/structure/closet/crate
containername = "Eyewear crate"
/datum/supply_packs/randomised/costumes/gloves_vr
name = "Gloves crate"
num_contained = 4
contains = list(
/obj/item/clothing/gloves/black,
/obj/item/clothing/gloves/blue,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/gloves/brown,
/obj/item/clothing/gloves/evening,
/obj/item/clothing/gloves/fingerless,
/obj/item/clothing/gloves/fyellow,
/obj/item/clothing/gloves/green,
/obj/item/clothing/gloves/grey,
/obj/item/clothing/gloves/light_brown,
/obj/item/clothing/gloves/orange,
/obj/item/clothing/gloves/purple,
/obj/item/clothing/gloves/rainbow,
/obj/item/clothing/gloves/red,
/obj/item/clothing/gloves/white
)
cost = 40
containertype = /obj/structure/closet/crate
containername = "Gloves crate"
/datum/supply_packs/randomised/costumes/boots_vr
name = "Boots crate"
num_contained = 3
contains = list(
/obj/item/clothing/shoes/boots/workboots,
/obj/item/clothing/shoes/boots/cowboy,
/obj/item/clothing/shoes/boots/cowboy/classic,
/obj/item/clothing/shoes/boots/cowboy/snakeskin,
/obj/item/clothing/shoes/boots/duty,
/obj/item/clothing/shoes/boots/jackboots,
/obj/item/clothing/shoes/boots/jungle,
/obj/item/clothing/shoes/boots/winter
)
cost = 60
containertype = /obj/structure/closet/crate
containername = "Boots crate"
/datum/supply_packs/costumes/taurbags
name = "Saddlebags crate"
contains = list(
/obj/item/weapon/storage/backpack/saddlebag_common,
/obj/item/weapon/storage/backpack/saddlebag_common/robust,
/obj/item/weapon/storage/backpack/saddlebag_common/vest
)
cost = 60
containertype = /obj/structure/closet/crate
containername = "Saddlebags crate"

View File

@@ -0,0 +1,84 @@
/datum/supply_packs/randomised/hospitality/burgers_vr
num_contained = 5
contains = list(
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
/obj/item/weapon/reagent_containers/food/snacks/cheeseburger,
/obj/item/weapon/reagent_containers/food/snacks/jellyburger,
/obj/item/weapon/reagent_containers/food/snacks/tofuburger,
/obj/item/weapon/reagent_containers/food/snacks/fishburger
)
name = "Burger crate"
cost = 25
containertype = /obj/structure/closet/crate/freezer
containername = "Burger crate"
/*
/datum/supply_packs/randomised/hospitality/bakery_vr
num_contained = 5
contains = list(
/obj/item/weapon/reagent_containers/food/snacks/baguette,
/obj/item/weapon/reagent_containers/food/snacks/appletart,
/obj/item/weapon/reagent_containers/food/snacks/berrymuffin,
/obj/item/weapon/reagent_containers/food/snacks/bunbun,
/obj/item/weapon/reagent_containers/food/snacks/cherrypie,
/obj/item/weapon/reagent_containers/food/snacks/cookie,
/obj/item/weapon/reagent_containers/food/snacks/croissant,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
/obj/item/weapon/reagent_containers/food/snacks/muffin,
/obj/item/weapon/reagent_containers/food/snacks/pie,
/obj/item/weapon/reagent_containers/food/snacks/plump_pie,
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit,
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie,
/obj/item/weapon/reagent_containers/food/snacks/waffles
)
name = "Bakery products crate"
cost = 25
containertype = /obj/structure/closet/crate/freezer
containername = "Bakery products crate"
/datum/supply_packs/randomised/hospitality/cakes_vr
num_contained = 2
contains = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
)
name = "Cake crate"
cost = 100
containertype = /obj/structure/closet/crate/freezer
containername = "Cake crate"
/datum/supply_packs/randomised/hospitality/mexican_vr
num_contained = 5
contains = list(
/obj/item/weapon/reagent_containers/food/snacks/cheeseburrito,
/obj/item/weapon/reagent_containers/food/snacks/enchiladas,
/obj/item/weapon/reagent_containers/food/snacks/meatburrito,
/obj/item/weapon/reagent_containers/food/snacks/taco
)
name = "Mexican takeout crate"
cost = 50
containertype = /obj/structure/closet/crate/freezer
containername = "Mexican takeout crate"
*/
/datum/supply_packs/randomised/hospitality/asian_vr
num_contained = 5
contains = list(
/obj/item/weapon/reagent_containers/food/snacks/generalschicken,
/obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup
)
name = "Chinese takeout crate"
cost = 50
containertype = /obj/structure/closet/crate/freezer
containername = "Chinese takeout crate"
/datum/supply_packs/randomised/hospitality/pizza
cost = 50

View File

@@ -39,6 +39,7 @@
name = "Arts and Crafts supplies"
contains = list(
/obj/item/weapon/storage/fancy/crayons,
/obj/item/weapon/storage/fancy/markers,
/obj/item/device/camera,
/obj/item/device/camera_film = 2,
/obj/item/weapon/storage/photo_album,

View File

@@ -18,7 +18,7 @@
/obj/item/stack/cable_coil/random,
/obj/item/clothing/accessory/collar/shock,
/obj/item/clothing/suit/straight_jacket,
/obj/item/weapon/handcuffs/legcuffs,
/obj/item/weapon/handcuffs/legcuffs/fuzzy,
/obj/item/weapon/melee/fluff/holochain/mass,
/obj/item/weapon/material/twohanded/fluff/riding_crop,
/obj/item/clothing/under/fluff/latexmaid
@@ -39,3 +39,32 @@
cost = 50
containertype = /obj/structure/closet/crate
containername = "wolfgirl cosplay crate"
/datum/supply_packs/randomised/recreation/figures_vr
name = "Action figures crate"
num_contained = 5
contains = list(
/obj/random/action_figure
)
cost = 200
containertype = /obj/structure/closet/crate
containername = "Action figures crate"
/datum/supply_packs/recreation/characters_vr
name = "Tabletop miniatures"
contains = list(
/obj/item/weapon/storage/box/characters
)
containertype = /obj/structure/closet/crate
containername = "Tabletop miniatures crate"
cost = 50
/datum/supply_packs/randomised/recreation/plushies_vr
name = "Plushies crate"
num_contained = 3
contains = list(
/obj/random/plushie
)
cost = 60
containertype = /obj/structure/closet/crate
containername = "Plushies crate"

View File

@@ -33,7 +33,9 @@
if(!antag_indicator || !other.current || !recipient.current)
return
var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator
return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator, layer = LIGHTING_LAYER+0.1)
var/image/returnimage = image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator)
returnimage.plane = PLANE_LIGHTING_ABOVE
return returnimage
/datum/antagonist/proc/update_all_icons()
if(!antag_indicator)

View File

@@ -13,82 +13,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
*/
/area
var/fire = null
var/atmos = 1
var/atmosalm = 0
var/poweralm = 1
var/party = null
level = null
name = "Unknown"
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
layer = 10
luminosity = 0
mouse_opacity = 0
var/lightswitch = 1
var/eject = null
var/debug = 0
var/requires_power = 1
var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
var/power_equip = 1
var/power_light = 1
var/power_environ = 1
var/music = null
var/used_equip = 0
var/used_light = 0
var/used_environ = 0
var/has_gravity = 1
var/obj/machinery/power/apc/apc = null
var/no_air = null
// var/list/lights // list of all lights on this area
var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
var/firedoors_closed = 0
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/list/forced_ambience = null
var/sound_env = STANDARD_STATION
var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list()
/hook/startup/proc/setupTeleportLocs()
for(var/area/AR in world)
if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue
if(teleportlocs.Find(AR.name)) continue
var/turf/picked = pick(get_area_turfs(AR.type))
if (picked.z in using_map.station_levels)
teleportlocs += AR.name
teleportlocs[AR.name] = AR
teleportlocs = sortAssoc(teleportlocs)
return 1
var/list/ghostteleportlocs = list()
/hook/startup/proc/setupGhostTeleportLocs()
for(var/area/AR in world)
if(ghostteleportlocs.Find(AR.name)) continue
if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
ghostteleportlocs += AR.name
ghostteleportlocs[AR.name] = AR
var/turf/picked = pick(get_area_turfs(AR.type))
if (picked.z in using_map.player_levels)
ghostteleportlocs += AR.name
ghostteleportlocs[AR.name] = AR
ghostteleportlocs = sortAssoc(ghostteleportlocs)
return 1
/*-----------------------------------------------------------------------------*/
/////////
@@ -358,6 +282,7 @@ area/space/atmosalert()
/area/shuttle/trade
name = "\improper Trade Station"
icon_state = "red"
dynamic_lighting = 0
/area/shuttle/trade/centcom
name = "\improper Trade Shuttle CentCom"

View File

@@ -1,15 +1,49 @@
// Areas.dm
// ===
/area
var/fire = null
var/atmos = 1
var/atmosalm = 0
var/poweralm = 1
var/party = null
level = null
name = "Unknown"
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
plane = PLANE_LIGHTING_ABOVE //In case we color them
luminosity = 0
mouse_opacity = 0
var/lightswitch = 1
var/eject = null
var/debug = 0
var/requires_power = 1
var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
var/power_equip = 1
var/power_light = 1
var/power_environ = 1
var/music = null
var/used_equip = 0
var/used_light = 0
var/used_environ = 0
var/has_gravity = 1
var/obj/machinery/power/apc/apc = null
var/no_air = null
// var/list/lights // list of all lights on this area
var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
var/firedoors_closed = 0
var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
var/list/forced_ambience = null
var/sound_env = STANDARD_STATION
var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
var/global/global_uid = 0
var/uid
/area/New()
icon_state = ""
layer = 10
uid = ++global_uid
all_areas += src
@@ -275,7 +309,7 @@ var/list/mob/living/forced_ambiance_list = new
chosen_ambiance = sound(chosen_ambiance, repeat = 1, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE_FORCED)
L << chosen_ambiance
else
L << sound(null, channel = 1)
L << sound(null, channel = CHANNEL_AMBIENCE_FORCED)
else if(src.ambience.len && prob(35))
if((world.time >= L.client.played + 600))
var/sound = pick(ambience)
@@ -345,3 +379,37 @@ var/list/mob/living/forced_ambiance_list = new
/area/drop_location()
CRASH("Bad op: area/drop_location() called")
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
var/list/teleportlocs = list()
/hook/startup/proc/setupTeleportLocs()
for(var/area/AR in world)
if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue
if(teleportlocs.Find(AR.name)) continue
var/turf/picked = pick(get_area_turfs(AR.type))
if (picked.z in using_map.station_levels)
teleportlocs += AR.name
teleportlocs[AR.name] = AR
teleportlocs = sortAssoc(teleportlocs)
return 1
var/list/ghostteleportlocs = list()
/hook/startup/proc/setupGhostTeleportLocs()
for(var/area/AR in world)
if(ghostteleportlocs.Find(AR.name)) continue
if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
ghostteleportlocs += AR.name
ghostteleportlocs[AR.name] = AR
var/turf/picked = pick(get_area_turfs(AR.type))
if (picked.z in using_map.player_levels)
ghostteleportlocs += AR.name
ghostteleportlocs[AR.name] = AR
ghostteleportlocs = sortAssoc(ghostteleportlocs)
return 1

View File

@@ -1,5 +1,5 @@
/atom
layer = 2
layer = TURF_LAYER //This was here when I got here. Why though?
var/level = 2
var/flags = 0
var/list/fingerprints

View File

@@ -1,5 +1,5 @@
/atom/movable
layer = 3
layer = OBJ_LAYER
appearance_flags = TILE_BOUND|PIXEL_SCALE
var/last_move = null
var/anchored = 0
@@ -18,6 +18,7 @@
var/icon_scale = 1 // Used to scale icons up or down in update_transform().
var/old_x = 0
var/old_y = 0
var/datum/riding/riding_datum //VOREStation Add - Moved from /obj/vehicle
/atom/movable/Destroy()
. = ..()
@@ -37,6 +38,7 @@
if (pulledby.pulling == src)
pulledby.pulling = null
pulledby = null
qdel_null(riding_datum) //VOREStation Add
/atom/movable/Bump(var/atom/A, yes)
if(src.throwing)

View File

@@ -0,0 +1,12 @@
/atom/movable/proc/Bump_vr(var/atom/A, yes)
return
/atom/movable/set_dir(newdir)
. = ..(newdir)
if(riding_datum)
riding_datum.handle_vehicle_offsets()
/atom/movable/relaymove(mob/user, direction)
. = ..()
if(riding_datum)
riding_datum.handle_ride(user, direction)

View File

@@ -0,0 +1,698 @@
//cast_method flags, needs to be up to date with Technomancer's. They were, for some reason, not working outside it.
#define CAST_USE 1 // Clicking the spell in your hand.
#define CAST_MELEE 2 // Clicking an atom in melee range.
#define CAST_RANGED 4 // Clicking an atom beyond melee range.
#define CAST_THROW 8 // Throwing the spell and hitting an atom.
#define CAST_COMBINE 16 // Clicking another spell with this spell.
#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands.
//Aspects
#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this.
#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this.
#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this.
#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this.
#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location.
#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people.
#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff.
#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows.
#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration.
#define ASPECT_EMP "emp" //Unused now.
#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
//////////////////////////////Construct Spells/////////////////////////
proc/findNullRod(var/atom/target)
if(istype(target,/obj/item/weapon/nullrod))
return 1
else if(target.contents)
for(var/atom/A in target.contents)
if(findNullRod(A))
return 1
return 0
/spell/aoe_turf/conjure/construct
name = "Artificer"
desc = "This spell conjures a construct which may be controlled by Shades"
school = "conjuration"
charge_max = 600
spell_flags = 0
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/obj/structure/constructshell)
hud_state = "artificer"
/spell/aoe_turf/conjure/construct/lesser
charge_max = 1800
summon_type = list(/obj/structure/constructshell/cult)
hud_state = "const_shell"
override_base = "const"
/spell/aoe_turf/conjure/floor
name = "Floor Construction"
desc = "This spell constructs a cult floor"
charge_max = 20
spell_flags = Z2NOCAST | CONSTRUCT_CHECK
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/turf/simulated/floor/cult)
hud_state = "const_floor"
/spell/aoe_turf/conjure/floor/conjure_animation(var/atom/movable/overlay/animation, var/turf/target)
animation.icon_state = "cultfloor"
flick("cultfloor",animation)
spawn(10)
qdel(animation)
/spell/aoe_turf/conjure/wall
name = "Lesser Construction"
desc = "This spell constructs a cult wall"
charge_max = 100
spell_flags = Z2NOCAST | CONSTRUCT_CHECK
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/turf/simulated/wall/cult)
hud_state = "const_wall"
/spell/aoe_turf/conjure/wall/conjure_animation(var/atom/movable/overlay/animation, var/turf/target)
animation.icon_state = "cultwall"
flick("cultwall",animation)
spawn(10)
qdel(animation)
/spell/aoe_turf/conjure/wall/reinforced
name = "Greater Construction"
desc = "This spell constructs a reinforced metal wall"
charge_max = 300
spell_flags = Z2NOCAST
invocation = "none"
invocation_type = SpI_NONE
range = 0
cast_delay = 50
summon_type = list(/turf/simulated/wall/r_wall)
/spell/aoe_turf/conjure/soulstone
name = "Summon Soulstone"
desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space"
charge_max = 3000
spell_flags = 0
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/obj/item/device/soulstone)
hud_state = "const_stone"
override_base = "const"
/spell/aoe_turf/conjure/pylon
name = "Red Pylon"
desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source."
charge_max = 200
spell_flags = CONSTRUCT_CHECK
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/obj/structure/cult/pylon)
hud_state = "const_pylon"
/spell/aoe_turf/conjure/pylon/cast(list/targets)
..()
var/turf/spawn_place = pick(targets)
for(var/obj/structure/cult/pylon/P in spawn_place.contents)
if(P.isbroken)
P.repair(usr)
continue
return
/spell/aoe_turf/conjure/door
name = "Stone Door"
desc = "This spell conjures a massive stone door."
charge_max = 100
spell_flags = CONSTRUCT_CHECK
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/obj/structure/simple_door/cult)
hud_state = "const_door"
/spell/aoe_turf/conjure/grille
name = "Arcane Grille"
desc = "This spell conjures an airtight grille."
charge_max = 100
spell_flags = CONSTRUCT_CHECK
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/obj/structure/grille/cult)
hud_state = "const_grille"
/spell/aoe_turf/conjure/forcewall/lesser
name = "Shield"
desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats"
charge_max = 300
spell_flags = 0
invocation = "none"
invocation_type = SpI_NONE
range = 0
summon_type = list(/obj/effect/forcefield/cult)
duration = 200
hud_state = "const_juggwall"
//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it.
/obj/effect/forcefield/cult
desc = "That eerie looking obstacle seems to have been pulled from another dimension through sheer force"
name = "Juggerwall"
icon = 'icons/effects/effects.dmi'
icon_state = "m_shield_cult"
light_color = "#B40000"
light_range = 2
/obj/effect/forcefield/cult/cultify()
return
/spell/aoe_turf/knock/harvester
name = "Force Doors"
desc = "Mortal portals are no match for your occult might."
spell_flags = CONSTRUCT_CHECK
charge_max = 100
invocation = ""
invocation_type = "silent"
range = 4
hud_state = "const_knock"
/spell/aoe_turf/knock/harvester/cast(list/targets)
/* for(var/turf/T in targets) //Disintigrating doors is bad, okay.
for(var/obj/machinery/door/door in T.contents)
spawn door.cultify()
return */
for(var/turf/T in targets)
for(var/obj/machinery/door/door in T.contents)
spawn(1)
if(istype(door,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/AL = door
AL.locked = 0 //The spirits of the damned care not for your locks.
AL.welded = 0 //Or your welding tools.
else if(istype(door, /obj/machinery/door/firedoor))
var/obj/machinery/door/firedoor/FD = door
FD.blocked = 0
door.open(1)
return
/*
*
* Self-targeting spells. Modifiers, auras, instants, etc.
*
*/
/spell/targeted/ethereal_jaunt/shift
name = "Phase Shift"
desc = "This spell allows you to pass through walls"
charge_max = 200
spell_flags = Z2NOCAST | INCLUDEUSER | CONSTRUCT_CHECK
invocation_type = SpI_NONE
range = -1
duration = 50 //in deciseconds
hud_state = "const_shift"
/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
animation.icon_state = "phase_shift"
animation.dir = target.dir
flick("phase_shift",animation)
/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
animation.icon_state = "phase_shift2"
animation.dir = target.dir
flick("phase_shift2",animation)
/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc)
return
/*
* Harvest has been disabled due to the lack of Nar'Sie. Here for posterity / future rework.
*/
/*
/spell/targeted/harvest
name = "Harvest"
desc = "Back to where I come from, and you're coming with me."
school = "transmutation"
charge_max = 200
spell_flags = Z2NOCAST | CONSTRUCT_CHECK | INCLUDEUSER
invocation = ""
invocation_type = SpI_NONE
range = 0
max_targets = 0
overlay = 1
overlay_icon = 'icons/effects/effects.dmi'
overlay_icon_state = "rune_teleport"
overlay_lifespan = 0
hud_state = "const_harvest"
/spell/targeted/harvest/cast(list/targets, mob/user)//because harvest is already a proc
..()
var/destination = null
for(var/obj/singularity/narsie/large/N in narsie_list)
destination = N.loc
break
if(destination)
var/prey = 0
for(var/mob/living/M in targets)
if(!findNullRod(M))
M.forceMove(destination)
if(M != user)
prey = 1
user << "<span class='sinister'>You warp back to Nar-Sie[prey ? " along with your prey":""].</span>"
else
user << "<span class='danger'>...something's wrong!</span>"//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world.
*/
/spell/targeted/fortify
name = "Fortify Shell"
desc = "Emit a field of energy around your shell to reduce incoming damage incredibly, while decreasing your mobility."
range = -1
school = "evocation"
charge_type = Sp_RECHARGE
invocation_type = SpI_NONE
spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
hud_state = "const_fortify"
smoke_amt = 0
charge_max = 600
/spell/targeted/fortify/cast(list/targets, mob/living/user)
if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/fortify))
charge_counter = 400
return
user.add_modifier(/datum/modifier/fortify, 1 MINUTES)
/spell/targeted/occult_repair_aura
name = "Repair Aura"
desc = "Emit a field of energy around your shell to repair nearby constructs at range."
range = -1
school = "evocation"
charge_type = Sp_RECHARGE
invocation_type = SpI_NONE
spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
hud_state = "const_repairaura"
smoke_amt = 0
charge_max = 600
/spell/targeted/occult_repair_aura/cast(list/targets, mob/living/user)
if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/repair_aura))
charge_counter = 300
return
user.add_modifier(/datum/modifier/repair_aura, 30 SECONDS)
/spell/targeted/ambush_mode
name = "Toggle Ambush"
desc = "Phase yourself mostly out of this reality, minimizing your combat ability, but allowing for employance of ambush tactics."
range = -1
school = "evocation"
charge_type = Sp_RECHARGE
invocation_type = SpI_NONE
spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
hud_state = "const_ambush"
smoke_amt = 0
charge_max = 100
/spell/targeted/ambush_mode/cast(list/targets, mob/living/user)
if(findNullRod(user))
charge_counter = 50
return
if(user.has_modifier_of_type(/datum/modifier/ambush))
user.remove_modifiers_of_type(/datum/modifier/ambush)
return
user.add_modifier(/datum/modifier/ambush, 0)
/*
*
* These are the spells that place spell-objects into the construct's hands akin to technomancers.
*
*/
/spell/targeted/construct_advanced
name = "Base Construct Spell"
desc = "If you see this, please tell a developer!"
range = -1
school = "evocation"
charge_type = Sp_RECHARGE
invocation_type = SpI_NONE
spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
hud_state = "const_rune"
smoke_amt = 0
charge_max = 10
var/obj/item/weapon/spell/construct/spell_obj = null //This is the var that determines what Technomancer-style spell is put into their hands.
/spell/targeted/construct_advanced/cast(list/targets, mob/living/user)
if(!findNullRod(user))
user.place_spell_in_hand(spell_obj)
/spell/targeted/construct_advanced/inversion_beam
name = "Inversion Beam"
desc = "Fire a searing beam of darkness at your foes."
hud_state = "const_beam"
spell_obj = /obj/item/weapon/spell/construct/projectile/inverted_beam
/spell/targeted/construct_advanced/mend_acolyte
name = "Mend Acolyte"
desc = "Mend a target acolyte or construct over time."
charge_max = 100
hud_state = "const_mend"
spell_obj = /obj/item/weapon/spell/construct/mend_occult
/spell/targeted/construct_advanced/agonizing_sphere
name = "Sphere of Agony"
desc = "Rend a portal into a plane of naught but pain at the target location."
charge_max = 100
hud_state = "const_harvest"
spell_obj = /obj/item/weapon/spell/construct/spawner/agonizing_sphere
/spell/targeted/construct_advanced/slam
name = "Slam"
desc = "Empower your FIST."
charge_max = 300
hud_state = "const_fist"
spell_obj = /obj/item/weapon/spell/construct/slam
/*
*
* These are the spell objects that go into the construct's hands.
*
*/
/*
* Base advanced construct spell types.
*/
/obj/item/weapon/spell/construct //Energy costs are in units of blood, in the event a cultist gets one of these.
name = "unholy energy"
desc = "Your hands appear to be screaming. This is a debug text, you should probably tell a developer!"
icon = 'icons/obj/spells.dmi'
icon_state = "generic"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_spells.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_spells.dmi',
)
throwforce = 0
force = 0
show_examine = FALSE
owner = null
core = null
cast_methods = null // Controls how the spell is casted.
aspect = ASPECT_UNHOLY // Used for combining spells. Pretty much any cult spell is unholy.
toggled = 0 // Mainly used for overlays.
cooldown = 0 // If set, will add a cooldown overlay and adjust click delay. Must be a multiple of 5 for overlays.
cast_sound = null // Sound file played when this is used.
var/last_castcheck = null // The last time this spell was cast.
/obj/item/weapon/spell/construct/New()
//..() //This kills the spell, because super on this calls the default spell's New, which checks for a core. Can't have that.
if(isliving(loc))
owner = loc
if(!owner)
qdel(src)
update_icon()
/obj/item/weapon/spell/construct/adjust_instability(var/amount) //The only drawback to the boons of the geometer is the use of a mortal's blood as fuel. Constructs have already paid that price long ago.
return
/obj/item/weapon/spell/construct/run_checks()
if(owner)
if((iscultist(owner) || istype(owner, /mob/living/simple_animal/construct)) && (world.time >= (last_castcheck + cooldown))) //Are they a cultist or a construct, and has the cooldown time passed?
last_castcheck = world.time
return 1
return 0
/obj/item/weapon/spell/construct/pay_energy(var/amount)
if(owner)
if(istype(owner, /mob/living/simple_animal/construct))
return 1
if(iscultist(owner) && pay_blood(amount))
return 1
return 0
/obj/item/weapon/spell/construct/proc/pay_blood(var/amount) //If, for some reason, this is put into the hands of a cultist, by a talisnam or whatever.
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(!H.should_have_organ(O_HEART))
return 1
if(H.vessel.remove_reagent("blood", amount))
return 1
return 0
/obj/item/weapon/spell/construct/afterattack(atom/target, mob/user, proximity_flag, click_parameters) //Not overriding it caused runtimes, because cooldown checked for core.
if(!run_checks())
return
if(!proximity_flag)
if(cast_methods & CAST_RANGED)
on_ranged_cast(target, user)
else
if(istype(target, /obj/item/weapon/spell))
var/obj/item/weapon/spell/spell = target
if(spell.cast_methods & CAST_COMBINE)
spell.on_combine_cast(src, user)
return
if(cast_methods & CAST_MELEE)
on_melee_cast(target, user)
else if(cast_methods & CAST_RANGED) //Try to use a ranged method if a melee one doesn't exist.
on_ranged_cast(target, user)
if(cooldown)
var/effective_cooldown = round(cooldown, 5)
user.setClickCooldown(effective_cooldown)
flick("cooldown_[effective_cooldown]",src)
/obj/item/weapon/spell/construct/projectile //This makes me angry, but we need the template, and we can't use it because special check overrides on the base.
name = "construct projectile template"
icon_state = "generic"
desc = "This is a generic template that shoots projectiles. If you can read this, the game broke!"
cast_methods = CAST_RANGED
var/obj/item/projectile/spell_projectile = null
var/pre_shot_delay = 0
var/fire_sound = null
var/energy_cost_per_shot = 5
/obj/item/weapon/spell/construct/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
if(set_up(hit_atom, user))
var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user)
new_projectile.launch(hit_atom)
log_and_message_admins("has casted [src] at \the [hit_atom].")
if(fire_sound)
playsound(get_turf(src), fire_sound, 75, 1)
return 1
return 0
/obj/item/weapon/spell/construct/projectile/proc/make_projectile(obj/item/projectile/projectile_type, mob/living/user)
var/obj/item/projectile/P = new projectile_type(get_turf(user))
return P
/obj/item/weapon/spell/construct/projectile/proc/set_up(atom/hit_atom, mob/living/user)
if(spell_projectile)
if(pay_energy(energy_cost_per_shot))
if(pre_shot_delay)
var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target")
user << target_image
user.Stun(pre_shot_delay / 10)
sleep(pre_shot_delay)
qdel(target_image)
if(owner)
return TRUE
return FALSE // We got dropped before the firing occured.
return TRUE // No delay, no need to check.
return FALSE
/obj/item/weapon/spell/construct/spawner
name = "spawner template"
desc = "If you see me, someone messed up."
icon_state = "darkness"
cast_methods = CAST_RANGED
var/obj/effect/spawner_type = null
/obj/item/weapon/spell/construct/spawner/on_ranged_cast(atom/hit_atom, mob/user)
var/turf/T = get_turf(hit_atom)
if(T)
new spawner_type(T)
to_chat(user, "<span class='cult'>You shift \the [src] onto \the [T].</span>")
log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].")
qdel(src)
//Harvester Laser.
/obj/item/weapon/spell/construct/projectile/inverted_beam
name = "inversion beam"
icon_state = "generic"
desc = "Your manipulators fire searing beams of inverted light."
cast_methods = CAST_RANGED
spell_projectile = /obj/item/projectile/beam/inversion
pre_shot_delay = 0
cooldown = 5
fire_sound = 'sound/weapons/spiderlunge.ogg'
/obj/item/projectile/beam/inversion
name = "inversion beam"
icon_state = "invert"
fire_sound = 'sound/weapons/spiderlunge.ogg'
damage = 15
damage_type = BURN
check_armour = "laser"
armor_penetration = 60
light_range = 2
light_power = -2
light_color = "#FFFFFF"
muzzle_type = /obj/effect/projectile/inversion/muzzle
tracer_type = /obj/effect/projectile/inversion/tracer
impact_type = /obj/effect/projectile/inversion/impact
//Harvester Pain Orb
/obj/item/weapon/spell/construct/spawner/agonizing_sphere
name = "sphere of agony"
desc = "Call forth a portal to a dimension of naught but pain at your target."
spawner_type = /obj/effect/temporary_effect/pulsar/agonizing_sphere
/obj/item/weapon/spell/construct/spawner/agonizing_sphere/on_ranged_cast(atom/hit_atom, mob/user)
if(within_range(hit_atom) && pay_energy(10))
..()
/obj/item/weapon/spell/construct/spawner/agonizing_sphere/on_throw_cast(atom/hit_atom, mob/user)
pay_energy(5)
if(isliving(hit_atom))
var/mob/living/L = hit_atom
L.add_modifier(/datum/modifier/agonize, 10 SECONDS)
/obj/effect/temporary_effect/pulsar/agonizing_sphere
name = "agonizing sphere"
desc = "A portal to some hellish place. Its screams wrack your body with pain.."
icon_state = "red_static_sphere"
time_to_die = null
light_range = 4
light_power = 5
light_color = "#FF0000"
pulses_remaining = 10
/obj/effect/temporary_effect/pulsar/agonizing_sphere/pulse_loop()
while(pulses_remaining)
sleep(1 SECONDS)
spawn()
for(var/mob/living/L in view(4,src))
if(!iscultist(L) && !istype(L, /mob/living/simple_animal/construct))
L.add_modifier(/datum/modifier/agonize, 2 SECONDS)
if(L.isSynthetic())
to_chat(L, "<span class='cult'>Your chassis warps as the [src] pulses!</span>")
L.adjustFireLoss(4)
pulses_remaining--
qdel(src)
//Artificer Heal
/obj/item/weapon/spell/construct/mend_occult
name = "mend acolyte"
desc = "Mend the wounds of a cultist, or construct, over time."
icon_state = "mend_wounds"
cast_methods = CAST_MELEE
aspect = ASPECT_UNHOLY
light_color = "#FF5C5C"
light_power = -2
/obj/item/weapon/spell/construct/mend_occult/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
if(isliving(hit_atom))
var/mob/living/L = hit_atom
L.add_modifier(/datum/modifier/mend_occult, 150)
qdel(src)
//Juggernaut + Behemoth Slam
/obj/item/weapon/spell/construct/slam
name = "slam"
desc = "Empower your FIST, to send an opponent flying."
icon_state = "toggled_old"
cast_methods = CAST_MELEE
aspect = ASPECT_UNHOLY
light_color = "#FF5C5C"
light_power = -2
cooldown = 15
/obj/item/weapon/spell/construct/slam/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
var/attack_message = "slams"
if(istype(user, /mob/living/simple_animal))
var/mob/living/simple_animal/S = user
attack_message = pick(S.attacktext)
if(isliving(hit_atom))
var/mob/living/L = hit_atom
L.visible_message("<span class='danger'>\The [user] [attack_message] \the [L], sending them flying!</span>")
playsound(src, "punch", 50, 1)
L.Weaken(2)
L.adjustBruteLoss(rand(30, 50))
var/throwdir = get_dir(src, L)
L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
if(istype(hit_atom, /turf/simulated/wall))
var/turf/simulated/wall/W = hit_atom
user.visible_message("<span class='warning'>\The [user] rears its fist, preparing to hit \the [W]!</span>")
var/windup = cooldown
if(W.reinf_material)
windup = cooldown * 2
if(do_after(user, windup))
W.visible_message("<span class='danger'>\The [user] [attack_message] \the [W], obliterating it!</span>")
W.dismantle_wall(1)
else
user.visible_message("<span class='notice'>\The [user] lowers its fist.</span>")
return
qdel(src)

View File

@@ -14,20 +14,21 @@
return
/obj/item/weapon/melee/cultblade/attack(mob/living/M, mob/living/user, var/target_zone)
if(iscultist(user))
if(iscultist(user) && !istype(user, /mob/living/simple_animal/construct))
return ..()
var/zone = (user.hand ? "l_arm":"r_arm")
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/affecting = H.get_organ(zone)
user << "<span class='danger'>An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!</span>"
else
user << "<span class='danger'>An unexplicable force rips through you, tearing the sword from your grasp!</span>"
to_chat(user, "<span class='danger'>An inexplicable force rips through your [affecting.name], tearing the sword from your grasp!</span>")
//random amount of damage between half of the blade's force and the full force of the blade.
user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1)
user.Weaken(5)
else if(!istype(user, /mob/living/simple_animal/construct))
to_chat(user, "<span class='danger'>An inexplicable force rips through you, tearing the sword from your grasp!</span>")
else
to_chat(user, "<span class='critical'>The blade hisses, forcing itself from your manipulators. \The [src] will only allow mortals to wield it against foes, not kin.</span>")
user.drop_from_inventory(src, src.loc)
throw_at(get_edge_target_turf(src, pick(alldirs)), rand(1,3), throw_speed)
@@ -38,10 +39,11 @@
return 1
/obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob)
if(!iscultist(user))
user << "<span class='warning'>An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.</span>"
if(!iscultist(user) && !istype(user, /mob/living/simple_animal/construct))
to_chat(user, "<span class='warning'>An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.</span>")
user.make_dizzy(120)
if(istype(user, /mob/living/simple_animal/construct))
to_chat(user, "<span class='warning'>\The [src] hisses, as it is discontent with your acquisition of it. It would be wise to return it to a worthy mortal quickly.</span>")
/obj/item/clothing/head/culthood
name = "cult hood"

View File

@@ -10,7 +10,7 @@
announce=0
cause_hell=0
layer=LIGHTING_LAYER+2 // ITS SO BRIGHT
plane = PLANE_LIGHTING_ABOVE // ITS SO BRIGHT
consume_range = 6
@@ -38,13 +38,13 @@
var/mob/living/L = A
if(L.buckled && istype(L.buckled,/obj/structure/bed/))
var/turf/O = L.buckled
do_teleport(O, pick(endgame_safespawns))
do_teleport(O, pick(endgame_safespawns), local = FALSE) //VOREStation Edit
L.loc = O.loc
else
do_teleport(L, pick(endgame_safespawns)) //dead-on precision
do_teleport(L, pick(endgame_safespawns), local = FALSE) //dead-on precision //VOREStation Edit
else if (istype(A, /obj/mecha/))
do_teleport(A, pick(endgame_safespawns)) //dead-on precision
do_teleport(A, pick(endgame_safespawns), local = FALSE) //dead-on precision //VOREStation Edit
else if (isturf(A))
var/turf/T = A
@@ -79,7 +79,8 @@
var/turf/T_mob = get_turf(src)
if((R.z == T_mob.z) && (get_dist(R,T_mob) <= (R.consume_range+10)) && !(R in view(T_mob)))
if(!riftimage)
riftimage = image('icons/obj/rift.dmi',T_mob,"rift",LIGHTING_LAYER+2,1)
riftimage = image('icons/obj/rift.dmi',T_mob,"rift",1,1)
riftimage.plane = PLANE_LIGHTING_ABOVE
riftimage.mouse_opacity = 0
var/new_x = 32 * (R.x - T_mob.x) + R.pixel_x

View File

@@ -140,6 +140,7 @@
SpinAnimation()
/obj/effect/meteor/Bump(atom/A)
if(attempt_vr(src,"Bump_vr",list(A))) return //VOREStation Edit - allows meteors to be deflected by baseball bats
if(A)
if(A.handle_meteor_impact(src)) // Used for special behaviour when getting hit specifically by a meteor, like a shield.
ram_turf(get_turf(A))

View File

@@ -0,0 +1,10 @@
/obj/effect/meteor/Bump_vr(atom/A)//BATTER UP
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/batter = A
var/obj/item/I = batter.get_active_hand()
if(!batter.stat && istype(I, /obj/item/weapon/material/twohanded/baseballbat))
batter.do_attack_animation(src)
batter.visible_message("[batter] deflects [src] with [I]]! Home run!", "You deflect [src] with [I]! Home run!")
walk_away(src, batter, 100, 1)
return TRUE
return

View File

@@ -19,6 +19,7 @@
#define ASPECT_EMP "emp" //Unused now.
#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
/obj/item/weapon/spell
name = "glowing particles"

View File

@@ -413,6 +413,7 @@ var/global/datum/controller/occupations/job_master
job.equip_backpack(H)
// job.equip_survival(H)
job.apply_fingerprints(H)
if(job.title != "Cyborg" && job.title != "AI")
H.equip_post_job()
//If some custom items could not be equipped before, try again now.

View File

@@ -4,7 +4,7 @@
name = "Bluespace Gigabeacon"
desc = "A device that draws power from bluespace and creates a permanent tracking beacon."
level = 1 // underfloor
layer = 2.5
layer = UNDER_JUNK_LAYER
anchored = 1
use_power = 1
idle_power_usage = 0

View File

@@ -2,7 +2,6 @@
name = "\improper AI Liquid Dispenser"
icon = 'icons/obj/device.dmi'
icon_state = "motion0"
layer = 3
anchored = 1.0
use_power = 1
idle_power_usage = 10

View File

@@ -1,6 +1,7 @@
/obj/machinery/portable_atmospherics
name = "atmoalter"
use_power = 0
layer = OBJ_LAYER // These are mobile, best not be under everything.
var/datum/gas_mixture/air_contents = new
var/obj/machinery/atmospherics/portables_connector/connected_port

View File

@@ -6,7 +6,8 @@
use_power = 2
idle_power_usage = 5
active_power_usage = 10
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
var/list/network = list(NETWORK_DEFAULT)
var/c_tag = null
@@ -141,6 +142,18 @@
add_hiddenprint(user)
destroy()
/obj/machinery/camera/attack_generic(mob/user as mob)
if(isanimal(user))
var/mob/living/simple_animal/S = user
set_status(0)
S.do_attack_animation(src)
S.setClickCooldown(user.get_attack_speed())
visible_message("<span class='warning'>\The [user] [pick(S.attacktext)] \the [src]!</span>")
playsound(src.loc, S.attack_sound, 100, 1)
add_hiddenprint(user)
destroy()
..()
/obj/machinery/camera/attackby(obj/item/W as obj, mob/living/user as mob)
update_coverage()
// DECONSTRUCTION

View File

@@ -1,7 +1,7 @@
/obj/machinery/camera
layer = 4
layer = BELOW_MOB_LAYER
/obj/machinery/camera/New()
..()
if (dir == 1) // idk why the fuck dir is not 2
layer = 5
if (dir == NORTH)
layer = ABOVE_MOB_LAYER

View File

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

View File

@@ -40,8 +40,7 @@
<BR>\n<A href='?src=\ref[src];order=categories'>Request items</A><BR><BR>
<A href='?src=\ref[src];vieworders=1'>View approved orders</A><BR><BR>
<A href='?src=\ref[src];viewrequests=1'>View requests</A><BR><BR>
"} // VOREStation Edit - Export reports
dat += {"\n<A href='?src=\ref[src];viewexport=1'>View export report</A><BR><BR>
\n<A href='?src=\ref[src];viewexport=1'>View export report</A><BR><BR>
<A href='?src=\ref[user];mach_close=computer'>Close</A>"}
user << browse(dat, "window=computer;size=575x450")
@@ -200,8 +199,7 @@
\n<A href='?src=\ref[src];order=categories'>Order items</A><BR>\n<BR>
\n<A href='?src=\ref[src];viewrequests=1'>View requests</A><BR>\n<BR>
\n<A href='?src=\ref[src];vieworders=1'>View orders</A><BR>\n<BR>
"} // VOREStation Edit - Export reports
dat += {"\n<A href='?src=\ref[src];viewexport=1'>View export report</A><BR>\n<BR>
\n<A href='?src=\ref[src];viewexport=1'>View export report</A><BR>\n<BR>
\n<A href='?src=\ref[user];mach_close=computer'>Close</A>"}
@@ -371,7 +369,6 @@
temp += "<BR><A href='?src=\ref[src];clearreq=1'>Clear list</A>"
temp += "<BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
//VOREStation Edit - Export reports
else if (href_list["viewexport"])
temp = "Previous shuttle export report: <BR><BR>"
var/cratecount = 0
@@ -383,7 +380,6 @@
temp += "[EC.name] exported for [EC.value] supply points<BR>"
temp += "<BR>Shipment of [cratecount] crates exported for [totalvalue] supply points.<BR>"
temp += "<BR><A href='?src=\ref[src];mainmenu=1'>OK</A>"
//VOREStation Edit End
else if (href_list["rreq"])
var/ordernum = text2num(href_list["rreq"])

View File

@@ -3,7 +3,6 @@
desc = "A generic vending machine."
icon = 'icons/obj/vending.dmi'
icon_state = "robotics"
layer = 2.9
anchored = 1
density = 1
var/obj/machinery/computer3/laptop/vended/newlap = null

View File

@@ -6,13 +6,15 @@
icon_state = "pod_preview"
density = 1
anchored = 1.0
layer = 2.8
layer = UNDER_JUNK_LAYER
interact_offline = 1
var/on = 0
use_power = 1
idle_power_usage = 20
active_power_usage = 200
buckle_lying = FALSE
buckle_dir = SOUTH
var/temperature_archived
var/mob/living/carbon/occupant = null
@@ -20,12 +22,29 @@
var/current_heat_capacity = 50
var/image/fluid
/obj/machinery/atmospherics/unary/cryo_cell/New()
..()
icon = 'icons/obj/cryogenics_split.dmi'
update_icon()
icon_state = "base"
initialize_directions = dir
/obj/machinery/atmospherics/unary/cryo_cell/initialize()
. = ..()
var/image/tank = image(icon,"tank")
tank.alpha = 200
tank.pixel_y = 18
tank.plane = MOB_PLANE
tank.layer = MOB_LAYER+0.2 //Above fluid
fluid = image(icon, "tube_filler")
fluid.pixel_y = 18
fluid.alpha = 200
fluid.plane = MOB_PLANE
fluid.layer = MOB_LAYER+0.1 //Below glass, above mob
add_overlay(tank)
update_icon()
/obj/machinery/atmospherics/unary/cryo_cell/Destroy()
var/turf/T = src.loc
T.contents += contents
@@ -153,6 +172,7 @@
if(beaker)
beaker.loc = get_step(src.loc, SOUTH)
beaker = null
update_icon()
if(href_list["ejectOccupant"])
if(!occupant || isslime(usr) || ispAI(usr))
@@ -172,6 +192,7 @@
user.drop_item()
G.loc = src
user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
update_icon()
else if(istype(G, /obj/item/weapon/grab))
var/obj/item/weapon/grab/grab = G
if(!ismob(grab.affecting))
@@ -191,40 +212,23 @@
put_mob(target)
/obj/machinery/atmospherics/unary/cryo_cell/update_icon()
overlays.Cut()
icon_state = "pod[on]"
var/image/I
I = image(icon, "pod[on]_top")
I.layer = 5 // this needs to be fairly high so it displays over most things, but it needs to be under lighting (at 10)
I.pixel_z = 32
overlays += I
if(occupant)
var/image/pickle = image(occupant.icon, occupant.icon_state)
pickle.overlays = occupant.overlays
pickle.pixel_z = 18
pickle.layer = 5
overlays += pickle
I = image(icon, "lid[on]")
I.layer = 5
overlays += I
I = image(icon, "lid[on]_top")
I.layer = 5
I.pixel_z = 32
overlays += I
cut_overlay(fluid)
fluid.color = null
if(on)
if(beaker)
fluid.color = beaker.reagents.get_color()
add_overlay(fluid)
/obj/machinery/atmospherics/unary/cryo_cell/proc/process_occupant()
if(air_contents.total_moles < 10)
return
if(occupant)
if(occupant.stat == 2)
if(occupant.stat >= DEAD)
return
occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity())
occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise
occupant.stat = 1
occupant.stat = UNCONSCIOUS
occupant.dir = SOUTH
if(occupant.bodytemperature < T0C)
occupant.sleeping = max(5, (1/occupant.bodytemperature)*2000)
occupant.Paralyse(max(5, (1/occupant.bodytemperature)*3000))
@@ -273,14 +277,16 @@
if(occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
vis_contents -= occupant
occupant.pixel_x = occupant.default_pixel_x
occupant.pixel_y = occupant.default_pixel_y
occupant.loc = get_step(src.loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem.
if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug.
// occupant.metabslow = 0
unbuckle_mob(occupant, force = TRUE)
occupant = null
current_heat_capacity = initial(current_heat_capacity)
update_use_power(1)
update_icon()
return
/obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob)
if(stat & (NOPOWER|BROKEN))
@@ -307,6 +313,9 @@
if(M.health > -100 && (M.health < 0 || M.sleeping))
M << "<span class='notice'><b>You feel a cold liquid surround you. Your skin starts to freeze up.</b></span>"
occupant = M
buckle_mob(occupant, forced = TRUE, check_loc = FALSE)
vis_contents |= occupant
occupant.pixel_y += 19
current_heat_capacity = HEAT_CAPACITY_HUMAN
update_use_power(2)
// M.metabslow = 1

View File

@@ -446,8 +446,8 @@
desc = "It's an extra resilient airlock intended for spacefaring vessels."
icon = 'icons/obj/doors/shuttledoors.dmi'
explosion_resistance = 20
opacity = 0 //VOREStation Edit - They have windows.
glass = 1 //VOREStation Edit - They have windows.
opacity = 0
glass = 1
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft
// Airlock opens from top-bottom instead of left-right.

View File

@@ -7,6 +7,9 @@
// as they lack any ID scanning system, they just handle remote control signals. Subtypes have
// different icons, which are defined by set of variables. Subtypes are on bottom of this file.
// UPDATE 06.04.2018
// The emag thing wasn't working as intended, manually overwrote it.
/obj/machinery/door/blast
name = "Blast Door"
desc = "That looks like it doesn't open easily."
@@ -56,6 +59,10 @@
radiation_repository.resistance_cache.Remove(get_turf(src))
return
// Has to be in here, comment at the top is older than the emag_act code on doors proper
/obj/machinery/door/blast/emag_act()
return -1
// Proc: force_open()
// Parameters: None
// Description: Opens the door. No checks are done inside this proc.
@@ -197,6 +204,27 @@
return
..()
// Proc: attack_generic()
// Parameters: Attacking simple mob, incoming damage.
// Description: Checks the power or integrity of the blast door, if either have failed, chekcs the damage to determine if the creature would be able to open the door by force. Otherwise, super.
/obj/machinery/door/blast/attack_generic(var/mob/user, var/damage)
if(stat & (BROKEN|NOPOWER))
if(damage >= 10)
if(src.density)
visible_message("<span class='danger'>\The [user] starts forcing \the [src] open!</span>")
if(do_after(user, 5 SECONDS, src))
visible_message("<span class='danger'>\The [user] forces \the [src] open!</span>")
force_open(1)
else
visible_message("<span class='danger'>\The [user] starts forcing \the [src] closed!</span>")
if(do_after(user, 2 SECONDS, src))
visible_message("<span class='danger'>\The [user] forces \the [src] closed!</span>")
force_close(1)
else
visible_message("<span class='notice'>\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].</span>")
return
..()
// Proc: open()
// Parameters: None
// Description: Opens the door. Does necessary checks. Automatically closes if autoclose is true

View File

@@ -25,34 +25,39 @@
var/releasetime = 0 // when world.timeofday reaches it - release the prisoner
var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing
var/picture_state // icon_state of alert picture, if not displaying text/numbers
var/list/obj/machinery/targets = list()
var/list/obj/machinery/targets
var/timetoset = 0 // Used to set releasetime upon starting the timer
maptext_height = 26
maptext_width = 32
/obj/machinery/door_timer/New()
/obj/machinery/door_timer/initialize()
..()
//Doors need to go first, and can't rely on init order, so come back to me.
return INITIALIZE_HINT_LATELOAD
/obj/machinery/door_timer/LateInitialize()
. = ..()
spawn(20)
for(var/obj/machinery/door/window/brigdoor/M in machines)
if (M.id == src.id)
targets += M
LAZYADD(targets,M)
for(var/obj/machinery/flasher/F in machines)
if(F.id == src.id)
targets += F
LAZYADD(targets,F)
for(var/obj/structure/closet/secure_closet/brig/C in world)
if(C.id == src.id)
targets += C
LAZYADD(targets,C)
if(targets.len==0)
if(!LAZYLEN(targets))
stat |= BROKEN
update_icon()
return
return
/obj/machinery/door_timer/Destroy()
LAZYCLEARLIST(targets)
return ..()
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
@@ -95,6 +100,7 @@
// Closes and locks doors, power check
/obj/machinery/door_timer/proc/timer_start()
if(stat & (NOPOWER|BROKEN)) return 0
if(!LAZYLEN(targets)) return 0
// Set releasetime
releasetime = world.timeofday + timetoset
@@ -115,6 +121,7 @@
// Opens and unlocks doors, power check
/obj/machinery/door_timer/proc/timer_end()
if(stat & (NOPOWER|BROKEN)) return 0
if(!LAZYLEN(targets)) return 0
// Reset releasetime
releasetime = 0
@@ -197,6 +204,7 @@
dat += "<a href='?src=\ref[src];tp=-60'>-</a> <a href='?src=\ref[src];tp=-1'>-</a> <a href='?src=\ref[src];tp=1'>+</a> <A href='?src=\ref[src];tp=60'>+</a><br/>"
// Mounted flash controls
if(LAZYLEN(targets))
for(var/obj/machinery/flasher/F in targets)
if(F.last_flash && (F.last_flash + 150) > world.time)
dat += "<br/><A href='?src=\ref[src];fc=1'>Flash Charging</A>"
@@ -244,6 +252,7 @@
timeset(addtime)
if(href_list["fc"])
if(LAZYLEN(targets))
for(var/obj/machinery/flasher/F in targets)
F.flash()

View File

@@ -38,8 +38,11 @@
var/atom/movable/overlay/c_animation = null
/obj/machinery/door/attack_generic(var/mob/user, var/damage)
if(isanimal(user))
var/mob/living/simple_animal/S = user
if(damage >= 10)
visible_message("<span class='danger'>\The [user] smashes into the [src]!</span>")
playsound(src, S.attack_sound, 75, 1)
take_damage(damage)
else
visible_message("<span class='notice'>\The [user] bonks \the [src] harmlessly.</span>")

View File

@@ -216,6 +216,27 @@
return
..()
/obj/machinery/door/firedoor/attack_generic(var/mob/user, var/damage)
if(stat & (BROKEN|NOPOWER))
if(damage >= 10)
var/time_to_force = (2 + (2 * blocked)) * 5
if(src.density)
visible_message("<span class='danger'>\The [user] starts forcing \the [src] open!</span>")
if(do_after(user, time_to_force, src))
visible_message("<span class='danger'>\The [user] forces \the [src] open!</span>")
src.blocked = 0
open(1)
else
time_to_force = (time_to_force / 2)
visible_message("<span class='danger'>\The [user] starts forcing \the [src] closed!</span>")
if(do_after(user, time_to_force, src))
visible_message("<span class='danger'>\The [user] forces \the [src] closed!</span>")
close(1)
else
visible_message("<span class='notice'>\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].</span>")
return
..()
/obj/machinery/door/firedoor/attackby(obj/item/weapon/C as obj, mob/user as mob)
add_fingerprint(user)
if(istype(C, /obj/item/taperoll))

View File

@@ -12,11 +12,6 @@
else
construction_frame_floor += type
var/datum/frame/frame_types/cancel/cancel = new /datum/frame/frame_types/cancel
construction_frame_wall += cancel
construction_frame_floor += cancel
//////////////////////////////
// Frame Type Datum - Describes the frame structures that can be created from a frame item.
//////////////////////////////
@@ -180,9 +175,6 @@
x_offset = 24
y_offset = 24
/datum/frame/frame_types/cancel //used to get out of input dialogue
name = "Cancel"
//////////////////////////////
// Frame Object (Structure)
//////////////////////////////

View File

@@ -4,7 +4,7 @@
desc = "Small wall-mounted holographic projector"
icon = 'icons/obj/holosign.dmi'
icon_state = "sign_off"
layer = 4
plane = MOB_PLANE
use_power = 1
idle_power_usage = 2
active_power_usage = 4

View File

@@ -172,7 +172,6 @@
name = "ice cream cone"
desc = "Delicious waffle cone, but no ice cream."
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
layer = 3.1
bitesize = 3
var/ice_creamed = 0

View File

@@ -2,7 +2,6 @@
name = "microwave"
icon = 'icons/obj/kitchen.dmi'
icon_state = "mw"
layer = 2.9
density = 1
anchored = 1
use_power = 1

View File

@@ -4,7 +4,6 @@
name = "\improper SmartFridge"
icon = 'icons/obj/vending.dmi'
icon_state = "smartfridge"
layer = 2.9
density = 1
anchored = 1
use_power = 1

View File

@@ -97,6 +97,7 @@ Class Procs:
name = "machinery"
icon = 'icons/obj/stationobjs.dmi'
w_class = ITEMSIZE_NO_CONTAINER
layer = UNDER_JUNK_LAYER
var/stat = 0
var/emagged = 0

View File

@@ -9,8 +9,7 @@
icon_state = "floor_magnet-f"
name = "Electromagnetic Generator"
desc = "A device that uses station power to create points of magnetic energy."
level = 1 // underfloor
layer = 2.5
plane = PLATING_PLANE
anchored = 1
use_power = 1
idle_power_usage = 50

View File

@@ -8,8 +8,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
icon_state = "navbeacon0-f"
name = "navigation beacon"
desc = "A beacon used for bot navigation."
level = 1 // underfloor
layer = 2.5
plane = PLATING_PLANE
anchored = 1
var/open = 0 // true if cover is open
var/locked = 1 // true if controls are locked

View File

@@ -935,18 +935,9 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/machinery/newscaster/proc/scan_user(mob/living/user as mob)
if(istype(user,/mob/living/carbon/human)) //User is a human
var/mob/living/carbon/human/human_user = user
if(human_user.wear_id) //Newscaster scans you
if(istype(human_user.wear_id, /obj/item/device/pda)) //autorecognition, woo!
var/obj/item/device/pda/P = human_user.wear_id
if(P.id)
scanned_user = GetNameAndAssignmentFromId(P.id)
else
scanned_user = "Unknown"
else if(istype(human_user.wear_id, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/ID = human_user.wear_id
scanned_user = GetNameAndAssignmentFromId(ID)
else
scanned_user ="Unknown"
var/obj/item/weapon/card/id/I = human_user.GetIdCard()
if(I)
scanned_user = GetNameAndAssignmentFromId(I)
else
scanned_user = "Unknown"
else

View File

@@ -168,7 +168,7 @@
qdel(I)
qdel(J)
H.icon = HI
H.layer = 25
H.hud_layerise()
usr.mapobjs += H
#else
@@ -287,7 +287,7 @@
H.icon = I
qdel(I)
H.layer = 25
H.hud_layerise()
usr.mapobjs += H
#endif

View File

@@ -0,0 +1,109 @@
/obj/machinery/gear_painter
name = "Color Mate"
desc = "A machine to give your apparel a fresh new color! Recommended to use with white items for best results."
icon = 'icons/obj/vending_vr.dmi'
icon_state = "colormate"
density = 1
anchored = 1
var/list/processing = list()
var/activecolor = "#FFFFFF"
var/list/allowed_types = list(
/obj/item/clothing,
/obj/item/weapon/storage/backpack,
/obj/item/weapon/storage/belt
)
/obj/machinery/gear_painter/update_icon()
if(panel_open)
icon_state = "colormate_open"
else if(inoperable())
icon_state = "colormate_off"
else if(processing.len)
icon_state = "colormate_active"
else
icon_state = "colormate"
/obj/machinery/gear_painter/Destroy()
for(var/atom/movable/O in processing)
O.forceMove(drop_location())
processing.Cut()
return ..()
/obj/machinery/gear_painter/attackby(obj/item/W as obj, mob/user as mob)
if(processing.len)
to_chat(user, "<span class='warning'>The machine is already loaded.</span>")
return
if(default_deconstruction_screwdriver(user, W))
return
if(default_deconstruction_crowbar(user, W))
return
if(default_unfasten_wrench(user, W, 40))
return
if(is_type_in_list(W, allowed_types) && !inoperable())
user.visible_message("<span class='notice'>[user] inserts \the [W] into the Color Mate receptable.</span>")
user.drop_from_inventory(W)
W.forceMove(src)
processing |= W
else
..()
update_icon()
/obj/machinery/gear_painter/attack_hand(mob/user as mob)
if(..())
return
interact(user)
/obj/machinery/gear_painter/interact(mob/user as mob)
if(inoperable())
return
user.set_machine(src)
var/dat = "<TITLE>Color Mate Control Panel</TITLE><BR>"
if(!processing.len)
dat += "No item inserted."
else
for(var/atom/movable/O in processing)
dat += "Item inserted: [O]<HR>"
dat += "<A href='?src=\ref[src];select=1'>Select new color.</A><BR>"
dat += "Color: <font color='[activecolor]'>&#9899;</font>"
dat += "<A href='?src=\ref[src];paint=1'>Apply new color.</A><BR><BR>"
dat += "<A href='?src=\ref[src];clear=1'>Remove paintjob.</A><BR><BR>"
dat += "<A href='?src=\ref[src];eject=1'>Eject item.</A><BR><BR>"
var/datum/browser/menu = new(user, "colormate","Color Mate Control Panel", 400, 600, src)
menu.set_content(dat)
menu.open()
return
/obj/machinery/gear_painter/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
add_fingerprint(usr)
if(href_list["close"])
return
if(href_list["select"])
var/newcolor = input(usr, "Choose a color.", "", activecolor) as color|null
if(newcolor)
activecolor = newcolor
if(href_list["paint"])
for(var/atom/movable/O in processing)
O.color = activecolor
playsound(src.loc, 'sound/effects/spray3.ogg', 50, 1)
if(href_list["clear"])
for(var/atom/movable/O in processing)
O.color = initial(O.color)
playsound(src.loc, 'sound/effects/spray3.ogg', 50, 1)
if(href_list["eject"])
for(var/atom/movable/O in processing)
O.forceMove(drop_location())
processing.Cut()
update_icon()
updateUsrDialog()

View File

@@ -393,6 +393,18 @@ var/list/turret_icons
attacked = 0
..()
/obj/machinery/porta_turret/attack_generic(mob/user as mob, var/damage)
if(isanimal(user))
var/mob/living/simple_animal/S = user
if(damage >= 10)
var/incoming_damage = round(damage - (damage / 5)) //Turrets are slightly armored, assumedly.
visible_message("<span class='danger'>\The [S] [pick(S.attacktext)] \the [src]!</span>")
take_damage(incoming_damage)
S.do_attack_animation(src)
return 1
visible_message("<span class='notice'>\The [user] bonks \the [src]'s casing!</span>")
return ..()
/obj/machinery/porta_turret/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
//Emagging the turret makes it go bonkers and stun everyone. It also makes

View File

@@ -6,7 +6,6 @@
desc = "A generic vending machine."
icon = 'icons/obj/vending_vr.dmi' //VOREStation Edit - Eris vending machine sprites
icon_state = "generic"
layer = 2.9
anchored = 1
density = 1
@@ -863,7 +862,7 @@
/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
/obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
/obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2,
/obj/item/stack/medical/advanced/bruise_pack = 6, /obj/item/stack/medical/advanced/ointment = 6, /obj/item/stack/medical/splint = 4,
/obj/item/weapon/storage/pill_bottle/carbon = 2)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.

View File

@@ -29,18 +29,18 @@
update_type_list()
var/datum/frame/frame_types/frame_type
if(!build_machine_type)
var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor
if(!response || response.name == "Cancel")
var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_floor
if(!response)
return
frame_type = response
build_machine_type = /obj/structure/frame
if(frame_type.frame_size != 5)
new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size))
new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size))
var/ndir
ndir = usr.dir
ndir = user.dir
if(!(ndir in cardinal))
return
@@ -48,52 +48,57 @@
M.fingerprints = fingerprints
M.fingerprintshidden = fingerprintshidden
M.fingerprintslast = fingerprintslast
if(istype(src.loc, /obj/item/weapon/gripper)) //Typical gripper shenanigans
user.drop_item()
qdel(src)
/obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob)
update_type_list()
if(get_dist(on_wall, user)>1)
return
var/ndir
if(reverse)
ndir = get_dir(user, on_wall)
else
ndir = get_dir(on_wall, user)
if(!(ndir in cardinal))
return
var/turf/loc = get_turf(user)
var/area/A = loc.loc
if(!istype(loc, /turf/simulated/floor))
to_chat(user, "<span class='danger'>\The frame cannot be placed on this spot.</span>")
return
if(A.requires_power == 0 || A.name == "Space")
to_chat(user, "<span class='danger'>\The [src] Alarm cannot be placed in this area.</span>")
return
if(gotwallitem(loc, ndir))
to_chat(user, "<span class='danger'>There's already an item on this wall!</span>")
return
var/datum/frame/frame_types/frame_type
if(!build_machine_type)
var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall
if(!response || response.name == "Cancel")
var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_wall
if(!response)
return
frame_type = response
build_machine_type = /obj/structure/frame
if(frame_type.frame_size != 5)
new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size))
if(get_dist(on_wall, usr)>1)
return
var/ndir
if(reverse)
ndir = get_dir(usr, on_wall)
else
ndir = get_dir(on_wall, usr)
if(!(ndir in cardinal))
return
var/turf/loc = get_turf(usr)
var/area/A = loc.loc
if(!istype(loc, /turf/simulated/floor))
usr << "<span class='danger'>\The frame cannot be placed on this spot.</span>"
return
if(A.requires_power == 0 || A.name == "Space")
usr << "<span class='danger'>\The [src] Alarm cannot be placed in this area.</span>"
return
if(gotwallitem(loc, ndir))
usr << "<span class='danger'>There's already an item on this wall!</span>"
return
new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size))
var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type)
M.fingerprints = fingerprints
M.fingerprintshidden = fingerprintshidden
M.fingerprintslast = fingerprintslast
if(istype(src.loc, /obj/item/weapon/gripper)) //Typical gripper shenanigans
user.drop_item()
qdel(src)
/obj/item/frame/light

View File

@@ -44,7 +44,7 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
desc = "... Blitzkrieg?"
icon = 'icons/mecha/NaziMech.dmi'
icon_state = "pzrwreck"
layer = 4 // so it overlaps other people
plane = MOB_PLANE
pixel_x = -16
anchored = 1 // It's fucking huge. You aren't moving it.

View File

@@ -7,7 +7,7 @@
density = 1
throwpass = 1
use_power = 1
layer = 3.3
layer = ON_WINDOW_LAYER
power_channel = EQUIP
var/on = 0
var/id_tag = null

View File

@@ -36,6 +36,7 @@
desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
name = "DEATH-RIPLEY"
icon_state = "deathripley"
initial_icon = "deathripley"
step_in = 2
opacity=0
lights_power = 60

View File

@@ -75,6 +75,13 @@
// buckled_mob = M
buckled_mobs |= M
//VOREStation Add
if(riding_datum)
riding_datum.ridden = src
riding_datum.handle_vehicle_offsets()
M.update_water()
//VOREStation Add End
post_buckle_mob(M)
return TRUE
@@ -94,6 +101,12 @@
// buckled_mob = null
buckled_mobs -= buckled_mob
//VOREStation Add
buckled_mob.update_water()
if(riding_datum)
riding_datum.restore_position(buckled_mob)
riding_datum.handle_vehicle_offsets() // So the person in back goes to the front.
//VOREStation Add End
post_buckle_mob(.)
/atom/movable/proc/unbuckle_all_mobs(force = FALSE)
@@ -175,3 +188,9 @@
. = ..()
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
. = 0
//VOREStation Add
else if(. && riding_datum)
riding_datum.handle_vehicle_layer()
riding_datum.handle_vehicle_offsets()
//VOREStation Add End

View File

@@ -147,7 +147,8 @@
anchored = 1
density = 0
layer = 2
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
var/health = 15
var/obj/effect/alien/weeds/node/linked_node = null
@@ -155,7 +156,7 @@
icon_state = "weednode"
name = "purple sac"
desc = "Weird purple octopus-like thing."
layer = 3
layer = ABOVE_TURF_LAYER+0.01
light_range = NODERANGE
var/node_range = NODERANGE

View File

@@ -161,7 +161,7 @@
if(chemholder.reagents.reagent_list.len)
chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents
smoke.icon = I
smoke.layer = 6
smoke.plane = ABOVE_PLANE
smoke.set_dir(pick(cardinal))
smoke.pixel_x = -32 + rand(-8, 8)
smoke.pixel_y = -32 + rand(-8, 8)

View File

@@ -2,7 +2,7 @@
//Liquid fuel is used for things that used to rely on volatile fuels or phoron being contained to a couple tiles.
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
layer = TURF_LAYER+0.2
plane = DIRTY_PLANE
anchored = 1
var/amount = 1

View File

@@ -10,7 +10,7 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
density = 0
anchored = 1
layer = 2
plane = BLOOD_PLANE
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
@@ -179,7 +179,6 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "gibbl5"
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6")
@@ -236,7 +235,6 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")

View File

@@ -4,7 +4,6 @@
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
@@ -36,7 +35,6 @@
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "dirt"
mouse_opacity = 0
@@ -47,7 +45,6 @@
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
@@ -57,7 +54,6 @@
gender = PLURAL
density = 0
anchored = 1
layer = 2
light_range = 1
icon = 'icons/effects/effects.dmi'
icon_state = "greenglow"
@@ -67,7 +63,7 @@
desc = "Somebody should remove that."
density = 0
anchored = 1
layer = 3
plane = OBJ_PLANE
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb1"
@@ -76,7 +72,7 @@
desc = "It looks like a melted... something."
density = 0
anchored = 1
layer = 3
plane = OBJ_PLANE
icon = 'icons/obj/chemical.dmi'
icon_state = "molten"
@@ -85,7 +81,7 @@
desc = "Somebody should remove that."
density = 0
anchored = 1
layer = 3
plane = OBJ_PLANE
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb2"
@@ -96,7 +92,6 @@
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
@@ -107,7 +102,6 @@
desc = "It's red."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
@@ -116,7 +110,6 @@
desc = "Seems like this one won't hatch."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
@@ -125,7 +118,6 @@
desc = "It's pie cream from a cream pie."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
@@ -134,7 +126,6 @@
desc = "Some kind of fruit smear."
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")

View File

@@ -1,4 +1,5 @@
/obj/effect/decal/cleanable
plane = DIRTY_PLANE
var/list/random_icon_states = list()
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)

View File

@@ -2,7 +2,7 @@
name = "rune"
desc = "A rune drawn in crayon."
icon = 'icons/obj/rune.dmi'
layer = 2.1
plane = DIRTY_PLANE
anchored = 1
New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune")

View File

@@ -3,7 +3,7 @@
desc = "It's an arrow hanging in mid-air. There may be a wizard about."
icon = 'icons/mob/screen1.dmi'
icon_state = "arrow"
layer = 16.0
plane = ABOVE_PLANE
anchored = 1
mouse_opacity = 0
@@ -11,4 +11,4 @@
/obj/effect/decal/spraystill
density = 0
anchored = 1
layer = 50
plane = ABOVE_PLANE

View File

@@ -1,6 +1,5 @@
/obj/effect/decal/warning_stripes
icon = 'icons/effects/warning_stripes.dmi'
layer = 2
/obj/effect/decal/warning_stripes/New()
. = ..()

View File

@@ -26,7 +26,8 @@
desc = "Something swinging really wide."
icon = 'icons/effects/96x96.dmi'
icon_state = "cleave"
layer = 6
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
time_to_die = 6
alpha = 140
mouse_opacity = 0

View File

@@ -17,7 +17,8 @@
icon = 'icons/misc/beach2.dmi'
icon_state = "palm1"
density = 1
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
anchored = 1
/obj/effect/overlay/palmtree_l
@@ -25,7 +26,8 @@
icon = 'icons/misc/beach2.dmi'
icon_state = "palm2"
density = 1
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
anchored = 1
/obj/effect/overlay/coconut
@@ -37,7 +39,7 @@
name = "Bluespace"
icon = 'icons/turf/space.dmi'
icon_state = "bluespacify"
layer = 10
plane = ABOVE_PLANE
/obj/effect/overlay/wallrot
name = "wallrot"
@@ -45,7 +47,8 @@
icon = 'icons/effects/wallrot.dmi'
anchored = 1
density = 1
layer = 5
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER
mouse_opacity = 0
/obj/effect/overlay/wallrot/New()
@@ -70,7 +73,8 @@
/obj/effect/overlay/snow/floor
icon_state = "snowfloor"
layer = 2.01 //Just above floor
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
mouse_opacity = 0 //Don't block underlying tile interactions
/obj/effect/overlay/snow/floor/edges
@@ -86,11 +90,12 @@
/obj/effect/overlay/snow/airlock
icon_state = "snowairlock"
layer = 3.2 //Just above airlocks
layer = DOOR_CLOSED_LAYER+0.01
/obj/effect/overlay/snow/floor/pointy
icon_state = "snowfloorpointy"
/obj/effect/overlay/snow/wall
icon_state = "snowwall"
layer = 5 //Same as lights so humans can stand under it
plane = MOB_PLANE
layer = ABOVE_MOB_LAYER

View File

@@ -123,7 +123,7 @@
desc = "It never stays still for long."
icon_state = "spiderling"
anchored = 0
layer = 2.7
layer = HIDING_LAYER
health = 3
var/last_itch = 0
var/amount_grown = -1
@@ -221,7 +221,7 @@
skitter()
else if(isorgan(loc))
if(!amount_grown) amount_grown = 1
if(amount_grown < 0) amount_grown = 1
var/obj/item/organ/external/O = loc
if(!O.owner || O.owner.stat == DEAD || amount_grown > 80)
O.implants -= src
@@ -237,7 +237,7 @@
else if(prob(1))
src.visible_message("<span class='notice'>\The [src] skitters.</span>")
if(amount_grown)
if(amount_grown >= 0)
amount_grown += rand(0,2)
/obj/effect/spider/spiderling/proc/skitter()

View File

@@ -13,31 +13,31 @@
new /obj/item/stack/material/steel( get_turf(src.loc), 2 )
qdel(src)
/obj/item/frame/apc/try_build(turf/on_wall)
if (get_dist(on_wall,usr)>1)
/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob)
if (get_dist(on_wall, user)>1)
return
var/ndir = get_dir(usr,on_wall)
var/ndir = get_dir(user, on_wall)
if (!(ndir in cardinal))
return
var/turf/loc = get_turf(usr)
var/turf/loc = get_turf(user)
var/area/A = loc.loc
if (!istype(loc, /turf/simulated/floor))
usr << "<span class='warning'>APC cannot be placed on this spot.</span>"
to_chat(user, "<span class='warning'>APC cannot be placed on this spot.</span>")
return
if (A.requires_power == 0 || istype(A, /area/space))
usr << "<span class='warning'>APC cannot be placed in this area.</span>"
to_chat(user, "<span class='warning'>APC cannot be placed in this area.</span>")
return
if (A.get_apc())
usr << "<span class='warning'>This area already has an APC.</span>"
to_chat(user, "<span class='warning'>This area already has an APC.</span>")
return //only one APC per area
for(var/obj/machinery/power/terminal/T in loc)
if (T.master)
usr << "<span class='warning'>There is another network terminal here.</span>"
to_chat(user, "<span class='warning'>There is another network terminal here.</span>")
return
else
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc)
C.amount = 10
usr << "You cut the cables and disassemble the unused power terminal."
to_chat(user, "You cut the cables and disassemble the unused power terminal.")
qdel(T)
new /obj/machinery/power/apc(loc, ndir, 1)
qdel(src)

View File

@@ -46,11 +46,11 @@
if(colour != "#FFFFFF" && shadeColour != "#000000")
colour = "#FFFFFF"
shadeColour = "#000000"
user << "You will now draw in white and black with this crayon."
to_chat(user, "You will now draw in white and black with this crayon.")
else
colour = "#000000"
shadeColour = "#FFFFFF"
user << "You will now draw in black and white with this crayon."
to_chat(user, "You will now draw in black and white with this crayon.")
return
/obj/item/weapon/pen/crayon/rainbow
@@ -72,22 +72,22 @@
switch(drawtype)
if("letter")
drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
user << "You start drawing a letter on the [target.name]."
to_chat(user, "You start drawing a letter on the [target.name].")
if("graffiti")
user << "You start drawing graffiti on the [target.name]."
to_chat(user, "You start drawing graffiti on the [target.name].")
if("rune")
user << "You start drawing a rune on the [target.name]."
to_chat(user, "You start drawing a rune on the [target.name].")
if("arrow")
drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down")
user << "You start drawing an arrow on the [target.name]."
to_chat(user, "You start drawing an arrow on the [target.name].")
if(instant || do_after(user, 50))
new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype)
user << "You finish drawing."
to_chat(user, "You finish drawing.")
target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on.
if(uses)
uses--
if(!uses)
user << "<span class='warning'>You used up your crayon!</span>"
to_chat(user, "<span class='warning'>You used up your crayon!</span>")
qdel(src)
return
@@ -99,7 +99,93 @@
if(uses)
uses -= 5
if(uses <= 0)
user << "<span class='warning'>You ate your crayon!</span>"
to_chat(user,"<span class='warning'>You ate your crayon!</span>")
qdel(src)
else
..()
/obj/item/weapon/pen/crayon/marker/black
icon_state = "markerblack"
colour = "#2D2D2D"
shadeColour = "#000000"
colourName = "black"
/obj/item/weapon/pen/crayon/marker/red
icon_state = "markerred"
colour = "#DA0000"
shadeColour = "#810C0C"
colourName = "red"
/obj/item/weapon/pen/crayon/marker/orange
icon_state = "markerorange"
colour = "#FF9300"
shadeColour = "#A55403"
colourName = "orange"
/obj/item/weapon/pen/crayon/marker/yellow
icon_state = "markeryellow"
colour = "#FFF200"
shadeColour = "#886422"
colourName = "yellow"
/obj/item/weapon/pen/crayon/marker/green
icon_state = "markergreen"
colour = "#A8E61D"
shadeColour = "#61840F"
colourName = "green"
/obj/item/weapon/pen/crayon/marker/blue
icon_state = "markerblue"
colour = "#00B7EF"
shadeColour = "#0082A8"
colourName = "blue"
/obj/item/weapon/pen/crayon/marker/purple
icon_state = "markerpurple"
colour = "#DA00FF"
shadeColour = "#810CFF"
colourName = "purple"
/obj/item/weapon/pen/crayon/marker/mime
icon_state = "markermime"
desc = "A very sad-looking marker."
colour = "#FFFFFF"
shadeColour = "#000000"
colourName = "mime"
uses = 0
/obj/item/weapon/pen/crayon/marker/mime/attack_self(mob/living/user as mob) //inversion
if(colour != "#FFFFFF" && shadeColour != "#000000")
colour = "#FFFFFF"
shadeColour = "#000000"
to_chat(user, "You will now draw in white and black with this marker.")
else
colour = "#000000"
shadeColour = "#FFFFFF"
to_chat(user, "You will now draw in black and white with this marker.")
return
/obj/item/weapon/pen/crayon/marker/rainbow
icon_state = "markerrainbow"
colour = "#FFF000"
shadeColour = "#000FFF"
colourName = "rainbow"
uses = 0
/obj/item/weapon/pen/crayon/marker/rainbow/attack_self(mob/living/user as mob)
colour = input(user, "Please select the main colour.", "Marker colour") as color
shadeColour = input(user, "Please select the shade colour.", "Marker colour") as color
return
/obj/item/weapon/pen/crayon/marker/attack(mob/M as mob, mob/user as mob)
if(M == user)
to_chat(user, "You take a bite of the marker and swallow it.")
user.nutrition += 1
user.reagents.add_reagent("marker_ink",6)
if(uses)
uses -= 5
if(uses <= 0)
to_chat(user,"<span class='warning'>You ate the marker!</span>")
qdel(src)
else
..()

View File

@@ -102,6 +102,11 @@
user << "<span class='danger'>Transfer failed:</span> Existing AI found on remote device. Remove existing AI to install a new one."
return 0
if(!user.IsAdvancedToolUser() && isanimal(user))
var/mob/living/simple_animal/S = user
if(!S.IsHumanoidToolUser(src))
return 0
user.visible_message("\The [user] starts transferring \the [ai] into \the [src]...", "You start transferring \the [ai] into \the [src]...")
ai << "<span class='danger'>\The [user] is transferring you into \the [src]!</span>"

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