mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
Merge branch 'master' of https://github.com/VOREStation/VOREStation
# 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:
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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_
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
264
code/datums/supplypacks/costumes_vr.dm
Normal file
264
code/datums/supplypacks/costumes_vr.dm
Normal 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"
|
||||
84
code/datums/supplypacks/hospitality_vr.dm
Normal file
84
code/datums/supplypacks/hospitality_vr.dm
Normal 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
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
12
code/game/atoms_movable_vr.dm
Normal file
12
code/game/atoms_movable_vr.dm
Normal 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)
|
||||
698
code/game/gamemodes/cult/construct_spells.dm
Normal file
698
code/game/gamemodes/cult/construct_spells.dm
Normal 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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
10
code/game/gamemodes/meteor/meteors_vr.dm
Normal file
10
code/game/gamemodes/meteor/meteors_vr.dm
Normal 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
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
//////////////////////////////
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name = "microwave"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "mw"
|
||||
layer = 2.9
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = 1
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
109
code/game/machinery/painter_vr.dm
Normal file
109
code/game/machinery/painter_vr.dm
Normal 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]'>⚫</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()
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -1,6 +1,5 @@
|
||||
/obj/effect/decal/warning_stripes
|
||||
icon = 'icons/effects/warning_stripes.dmi'
|
||||
layer = 2
|
||||
|
||||
/obj/effect/decal/warning_stripes/New()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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
Reference in New Issue
Block a user