mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-30 15:36:21 +01:00
@@ -71,20 +71,23 @@
|
||||
else if(istype(loc, /turf/space/))
|
||||
parent.radiate_heat_to_space(surface, 1)
|
||||
|
||||
if(buckled_mob)
|
||||
var/hc = pipe_air.heat_capacity()
|
||||
var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500)
|
||||
pipe_air.temperature = avg_temp
|
||||
buckled_mob.bodytemperature = avg_temp
|
||||
if(has_buckled_mobs())
|
||||
for(var/M in buckled_mobs)
|
||||
var/mob/living/L = M
|
||||
|
||||
var/heat_limit = 1000
|
||||
var/hc = pipe_air.heat_capacity()
|
||||
var/avg_temp = (pipe_air.temperature * hc + L.bodytemperature * 3500) / (hc + 3500)
|
||||
pipe_air.temperature = avg_temp
|
||||
L.bodytemperature = avg_temp
|
||||
|
||||
var/mob/living/carbon/human/H = buckled_mob
|
||||
if(istype(H) && H.species)
|
||||
heat_limit = H.species.heat_level_3
|
||||
var/heat_limit = 1000
|
||||
|
||||
if(pipe_air.temperature > heat_limit + 1)
|
||||
buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO, used_weapon = "Excessive Heat")
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(istype(H) && H.species)
|
||||
heat_limit = H.species.heat_level_3
|
||||
|
||||
if(pipe_air.temperature > heat_limit + 1)
|
||||
L.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO, used_weapon = "Excessive Heat")
|
||||
|
||||
//fancy radiation glowing
|
||||
if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K
|
||||
|
||||
+37
-68
@@ -1,3 +1,6 @@
|
||||
//
|
||||
// Base type of pipes
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe
|
||||
|
||||
var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke
|
||||
@@ -100,7 +103,7 @@
|
||||
qdel(meter)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/atmospherics/proc/change_color(var/new_color)
|
||||
/obj/machinery/atmospherics/pipe/proc/change_color(var/new_color)
|
||||
//only pass valid pipe colors please ~otherwise your pipe will turn invisible
|
||||
if(!pipe_color_check(new_color))
|
||||
return
|
||||
@@ -108,21 +111,6 @@
|
||||
pipe_color = new_color
|
||||
update_icon()
|
||||
|
||||
/*
|
||||
/obj/machinery/atmospherics/pipe/add_underlay(var/obj/machinery/atmospherics/node, var/direction)
|
||||
if(istype(src, /obj/machinery/atmospherics/pipe/tank)) //todo: move tanks to unary devices
|
||||
return ..()
|
||||
|
||||
if(node)
|
||||
var/temp_dir = get_dir(src, node)
|
||||
underlays += icon_manager.get_atmos_icon("pipe_underlay_intact", temp_dir, color_cache_name(node))
|
||||
return temp_dir
|
||||
else if(direction)
|
||||
underlays += icon_manager.get_atmos_icon("pipe_underlay_exposed", direction, pipe_color)
|
||||
else
|
||||
return null
|
||||
*/
|
||||
|
||||
/obj/machinery/atmospherics/pipe/color_cache_name(var/obj/machinery/atmospherics/node)
|
||||
if(istype(src, /obj/machinery/atmospherics/pipe/tank))
|
||||
return ..()
|
||||
@@ -137,6 +125,20 @@
|
||||
else
|
||||
return pipe_color
|
||||
|
||||
/obj/machinery/atmospherics/pipe/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/process()
|
||||
if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
//
|
||||
// Simple Pipes - Just a tube, maybe bent
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/simple
|
||||
icon = 'icons/atmos/pipes.dmi'
|
||||
icon_state = ""
|
||||
@@ -166,17 +168,6 @@
|
||||
icon = null
|
||||
alpha = 255
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/process()
|
||||
if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure)
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
@@ -411,7 +402,9 @@
|
||||
|
||||
level = 2
|
||||
|
||||
|
||||
//
|
||||
// Manifold Pipes - Three way "T" joints
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/manifold
|
||||
icon = 'icons/atmos/manifold.dmi'
|
||||
icon_state = ""
|
||||
@@ -444,20 +437,9 @@
|
||||
if(WEST)
|
||||
initialize_directions = NORTH|EAST|SOUTH
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion()
|
||||
return list(node1, node2, node3)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
@@ -674,6 +656,10 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold/hidden/purple
|
||||
color = PIPE_COLOR_PURPLE
|
||||
|
||||
|
||||
//
|
||||
// 4-Way Manifold Pipes - 4 way "cross" junction
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/manifold4w
|
||||
icon = 'icons/atmos/manifold.dmi'
|
||||
icon_state = ""
|
||||
@@ -699,12 +685,6 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/pipeline_expansion()
|
||||
return list(node1, node2, node3, node4)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
@@ -813,11 +793,6 @@
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/atmos_init()
|
||||
|
||||
for(var/obj/machinery/atmospherics/target in get_step(src,1))
|
||||
@@ -939,6 +914,9 @@
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple
|
||||
color = PIPE_COLOR_PURPLE
|
||||
|
||||
//
|
||||
// Pipe Cap - They go on the end
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/cap
|
||||
name = "pipe endcap"
|
||||
desc = "An endcap for pipes"
|
||||
@@ -957,19 +935,9 @@
|
||||
/obj/machinery/atmospherics/pipe/cap/init_dir()
|
||||
initialize_directions = dir
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/hide(var/i)
|
||||
if(istype(loc, /turf/simulated))
|
||||
invisibility = i ? 101 : 0
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/pipeline_expansion()
|
||||
return list(node)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/cap/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
/obj/machinery/atmospherics/pipe/cap/Destroy()
|
||||
if(node)
|
||||
node.disconnect(src)
|
||||
@@ -1061,7 +1029,9 @@
|
||||
icon_connect_type = "-supply"
|
||||
color = PIPE_COLOR_BLUE
|
||||
|
||||
|
||||
//
|
||||
// Tanks - These are implemented as pipes with large volume
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/tank
|
||||
icon = 'icons/atmos/tank_vr.dmi' //VOREStation Edit - New Icons
|
||||
icon_state = "air_map"
|
||||
@@ -1084,12 +1054,6 @@
|
||||
/obj/machinery/atmospherics/pipe/tank/init_dir()
|
||||
initialize_directions = dir
|
||||
|
||||
/obj/machinery/atmospherics/pipe/tank/process()
|
||||
if(!parent)
|
||||
..()
|
||||
else
|
||||
. = PROCESS_KILL
|
||||
|
||||
/obj/machinery/atmospherics/pipe/tank/Destroy()
|
||||
if(node1)
|
||||
node1.disconnect(src)
|
||||
@@ -1227,6 +1191,9 @@
|
||||
..()
|
||||
icon_state = "n2o"
|
||||
|
||||
//
|
||||
// Vent Pipe - Unpowered vent
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/vent
|
||||
icon = 'icons/obj/atmospherics/pipe_vent.dmi'
|
||||
icon_state = "intact"
|
||||
@@ -1308,7 +1275,9 @@
|
||||
else
|
||||
icon_state = "exposed"
|
||||
|
||||
|
||||
//
|
||||
// Universal Pipe Adapter - Designed for connecting scrubbers, normal, and supply pipes together.
|
||||
//
|
||||
/obj/machinery/atmospherics/pipe/simple/visible/universal
|
||||
name="Universal pipe adapter"
|
||||
desc = "An adapter for regular, supply and scrubbers pipes"
|
||||
|
||||
@@ -49,7 +49,7 @@ What is the naming convention for planes or layers?
|
||||
|
||||
// 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_START -53
|
||||
#define OPENSPACE_PLANE_END -38
|
||||
#define OVER_OPENSPACE_PLANE -37
|
||||
|
||||
@@ -57,7 +57,24 @@ What is the naming convention for planes or layers?
|
||||
#define PLANE_WORLD 0 // BYOND's default value for plane, the "base plane"
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
|
||||
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
||||
//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
|
||||
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
|
||||
#define SHOWER_OPEN_LAYER 3.4
|
||||
#define BELOW_MOB_LAYER 3.9
|
||||
//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
|
||||
#define ABOVE_MOB_LAYER 4.1
|
||||
#define SHOWER_CLOSED_LAYER 4.2
|
||||
|
||||
//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
|
||||
#define LIGHTING_LAYER 11 //Layer that lighting used to be on (now it's on a plane)
|
||||
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
|
||||
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||
|
||||
#define PLANE_LIGHTING 5 //Where the lighting (and darkness) lives
|
||||
#define PLANE_LIGHTING_ABOVE 6 //For glowy eyes etc. that shouldn't be affected by darkness
|
||||
|
||||
#define PLANE_GHOSTS 10 //Spooooooooky ghooooooosts
|
||||
#define PLANE_AI_EYE 11 //The AI eye lives here
|
||||
@@ -74,8 +91,13 @@ What is the naming convention for planes or layers?
|
||||
#define PLANE_CH_SPECIAL 23 //Special role icon (revhead or w/e)
|
||||
#define PLANE_CH_STATUS_OOC 24 //OOC status hud for spooks
|
||||
|
||||
|
||||
//Fullscreen overlays under inventory
|
||||
#define PLANE_FULLSCREEN 90 //Blindness, mesons, druggy, etc
|
||||
#define FULLSCREEN_LAYER 18
|
||||
#define DAMAGE_LAYER 18.1
|
||||
#define BLIND_LAYER 18.2
|
||||
#define CRIT_LAYER 18.3
|
||||
|
||||
//Client UI HUD stuff
|
||||
#define PLANE_PLAYER_HUD 95 //The character's UI is on this plane
|
||||
|
||||
@@ -2,4 +2,6 @@
|
||||
#define PLANE_CH_HEALTH_VR 27 //Hidden healthbar when at full health
|
||||
#define PLANE_CH_STATUS_R 28 //Right-side status icon
|
||||
#define PLANE_CH_BACKUP 29 //Backup implant
|
||||
#define PLANE_CH_VANTAG 30 //Vore Antag hud
|
||||
#define PLANE_CH_VANTAG 30 //Vore Antag hud
|
||||
|
||||
#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable
|
||||
@@ -9,7 +9,7 @@
|
||||
#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources
|
||||
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
|
||||
|
||||
#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
|
||||
//#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
|
||||
#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
|
||||
#define LIGHTING_ICON_STATE_DARK "soft_dark" // Change between "soft_dark" and "dark" to swap soft darkvision
|
||||
|
||||
@@ -49,3 +49,28 @@
|
||||
#define CL_MATRIX_CG 18
|
||||
#define CL_MATRIX_CB 19
|
||||
#define CL_MATRIX_CA 20
|
||||
|
||||
//Some defines to generalise colours used in lighting.
|
||||
//Important note on colors. Colors can end up significantly different from the basic html picture, especially when saturated
|
||||
#define LIGHT_COLOR_RED "#FA8282" //Warm but extremely diluted red. rgb(250, 130, 130)
|
||||
#define LIGHT_COLOR_GREEN "#64C864" //Bright but quickly dissipating neon green. rgb(100, 200, 100)
|
||||
#define LIGHT_COLOR_BLUE "#6496FA" //Cold, diluted blue. rgb(100, 150, 250)
|
||||
|
||||
#define LIGHT_COLOR_BLUEGREEN "#7DE1AF" //Light blueish green. rgb(125, 225, 175)
|
||||
#define LIGHT_COLOR_CYAN "#7DE1E1" //Diluted cyan. rgb(125, 225, 225)
|
||||
#define LIGHT_COLOR_LIGHT_CYAN "#40CEFF" //More-saturated cyan. rgb(64, 206, 255)
|
||||
#define LIGHT_COLOR_DARK_BLUE "#6496FA" //Saturated blue. rgb(51, 117, 248)
|
||||
#define LIGHT_COLOR_PINK "#E17DE1" //Diluted, mid-warmth pink. rgb(225, 125, 225)
|
||||
#define LIGHT_COLOR_YELLOW "#E1E17D" //Dimmed yellow, leaning kaki. rgb(225, 225, 125)
|
||||
#define LIGHT_COLOR_BROWN "#966432" //Clear brown, mostly dim. rgb(150, 100, 50)
|
||||
#define LIGHT_COLOR_ORANGE "#FA9632" //Mostly pure orange. rgb(250, 150, 50)
|
||||
#define LIGHT_COLOR_PURPLE "#952CF4" //Light Purple. rgb(149, 44, 244)
|
||||
#define LIGHT_COLOR_LAVENDER "#9B51FF" //Less-saturated light purple. rgb(155, 81, 255)
|
||||
|
||||
//These ones aren't a direct colour like the ones above, because nothing would fit
|
||||
#define LIGHT_COLOR_FIRE "#FAA019" //Warm orange color, leaning strongly towards yellow. rgb(250, 160, 25)
|
||||
#define LIGHT_COLOR_LAVA "#C48A18" //Very warm yellow, leaning slightly towards orange. rgb(196, 138, 24)
|
||||
#define LIGHT_COLOR_FLARE "#FA644B" //Bright, non-saturated red. Leaning slightly towards pink for visibility. rgb(250, 100, 75)
|
||||
#define LIGHT_COLOR_SLIME_LAMP "#AFC84B" //Weird color, between yellow and green, very slimy. rgb(175, 200, 75)
|
||||
#define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175)
|
||||
#define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250)
|
||||
+5
-13
@@ -87,7 +87,6 @@
|
||||
#define SHUTTLE_IDLE 0
|
||||
#define SHUTTLE_WARMUP 1
|
||||
#define SHUTTLE_INTRANSIT 2
|
||||
#define SHUTTLE_CRASHED 3 // VOREStation Edit - Yup that can happen now
|
||||
|
||||
// Sound defines for shuttles.
|
||||
#define HYPERSPACE_WARMUP 0
|
||||
@@ -121,18 +120,6 @@
|
||||
|
||||
//Area flags, possibly more to come
|
||||
#define RAD_SHIELDED 1 //shielded from radiation, clearly
|
||||
// VOREStation Edit Begin
|
||||
#define BLUE_SHIELDED 2 // shield from bluespace teleportation (telescience)
|
||||
// VOREStation Edit End
|
||||
|
||||
// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc.
|
||||
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
||||
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
|
||||
#define LIGHTING_LAYER 11
|
||||
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
|
||||
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||
#define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable // VOREStation Edit
|
||||
|
||||
// Convoluted setup so defines can be supplied by Bay12 main server compile script.
|
||||
// Should still work fine for people jamming the icons into their repo.
|
||||
@@ -160,6 +147,10 @@
|
||||
#define MAT_PHORON "phoron"
|
||||
#define MAT_DIAMOND "diamond"
|
||||
#define MAT_SNOW "snow"
|
||||
#define MAT_WOOD "wood"
|
||||
#define MAT_LOG "log"
|
||||
#define MAT_SIFWOOD "alien wood"
|
||||
#define MAT_SIFLOG "alien log"
|
||||
|
||||
#define SHARD_SHARD "shard"
|
||||
#define SHARD_SHRAPNEL "shrapnel"
|
||||
@@ -228,6 +219,7 @@
|
||||
#define MAP_MAXX 4
|
||||
#define MAP_MAXY 5
|
||||
#define MAP_MAXZ 6
|
||||
|
||||
// /atom/proc/use_check flags
|
||||
#define USE_ALLOW_NONLIVING 1
|
||||
#define USE_ALLOW_NON_ADV_TOOL_USR 2
|
||||
|
||||
@@ -24,3 +24,8 @@
|
||||
#define MR_NORMAL 0
|
||||
#define MR_UNSURE 1
|
||||
#define MR_DEAD 2
|
||||
|
||||
//Shuttle madness!
|
||||
#define SHUTTLE_CRASHED 3 // Yup that can happen now
|
||||
|
||||
#define BLUE_SHIELDED 2 // Shield from bluespace teleportation (telescience)
|
||||
|
||||
@@ -102,14 +102,14 @@
|
||||
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
|
||||
#define MAX_SUPPLIED_LAW_NUMBER 50
|
||||
|
||||
// NT's alignment towards the character
|
||||
#define COMPANY_LOYAL "Loyal"
|
||||
#define COMPANY_SUPPORTATIVE "Supportive"
|
||||
#define COMPANY_NEUTRAL "Neutral"
|
||||
#define COMPANY_SKEPTICAL "Skeptical"
|
||||
#define COMPANY_OPPOSED "Opposed"
|
||||
// Character's economic class
|
||||
#define CLASS_UPPER "Wealthy"
|
||||
#define CLASS_UPMID "Well-off"
|
||||
#define CLASS_MIDDLE "Average"
|
||||
#define CLASS_LOWMID "Underpaid"
|
||||
#define CLASS_LOWER "Poor"
|
||||
|
||||
#define COMPANY_ALIGNMENTS list(COMPANY_LOYAL,COMPANY_SUPPORTATIVE,COMPANY_NEUTRAL,COMPANY_SKEPTICAL,COMPANY_OPPOSED)
|
||||
#define ECONOMIC_CLASS list(CLASS_UPPER,CLASS_UPMID,CLASS_MIDDLE,CLASS_LOWMID,CLASS_LOWER)
|
||||
|
||||
|
||||
// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc.
|
||||
|
||||
@@ -33,7 +33,8 @@
|
||||
#define ARCHAEO_REMAINS_ROBOT 33
|
||||
#define ARCHAEO_REMAINS_XENO 34
|
||||
#define ARCHAEO_GASMASK 35
|
||||
#define MAX_ARCHAEO 35
|
||||
#define ARCHAEO_ALIEN_ITEM 36
|
||||
#define MAX_ARCHAEO 36
|
||||
|
||||
#define DIGSITE_GARDEN 1
|
||||
#define DIGSITE_ANIMAL 2
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
return occupant
|
||||
|
||||
/obj/vehicle/train/get_mob()
|
||||
return buckled_mob
|
||||
return buckled_mobs
|
||||
|
||||
/mob/get_mob()
|
||||
return src
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
#define to_world_log(message) world.log << message
|
||||
// TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later.
|
||||
#define log_world(message) world.log << message
|
||||
#define to_file(file_entry, source_var) file_entry << source_var
|
||||
#define from_file(file_entry, target_var) file_entry >> target_var
|
||||
|
||||
|
||||
#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE)
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
#define FULLSCREEN_LAYER 18
|
||||
#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1
|
||||
#define BLIND_LAYER DAMAGE_LAYER + 0.1
|
||||
#define CRIT_LAYER BLIND_LAYER + 0.1
|
||||
|
||||
/mob
|
||||
var/list/screens = list()
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
/obj/screen
|
||||
name = ""
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|NO_CLIENT_COLOR
|
||||
layer = LAYER_HUD_BASE
|
||||
plane = PLANE_PLAYER_HUD
|
||||
unacidable = 1
|
||||
|
||||
@@ -81,6 +81,7 @@ var/list/gamemode_cache = list()
|
||||
var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active.
|
||||
|
||||
var/character_slots = 10 // The number of available character slots
|
||||
var/loadout_slots = 3 // The number of loadout slots per character
|
||||
|
||||
var/max_maint_drones = 5 //This many drones can spawn,
|
||||
var/allow_drone_spawn = 1 //assuming the admin allow them to.
|
||||
@@ -653,6 +654,9 @@ var/list/gamemode_cache = list()
|
||||
if("character_slots")
|
||||
config.character_slots = text2num(value)
|
||||
|
||||
if("loadout_slots")
|
||||
config.loadout_slots = text2num(value)
|
||||
|
||||
if("allow_drone_spawn")
|
||||
config.allow_drone_spawn = text2num(value)
|
||||
|
||||
|
||||
@@ -8,8 +8,12 @@ var/global/datum/shuttle_controller/shuttle_controller
|
||||
|
||||
/datum/shuttle_controller/proc/process()
|
||||
//process ferry shuttles
|
||||
for (var/datum/shuttle/ferry/shuttle in process_shuttles)
|
||||
if (shuttle.process_state || shuttle.always_process)
|
||||
for (var/datum/shuttle/shuttle in process_shuttles)
|
||||
if(istype(shuttle, /datum/shuttle/ferry))
|
||||
var/datum/shuttle/ferry/F = shuttle
|
||||
if(F.process_state || F.always_process)
|
||||
F.process()
|
||||
else
|
||||
shuttle.process()
|
||||
|
||||
|
||||
|
||||
@@ -81,17 +81,7 @@
|
||||
|
||||
/////// 9mm
|
||||
|
||||
/obj/item/ammo_magazine/m9mm/flash
|
||||
ammo_type =/obj/item/ammo_casing/a9mmf
|
||||
|
||||
/obj/item/ammo_magazine/m9mm/rubber
|
||||
name = "magazine (9mm rubber)"
|
||||
ammo_type =/obj/item/ammo_casing/a9mmr
|
||||
|
||||
/obj/item/ammo_magazine/m9mm/practice
|
||||
name = "magazine (9mm practice)"
|
||||
ammo_type =/obj/item/ammo_casing/a9mmp
|
||||
|
||||
// Full size pistol mags.
|
||||
/datum/category_item/autolathe/arms/pistol_9mm
|
||||
name = "pistol magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mm
|
||||
@@ -109,6 +99,28 @@
|
||||
name = "pistol magazine (9mm flash)"
|
||||
path =/obj/item/ammo_magazine/m9mm/flash
|
||||
|
||||
// Small mags for small or old guns.
|
||||
/datum/category_item/autolathe/arms/pistol_9mm_compact
|
||||
name = "compact pistol magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mmr_compact
|
||||
name = "compact pistol magazine (9mm rubber)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact/rubber
|
||||
hidden = 1 // These are all hidden because they are traitor mags and will otherwise just clutter the Autolathe.
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mmp_compact
|
||||
name = "compact pistol magazine (9mm practice)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact/practice
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_9mmf_compact
|
||||
name = "compact pistol magazine (9mm flash)"
|
||||
path =/obj/item/ammo_magazine/m9mm/compact/flash
|
||||
hidden = 1
|
||||
|
||||
// SMG mags
|
||||
/datum/category_item/autolathe/arms/smg_9mm
|
||||
name = "top-mounted SMG magazine (9mm)"
|
||||
path =/obj/item/ammo_magazine/m9mmt
|
||||
@@ -157,7 +169,7 @@
|
||||
hidden = 1
|
||||
|
||||
/*/datum/category_item/autolathe/arms/machinegun_545_hunter //VOREStation Edit Start. By request of Ace
|
||||
name = "machinegun box magazine (5.56 hunting)"
|
||||
name = "machinegun box magazine (5.45 hunting)"
|
||||
path =/obj/item/ammo_magazine/m545saw/hunter
|
||||
hidden = 1*/ //VOREStation Edit End.
|
||||
|
||||
@@ -409,7 +421,7 @@
|
||||
|
||||
/datum/category_item/autolathe/arms/tacknife
|
||||
name = "tactical knife"
|
||||
path =/obj/item/weapon/material/hatchet/tacknife
|
||||
path =/obj/item/weapon/material/knife/tacknife
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/flamethrower
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
/datum/category_item/autolathe/tools/hatchet
|
||||
name = "hatchet"
|
||||
path =/obj/item/weapon/material/hatchet
|
||||
path =/obj/item/weapon/material/knife/machete/hatchet
|
||||
|
||||
/datum/category_item/autolathe/tools/minihoe
|
||||
name = "mini hoe"
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
//Beam Datum and effect
|
||||
/datum/beam
|
||||
var/atom/origin = null
|
||||
var/atom/target = null
|
||||
var/list/elements = list()
|
||||
var/icon/base_icon = null
|
||||
var/icon
|
||||
var/icon_state = "" //icon state of the main segments of the beam
|
||||
var/max_distance = 0
|
||||
var/endtime = 0
|
||||
var/sleep_time = 3
|
||||
var/finished = 0
|
||||
var/target_oldloc = null
|
||||
var/origin_oldloc = null
|
||||
var/static_beam = 0
|
||||
var/beam_type = /obj/effect/ebeam //must be subtype
|
||||
|
||||
/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=50,maxdistance=10,btype = /obj/effect/ebeam,beam_sleep_time=3)
|
||||
endtime = world.time+time
|
||||
origin = beam_origin
|
||||
origin_oldloc = get_turf(origin)
|
||||
target = beam_target
|
||||
target_oldloc = get_turf(target)
|
||||
sleep_time = beam_sleep_time
|
||||
if(origin_oldloc == origin && target_oldloc == target)
|
||||
static_beam = 1
|
||||
max_distance = maxdistance
|
||||
base_icon = new(beam_icon,beam_icon_state)
|
||||
icon = beam_icon
|
||||
icon_state = beam_icon_state
|
||||
beam_type = btype
|
||||
|
||||
/datum/beam/proc/Start()
|
||||
Draw()
|
||||
while(!finished && origin && target && world.time < endtime && get_dist(origin,target)<max_distance && origin.z == target.z)
|
||||
var/origin_turf = get_turf(origin)
|
||||
var/target_turf = get_turf(target)
|
||||
if(!static_beam && (origin_turf != origin_oldloc || target_turf != target_oldloc))
|
||||
origin_oldloc = origin_turf //so we don't keep checking against their initial positions, leading to endless Reset()+Draw() calls
|
||||
target_oldloc = target_turf
|
||||
Reset()
|
||||
Draw()
|
||||
sleep(sleep_time)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/datum/beam/proc/End()
|
||||
finished = TRUE
|
||||
|
||||
/datum/beam/proc/Reset()
|
||||
for(var/obj/effect/ebeam/B in elements)
|
||||
qdel(B)
|
||||
elements.Cut()
|
||||
|
||||
/datum/beam/Destroy()
|
||||
Reset()
|
||||
target = null
|
||||
origin = null
|
||||
return ..()
|
||||
|
||||
/datum/beam/proc/Draw()
|
||||
var/Angle = round(Get_Angle(origin,target))
|
||||
|
||||
var/matrix/rot_matrix = matrix()
|
||||
rot_matrix.Turn(Angle)
|
||||
|
||||
//Translation vector for origin and target
|
||||
var/DX = (32*target.x+target.pixel_x)-(32*origin.x+origin.pixel_x)
|
||||
var/DY = (32*target.y+target.pixel_y)-(32*origin.y+origin.pixel_y)
|
||||
var/N = 0
|
||||
var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement
|
||||
|
||||
for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X
|
||||
if(QDELETED(src) || finished)
|
||||
break
|
||||
var/obj/effect/ebeam/X = new beam_type(origin_oldloc)
|
||||
X.owner = src
|
||||
elements |= X
|
||||
|
||||
//Assign icon, for main segments it's base_icon, for the end, it's icon+icon_state
|
||||
//cropped by a transparent box of length-N pixel size
|
||||
if(N+32>length)
|
||||
var/icon/II = new(icon, icon_state)
|
||||
II.DrawBox(null,1,(length-N),32,32)
|
||||
X.icon = II
|
||||
else
|
||||
X.icon = base_icon
|
||||
X.transform = rot_matrix
|
||||
|
||||
//Calculate pixel offsets (If necessary)
|
||||
var/Pixel_x
|
||||
var/Pixel_y
|
||||
if(DX == 0)
|
||||
Pixel_x = 0
|
||||
else
|
||||
Pixel_x = round(sin(Angle)+32*sin(Angle)*(N+16)/32)
|
||||
if(DY == 0)
|
||||
Pixel_y = 0
|
||||
else
|
||||
Pixel_y = round(cos(Angle)+32*cos(Angle)*(N+16)/32)
|
||||
|
||||
//Position the effect so the beam is one continous line
|
||||
var/a
|
||||
if(abs(Pixel_x)>32)
|
||||
a = Pixel_x > 0 ? round(Pixel_x/32) : Ceiling(Pixel_x/32)
|
||||
X.x += a
|
||||
Pixel_x %= 32
|
||||
if(abs(Pixel_y)>32)
|
||||
a = Pixel_y > 0 ? round(Pixel_y/32) : Ceiling(Pixel_y/32)
|
||||
X.y += a
|
||||
Pixel_y %= 32
|
||||
|
||||
X.pixel_x = Pixel_x
|
||||
X.pixel_y = Pixel_y
|
||||
|
||||
/obj/effect/ebeam
|
||||
mouse_opacity = 0
|
||||
anchored = TRUE
|
||||
var/datum/beam/owner
|
||||
|
||||
/obj/effect/ebeam/Destroy()
|
||||
owner = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/ebeam/singularity_pull()
|
||||
return
|
||||
/obj/effect/ebeam/singularity_act()
|
||||
return
|
||||
|
||||
/obj/effect/ebeam/deadly/Crossed(atom/A)
|
||||
..()
|
||||
A.ex_act(1)
|
||||
|
||||
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3)
|
||||
var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time)
|
||||
spawn(0)
|
||||
newbeam.Start()
|
||||
return newbeam
|
||||
@@ -25,7 +25,7 @@
|
||||
l_ear = /obj/item/device/radio/headset
|
||||
glasses = /obj/item/clothing/glasses/thermal/plain/monocle
|
||||
suit = /obj/item/clothing/suit/storage/apron
|
||||
l_pocket = /obj/item/weapon/material/hatchet/tacknife
|
||||
l_pocket = /obj/item/weapon/material/knife/tacknife
|
||||
r_pocket = /obj/item/weapon/surgical/scalpel
|
||||
r_hand = /obj/item/weapon/material/twohanded/fireaxe
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
uniform = /obj/item/clothing/under/rank/chef
|
||||
suit = /obj/item/clothing/suit/chef
|
||||
r_hand = /obj/item/weapon/material/kitchen/rollingpin
|
||||
l_pocket = /obj/item/weapon/material/hatchet/tacknife
|
||||
r_pocket = /obj/item/weapon/material/hatchet/tacknife
|
||||
l_pocket = /obj/item/weapon/material/knife/tacknife
|
||||
r_pocket = /obj/item/weapon/material/knife/tacknife
|
||||
|
||||
/decl/hierarchy/outfit/tournament_gear/janitor
|
||||
name = "Tournament gear - Janitor"
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
// This is used to make things that are supposed to move while buckled more consistant and easier to handle code-wise.
|
||||
|
||||
/datum/riding
|
||||
var/next_vehicle_move = 0 // Used for move delays
|
||||
var/vehicle_move_delay = 2 // Tick delay between movements, lower = faster, higher = slower
|
||||
var/keytype = null // Can give this a type to require the rider to hold the item type inhand to move the ridden atom.
|
||||
var/nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
|
||||
var/key_name = "the keys" // What the 'keys' for the thing being rided on would be called.
|
||||
var/atom/movable/ridden = null // The thing that the datum is attached to.
|
||||
var/only_one_driver = FALSE // If true, only the person in 'front' (first on list of riding mobs) can drive.
|
||||
|
||||
/datum/riding/New(atom/movable/_ridden)
|
||||
ridden = _ridden
|
||||
|
||||
/datum/riding/Destroy()
|
||||
ridden = null
|
||||
return ..()
|
||||
|
||||
/datum/riding/proc/handle_vehicle_layer()
|
||||
if(ridden.dir != NORTH)
|
||||
ridden.layer = ABOVE_MOB_LAYER
|
||||
else
|
||||
ridden.layer = OBJ_LAYER
|
||||
|
||||
/datum/riding/proc/on_vehicle_move()
|
||||
for(var/mob/living/M in ridden.buckled_mobs)
|
||||
ride_check(M)
|
||||
handle_vehicle_offsets()
|
||||
handle_vehicle_layer()
|
||||
|
||||
/datum/riding/proc/ride_check(mob/living/M)
|
||||
return TRUE
|
||||
|
||||
/datum/riding/proc/force_dismount(mob/living/M)
|
||||
ridden.unbuckle_mob(M)
|
||||
|
||||
/datum/riding/proc/handle_vehicle_offsets()
|
||||
var/ridden_dir = "[ridden.dir]"
|
||||
var/passindex = 0
|
||||
if(ridden.has_buckled_mobs())
|
||||
for(var/m in ridden.buckled_mobs)
|
||||
passindex++
|
||||
var/mob/living/buckled_mob = m
|
||||
var/list/offsets = get_offsets(passindex)
|
||||
var/rider_dir = get_rider_dir(passindex)
|
||||
buckled_mob.set_dir(rider_dir)
|
||||
dir_loop:
|
||||
for(var/offsetdir in offsets)
|
||||
if(offsetdir == ridden_dir)
|
||||
var/list/diroffsets = offsets[offsetdir]
|
||||
buckled_mob.pixel_x = diroffsets[1]
|
||||
if(diroffsets.len >= 2)
|
||||
buckled_mob.pixel_y = diroffsets[2]
|
||||
if(diroffsets.len == 3)
|
||||
buckled_mob.layer = diroffsets[3]
|
||||
break dir_loop
|
||||
|
||||
// Override this to set your vehicle's various pixel offsets
|
||||
/datum/riding/proc/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
return list("[NORTH]" = list(0, 0), "[SOUTH]" = list(0, 0), "[EAST]" = list(0, 0), "[WEST]" = list(0, 0))
|
||||
|
||||
// Override this to set the passengers/riders dir based on which passenger they are.
|
||||
// ie: rider facing the vehicle's dir, but passenger 2 facing backwards, etc.
|
||||
/datum/riding/proc/get_rider_dir(pass_index)
|
||||
return ridden.dir
|
||||
|
||||
// KEYS
|
||||
/datum/riding/proc/keycheck(mob/user)
|
||||
if(keytype)
|
||||
if(nonhuman_key_exemption && !ishuman(user))
|
||||
return TRUE
|
||||
|
||||
if(user.is_holding_item_of_type(keytype))
|
||||
return TRUE
|
||||
else
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// BUCKLE HOOKS
|
||||
/datum/riding/proc/restore_position(mob/living/buckled_mob)
|
||||
if(istype(buckled_mob))
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = 0
|
||||
buckled_mob.layer = initial(buckled_mob.layer)
|
||||
|
||||
// MOVEMENT
|
||||
/datum/riding/proc/handle_ride(mob/user, direction)
|
||||
if(user.incapacitated())
|
||||
Unbuckle(user)
|
||||
return
|
||||
|
||||
if(only_one_driver && ridden.buckled_mobs.len)
|
||||
var/mob/living/driver = ridden.buckled_mobs[1]
|
||||
if(driver != user)
|
||||
to_chat(user, "<span class='warning'>\The [ridden] can only be controlled by one person at a time, and is currently being controlled by \the [driver].</span>")
|
||||
return
|
||||
|
||||
if(world.time < next_vehicle_move)
|
||||
return
|
||||
next_vehicle_move = world.time + vehicle_move_delay
|
||||
if(keycheck(user))
|
||||
if(!Process_Spacemove(direction) || !isturf(ridden.loc))
|
||||
return
|
||||
step(ridden, direction)
|
||||
|
||||
handle_vehicle_layer()
|
||||
handle_vehicle_offsets()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You'll need [key_name] in one of your hands to move \the [ridden].</span>")
|
||||
|
||||
/datum/riding/proc/Unbuckle(atom/movable/M)
|
||||
// addtimer(CALLBACK(ridden, /atom/movable/.proc/unbuckle_mob, M), 0, TIMER_UNIQUE)
|
||||
spawn(0)
|
||||
// On /tg/ this uses the fancy CALLBACK system. Not entirely sure why they needed to do so with a duration of 0,
|
||||
// so if there is a reason, this should replicate it close enough. Hopefully.
|
||||
ridden.unbuckle_mob(M)
|
||||
|
||||
/datum/riding/proc/Process_Spacemove(direction)
|
||||
if(ridden.has_gravity())
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
/datum/riding/space/Process_Spacemove(direction)
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
// SUBTYPES
|
||||
|
||||
// I'm on a
|
||||
/datum/riding/boat
|
||||
keytype = /obj/item/weapon/oar
|
||||
key_name = "an oar"
|
||||
nonhuman_key_exemption = TRUE // Borgs can't hold oars.
|
||||
only_one_driver = TRUE // Would be pretty crazy if five people try to move at the same time.
|
||||
|
||||
/datum/riding/boat/handle_ride(mob/user, direction)
|
||||
var/turf/next = get_step(ridden, direction)
|
||||
var/turf/current = get_turf(ridden)
|
||||
|
||||
if(istype(next, /turf/simulated/floor/water) || istype(current, /turf/simulated/floor/water)) //We can move from land to water, or water to land, but not from land to land
|
||||
..()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Boats don't go on land!</span>")
|
||||
return FALSE
|
||||
|
||||
/datum/riding/boat/small // 'Small' boats can hold up to two people.
|
||||
|
||||
/datum/riding/boat/small/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
var/H = 7 // Horizontal seperation.
|
||||
var/V = 5 // Vertical seperation.
|
||||
var/O = 2 // Vertical offset.
|
||||
switch(pass_index)
|
||||
if(1) // Person in front.
|
||||
return list(
|
||||
"[NORTH]" = list( 0, O+V, MOB_LAYER),
|
||||
"[SOUTH]" = list( 0, O, ABOVE_MOB_LAYER),
|
||||
"[EAST]" = list( H, O, MOB_LAYER),
|
||||
"[WEST]" = list(-H, O, MOB_LAYER)
|
||||
)
|
||||
if(2) // Person in back.
|
||||
return list(
|
||||
"[NORTH]" = list( 0, O, ABOVE_MOB_LAYER),
|
||||
"[SOUTH]" = list( 0, O+V, MOB_LAYER),
|
||||
"[EAST]" = list(-H, O, MOB_LAYER),
|
||||
"[WEST]" = list( H, O, MOB_LAYER)
|
||||
)
|
||||
else
|
||||
return null // This will runtime, but we want that since this is out of bounds.
|
||||
|
||||
/datum/riding/boat/small/handle_vehicle_layer()
|
||||
ridden.layer = ABOVE_MOB_LAYER
|
||||
|
||||
/datum/riding/boat/big // 'Big' boats can hold up to five people.
|
||||
|
||||
/datum/riding/boat/big/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
var/H = 12 // Horizontal seperation. Halved when facing up-down.
|
||||
var/V = 4 // Vertical seperation.
|
||||
var/O = 7 // Vertical offset.
|
||||
switch(pass_index)
|
||||
if(1) // Person in center front, first row.
|
||||
return list(
|
||||
"[NORTH]" = list( 0, O+V, MOB_LAYER+0.1),
|
||||
"[SOUTH]" = list( 0, O-V, MOB_LAYER+0.3),
|
||||
"[EAST]" = list( H, O, MOB_LAYER+0.1),
|
||||
"[WEST]" = list(-H, O, MOB_LAYER+0.1)
|
||||
)
|
||||
if(2) // Person in left, second row.
|
||||
return list(
|
||||
"[NORTH]" = list( H/2, O, MOB_LAYER+0.2),
|
||||
"[SOUTH]" = list(-H/2, O, MOB_LAYER+0.2),
|
||||
"[EAST]" = list( 0, O-V, MOB_LAYER+0.2),
|
||||
"[WEST]" = list( 0, O+V, MOB_LAYER)
|
||||
)
|
||||
if(3) // Person in right, second row.
|
||||
return list(
|
||||
"[NORTH]" = list(-H/2, O, MOB_LAYER+0.2),
|
||||
"[SOUTH]" = list( H/2, O, MOB_LAYER+0.2),
|
||||
"[EAST]" = list( 0, O+V, MOB_LAYER),
|
||||
"[WEST]" = list( 0, O-V, MOB_LAYER+0.2)
|
||||
)
|
||||
if(4) // Person in left, third row.
|
||||
return list(
|
||||
"[NORTH]" = list( H/2, O-V, MOB_LAYER+0.3),
|
||||
"[SOUTH]" = list(-H/2, O+V, MOB_LAYER+0.1),
|
||||
"[EAST]" = list(-H, O-V, MOB_LAYER+0.2),
|
||||
"[WEST]" = list( H, O+V, MOB_LAYER)
|
||||
)
|
||||
if(5) // Person in right, third row.
|
||||
return list(
|
||||
"[NORTH]" = list(-H/2, O-V, MOB_LAYER+0.3),
|
||||
"[SOUTH]" = list( H/2, O+V, MOB_LAYER+0.1),
|
||||
"[EAST]" = list(-H, O+V, MOB_LAYER),
|
||||
"[WEST]" = list( H, O-V, MOB_LAYER+0.2)
|
||||
)
|
||||
else
|
||||
return null // This will runtime, but we want that since this is out of bounds.
|
||||
|
||||
/datum/riding/boat/big/handle_vehicle_layer()
|
||||
ridden.layer = MOB_LAYER+0.4
|
||||
|
||||
/datum/riding/boat/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
return list("[NORTH]" = list(1, 2), "[SOUTH]" = list(1, 2), "[EAST]" = list(1, 2), "[WEST]" = list(1, 2))
|
||||
@@ -96,7 +96,7 @@
|
||||
/obj/item/clothing/glasses/thermal/syndi,
|
||||
/obj/item/weapon/card/emag,
|
||||
/obj/item/ammo_magazine/m45/ap,
|
||||
/obj/item/weapon/material/hatchet/tacknife/combatknife,
|
||||
/obj/item/weapon/material/knife/tacknife/combatknife,
|
||||
/obj/item/clothing/mask/balaclava
|
||||
)
|
||||
)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 2,
|
||||
/obj/item/weapon/material/hatchet,
|
||||
/obj/item/weapon/material/knife/machete/hatchet,
|
||||
/obj/item/weapon/material/minihoe,
|
||||
/obj/item/device/analyzer/plant_analyzer,
|
||||
/obj/item/clothing/gloves/botanic_leather,
|
||||
@@ -110,7 +110,7 @@
|
||||
/datum/supply_packs/hydro/weedcontrol
|
||||
name = "Weed control crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/material/hatchet = 2,
|
||||
/obj/item/weapon/material/knife/machete/hatchet = 2,
|
||||
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
|
||||
/obj/item/clothing/mask/gas = 2,
|
||||
/obj/item/weapon/grenade/chem_grenade/antiweed = 2,
|
||||
|
||||
@@ -10,10 +10,19 @@
|
||||
name = ".357 Speedloader"
|
||||
path = /obj/item/ammo_magazine/s357
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm_compact
|
||||
name = "Compact Pistol Magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mm/compact
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm
|
||||
name = "Pistol Magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mm
|
||||
|
||||
/datum/uplink_item/item/ammo/mc9mm_large
|
||||
name = "Large Capacity Pistol Magazine (9mm)"
|
||||
path = /obj/item/ammo_magazine/m9mm/large
|
||||
item_cost = 40
|
||||
|
||||
/datum/uplink_item/item/ammo/c45m
|
||||
name = "Pistol Magazine (.45)"
|
||||
path = /obj/item/ammo_magazine/m45
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
/datum/uplink_item/item/visible_weapons/tactknife
|
||||
name = "Tactical Knife"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/material/hatchet/tacknife
|
||||
path = /obj/item/weapon/material/knife/tacknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/combatknife
|
||||
name = "Combat Knife"
|
||||
item_cost = 20
|
||||
path = /obj/item/weapon/material/hatchet/tacknife/combatknife
|
||||
path = /obj/item/weapon/material/knife/tacknife/combatknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword
|
||||
name = "Energy Sword, Random"
|
||||
@@ -44,11 +44,21 @@
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/melee/energy/sword/pirate
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_spear
|
||||
name = "Energy Spear"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/melee/energy/spear
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/claymore
|
||||
name = "Claymore"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/material/sword
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/chainsaw
|
||||
name = "Chainsaw"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/chainsaw
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/katana
|
||||
name = "Katana"
|
||||
item_cost = 40
|
||||
@@ -89,6 +99,16 @@
|
||||
item_cost = 70
|
||||
path = /obj/item/weapon/gun/projectile/revolver/judge
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/pistol_standard_capacity
|
||||
name = "9mm Pistol"
|
||||
item_cost = 40
|
||||
path = /obj/item/weapon/gun/projectile/p92x
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/pistol_large_capacity
|
||||
name = "9mm Pistol (with large capacity magazine)"
|
||||
item_cost = 70
|
||||
path = /obj/item/weapon/gun/projectile/p92x/large
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/lemat
|
||||
name = "LeMat"
|
||||
item_cost = 60
|
||||
|
||||
@@ -91,6 +91,7 @@ var/datum/antagonist/raider/raiders
|
||||
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn,
|
||||
/obj/item/weapon/gun/projectile/colt/detective,
|
||||
/obj/item/weapon/gun/projectile/pistol,
|
||||
/obj/item/weapon/gun/projectile/p92x,
|
||||
/obj/item/weapon/gun/projectile/revolver,
|
||||
/obj/item/weapon/gun/projectile/pirate,
|
||||
/obj/item/weapon/gun/projectile/revolver/judge,
|
||||
|
||||
@@ -45,6 +45,7 @@ var/datum/antagonist/renegade/renegades
|
||||
/obj/item/weapon/gun/projectile/sec/wood,
|
||||
/obj/item/weapon/gun/projectile/silenced,
|
||||
/obj/item/weapon/gun/projectile/pistol,
|
||||
/obj/item/weapon/gun/projectile/p92x,
|
||||
/obj/item/weapon/gun/projectile/revolver,
|
||||
/obj/item/weapon/gun/projectile/derringer,
|
||||
/obj/item/weapon/gun/projectile/shotgun/pump,
|
||||
|
||||
@@ -309,7 +309,7 @@ var/list/mob/living/forced_ambiance_list = new
|
||||
for(var/obj/machinery/door/window/temp_windoor in src)
|
||||
temp_windoor.open()
|
||||
|
||||
/area/proc/has_gravity()
|
||||
/area/has_gravity()
|
||||
return has_gravity
|
||||
|
||||
/area/space/has_gravity()
|
||||
|
||||
+10
-72
@@ -127,78 +127,6 @@
|
||||
found += A.search_contents_for(path,filter_path)
|
||||
return found
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Beam code by Gunbuddy
|
||||
|
||||
Beam() proc will only allow one beam to come from a source at a time. Attempting to call it more than
|
||||
once at a time per source will cause graphical errors.
|
||||
Also, the icon used for the beam will have to be vertical and 32x32.
|
||||
The math involved assumes that the icon is vertical to begin with so unless you want to adjust the math,
|
||||
its easier to just keep the beam vertical.
|
||||
*/
|
||||
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10)
|
||||
//BeamTarget represents the target for the beam, basically just means the other end.
|
||||
//Time is the duration to draw the beam
|
||||
//Icon is obviously which icon to use for the beam, default is beam.dmi
|
||||
//Icon_state is what icon state is used. Default is b_beam which is a blue beam.
|
||||
//Maxdistance is the longest range the beam will persist before it gives up.
|
||||
var/EndTime=world.time+time
|
||||
while(BeamTarget&&world.time<EndTime&&get_dist(src,BeamTarget)<maxdistance&&z==BeamTarget.z)
|
||||
//If the BeamTarget gets deleted, the time expires, or the BeamTarget gets out
|
||||
//of range or to another z-level, then the beam will stop. Otherwise it will
|
||||
//continue to draw.
|
||||
|
||||
set_dir(get_dir(src,BeamTarget)) //Causes the source of the beam to rotate to continuosly face the BeamTarget.
|
||||
|
||||
for(var/obj/effect/overlay/beam/O in orange(10,src)) //This section erases the previously drawn beam because I found it was easier to
|
||||
if(O.BeamSource==src) //just draw another instance of the beam instead of trying to manipulate all the
|
||||
qdel(O) //pieces to a new orientation.
|
||||
var/Angle=round(Get_Angle(src,BeamTarget))
|
||||
var/icon/I=new(icon,icon_state)
|
||||
I.Turn(Angle)
|
||||
var/DX=(32*BeamTarget.x+BeamTarget.pixel_x)-(32*x+pixel_x)
|
||||
var/DY=(32*BeamTarget.y+BeamTarget.pixel_y)-(32*y+pixel_y)
|
||||
var/N=0
|
||||
var/length=round(sqrt((DX)**2+(DY)**2))
|
||||
for(N,N<length,N+=32)
|
||||
var/obj/effect/overlay/beam/X=new(loc)
|
||||
X.BeamSource=src
|
||||
if(N+32>length)
|
||||
var/icon/II=new(icon,icon_state)
|
||||
II.DrawBox(null,1,(length-N),32,32)
|
||||
II.Turn(Angle)
|
||||
X.icon=II
|
||||
else X.icon=I
|
||||
var/Pixel_x=round(sin(Angle)+32*sin(Angle)*(N+16)/32)
|
||||
var/Pixel_y=round(cos(Angle)+32*cos(Angle)*(N+16)/32)
|
||||
if(DX==0) Pixel_x=0
|
||||
if(DY==0) Pixel_y=0
|
||||
if(Pixel_x>32)
|
||||
for(var/a=0, a<=Pixel_x,a+=32)
|
||||
X.x++
|
||||
Pixel_x-=32
|
||||
if(Pixel_x<-32)
|
||||
for(var/a=0, a>=Pixel_x,a-=32)
|
||||
X.x--
|
||||
Pixel_x+=32
|
||||
if(Pixel_y>32)
|
||||
for(var/a=0, a<=Pixel_y,a+=32)
|
||||
X.y++
|
||||
Pixel_y-=32
|
||||
if(Pixel_y<-32)
|
||||
for(var/a=0, a>=Pixel_y,a-=32)
|
||||
X.y--
|
||||
Pixel_y+=32
|
||||
X.pixel_x=Pixel_x
|
||||
X.pixel_y=Pixel_y
|
||||
sleep(3) //Changing this to a lower value will cause the beam to follow more smoothly with movement, but it will also be more laggy.
|
||||
//I've found that 3 ticks provided a nice balance for my use.
|
||||
for(var/obj/effect/overlay/beam/O in orange(10,src)) if(O.BeamSource==src) qdel(O)
|
||||
|
||||
|
||||
//All atoms
|
||||
/atom/proc/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
|
||||
//This reformat names to get a/an properly working on item descriptions when they are bloody
|
||||
@@ -519,3 +447,13 @@ its easier to just keep the beam vertical.
|
||||
|
||||
/atom/proc/InsertedContents()
|
||||
return contents
|
||||
|
||||
/atom/proc/has_gravity(turf/T)
|
||||
if(!T || !isturf(T))
|
||||
T = get_turf(src)
|
||||
if(istype(T, /turf/space)) // Turf never has gravity
|
||||
return FALSE
|
||||
var/area/A = get_area(T)
|
||||
if(A && A.has_gravity())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -93,6 +93,8 @@
|
||||
AM.Crossed(src)
|
||||
if(is_new_area && is_destination_turf)
|
||||
destination.loc.Entered(src, origin)
|
||||
|
||||
Moved(origin)
|
||||
return 1
|
||||
|
||||
//called when src is thrown into hit_atom
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/datum/power/changeling/enrage
|
||||
name = "Enrage"
|
||||
desc = "We evolve modifications to our mind and body, allowing us to call on intense periods of rage for our benefit."
|
||||
helptext = "Berserks us, giving massive bonuses to fighting in close quarters for thirty seconds, and losing the ability to \
|
||||
be accurate at ranged while active. Afterwards, we will suffer extreme amounts of exhaustion for a period of two minutes, \
|
||||
during which we will be much weaker and slower than before. We cannot berserk again while exhausted. This ability requires \
|
||||
a significant amount of nutrition to use, and cannot be used if too hungry. Using this ability will end most forms of disables."
|
||||
enhancedtext = "The length of exhaustion after berserking is reduced to one minute, from two, and requires half as much nutrition."
|
||||
ability_icon_state = "ling_berserk"
|
||||
genomecost = 2
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/living/proc/changeling_berserk
|
||||
|
||||
// Makes the ling very upset.
|
||||
/mob/living/proc/changeling_berserk()
|
||||
set category = "Changeling"
|
||||
set name = "Enrage (30)"
|
||||
set desc = "Causes you to go Berserk."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(30,0,100)
|
||||
if(!changeling)
|
||||
return 0
|
||||
|
||||
var/modifier_to_use = /datum/modifier/berserk/changeling
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
modifier_to_use = /datum/modifier/berserk/changeling/recursive
|
||||
to_chat(src, "<span class='notice'>We optimize our levels of anger, which will avoid excessive stress on ourselves.</span>")
|
||||
|
||||
if(add_modifier(modifier_to_use, 30 SECONDS))
|
||||
changeling.chem_charges -= 30
|
||||
|
||||
feedback_add_details("changeling_powers","EN")
|
||||
return 1
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
//luminosity = 5
|
||||
//l_color="#0066FF"
|
||||
layer = LIGHTING_LAYER+1
|
||||
plane = PLANE_LIGHTING_ABOVE
|
||||
|
||||
var/spawned=0 // DIR mask
|
||||
var/next_check=0
|
||||
|
||||
@@ -514,9 +514,9 @@ proc/get_nt_opposed()
|
||||
var/list/dudes = list()
|
||||
for(var/mob/living/carbon/human/man in player_list)
|
||||
if(man.client)
|
||||
if(man.client.prefs.nanotrasen_relation == COMPANY_OPPOSED)
|
||||
if(man.client.prefs.economic_status == CLASS_LOWER)
|
||||
dudes += man
|
||||
else if(man.client.prefs.nanotrasen_relation == COMPANY_SKEPTICAL && prob(50))
|
||||
else if(man.client.prefs.economic_status == CLASS_LOWMID && prob(50))
|
||||
dudes += man
|
||||
if(dudes.len == 0) return null
|
||||
return pick(dudes)
|
||||
|
||||
@@ -25,5 +25,6 @@
|
||||
/obj/effect/temporary_effect/darkness
|
||||
name = "darkness"
|
||||
time_to_die = 2 MINUTES
|
||||
new_light_range = 6
|
||||
new_light_power = -20
|
||||
invisibility = 101
|
||||
light_range = 6
|
||||
light_power = -20
|
||||
@@ -26,13 +26,11 @@
|
||||
/obj/effect/temporary_effect/destablize
|
||||
name = "destablizing disturbance"
|
||||
desc = "This can't be good..."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "blueshatter"
|
||||
time_to_die = null
|
||||
invisibility = 0
|
||||
new_light_range = 6
|
||||
new_light_power = 20
|
||||
new_light_color = "#C26DDE"
|
||||
light_range = 6
|
||||
light_power = 20
|
||||
light_color = "#C26DDE"
|
||||
var/pulses_remaining = 40 // Lasts 20 seconds.
|
||||
var/instability_power = 5
|
||||
var/instability_range = 6
|
||||
|
||||
@@ -22,13 +22,11 @@
|
||||
/obj/effect/temporary_effect/fire_blast
|
||||
name = "fire blast"
|
||||
desc = "Run!"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "at_shield1"
|
||||
time_to_die = 2.5 SECONDS // After which we go boom.
|
||||
invisibility = 0
|
||||
new_light_range = 4
|
||||
new_light_power = 5
|
||||
new_light_color = "#FF6A00"
|
||||
light_range = 4
|
||||
light_power = 5
|
||||
light_color = "#FF6A00"
|
||||
|
||||
/obj/effect/temporary_effect/fire_blast/Destroy()
|
||||
explosion(get_turf(src), -1, 1, 2, 5, adminlog = 1)
|
||||
|
||||
@@ -28,13 +28,11 @@
|
||||
/obj/effect/temporary_effect/pulsar
|
||||
name = "pulsar"
|
||||
desc = "Not a real pulsar, but still emits loads of EMP."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "shield2"
|
||||
time_to_die = null
|
||||
invisibility = 0
|
||||
new_light_range = 4
|
||||
new_light_power = 5
|
||||
new_light_color = "#2ECCFA"
|
||||
light_range = 4
|
||||
light_power = 5
|
||||
light_color = "#2ECCFA"
|
||||
var/pulses_remaining = 3
|
||||
|
||||
/obj/effect/temporary_effect/pulsar/New()
|
||||
|
||||
@@ -6,22 +6,6 @@
|
||||
aspect = null
|
||||
var/obj/effect/spawner_type = null
|
||||
|
||||
/obj/effect/temporary_effect
|
||||
name = "self deleting effect"
|
||||
desc = "How are you examining what which cannot be seen?"
|
||||
invisibility = 101
|
||||
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
|
||||
var/new_light_range = 6
|
||||
var/new_light_power = 6
|
||||
var/new_light_color = "#FFFFFF"
|
||||
|
||||
/obj/effect/temporary_effect/New()
|
||||
..()
|
||||
set_light(new_light_range, new_light_power, l_color = new_light_color)
|
||||
if(time_to_die)
|
||||
spawn(time_to_die)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spell/spawner/on_ranged_cast(atom/hit_atom, mob/user)
|
||||
var/turf/T = get_turf(hit_atom)
|
||||
if(T)
|
||||
|
||||
@@ -51,17 +51,17 @@
|
||||
if(!account_allowed || (H.mind && H.mind.initial_account))
|
||||
return
|
||||
|
||||
var/loyalty = 1
|
||||
var/income = 1
|
||||
if(H.client)
|
||||
switch(H.client.prefs.nanotrasen_relation)
|
||||
if(COMPANY_LOYAL) loyalty = 1.30
|
||||
if(COMPANY_SUPPORTATIVE)loyalty = 1.15
|
||||
if(COMPANY_NEUTRAL) loyalty = 1
|
||||
if(COMPANY_SKEPTICAL) loyalty = 0.85
|
||||
if(COMPANY_OPPOSED) loyalty = 0.70
|
||||
switch(H.client.prefs.economic_status)
|
||||
if(CLASS_UPPER) income = 1.30
|
||||
if(CLASS_UPMID) income = 1.15
|
||||
if(CLASS_MIDDLE) income = 1
|
||||
if(CLASS_LOWMID) income = 0.75
|
||||
if(CLASS_LOWER) income = 0.50
|
||||
|
||||
//give them an account in the station database
|
||||
var/money_amount = (rand(15,40) + rand(15,40)) * loyalty * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks.
|
||||
var/money_amount = (rand(15,40) + rand(15,40)) * income * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks.
|
||||
var/datum/money_account/M = create_account(H.real_name, money_amount, null)
|
||||
if(H.mind)
|
||||
var/remembered_info = ""
|
||||
|
||||
@@ -483,7 +483,7 @@ var/global/datum/controller/occupations/job_master
|
||||
H.buckled = W
|
||||
H.update_canmove()
|
||||
W.set_dir(H.dir)
|
||||
W.buckled_mob = H
|
||||
W.buckled_mobs |= H
|
||||
W.add_fingerprint(H)
|
||||
if(R)
|
||||
W.color = R.color
|
||||
|
||||
@@ -31,7 +31,8 @@
|
||||
|
||||
/obj/machinery/light_switch/proc/updateicon()
|
||||
if(!overlay)
|
||||
overlay = image(icon, "light1-overlay", LIGHTING_LAYER+0.1)
|
||||
overlay = image(icon, "light1-overlay")
|
||||
overlay.plane = PLANE_LIGHTING_ABOVE
|
||||
|
||||
overlays.Cut()
|
||||
if(stat & NOPOWER)
|
||||
|
||||
@@ -985,7 +985,7 @@
|
||||
products = list(
|
||||
/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/material/knife = 3,
|
||||
/obj/item/weapon/material/kitchen/rollingpin = 2,
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
products = list(
|
||||
/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/material/knife = 3,
|
||||
/obj/item/weapon/material/kitchen/rollingpin = 2,
|
||||
@@ -60,7 +60,7 @@
|
||||
icon_deny = "boozeomat-deny"
|
||||
products = list(/obj/item/weapon/tray = 8,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tomatosoup = 8,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/mushroomsoup = 8,
|
||||
@@ -94,7 +94,7 @@
|
||||
icon_deny = "boozeomat-deny"
|
||||
products = list(/obj/item/weapon/tray = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife = 6,
|
||||
/obj/item/weapon/material/knife/plastic = 6,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup = 3,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 3,
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
//loading
|
||||
if(istype(target,/obj))
|
||||
var/obj/O = target
|
||||
if(O.buckled_mob)
|
||||
if(O.has_buckled_mobs())
|
||||
return
|
||||
if(locate(/mob/living) in O)
|
||||
occupant_message("<span class='warning'>You can't load living things into the cargo compartment.</span>")
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
var/speed = 1
|
||||
var/mat_efficiency = 1
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0)
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0)
|
||||
var/res_max_amount = 200000
|
||||
|
||||
var/datum/research/files
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
var/speed = 1
|
||||
var/mat_efficiency = 1
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0)
|
||||
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "plastic" = 0, "gold" = 0, "silver" = 0, "osmium" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0, "plasteel" = 0)
|
||||
var/res_max_amount = 200000
|
||||
|
||||
var/datum/research/files
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#define MELEE 1
|
||||
#define RANGED 2
|
||||
|
||||
|
||||
/obj/mecha
|
||||
name = "Mecha"
|
||||
desc = "Exosuit"
|
||||
@@ -1051,6 +1050,17 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/mecha/MouseDrop_T(mob/O, mob/user as mob)
|
||||
//Humans can pilot mechs.
|
||||
if(!ishuman(O))
|
||||
return
|
||||
|
||||
//Can't put other people into mechs (can comment this out if you want that to be possible)
|
||||
if(O != user)
|
||||
return
|
||||
|
||||
move_inside()
|
||||
|
||||
/obj/mecha/verb/move_inside()
|
||||
set category = "Object"
|
||||
set name = "Enter Exosuit"
|
||||
@@ -1060,17 +1070,17 @@
|
||||
return
|
||||
|
||||
if (usr.buckled)
|
||||
usr << "<span class='warning'>You can't climb into the exosuit while buckled!</span>"
|
||||
to_chat(usr,"<span class='warning'>You can't climb into the exosuit while buckled!</span>")
|
||||
return
|
||||
|
||||
src.log_message("[usr] tries to move in.")
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
if(C.handcuffed)
|
||||
usr << "<span class='danger'>Kinda hard to climb in while handcuffed don't you think?</span>"
|
||||
to_chat(usr,"<span class='danger'>Kinda hard to climb in while handcuffed don't you think?</span>")
|
||||
return
|
||||
if (src.occupant)
|
||||
usr << "<span class='danger'>The [src.name] is already occupied!</span>"
|
||||
to_chat(usr,"<span class='danger'>The [src.name] is already occupied!</span>")
|
||||
src.log_append_to_last("Permission denied.")
|
||||
return
|
||||
/*
|
||||
@@ -1085,12 +1095,12 @@
|
||||
else if(src.operation_allowed(usr))
|
||||
passed = 1
|
||||
if(!passed)
|
||||
usr << "<span class='warning'>Access denied</span>"
|
||||
to_chat(usr,"<span class='warning'>Access denied</span>")
|
||||
src.log_append_to_last("Permission denied.")
|
||||
return
|
||||
for(var/mob/living/simple_animal/slime/M in range(1,usr))
|
||||
if(M.victim == usr)
|
||||
usr << "You're too busy getting your life sucked out of you."
|
||||
to_chat(usr,"You're too busy getting your life sucked out of you.")
|
||||
return
|
||||
// usr << "You start climbing into [src.name]"
|
||||
|
||||
@@ -1100,9 +1110,9 @@
|
||||
if(!src.occupant)
|
||||
moved_inside(usr)
|
||||
else if(src.occupant!=usr)
|
||||
usr << "[src.occupant] was faster. Try better next time, loser."
|
||||
to_chat(usr,"[src.occupant] was faster. Try better next time, loser.")
|
||||
else
|
||||
usr << "You stop entering the exosuit."
|
||||
to_chat(usr,"You stop entering the exosuit.")
|
||||
return
|
||||
|
||||
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/obj/item/weapon/banner
|
||||
name = "banner"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "banner"
|
||||
desc = "A banner that's invisible because it shouldn't exist."
|
||||
|
||||
/obj/item/weapon/banner/red
|
||||
name = "red banner"
|
||||
icon_state = "banner-red"
|
||||
desc = "A red colored banner."
|
||||
|
||||
/obj/item/weapon/banner/blue
|
||||
name = "blue banner"
|
||||
icon_state = "banner-blue"
|
||||
desc = "A blue colored banner."
|
||||
|
||||
/obj/item/weapon/banner/green
|
||||
name = "green banner"
|
||||
icon_state = "banner-green"
|
||||
desc = "A green colored banner."
|
||||
|
||||
/obj/item/weapon/banner/nt
|
||||
name = "\improper NanoTrasen banner"
|
||||
icon_state = "banner-nt"
|
||||
desc = "A banner with NanoTrasen's logo on it."
|
||||
|
||||
/obj/item/weapon/banner/solgov
|
||||
name = "\improper SolGov banner"
|
||||
icon_state = "banner-solgov"
|
||||
desc = "A banner with the symbol of the Solar Confederate Government."
|
||||
|
||||
/obj/item/weapon/banner/virgov
|
||||
name = "\improper VirGov banner"
|
||||
icon_state = "banner-virgov"
|
||||
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as SifGov."
|
||||
@@ -6,26 +6,44 @@
|
||||
var/buckle_dir = 0
|
||||
var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1
|
||||
var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes
|
||||
var/mob/living/buckled_mob = null
|
||||
// var/mob/living/buckled_mob = null
|
||||
var/list/mob/living/buckled_mobs = null //list()
|
||||
var/max_buckled_mobs = 1
|
||||
|
||||
|
||||
/atom/movable/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(can_buckle && buckled_mob)
|
||||
user_unbuckle_mob(user)
|
||||
// if(can_buckle && buckled_mob)
|
||||
// user_unbuckle_mob(user)
|
||||
|
||||
if(can_buckle && has_buckled_mobs())
|
||||
if(buckled_mobs.len > 1)
|
||||
var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs
|
||||
if(user_unbuckle_mob(unbuckled, user))
|
||||
return TRUE
|
||||
else
|
||||
if(user_unbuckle_mob(buckled_mobs[1], user))
|
||||
return TRUE
|
||||
|
||||
/obj/proc/attack_alien(mob/user as mob) //For calling in the event of Xenomorph or other alien checks.
|
||||
return
|
||||
|
||||
/obj/attack_robot(mob/living/user)
|
||||
if(Adjacent(user) && buckled_mob) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
|
||||
if(Adjacent(user) && has_buckled_mobs()) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
|
||||
return attack_hand(user) //Process as if we're a normal person touching the object.
|
||||
return ..() //Otherwise, treat this as an AI click like usual.
|
||||
|
||||
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
. = ..()
|
||||
if(can_buckle && istype(M))
|
||||
user_buckle_mob(M, user)
|
||||
if(user_buckle_mob(M, user))
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/has_buckled_mobs()
|
||||
if(!buckled_mobs)
|
||||
return FALSE
|
||||
if(buckled_mobs.len)
|
||||
return TRUE
|
||||
|
||||
/atom/movable/Destroy()
|
||||
unbuckle_mob()
|
||||
@@ -33,52 +51,81 @@
|
||||
|
||||
|
||||
/atom/movable/proc/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
|
||||
if((!can_buckle && !forced) || !istype(M) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained()))
|
||||
return 0
|
||||
if(!buckled_mobs)
|
||||
buckled_mobs = list()
|
||||
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
|
||||
if(check_loc && M.loc != loc)
|
||||
return 0
|
||||
if(buckled_mob) //Handles trying to buckle yourself to the chair when someone is on it
|
||||
M << "<span class='notice'>\The [src] already has someone buckled to it.</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if((!can_buckle && !forced) || M.buckled || M.pinned.len || (buckled_mobs.len >= max_buckled_mobs) || (buckle_require_restraints && !M.restrained()))
|
||||
return FALSE
|
||||
|
||||
if(has_buckled_mobs() && buckled_mobs.len >= max_buckled_mobs) //Handles trying to buckle yourself to the chair when someone is on it
|
||||
to_chat(M, "<span class='notice'>\The [src] can't buckle anymore people.</span>")
|
||||
return FALSE
|
||||
|
||||
M.buckled = src
|
||||
M.facing_dir = null
|
||||
M.set_dir(buckle_dir ? buckle_dir : dir)
|
||||
M.update_canmove()
|
||||
M.update_floating( M.Check_Dense_Object() )
|
||||
buckled_mob = M
|
||||
// buckled_mob = M
|
||||
buckled_mobs |= M
|
||||
|
||||
post_buckle_mob(M)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/atom/movable/proc/unbuckle_mob(mob/living/buckled_mob, force = FALSE)
|
||||
if(!buckled_mob) // If we didn't get told which mob needs to get unbuckled, just assume its the first one on the list.
|
||||
if(has_buckled_mobs())
|
||||
buckled_mob = buckled_mobs[1]
|
||||
else
|
||||
return
|
||||
|
||||
/atom/movable/proc/unbuckle_mob()
|
||||
if(buckled_mob && buckled_mob.buckled == src)
|
||||
. = buckled_mob
|
||||
buckled_mob.buckled = null
|
||||
buckled_mob.anchored = initial(buckled_mob.anchored)
|
||||
buckled_mob.update_canmove()
|
||||
buckled_mob.update_floating( buckled_mob.Check_Dense_Object() )
|
||||
buckled_mob = null
|
||||
// buckled_mob = null
|
||||
buckled_mobs -= buckled_mob
|
||||
|
||||
post_buckle_mob(.)
|
||||
|
||||
/atom/movable/proc/unbuckle_all_mobs(force = FALSE)
|
||||
if(!has_buckled_mobs())
|
||||
return
|
||||
for(var/m in buckled_mobs)
|
||||
unbuckle_mob(m, force)
|
||||
|
||||
//Handle any extras after buckling/unbuckling
|
||||
//Called on buckle_mob() and unbuckle_mob()
|
||||
/atom/movable/proc/post_buckle_mob(mob/living/M)
|
||||
return
|
||||
|
||||
//Wrapper procs that handle sanity and user feedback
|
||||
/atom/movable/proc/user_buckle_mob(mob/living/M, mob/user, var/forced = FALSE, var/silent = FALSE)
|
||||
if(!ticker)
|
||||
user << "<span class='warning'>You can't buckle anyone in before the game starts.</span>"
|
||||
return FALSE // Is this really needed?
|
||||
if(!user.Adjacent(M) || user.restrained() || user.stat || istype(user, /mob/living/silicon/pai))
|
||||
return
|
||||
if(M == buckled_mob)
|
||||
return
|
||||
return FALSE
|
||||
if(M in buckled_mobs)
|
||||
to_chat(user, "<span class='warning'>\The [M] is already buckled to \the [src].</span>")
|
||||
return FALSE
|
||||
|
||||
add_fingerprint(user)
|
||||
unbuckle_mob()
|
||||
// unbuckle_mob()
|
||||
|
||||
//can't buckle unless you share locs so try to move M to the obj.
|
||||
if(M.loc != src.loc)
|
||||
step_towards(M, src)
|
||||
if(M.Adjacent(src) && user.Adjacent(src))
|
||||
M.forceMove(get_turf(src))
|
||||
// step_towards(M, src)
|
||||
|
||||
. = buckle_mob(M, forced)
|
||||
if(.)
|
||||
@@ -94,8 +141,8 @@
|
||||
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
|
||||
"<span class='notice'>You hear metal clanking.</span>")
|
||||
|
||||
/atom/movable/proc/user_unbuckle_mob(mob/user)
|
||||
var/mob/living/M = unbuckle_mob()
|
||||
/atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
|
||||
var/mob/living/M = unbuckle_mob(buckled_mob)
|
||||
if(M)
|
||||
if(M != user)
|
||||
M.visible_message(\
|
||||
@@ -111,18 +158,20 @@
|
||||
return M
|
||||
|
||||
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
|
||||
if(buckled_mob)
|
||||
// if(!buckled_mob.Move(newloc, direct))
|
||||
if(!buckled_mob.forceMove(newloc, direct))
|
||||
loc = buckled_mob.loc
|
||||
last_move = buckled_mob.last_move
|
||||
buckled_mob.inertia_dir = last_move
|
||||
return FALSE
|
||||
else
|
||||
buckled_mob.set_dir(dir)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
// if(!L.Move(newloc, direct))
|
||||
if(!L.forceMove(newloc, direct))
|
||||
loc = L.loc
|
||||
last_move = L.last_move
|
||||
L.inertia_dir = last_move
|
||||
return FALSE
|
||||
else
|
||||
L.set_dir(dir)
|
||||
return TRUE
|
||||
|
||||
/atom/movable/Move(atom/newloc, direct = 0)
|
||||
. = ..()
|
||||
if(. && buckled_mob && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
|
||||
if(. && has_buckled_mobs() && !handle_buckled_mob_movement(newloc, direct)) //movement failed due to buckled mob(s)
|
||||
. = 0
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
anchored = 1
|
||||
var/amount = 1
|
||||
|
||||
/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=0)
|
||||
/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=1)
|
||||
if(!nologs)
|
||||
message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[newLoc.x];Y=[newLoc.y];Z=[newLoc.z]'>JMP</a>)")
|
||||
log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
|
||||
|
||||
@@ -7,6 +7,19 @@
|
||||
density = 1
|
||||
anchored = 0
|
||||
|
||||
/obj/effect/temporary_effect
|
||||
name = "self deleting effect"
|
||||
desc = "How are you examining what which cannot be seen?"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
invisibility = 0
|
||||
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
|
||||
|
||||
/obj/effect/temporary_effect/New()
|
||||
..()
|
||||
if(time_to_die)
|
||||
spawn(time_to_die)
|
||||
qdel(src)
|
||||
|
||||
// Shown really briefly when attacking with axes.
|
||||
/obj/effect/temporary_effect/cleave_attack
|
||||
name = "cleaving attack"
|
||||
@@ -16,12 +29,19 @@
|
||||
layer = 6
|
||||
time_to_die = 6
|
||||
alpha = 140
|
||||
invisibility = 0
|
||||
mouse_opacity = 0
|
||||
new_light_range = 0
|
||||
new_light_power = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/temporary_effect/cleave_attack/initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself.
|
||||
animate(src, alpha = 0, time = time_to_die - 1)
|
||||
|
||||
/obj/effect/temporary_effect/shuttle_landing
|
||||
name = "shuttle landing"
|
||||
desc = "You better move if you don't want to go splat!"
|
||||
icon_state = "shuttle_warning_still"
|
||||
time_to_die = 4.9 SECONDS
|
||||
|
||||
/obj/effect/temporary_effect/shuttle_landing/initialize()
|
||||
flick("shuttle_warning", src) // flick() forces the animation to always begin at the start.
|
||||
..()
|
||||
@@ -158,7 +158,7 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
|
||||
var/safety = 100 // Infinite loop protection.
|
||||
while(!T && safety)
|
||||
var/turf/simulated/candidate = pick(planet.planet_floors)
|
||||
if(!istype(candidate) || istype(candidate, /turf/simulated/sky))
|
||||
if(!istype(candidate) || istype(candidate, /turf/simulated/sky) || !T.outdoors)
|
||||
safety--
|
||||
continue
|
||||
else
|
||||
|
||||
@@ -234,7 +234,9 @@
|
||||
// apparently called whenever an item is removed from a slot, container, or anything else.
|
||||
/obj/item/proc/dropped(mob/user as mob)
|
||||
..()
|
||||
if(zoom) zoom() //binoculars, scope, etc
|
||||
if(zoom)
|
||||
zoom() //binoculars, scope, etc
|
||||
appearance_flags &= ~NO_CLIENT_COLOR
|
||||
|
||||
// called just as an item is picked up (loc is not yet changed)
|
||||
/obj/item/proc/pickup(mob/user)
|
||||
|
||||
@@ -108,6 +108,7 @@
|
||||
data["note"] = note // current notes
|
||||
data["weather"] = weather
|
||||
data["aircontents"] = src.analyze_air()
|
||||
data["flashlight"] = fon
|
||||
data["injection"] = injection
|
||||
|
||||
// update the ui if it exists, returns null if no ui is passed/found
|
||||
@@ -245,5 +246,9 @@
|
||||
note = ""
|
||||
notehtml = note
|
||||
|
||||
if(href_list["Light"])
|
||||
fon = !fon
|
||||
set_light(fon * flum)
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
add_fingerprint(usr)
|
||||
@@ -32,6 +32,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
var/notehtml = ""
|
||||
|
||||
var/obj/item/weapon/cartridge/cartridge = null //current cartridge
|
||||
var/fon = 0 // Internal light
|
||||
var/flum = 2 // Brightness
|
||||
|
||||
var/list/modules = list(
|
||||
list("module" = "Phone", "icon" = "phone64", "number" = 2),
|
||||
list("module" = "Contacts", "icon" = "person64", "number" = 3),
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
brightness_on = 8 // Pretty bright.
|
||||
light_power = 3
|
||||
light_color = "#e58775"
|
||||
light_color = LIGHT_COLOR_FLARE
|
||||
icon_state = "flare"
|
||||
item_state = "flare"
|
||||
action_button_name = null //just pull it manually, neckbeard.
|
||||
|
||||
@@ -195,7 +195,7 @@ var/list/GPS_list = list()
|
||||
tracking = TRUE // On by default.
|
||||
|
||||
/obj/item/device/gps/internal // Base type for immobile/internal GPS units.
|
||||
icon_state = null
|
||||
icon_state = "internal"
|
||||
gps_tag = "Eerie Signal"
|
||||
desc = "Report to a coder immediately."
|
||||
invisibility = INVISIBILITY_MAXIMUM
|
||||
|
||||
@@ -44,4 +44,4 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "multitool"
|
||||
toolspeed = 0.1
|
||||
origin_tech = list(TECH_MAGNETS = 5, TECH_ENGINEERING = 5)
|
||||
origin_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 5)
|
||||
@@ -19,13 +19,15 @@
|
||||
/obj/item/device/uplink/nano_host()
|
||||
return loc
|
||||
|
||||
/obj/item/device/uplink/New(var/location, var/datum/mind/owner, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
|
||||
/obj/item/device/uplink/New(var/location, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
|
||||
..()
|
||||
if(owner) //VOREStation Edit - Owner optional
|
||||
src.uplink_owner = owner
|
||||
uses = owner.tcrystals
|
||||
src.uplink_owner = owner
|
||||
purchase_log = list()
|
||||
world_uplinks += src
|
||||
if(owner)
|
||||
uses = owner.tcrystals
|
||||
else
|
||||
uses = telecrystals
|
||||
processing_objects += src
|
||||
|
||||
/obj/item/device/uplink/Destroy()
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
/*****************Marker Beacons**************************/
|
||||
var/list/marker_beacon_colors = list(
|
||||
"Random" = FALSE, //not a true color, will pick a random color
|
||||
"Burgundy" = LIGHT_COLOR_FLARE,
|
||||
"Bronze" = LIGHT_COLOR_ORANGE,
|
||||
"Yellow" = LIGHT_COLOR_YELLOW,
|
||||
"Lime" = LIGHT_COLOR_SLIME_LAMP,
|
||||
"Olive" = LIGHT_COLOR_GREEN,
|
||||
"Jade" = LIGHT_COLOR_BLUEGREEN,
|
||||
"Teal" = LIGHT_COLOR_LIGHT_CYAN,
|
||||
"Cerulean" = LIGHT_COLOR_BLUE,
|
||||
"Indigo" = LIGHT_COLOR_DARK_BLUE,
|
||||
"Purple" = LIGHT_COLOR_PURPLE,
|
||||
"Violet" = LIGHT_COLOR_LAVENDER,
|
||||
"Fuchsia" = LIGHT_COLOR_PINK
|
||||
)
|
||||
|
||||
/obj/item/stack/marker_beacon
|
||||
name = "marker beacons"
|
||||
singular_name = "marker beacon"
|
||||
desc = "Prismatic path illumination devices. Used by explorers and miners to mark paths and warn of danger."
|
||||
description_info = "Use inhand to drop one marker beacon. You can pick them up again with an empty hand or \
|
||||
hitting them with this marker stack. Alt-click to select a specific color."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "marker"
|
||||
max_amount = 100
|
||||
no_variants = TRUE
|
||||
var/picked_color = "random"
|
||||
|
||||
/obj/item/stack/marker_beacon/ten
|
||||
amount = 10
|
||||
|
||||
/obj/item/stack/marker_beacon/thirty
|
||||
amount = 30
|
||||
|
||||
/obj/item/stack/marker_beacon/hundred
|
||||
amount = 100
|
||||
|
||||
/obj/item/stack/marker_beacon/initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/stack/marker_beacon/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Use in-hand to place a [singular_name].</span>")
|
||||
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
|
||||
|
||||
/obj/item/stack/marker_beacon/update_icon()
|
||||
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
|
||||
|
||||
/obj/item/stack/marker_beacon/attack_self(mob/user)
|
||||
if(!isturf(user.loc))
|
||||
to_chat(user, "<span class='warning'>You need more space to place a [singular_name] here.</span>")
|
||||
return
|
||||
if(locate(/obj/structure/marker_beacon) in user.loc)
|
||||
to_chat(user, "<span class='warning'>There is already a [singular_name] here.</span>")
|
||||
return
|
||||
if(use(1))
|
||||
to_chat(user, "<span class='notice'>You activate and anchor [amount ? "a":"the"] [singular_name] in place.</span>")
|
||||
playsound(user, 'sound/machines/click.ogg', 50, 1)
|
||||
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
|
||||
transfer_fingerprints_to(M)
|
||||
|
||||
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
|
||||
if(user.incapacitated() || !istype(user))
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors
|
||||
if(user.incapacitated() || !istype(user) || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
update_icon()
|
||||
|
||||
/obj/structure/marker_beacon
|
||||
name = "marker beacon"
|
||||
desc = "A prismatic path illumination device. It is anchored in place and glowing steadily."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "marker"
|
||||
// layer = BELOW_OPEN_DOOR_LAYER
|
||||
anchored = TRUE
|
||||
light_range = 2
|
||||
light_power = 3
|
||||
var/remove_speed = 15
|
||||
var/picked_color
|
||||
|
||||
/obj/structure/marker_beacon/New(newloc, set_color)
|
||||
. = ..()
|
||||
picked_color = set_color
|
||||
update_icon()
|
||||
|
||||
/obj/structure/marker_beacon/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
|
||||
|
||||
/obj/structure/marker_beacon/update_icon()
|
||||
while(!picked_color || !marker_beacon_colors[picked_color])
|
||||
picked_color = pick(marker_beacon_colors)
|
||||
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
|
||||
set_light(light_range, light_power, marker_beacon_colors[picked_color])
|
||||
|
||||
/obj/structure/marker_beacon/attack_hand(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
|
||||
if(do_after(user, remove_speed, target = src))
|
||||
var/obj/item/stack/marker_beacon/M = new(loc)
|
||||
M.picked_color = picked_color
|
||||
M.update_icon()
|
||||
transfer_fingerprints_to(M)
|
||||
if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
qdel(src) //otherwise delete us
|
||||
|
||||
/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/stack/marker_beacon))
|
||||
var/obj/item/stack/marker_beacon/M = I
|
||||
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
|
||||
if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount)
|
||||
M.add(1)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/marker_beacon/AltClick(mob/living/user)
|
||||
..()
|
||||
if(user.incapacitated() || !istype(user))
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in marker_beacon_colors
|
||||
if(user.incapacitated() || !istype(user) || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
update_icon()
|
||||
@@ -101,9 +101,8 @@
|
||||
//Step one - dehairing.
|
||||
/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if( istype(W, /obj/item/weapon/material/knife) || \
|
||||
istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || \
|
||||
istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \
|
||||
istype(W, /obj/item/weapon/material/hatchet) )
|
||||
istype(W, /obj/item/weapon/material/knife/machete/hatchet) )
|
||||
|
||||
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
|
||||
usr.visible_message("<span class='notice'>\The [usr] starts cutting hair off \the [src]</span>", "<span class='notice'>You start cutting the hair off \the [src]</span>", "You hear the sound of a knife rubbing against flesh")
|
||||
|
||||
@@ -1,19 +1,29 @@
|
||||
obj/item/weapon/chainsaw
|
||||
name = "Chainsaw"
|
||||
name = "chainsaw"
|
||||
desc = "Vroom vroom."
|
||||
icon_state = "chainsaw0"
|
||||
item_state = "chainsaw0"
|
||||
var/on = 0
|
||||
var/max_fuel = 20
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slot_flags = SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slot_flags = SLOT_BACK
|
||||
var/active_force = 55
|
||||
var/inactive_force = 10
|
||||
|
||||
obj/item/weapon/chainsaw/New()
|
||||
var/datum/reagents/R = new/datum/reagents(max_fuel)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
R.add_reagent("fuel", max_fuel)
|
||||
processing_objects |= src
|
||||
..()
|
||||
|
||||
obj/item/weapon/chainsaw/Destroy()
|
||||
processing_objects -= src
|
||||
if(reagents)
|
||||
qdel(reagents)
|
||||
..()
|
||||
|
||||
obj/item/weapon/chainsaw/proc/turnOn()
|
||||
@@ -31,7 +41,7 @@ obj/item/weapon/chainsaw/proc/turnOn()
|
||||
visible_message("You start \the [src] up with a loud grinding!", "[usr] starts \the [src] up with a loud grinding!")
|
||||
attack_verb = list("shreds", "rips", "tears")
|
||||
playsound(src, 'sound/weapons/chainsaw_startup.ogg',40,1)
|
||||
force = 55
|
||||
force = active_force
|
||||
edge = 1
|
||||
sharp = 1
|
||||
on = 1
|
||||
@@ -44,7 +54,7 @@ obj/item/weapon/chainsaw/proc/turnOff()
|
||||
to_chat(usr, "You switch the gas nozzle on the chainsaw, turning it off.")
|
||||
attack_verb = list("bluntly hit", "beat", "knocked")
|
||||
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',40,1)
|
||||
force = 10
|
||||
force = inactive_force
|
||||
edge = 0
|
||||
sharp = 0
|
||||
on = 0
|
||||
@@ -87,12 +97,13 @@ obj/item/weapon/chainsaw/process()
|
||||
if(on)
|
||||
if(get_fuel() > 0)
|
||||
reagents.remove_reagent("fuel", 1)
|
||||
playsound(src, 'sound/weapons/chainsaw_turnoff.ogg',15,1)
|
||||
if(get_fuel() <= 0)
|
||||
to_chat(usr, "\The [src] sputters to a stop!")
|
||||
on = !on
|
||||
turnOff()
|
||||
|
||||
obj/item/weapon/chainsaw/proc/get_fuel()
|
||||
reagents.get_reagent_amount("fuel")
|
||||
return reagents.get_reagent_amount("fuel")
|
||||
|
||||
obj/item/weapon/chainsaw/examine(mob/user)
|
||||
if(..(user,0))
|
||||
@@ -109,4 +120,4 @@ obj/item/weapon/chainsaw/update_icon()
|
||||
item_state = "chainsaw1"
|
||||
else
|
||||
icon_state = "chainsaw0"
|
||||
icon_state = "chainsaw0"
|
||||
item_state = "chainsaw0"
|
||||
|
||||
@@ -78,16 +78,10 @@
|
||||
/*
|
||||
* Knives
|
||||
*/
|
||||
/obj/item/weapon/material/kitchen/utensil/knife
|
||||
name = "knife"
|
||||
desc = "A knife for eating with. Can cut through any food."
|
||||
icon_state = "knife"
|
||||
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
|
||||
scoop_food = 0
|
||||
|
||||
// Identical to the tactical knife but nowhere near as stabby.
|
||||
// Kind of like the toy esword compared to the real thing.
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/boot
|
||||
/obj/item/weapon/material/knife/boot
|
||||
name = "boot knife"
|
||||
desc = "A small fixed-blade knife for putting inside a boot."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
@@ -95,14 +89,15 @@
|
||||
item_state = "knife"
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
|
||||
/* From the time of Clowns. Commented out for posterity, and sanity.
|
||||
/obj/item/weapon/material/knife/attack(target as mob, mob/living/user as mob)
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "<span class='warning'>You accidentally cut yourself with \the [src].</span>"
|
||||
user.take_organ_damage(20)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/plastic
|
||||
*/
|
||||
/obj/item/weapon/material/knife/plastic
|
||||
default_material = "plastic"
|
||||
|
||||
/*
|
||||
|
||||
@@ -87,17 +87,30 @@
|
||||
|
||||
/obj/item/weapon/material/knife/butch
|
||||
name = "butcher's cleaver"
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "butch"
|
||||
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
|
||||
force_divisor = 0.25 // 15 when wielded with hardness 60 (steel)
|
||||
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/material/hatchet/tacknife/survival
|
||||
/obj/item/weapon/material/knife/machete
|
||||
name = "machete"
|
||||
desc = "A sharp machete often found in survival kits."
|
||||
icon_state = "machete"
|
||||
force_divisor = 0.3 // 20 when hardness 60 (steel)
|
||||
attack_verb = list("slashed", "chopped", "gouged", "ripped", "cut")
|
||||
var/should_cleave = TRUE //Now hatchets inherit from the machete, and thus knives. Tables turned.
|
||||
|
||||
// This cannot go into afterattack since some mobs delete themselves upon dying.
|
||||
/obj/item/weapon/material/knife/machete/pre_attack(var/mob/living/target, var/mob/living/user)
|
||||
if(should_cleave && istype(target))
|
||||
cleave(user, target)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/knife/tacknife/survival
|
||||
name = "survival knife"
|
||||
desc = "A hunting grade survival knife."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "survivalknife"
|
||||
item_state = "knife"
|
||||
applies_material_colour = FALSE
|
||||
should_cleave = FALSE
|
||||
toolspeed = 2 // Use a real axe if you want to chop logs.
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
attack_verb = list("punched", "beaten", "struck")
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/hatchet
|
||||
/obj/item/weapon/material/knife/machete/hatchet
|
||||
name = "hatchet"
|
||||
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
@@ -32,15 +32,8 @@
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1)
|
||||
attack_verb = list("chopped", "torn", "cut")
|
||||
applies_material_colour = 0
|
||||
var/should_cleave = TRUE // Because knives inherit from hatchets. For some reason.
|
||||
|
||||
// This cannot go into afterattack since some mobs delete themselves upon dying.
|
||||
/obj/item/weapon/material/hatchet/pre_attack(var/mob/living/target, var/mob/living/user)
|
||||
if(should_cleave && istype(target))
|
||||
cleave(user, target)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/hatchet/unathiknife
|
||||
/obj/item/weapon/material/knife/machete/hatchet/unathiknife
|
||||
name = "duelling knife"
|
||||
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
@@ -49,23 +42,23 @@
|
||||
should_cleave = FALSE
|
||||
var hits = 0
|
||||
|
||||
/obj/item/weapon/material/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob)
|
||||
/obj/item/weapon/material/knife/machete/hatchet/unathiknife/attack(mob/M as mob, mob/user as mob)
|
||||
if(hits > 0)
|
||||
return
|
||||
var/obj/item/I = user.get_inactive_hand()
|
||||
if(istype(I, /obj/item/weapon/material/hatchet/unathiknife))
|
||||
if(istype(I, /obj/item/weapon/material/knife/machete/hatchet/unathiknife))
|
||||
hits ++
|
||||
var/obj/item/weapon/W = I
|
||||
W.attack(M, user)
|
||||
W.afterattack(M, user)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/hatchet/unathiknife/afterattack(mob/M as mob, mob/user as mob)
|
||||
/obj/item/weapon/material/knife/machete/hatchet/unathiknife/afterattack(mob/M as mob, mob/user as mob)
|
||||
hits = initial(hits)
|
||||
..()
|
||||
|
||||
// These probably shouldn't inherit from hatchets.
|
||||
/obj/item/weapon/material/hatchet/tacknife
|
||||
/obj/item/weapon/material/knife/tacknife
|
||||
name = "tactical knife"
|
||||
desc = "You'd be killing loads of people if this was Medal of Valor: Heroes of Space."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
@@ -73,9 +66,8 @@
|
||||
item_state = "knife"
|
||||
attack_verb = list("stabbed", "chopped", "cut")
|
||||
applies_material_colour = 1
|
||||
should_cleave = FALSE
|
||||
|
||||
/obj/item/weapon/material/hatchet/tacknife/combatknife
|
||||
/obj/item/weapon/material/knife/tacknife/combatknife
|
||||
name = "combat knife"
|
||||
desc = "If only you had a boot to put it in."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
@@ -85,7 +77,6 @@
|
||||
thrown_force_divisor = 1.75 // 20 with weight 20 (steel)
|
||||
attack_verb = list("sliced", "stabbed", "chopped", "cut")
|
||||
applies_material_colour = 1
|
||||
should_cleave = FALSE
|
||||
|
||||
/obj/item/weapon/material/minihoe // -- Numbers
|
||||
name = "mini hoe"
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
/obj/item/device/radio/headset,
|
||||
/obj/item/device/robotanalyzer,
|
||||
/obj/item/weapon/material/minihoe,
|
||||
/obj/item/weapon/material/hatchet,
|
||||
/obj/item/weapon/material/knife/machete/hatchet,
|
||||
/obj/item/device/analyzer/plant_analyzer,
|
||||
/obj/item/weapon/extinguisher/mini,
|
||||
/obj/item/weapon/tape_roll,
|
||||
@@ -160,6 +160,7 @@
|
||||
/obj/item/weapon/melee,
|
||||
/obj/item/clothing/accessory/badge,
|
||||
/obj/item/weapon/gun/projectile/sec,
|
||||
/obj/item/weapon/gun/projectile/p92x,
|
||||
/obj/item/taperoll,
|
||||
/obj/item/weapon/gun/projectile/colt/detective
|
||||
)
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/g9mm
|
||||
name = "\improper Smooth operator"
|
||||
desc = "9mm with silencer kit."
|
||||
desc = "Compact 9mm with silencer kit."
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/g9mm/New()
|
||||
..()
|
||||
|
||||
@@ -7,6 +7,9 @@ var/list/global/tank_gauge_cache = list()
|
||||
/obj/item/weapon/tank
|
||||
name = "tank"
|
||||
icon = 'icons/obj/tank.dmi'
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/back.dmi'
|
||||
)
|
||||
|
||||
var/gauge_icon = "indicator_tank"
|
||||
var/last_gauge_pressure
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
icon_state = "wrench"
|
||||
usesound = 'sound/effects/empulse.ogg'
|
||||
toolspeed = 0.1
|
||||
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEER = 5)
|
||||
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5)
|
||||
|
||||
/obj/item/weapon/wrench/power
|
||||
name = "hand drill"
|
||||
@@ -989,9 +989,9 @@
|
||||
/obj/item/weapon/screwdriver,
|
||||
/obj/item/weapon/wrench,
|
||||
/obj/item/weapon/wirecutters,
|
||||
/obj/item/weapon/material/kitchen/utensil/knife,
|
||||
/obj/item/weapon/material/knife,
|
||||
/obj/item/weapon/material/kitchen/utensil/fork,
|
||||
/obj/item/weapon/material/hatchet
|
||||
/obj/item/weapon/material/knife/machete/hatchet
|
||||
)
|
||||
var/list/tools = list()
|
||||
var/current_tool = 1
|
||||
@@ -1036,4 +1036,4 @@
|
||||
if(tool)
|
||||
tool.loc = src*/
|
||||
|
||||
#undef WELDER_FUEL_BURN_INTERVAL
|
||||
#undef WELDER_FUEL_BURN_INTERVAL
|
||||
|
||||
@@ -42,14 +42,16 @@
|
||||
anchored = 1
|
||||
|
||||
/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
|
||||
if(buckled_mob && can_use(user))
|
||||
if(has_buckled_mobs() && can_use(user))
|
||||
var/victim = english_list(buckled_mobs)
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] begins freeing [buckled_mob] from \the [src].</span>",
|
||||
"<span class='notice'>You carefully begin to free [buckled_mob] from \the [src].</span>",
|
||||
"<span class='notice'>[user] begins freeing [victim] from \the [src].</span>",
|
||||
"<span class='notice'>You carefully begin to free [victim] from \the [src].</span>",
|
||||
)
|
||||
if(do_after(user, 60))
|
||||
user.visible_message("<span class='notice'>[buckled_mob] has been freed from \the [src] by [user].</span>")
|
||||
unbuckle_mob()
|
||||
user.visible_message("<span class='notice'>[victim] has been freed from \the [src] by [user].</span>")
|
||||
for(var/A in buckled_mobs)
|
||||
unbuckle_mob(A)
|
||||
anchored = 0
|
||||
else if(deployed && can_use(user))
|
||||
user.visible_message(
|
||||
@@ -109,7 +111,7 @@
|
||||
"<b>You hear a loud metallic snap!</b>"
|
||||
)
|
||||
attack_mob(L)
|
||||
if(!buckled_mob)
|
||||
if(!has_buckled_mobs())
|
||||
anchored = 0
|
||||
deployed = 0
|
||||
update_icon()
|
||||
|
||||
@@ -111,39 +111,41 @@
|
||||
processing_objects |= src
|
||||
|
||||
/obj/effect/energy_net/Destroy()
|
||||
if(buckled_mob)
|
||||
to_chat(buckled_mob,"<span class='notice'>You are free of the net!</span>")
|
||||
unbuckle_mob()
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
to_chat(A,"<span class='notice'>You are free of the net!</span>")
|
||||
unbuckle_mob(A)
|
||||
|
||||
processing_objects -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/energy_net/process()
|
||||
if(isnull(buckled_mob) || buckled_mob.loc != loc)
|
||||
if(!has_buckled_mobs())
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/energy_net/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
var/mob/living/occupant = buckled_mob
|
||||
occupant.buckled = null
|
||||
occupant.forceMove(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
unbuckle_mob()
|
||||
qdel(src)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/occupant = A
|
||||
occupant.buckled = null
|
||||
occupant.forceMove(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
unbuckle_mob(occupant)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/energy_net/user_unbuckle_mob(mob/user)
|
||||
/obj/effect/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
|
||||
user.setClickCooldown(user.get_attack_speed())
|
||||
visible_message("<span class='danger'>[user] begins to tear at \the [src]!</span>")
|
||||
if(do_after(usr, escape_time, src, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
|
||||
if(!buckled_mob)
|
||||
if(!has_buckled_mobs())
|
||||
return
|
||||
visible_message("<span class='danger'>[user] manages to tear \the [src] apart!</span>")
|
||||
unbuckle_mob()
|
||||
unbuckle_mob(buckled_mob)
|
||||
|
||||
/obj/effect/energy_net/post_buckle_mob(mob/living/M)
|
||||
if(buckled_mob) //Just buckled someone
|
||||
if(M.buckled == src) //Just buckled someone
|
||||
..()
|
||||
layer = M.layer+1
|
||||
M.can_pull_size = 0
|
||||
|
||||
@@ -217,7 +217,7 @@
|
||||
//prob(6);/obj/item/weapon/material/wirerod,
|
||||
prob(2);/obj/item/weapon/material/butterfly/switchblade,
|
||||
prob(2);/obj/item/weapon/material/knuckledusters,
|
||||
prob(1);/obj/item/weapon/material/hatchet/tacknife,
|
||||
prob(1);/obj/item/weapon/material/knife/tacknife,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
|
||||
prob(1);/obj/item/weapon/beartrap,
|
||||
prob(1);/obj/item/weapon/handcuffs/fuzzy,
|
||||
@@ -294,7 +294,7 @@
|
||||
|
||||
/obj/random/projectile
|
||||
name = "Random Projectile Weapon"
|
||||
desc = "This is a random security weapon."
|
||||
desc = "This is a random projectile weapon."
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "revolver"
|
||||
|
||||
@@ -315,6 +315,8 @@
|
||||
prob(3);/obj/item/weapon/gun/projectile/luger/brown,
|
||||
prob(4);/obj/item/weapon/gun/projectile/sec,
|
||||
prob(3);/obj/item/weapon/gun/projectile/sec/wood,
|
||||
prob(4);/obj/item/weapon/gun/projectile/p92x,
|
||||
prob(3);/obj/item/weapon/gun/projectile/p92x/brown,
|
||||
prob(4);/obj/item/weapon/gun/projectile/pistol,
|
||||
prob(5);/obj/item/weapon/gun/projectile/pirate,
|
||||
prob(2);/obj/item/weapon/gun/projectile/revolver,
|
||||
@@ -350,13 +352,15 @@
|
||||
|
||||
/obj/random/handgun/item_to_spawn()
|
||||
return pick(prob(4);/obj/item/weapon/gun/projectile/sec,
|
||||
prob(4);/obj/item/weapon/gun/projectile/luger,
|
||||
prob(4);/obj/item/weapon/gun/projectile/p92x,
|
||||
prob(3);/obj/item/weapon/gun/projectile/sec/wood,
|
||||
prob(3);/obj/item/weapon/gun/projectile/p92x/brown,
|
||||
prob(3);/obj/item/weapon/gun/projectile/colt,
|
||||
prob(2);/obj/item/weapon/gun/projectile/luger,
|
||||
prob(2);/obj/item/weapon/gun/energy/gun,
|
||||
prob(2);/obj/item/weapon/gun/projectile/colt,
|
||||
prob(2);/obj/item/weapon/gun/projectile/pistol,
|
||||
prob(1);/obj/item/weapon/gun/energy/retro,
|
||||
prob(1);/obj/item/weapon/gun/projectile/sec/wood,
|
||||
prob(3);/obj/item/weapon/gun/projectile/luger/brown)
|
||||
prob(1);/obj/item/weapon/gun/projectile/luger/brown)
|
||||
|
||||
/obj/random/handgun/sec
|
||||
name = "Random Security Handgun"
|
||||
@@ -370,7 +374,7 @@
|
||||
|
||||
/obj/random/ammo
|
||||
name = "Random Ammunition"
|
||||
desc = "This is random ammunition."
|
||||
desc = "This is random security ammunition."
|
||||
icon = 'icons/obj/ammo.dmi'
|
||||
icon_state = "45-10"
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/obj/structure/bonfire/New(newloc, material_name)
|
||||
..(newloc)
|
||||
if(!material_name)
|
||||
material_name = "wood"
|
||||
material_name = MAT_WOOD
|
||||
material = get_material_by_name("[material_name]")
|
||||
if(!material)
|
||||
qdel(src)
|
||||
@@ -23,14 +23,14 @@
|
||||
|
||||
// Blue wood.
|
||||
/obj/structure/bonfire/sifwood/New(newloc, material_name)
|
||||
..(newloc, "alien wood")
|
||||
..(newloc, MAT_SIFWOOD)
|
||||
|
||||
/obj/structure/bonfire/permanent/New(newloc, material_name)
|
||||
..()
|
||||
ignite()
|
||||
|
||||
/obj/structure/bonfire/permanent/sifwood/New(newloc, material_name)
|
||||
..(newloc, "alien wood")
|
||||
..(newloc, MAT_SIFWOOD)
|
||||
|
||||
/obj/structure/bonfire/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/stack/rods) && !can_buckle && !grill)
|
||||
@@ -63,7 +63,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/bonfire/attack_hand(mob/user)
|
||||
if(buckled_mob)
|
||||
if(has_buckled_mobs())
|
||||
return ..()
|
||||
|
||||
if(get_fuel_amount())
|
||||
@@ -194,7 +194,7 @@
|
||||
I.appearance_flags = RESET_COLOR
|
||||
overlays += I
|
||||
|
||||
if(buckled_mob && get_fuel_amount() >= 5)
|
||||
if(has_buckled_mobs() && get_fuel_amount() >= 5)
|
||||
I = image(icon, "bonfire_intense")
|
||||
I.pixel_y = 13
|
||||
I.layer = MOB_LAYER + 0.1
|
||||
@@ -231,7 +231,7 @@
|
||||
extinguish()
|
||||
|
||||
/obj/structure/bonfire/post_buckle_mob(mob/living/M)
|
||||
if(buckled_mob) // Just buckled someone
|
||||
if(M.buckled == src) // Just buckled someone
|
||||
M.pixel_y += 13
|
||||
else // Just unbuckled someone
|
||||
M.pixel_y -= 13
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
new /obj/item/device/radio/headset/headset_service(src)
|
||||
new /obj/item/clothing/head/greenbandana(src)
|
||||
new /obj/item/weapon/material/minihoe(src)
|
||||
new /obj/item/weapon/material/hatchet(src)
|
||||
new /obj/item/weapon/material/knife/machete/hatchet(src)
|
||||
new /obj/item/weapon/wirecutters/clippers(src)
|
||||
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/hydro(src)
|
||||
|
||||
@@ -127,12 +127,16 @@
|
||||
else
|
||||
src.toggle(user)
|
||||
|
||||
/obj/structure/closet/secure_closet/AltClick()
|
||||
..()
|
||||
verb_togglelock()
|
||||
|
||||
/obj/structure/closet/secure_closet/verb/verb_togglelock()
|
||||
set src in oview(1) // One square distance
|
||||
set category = "Object"
|
||||
set name = "Toggle Lock"
|
||||
|
||||
if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr)) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
|
||||
return
|
||||
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
continue
|
||||
if(istype(O, /obj/structure/bed)) //This is only necessary because of rollerbeds and swivel chairs.
|
||||
var/obj/structure/bed/B = O
|
||||
if(B.buckled_mob)
|
||||
if(B.has_buckled_mobs())
|
||||
continue
|
||||
O.forceMove(src)
|
||||
itemcount++
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define SHOWER_OPEN_LAYER OBJ_LAYER + 0.4
|
||||
#define SHOWER_CLOSED_LAYER MOB_LAYER + 0.2
|
||||
|
||||
/obj/structure/curtain
|
||||
name = "curtain"
|
||||
icon = 'icons/obj/curtain.dmi'
|
||||
|
||||
@@ -64,12 +64,14 @@
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(12, 1, src)
|
||||
s.start()
|
||||
if(buckled_mob)
|
||||
buckled_mob.burn_skin(85)
|
||||
buckled_mob << "<span class='danger'>You feel a deep shock course through your body!</span>"
|
||||
sleep(1)
|
||||
buckled_mob.burn_skin(85)
|
||||
buckled_mob.Stun(600)
|
||||
if(has_buckled_mobs())
|
||||
for(var/a in buckled_mobs)
|
||||
var/mob/living/L = a
|
||||
L.burn_skin(85)
|
||||
to_chat(L, "<span class='danger'>You feel a deep shock course through your body!</span>")
|
||||
sleep(1)
|
||||
L.burn_skin(85)
|
||||
L.Stun(600)
|
||||
visible_message("<span class='danger'>The electric chair went off!</span>", "<span class='danger'>You hear a deep sharp shock!</span>")
|
||||
|
||||
A.power_light = light
|
||||
|
||||
@@ -306,6 +306,7 @@
|
||||
|
||||
/obj/structure/flora/sif/subterranean/initialize()
|
||||
icon_state = "[initial(icon_state)][rand(1,2)]"
|
||||
..()
|
||||
|
||||
/obj/structure/flora/sif/eyes
|
||||
name = "mysterious bulbs"
|
||||
@@ -314,44 +315,4 @@
|
||||
|
||||
/obj/structure/flora/sif/eyes/initialize()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
|
||||
// VOREStation Edit Start
|
||||
//Pumpkins
|
||||
/obj/structure/flora/pumpkin
|
||||
name = "pumpkin"
|
||||
icon = 'icons/obj/flora/pumpkins.dmi'
|
||||
desc = "A healthy, fat pumpkin. It looks as if it was freshly plucked from its vines and shows no signs of decay."
|
||||
icon_state = "decor-pumpkin"
|
||||
|
||||
/obj/effect/landmark/carved_pumpkin_spawn
|
||||
name = "jack o'lantern spawn"
|
||||
icon = 'icons/obj/flora/pumpkins.dmi'
|
||||
icon_state = "spawner-jackolantern"
|
||||
|
||||
/obj/effect/landmark/carved_pumpkin_spawn/New()
|
||||
var/new_pumpkin = pick(
|
||||
prob(70);/obj/structure/flora/pumpkin,
|
||||
prob(60);/obj/structure/flora/pumpkin/carved,
|
||||
prob(30);/obj/structure/flora/pumpkin/carved/scream,
|
||||
prob(30);/obj/structure/flora/pumpkin/carved/girly,
|
||||
prob(10);/obj/structure/flora/pumpkin/carved/owo)
|
||||
new new_pumpkin(src.loc)
|
||||
..()
|
||||
|
||||
/obj/structure/flora/pumpkin/carved
|
||||
name = "jack o'lantern"
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has develishly evil-looking eyes and a grinning mouth more than big enough for a very small person to hide in."
|
||||
icon_state = "decor-jackolantern"
|
||||
|
||||
/obj/structure/flora/pumpkin/carved/scream
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has rounded eyes looking in completely opposite directions and a wide mouth, forever frozen in a silent scream. It looks ridiculous, actually."
|
||||
icon_state = "decor-jackolantern-scream"
|
||||
|
||||
/obj/structure/flora/pumpkin/carved/girly
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has neatly rounded eyes topped with what appear to be cartoony eyelashes, completed with what seems to have been the carver's attempt at friendly, toothy smile. The mouth is easily the scariest part of its face."
|
||||
icon_state = "decor-jackolantern-girly"
|
||||
|
||||
/obj/structure/flora/pumpkin/carved/owo
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has large, round eyes and a squiggly, cat-like smiling mouth. Its pleasantly surprised expression seems to suggest that the pumpkin has noticed something about you."
|
||||
icon_state = "decor-jackolantern-owo"
|
||||
// VOREStation Edit End
|
||||
..()
|
||||
@@ -198,5 +198,6 @@
|
||||
|
||||
/obj/structure/flora/tree/sif/update_icon()
|
||||
set_light(5, 1, "#33ccff")
|
||||
overlays.Cut()
|
||||
overlays.Add(image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow", layer = LIGHTING_LAYER + 0.1))
|
||||
var/image/glow = image(icon = 'icons/obj/flora/deadtrees.dmi', icon_state = "[icon_state]_glow")
|
||||
glow.plane = PLANE_LIGHTING_ABOVE
|
||||
overlays = list(glow)
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
//Pumpkins
|
||||
/obj/structure/flora/pumpkin
|
||||
name = "pumpkin"
|
||||
icon = 'icons/obj/flora/pumpkins.dmi'
|
||||
desc = "A healthy, fat pumpkin. It looks as if it was freshly plucked from its vines and shows no signs of decay."
|
||||
icon_state = "decor-pumpkin"
|
||||
|
||||
/obj/effect/landmark/carved_pumpkin_spawn
|
||||
name = "jack o'lantern spawn"
|
||||
icon = 'icons/obj/flora/pumpkins.dmi'
|
||||
icon_state = "spawner-jackolantern"
|
||||
|
||||
/obj/effect/landmark/carved_pumpkin_spawn/New()
|
||||
var/new_pumpkin = pick(
|
||||
prob(70);/obj/structure/flora/pumpkin,
|
||||
prob(60);/obj/structure/flora/pumpkin/carved,
|
||||
prob(30);/obj/structure/flora/pumpkin/carved/scream,
|
||||
prob(30);/obj/structure/flora/pumpkin/carved/girly,
|
||||
prob(10);/obj/structure/flora/pumpkin/carved/owo)
|
||||
new new_pumpkin(src.loc)
|
||||
..()
|
||||
|
||||
/obj/structure/flora/pumpkin/carved
|
||||
name = "jack o'lantern"
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has develishly evil-looking eyes and a grinning mouth more than big enough for a very small person to hide in."
|
||||
icon_state = "decor-jackolantern"
|
||||
|
||||
/obj/structure/flora/pumpkin/carved/scream
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has rounded eyes looking in completely opposite directions and a wide mouth, forever frozen in a silent scream. It looks ridiculous, actually."
|
||||
icon_state = "decor-jackolantern-scream"
|
||||
|
||||
/obj/structure/flora/pumpkin/carved/girly
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has neatly rounded eyes topped with what appear to be cartoony eyelashes, completed with what seems to have been the carver's attempt at friendly, toothy smile. The mouth is easily the scariest part of its face."
|
||||
icon_state = "decor-jackolantern-girly"
|
||||
|
||||
/obj/structure/flora/pumpkin/carved/owo
|
||||
desc = "A fat, freshly picked pumpkin. This one has a face carved into it! This one has large, round eyes and a squiggly, cat-like smiling mouth. Its pleasantly surprised expression seems to suggest that the pumpkin has noticed something about you."
|
||||
icon_state = "decor-jackolantern-owo"
|
||||
@@ -4,7 +4,7 @@
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "cart"
|
||||
anchored = 0
|
||||
density = 1
|
||||
density = 1
|
||||
climbable = 1
|
||||
flags = OPENCONTAINER
|
||||
//copypaste sorry
|
||||
@@ -229,9 +229,11 @@
|
||||
|
||||
/obj/structure/bed/chair/janicart/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src)
|
||||
buckled_mob.loc = loc
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
if(L.buckled == src)
|
||||
L.loc = loc
|
||||
|
||||
|
||||
/obj/structure/bed/chair/janicart/post_buckle_mob(mob/living/M)
|
||||
@@ -257,36 +259,41 @@
|
||||
/obj/structure/bed/chair/janicart/set_dir()
|
||||
..()
|
||||
update_layer()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.loc != loc)
|
||||
buckled_mob.buckled = null //Temporary, so Move() succeeds.
|
||||
buckled_mob.buckled = src //Restoring
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
if(L.loc != loc)
|
||||
L.buckled = null //Temporary, so Move() succeeds.
|
||||
L.buckled = src //Restoring
|
||||
|
||||
update_mob()
|
||||
|
||||
|
||||
/obj/structure/bed/chair/janicart/proc/update_mob()
|
||||
if(buckled_mob)
|
||||
buckled_mob.set_dir(dir)
|
||||
switch(dir)
|
||||
if(SOUTH)
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = 7
|
||||
if(WEST)
|
||||
buckled_mob.pixel_x = 13
|
||||
buckled_mob.pixel_y = 7
|
||||
if(NORTH)
|
||||
buckled_mob.pixel_x = 0
|
||||
buckled_mob.pixel_y = 4
|
||||
if(EAST)
|
||||
buckled_mob.pixel_x = -13
|
||||
buckled_mob.pixel_y = 7
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
L.set_dir(dir)
|
||||
switch(dir)
|
||||
if(SOUTH)
|
||||
L.pixel_x = 0
|
||||
L.pixel_y = 7
|
||||
if(WEST)
|
||||
L.pixel_x = 13
|
||||
L.pixel_y = 7
|
||||
if(NORTH)
|
||||
L.pixel_x = 0
|
||||
L.pixel_y = 4
|
||||
if(EAST)
|
||||
L.pixel_x = -13
|
||||
L.pixel_y = 7
|
||||
|
||||
|
||||
/obj/structure/bed/chair/janicart/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(buckled_mob)
|
||||
if(has_buckled_mobs())
|
||||
if(prob(85))
|
||||
return buckled_mob.bullet_act(Proj)
|
||||
var/mob/living/L = pick(buckled_mobs)
|
||||
return L.bullet_act(Proj)
|
||||
visible_message("<span class='warning'>[Proj] ricochets off the [callme]!</span>")
|
||||
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/clothing/under/tactical,
|
||||
/obj/item/weapon/beartrap,
|
||||
/obj/item/clothing/suit/storage/vest/press,
|
||||
/obj/item/weapon/material/hatchet/tacknife,
|
||||
/obj/item/weapon/material/knife/tacknife,
|
||||
/obj/item/weapon/material/butterfly/switchblade
|
||||
)
|
||||
|
||||
|
||||
@@ -192,10 +192,10 @@
|
||||
..(newloc, "diamond")
|
||||
|
||||
/obj/structure/simple_door/wood/New(var/newloc,var/material_name)
|
||||
..(newloc, "wood")
|
||||
..(newloc, MAT_WOOD)
|
||||
|
||||
/obj/structure/simple_door/sifwood/New(var/newloc,var/material_name)
|
||||
..(newloc, "alien wood")
|
||||
..(newloc, MAT_SIFWOOD)
|
||||
|
||||
/obj/structure/simple_door/resin/New(var/newloc,var/material_name)
|
||||
..(newloc, "resin")
|
||||
@@ -10,7 +10,7 @@
|
||||
/obj/structure/bed/nest/update_icon()
|
||||
return
|
||||
|
||||
/obj/structure/bed/nest/user_unbuckle_mob(mob/user as mob)
|
||||
/obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src)
|
||||
if(buckled_mob != user)
|
||||
@@ -20,7 +20,7 @@
|
||||
"<span class='notice'>You hear squelching...</span>")
|
||||
buckled_mob.pixel_y = 0
|
||||
buckled_mob.old_y = 0
|
||||
unbuckle_mob()
|
||||
unbuckle_mob(buckled_mob)
|
||||
else
|
||||
if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME)
|
||||
return
|
||||
@@ -34,7 +34,7 @@
|
||||
buckled_mob.last_special = world.time
|
||||
buckled_mob.pixel_y = 0
|
||||
buckled_mob.old_y = 0
|
||||
unbuckle_mob()
|
||||
unbuckle_mob(buckled_mob)
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
M.update_canmove()
|
||||
M.pixel_y = 6
|
||||
M.old_y = 6
|
||||
src.buckled_mob = M
|
||||
src.buckled_mobs |= M
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
else if(istype(W, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = W
|
||||
var/mob/living/affecting = G.affecting
|
||||
if(buckled_mob) //Handles trying to buckle someone else to a chair when someone else is on it
|
||||
if(has_buckled_mobs()) //Handles trying to buckle someone else to a chair when someone else is on it
|
||||
to_chat(user, "<span class='notice'>\The [src] already has someone buckled to it.</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] attempts to buckle [affecting] into \the [src]!</span>")
|
||||
@@ -184,7 +184,7 @@
|
||||
..(newloc,"wood","cotton")
|
||||
|
||||
/obj/structure/bed/double/post_buckle_mob(mob/living/M as mob)
|
||||
if(M == buckled_mob)
|
||||
if(M.buckled == src)
|
||||
M.pixel_y = 13
|
||||
M.old_y = 13
|
||||
else
|
||||
@@ -217,8 +217,9 @@
|
||||
if(istype(W, /obj/item/weapon/wrench) || istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
|
||||
return
|
||||
else if(istype(W,/obj/item/roller_holder))
|
||||
if(buckled_mob)
|
||||
user_unbuckle_mob(user)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
user_unbuckle_mob(A, user)
|
||||
else
|
||||
visible_message("[user] collapses \the [src.name].")
|
||||
new rollertype(get_turf(src))
|
||||
@@ -288,14 +289,15 @@
|
||||
|
||||
/obj/structure/bed/roller/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src)
|
||||
buckled_mob.loc = src.loc
|
||||
else
|
||||
buckled_mob = null
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
|
||||
if(L.buckled == src)
|
||||
L.loc = src.loc
|
||||
|
||||
/obj/structure/bed/roller/post_buckle_mob(mob/living/M as mob)
|
||||
if(M == buckled_mob)
|
||||
if(M.buckled == src)
|
||||
M.pixel_y = 6
|
||||
M.old_y = 6
|
||||
density = 1
|
||||
@@ -312,7 +314,7 @@
|
||||
..()
|
||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||
if(!ishuman(usr)) return
|
||||
if(buckled_mob) return 0
|
||||
if(has_buckled_mobs()) return 0
|
||||
visible_message("[usr] collapses \the [src.name].")
|
||||
new rollertype(get_turf(src))
|
||||
spawn(0)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/bed/chair/attack_tk(mob/user as mob)
|
||||
if(buckled_mob)
|
||||
if(has_buckled_mobs())
|
||||
..()
|
||||
else
|
||||
rotate()
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
/obj/structure/bed/chair/update_icon()
|
||||
..()
|
||||
if(buckled_mob && padding_material)
|
||||
if(has_buckled_mobs() && padding_material)
|
||||
var/cache_key = "[base_icon]-armrest-[padding_material.name]"
|
||||
if(isnull(stool_cache[cache_key]))
|
||||
var/image/I = image(icon, "[base_icon]_armrest")
|
||||
@@ -61,8 +61,10 @@
|
||||
/obj/structure/bed/chair/set_dir()
|
||||
..()
|
||||
update_layer()
|
||||
if(buckled_mob)
|
||||
buckled_mob.set_dir(dir)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
L.set_dir(dir)
|
||||
|
||||
/obj/structure/bed/chair/verb/rotate()
|
||||
set name = "Rotate Chair"
|
||||
@@ -137,45 +139,47 @@
|
||||
|
||||
/obj/structure/bed/chair/office/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
var/mob/living/occupant = buckled_mob
|
||||
occupant.buckled = null
|
||||
occupant.Move(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
if (propelled)
|
||||
for (var/mob/O in src.loc)
|
||||
if (O != occupant)
|
||||
Bump(O)
|
||||
else
|
||||
unbuckle_mob()
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/occupant = A
|
||||
occupant.buckled = null
|
||||
occupant.Move(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
if (propelled)
|
||||
for (var/mob/O in src.loc)
|
||||
if (O != occupant)
|
||||
Bump(O)
|
||||
else
|
||||
unbuckle_mob()
|
||||
|
||||
/obj/structure/bed/chair/office/Bump(atom/A)
|
||||
..()
|
||||
if(!buckled_mob) return
|
||||
if(!has_buckled_mobs()) return
|
||||
|
||||
if(propelled)
|
||||
var/mob/living/occupant = unbuckle_mob()
|
||||
for(var/a in buckled_mobs)
|
||||
var/mob/living/occupant = unbuckle_mob(a)
|
||||
|
||||
var/def_zone = ran_zone()
|
||||
var/blocked = occupant.run_armor_check(def_zone, "melee")
|
||||
var/soaked = occupant.get_armor_soak(def_zone, "melee")
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
occupant.apply_effect(6, STUN, blocked)
|
||||
occupant.apply_effect(6, WEAKEN, blocked)
|
||||
occupant.apply_effect(6, STUTTER, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/victim = A
|
||||
def_zone = ran_zone()
|
||||
blocked = victim.run_armor_check(def_zone, "melee")
|
||||
soaked = victim.get_armor_soak(def_zone, "melee")
|
||||
victim.apply_effect(6, STUN, blocked)
|
||||
victim.apply_effect(6, WEAKEN, blocked)
|
||||
victim.apply_effect(6, STUTTER, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
|
||||
var/def_zone = ran_zone()
|
||||
var/blocked = occupant.run_armor_check(def_zone, "melee")
|
||||
var/soaked = occupant.get_armor_soak(def_zone, "melee")
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
occupant.apply_effect(6, STUN, blocked)
|
||||
occupant.apply_effect(6, WEAKEN, blocked)
|
||||
occupant.apply_effect(6, STUTTER, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/victim = A
|
||||
def_zone = ran_zone()
|
||||
blocked = victim.run_armor_check(def_zone, "melee")
|
||||
soaked = victim.get_armor_soak(def_zone, "melee")
|
||||
victim.apply_effect(6, STUN, blocked)
|
||||
victim.apply_effect(6, WEAKEN, blocked)
|
||||
victim.apply_effect(6, STUTTER, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
|
||||
|
||||
/obj/structure/bed/chair/office/light
|
||||
icon_state = "officechair_white"
|
||||
|
||||
@@ -17,8 +17,10 @@
|
||||
overlays = null
|
||||
var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir)
|
||||
overlays += O
|
||||
if(buckled_mob)
|
||||
buckled_mob.set_dir(dir)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
L.set_dir(dir)
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench) || istype(W,/obj/item/stack) || istype(W, /obj/item/weapon/wirecutters))
|
||||
@@ -33,7 +35,7 @@
|
||||
user.pulledby = null
|
||||
user << "<span class='warning'>You lost your grip!</span>"
|
||||
return
|
||||
if(buckled_mob && pulling && user == buckled_mob)
|
||||
if(has_buckled_mobs() && pulling && user in buckled_mobs)
|
||||
if(pulling.stat || pulling.stunned || pulling.weakened || pulling.paralysis || pulling.lying || pulling.restrained())
|
||||
pulling.pulledby = null
|
||||
pulling = null
|
||||
@@ -51,7 +53,7 @@
|
||||
if(pulling && (get_dir(src.loc, pulling.loc) == direction))
|
||||
user << "<span class='warning'>You cannot go there.</span>"
|
||||
return
|
||||
if(pulling && buckled_mob && (buckled_mob == user))
|
||||
if(pulling && has_buckled_mobs() && (user in buckled_mobs))
|
||||
user << "<span class='warning'>You cannot drive while being pushed.</span>"
|
||||
return
|
||||
|
||||
@@ -59,10 +61,12 @@
|
||||
driving = 1
|
||||
var/turf/T = null
|
||||
//--1---Move occupant---1--//
|
||||
if(buckled_mob)
|
||||
buckled_mob.buckled = null
|
||||
step(buckled_mob, direction)
|
||||
buckled_mob.buckled = src
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/L = A
|
||||
L.buckled = null
|
||||
step(L, direction)
|
||||
L.buckled = src
|
||||
//--2----Move driver----2--//
|
||||
if(pulling)
|
||||
T = pulling.loc
|
||||
@@ -70,8 +74,9 @@
|
||||
step(pulling, get_dir(pulling.loc, src.loc))
|
||||
//--3--Move wheelchair--3--//
|
||||
step(src, direction)
|
||||
if(buckled_mob) // Make sure it stays beneath the occupant
|
||||
Move(buckled_mob.loc)
|
||||
if(has_buckled_mobs()) // Make sure it stays beneath the occupant
|
||||
var/mob/living/L = buckled_mobs[1]
|
||||
Move(L.loc)
|
||||
set_dir(direction)
|
||||
if(pulling) // Driver
|
||||
if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert!
|
||||
@@ -88,38 +93,41 @@
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
var/mob/living/occupant = buckled_mob
|
||||
if(!driving)
|
||||
occupant.buckled = null
|
||||
occupant.Move(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
if (propelled)
|
||||
for (var/mob/O in src.loc)
|
||||
if (O != occupant)
|
||||
Bump(O)
|
||||
else
|
||||
unbuckle_mob()
|
||||
if (pulling && (get_dist(src, pulling) > 1))
|
||||
pulling.pulledby = null
|
||||
pulling << "<span class='warning'>You lost your grip!</span>"
|
||||
pulling = null
|
||||
else
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
src.forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
var/mob/living/occupant = A
|
||||
if(!driving)
|
||||
occupant.buckled = null
|
||||
occupant.Move(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
if (propelled)
|
||||
for (var/mob/O in src.loc)
|
||||
if (O != occupant)
|
||||
Bump(O)
|
||||
else
|
||||
unbuckle_mob()
|
||||
if (pulling && (get_dist(src, pulling) > 1))
|
||||
pulling.pulledby = null
|
||||
pulling << "<span class='warning'>You lost your grip!</span>"
|
||||
pulling = null
|
||||
else
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
src.forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/attack_hand(mob/living/user as mob)
|
||||
if (pulling)
|
||||
MouseDrop(usr)
|
||||
else
|
||||
user_unbuckle_mob(user)
|
||||
if(has_buckled_mobs())
|
||||
for(var/A in buckled_mobs)
|
||||
user_unbuckle_mob(A, user)
|
||||
return
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/CtrlClick(var/mob/user)
|
||||
if(in_range(src, user))
|
||||
if(!ishuman(user)) return
|
||||
if(user == buckled_mob)
|
||||
if(has_buckled_mobs() && user in buckled_mobs)
|
||||
user << "<span class='warning'>You realize you are unable to push the wheelchair you sit in.</span>"
|
||||
return
|
||||
if(!pulling)
|
||||
@@ -137,7 +145,7 @@
|
||||
|
||||
/obj/structure/bed/chair/wheelchair/Bump(atom/A)
|
||||
..()
|
||||
if(!buckled_mob) return
|
||||
if(!has_buckled_mobs()) return
|
||||
|
||||
if(propelled || (pulling && (pulling.a_intent == I_HURT)))
|
||||
var/mob/living/occupant = unbuckle_mob()
|
||||
@@ -213,7 +221,7 @@
|
||||
..()
|
||||
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
|
||||
if(!ishuman(usr)) return
|
||||
if(buckled_mob) return 0
|
||||
if(has_buckled_mobs()) return 0
|
||||
visible_message("[usr] collapses \the [src.name].")
|
||||
var/obj/item/wheelchair/R = new/obj/item/wheelchair(get_turf(src))
|
||||
R.name = src.name
|
||||
|
||||
@@ -73,7 +73,7 @@ var/list/mechtoys = list(
|
||||
return prob(60)
|
||||
|
||||
var/obj/structure/bed/B = A
|
||||
if (istype(A, /obj/structure/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
|
||||
if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
|
||||
return 0
|
||||
|
||||
if(istype(A, /obj/vehicle)) //no vehicles
|
||||
|
||||
@@ -354,7 +354,8 @@
|
||||
*/
|
||||
/turf/simulated/floor/airless/ceiling
|
||||
/turf/simulated/floor/plating
|
||||
|
||||
/turf/simulated/floor/plating/external // To be overrided by the map files.
|
||||
/turf/simulated/floor/tiled/external
|
||||
|
||||
//**** Here lives snow ****
|
||||
/turf/simulated/floor/snow
|
||||
|
||||
@@ -236,3 +236,9 @@
|
||||
name = "voidcraft tiles"
|
||||
icon_state = "void_light"
|
||||
|
||||
/turf/simulated/shuttle/floor/voidcraft/external // For avoiding active edges.
|
||||
// The actual temperature adjustment is defined if the SC or other future map is compiled.
|
||||
|
||||
/turf/simulated/shuttle/floor/voidcraft/external/dark
|
||||
|
||||
/turf/simulated/shuttle/floor/voidcraft/external/light
|
||||
@@ -1,6 +1,5 @@
|
||||
var/list/grass_types = list(
|
||||
/obj/structure/flora/ausbushes/sparsegrass,
|
||||
/obj/structure/flora/ausbushes/fullgrass
|
||||
|
||||
)
|
||||
|
||||
/turf/simulated/floor/outdoors/grass
|
||||
@@ -13,6 +12,12 @@ var/list/grass_types = list(
|
||||
)
|
||||
var/grass_chance = 20
|
||||
|
||||
var/list/grass_types = list(
|
||||
/obj/structure/flora/ausbushes/sparsegrass,
|
||||
/obj/structure/flora/ausbushes/fullgrass
|
||||
)
|
||||
|
||||
|
||||
/turf/simulated/floor/outdoors/grass/sif
|
||||
name = "growth"
|
||||
icon_state = "grass_sif"
|
||||
@@ -20,6 +25,10 @@ var/list/grass_types = list(
|
||||
grass_chance = 0
|
||||
var/tree_chance = 2
|
||||
|
||||
grass_types = list(
|
||||
/obj/structure/flora/sif/eyes
|
||||
)
|
||||
|
||||
/turf/simulated/floor/outdoors/grass/sif/initialize()
|
||||
if(tree_chance && prob(tree_chance))
|
||||
new /obj/structure/flora/tree/sif(src)
|
||||
@@ -27,7 +36,7 @@ var/list/grass_types = list(
|
||||
|
||||
/turf/simulated/floor/outdoors/grass/initialize()
|
||||
if(prob(50))
|
||||
icon_state += "2"
|
||||
icon_state = "[initial(icon_state)]2"
|
||||
//edge_blending_priority++
|
||||
|
||||
if(grass_chance && prob(grass_chance))
|
||||
@@ -46,4 +55,6 @@ var/list/grass_types = list(
|
||||
name = "thick growth"
|
||||
icon_state = "grass_sif_dark"
|
||||
edge_blending_priority = 5
|
||||
tree_chance = 10
|
||||
tree_chance = 10
|
||||
grass_chance = 0
|
||||
|
||||
|
||||
@@ -48,16 +48,16 @@
|
||||
..(newloc,"durasteel", "durasteel")
|
||||
|
||||
/turf/simulated/wall/wood/New(var/newloc)
|
||||
..(newloc,"wood")
|
||||
..(newloc, MAT_WOOD)
|
||||
|
||||
/turf/simulated/wall/sifwood/New(var/newloc)
|
||||
..(newloc,"alien wood")
|
||||
..(newloc, MAT_SIFWOOD)
|
||||
|
||||
/turf/simulated/wall/log/New(var/newloc)
|
||||
..(newloc,"log")
|
||||
..(newloc, MAT_LOG)
|
||||
|
||||
/turf/simulated/wall/log_sif/New(var/newloc)
|
||||
..(newloc,"alien log")
|
||||
..(newloc, MAT_SIFLOG)
|
||||
|
||||
// Shuttle Walls
|
||||
/turf/simulated/shuttle/wall
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/L = AM
|
||||
L.update_water()
|
||||
if(L.check_submerged() <= 0)
|
||||
return
|
||||
if(!istype(oldloc, /turf/simulated/floor/water))
|
||||
to_chat(L, "<span class='warning'>You get drenched in water from entering \the [src]!</span>")
|
||||
AM.water_act(5)
|
||||
@@ -64,6 +66,8 @@
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/L = AM
|
||||
L.update_water()
|
||||
if(L.check_submerged() <= 0)
|
||||
return
|
||||
if(!istype(newloc, /turf/simulated/floor/water))
|
||||
to_chat(L, "<span class='warning'>You climb out of \the [src].</span>")
|
||||
..()
|
||||
@@ -97,6 +101,8 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/proc/check_submerged()
|
||||
if(buckled)
|
||||
return 0
|
||||
var/turf/simulated/floor/water/T = loc
|
||||
if(istype(T))
|
||||
return T.depth
|
||||
|
||||
@@ -31,6 +31,12 @@
|
||||
return
|
||||
var/weapon_attack_speed = user.get_attack_speed(I) / 10
|
||||
var/weapon_damage = I.force
|
||||
var/modified_damage_percent = 1
|
||||
|
||||
for(var/datum/modifier/M in user.modifiers)
|
||||
if(!isnull(M.outgoing_melee_damage_percent))
|
||||
weapon_damage *= M.outgoing_melee_damage_percent
|
||||
modified_damage_percent *= M.outgoing_melee_damage_percent
|
||||
|
||||
if(istype(I, /obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = I
|
||||
@@ -53,7 +59,7 @@
|
||||
qdel(P)
|
||||
|
||||
var/DPS = weapon_damage / weapon_attack_speed
|
||||
to_chat(user, "<span class='notice'>Damage: [weapon_damage]</span>")
|
||||
to_chat(user, "<span class='notice'>Damage: [weapon_damage][modified_damage_percent != 1 ? " (Modified by [modified_damage_percent*100]%)":""]</span>")
|
||||
to_chat(user, "<span class='notice'>Attack Speed: [weapon_attack_speed]/s</span>")
|
||||
to_chat(user, "<span class='notice'>\The [I] does <b>[DPS]</b> damage per second.</span>")
|
||||
if(DPS > 0)
|
||||
@@ -506,12 +512,25 @@
|
||||
return
|
||||
|
||||
for(var/obj/machinery/power/emitter/E in world)
|
||||
if(E.anchored)
|
||||
E.active = 1
|
||||
if(istype(get_area(E), /area/space))
|
||||
E.anchored = TRUE
|
||||
E.state = 2
|
||||
E.connect_to_network()
|
||||
E.active = TRUE
|
||||
|
||||
for(var/obj/machinery/field_generator/F in world)
|
||||
if(F.anchored)
|
||||
if(istype(get_area(F), /area/space))
|
||||
F.Varedit_start = 1
|
||||
|
||||
for(var/obj/structure/particle_accelerator/PA in world)
|
||||
PA.anchored = TRUE
|
||||
PA.construction_state = 3
|
||||
PA.update_icon()
|
||||
for(var/obj/machinery/particle_accelerator/PA in world)
|
||||
PA.anchored = TRUE
|
||||
PA.construction_state = 3
|
||||
PA.update_icon()
|
||||
|
||||
spawn(30)
|
||||
for(var/obj/machinery/the_singularitygen/G in world)
|
||||
if(G.anchored)
|
||||
@@ -543,10 +562,6 @@
|
||||
if(!Rad.active)
|
||||
Rad.toggle_power()
|
||||
|
||||
for(var/obj/machinery/power/smes/SMES in world)
|
||||
if(SMES.anchored)
|
||||
SMES.input_attempt = 1
|
||||
|
||||
/client/proc/setup_supermatter_engine()
|
||||
set category = "Debug"
|
||||
set name = "Setup supermatter"
|
||||
|
||||
@@ -248,7 +248,10 @@ var/list/blobs = list()
|
||||
if(!P)
|
||||
return
|
||||
|
||||
var/damage = P.damage
|
||||
var/damage = P.get_structure_damage() // So tasers don't hurt the blob.
|
||||
if(!damage)
|
||||
return
|
||||
|
||||
switch(P.damage_type)
|
||||
if(BRUTE)
|
||||
if(overmind)
|
||||
@@ -281,15 +284,11 @@ var/list/blobs = list()
|
||||
/obj/effect/temporary_effect/blob_attack
|
||||
name = "blob"
|
||||
desc = "The blob lashing out at something."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "blob_attack"
|
||||
layer = 5.2
|
||||
time_to_die = 6
|
||||
alpha = 140
|
||||
invisibility = 0
|
||||
mouse_opacity = 0
|
||||
new_light_range = 0
|
||||
new_light_power = 0
|
||||
|
||||
/obj/structure/grille/blob_act()
|
||||
qdel(src)
|
||||
|
||||
@@ -260,7 +260,7 @@
|
||||
B.visible_message("<span class='danger'>The [name] retaliates, lashing out at \the [attacker]!</span>")
|
||||
B.blob_attack_animation(attacker, B.overmind)
|
||||
attacker.blob_act(B)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
// Spreads damage to nearby blobs, and attacks with the force of all nearby blobs.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
S["citizenship"] >> pref.citizenship
|
||||
S["faction"] >> pref.faction
|
||||
S["religion"] >> pref.religion
|
||||
S["nanotrasen_relation"] >> pref.nanotrasen_relation
|
||||
S["economic_status"] >> pref.economic_status
|
||||
|
||||
/datum/category_item/player_setup_item/general/background/save_character(var/savefile/S)
|
||||
S["med_record"] << pref.med_record
|
||||
@@ -20,7 +20,7 @@
|
||||
S["citizenship"] << pref.citizenship
|
||||
S["faction"] << pref.faction
|
||||
S["religion"] << pref.religion
|
||||
S["nanotrasen_relation"] << pref.nanotrasen_relation
|
||||
S["economic_status"] << pref.economic_status
|
||||
|
||||
/datum/category_item/player_setup_item/general/background/sanitize_character()
|
||||
if(!pref.home_system) pref.home_system = "Unset"
|
||||
@@ -28,7 +28,7 @@
|
||||
if(!pref.faction) pref.faction = "None"
|
||||
if(!pref.religion) pref.religion = "None"
|
||||
|
||||
pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation))
|
||||
pref.economic_status = sanitize_inlist(pref.economic_status, ECONOMIC_CLASS, initial(pref.economic_status))
|
||||
|
||||
// Moved from /datum/preferences/proc/copy_to()
|
||||
/datum/category_item/player_setup_item/general/background/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
/datum/category_item/player_setup_item/general/background/content(var/mob/user)
|
||||
. += "<b>Background Information</b><br>"
|
||||
. += "[using_map.company_name] Relation: <a href='?src=\ref[src];nt_relation=1'>[pref.nanotrasen_relation]</a><br/>"
|
||||
. += "Economic Status: <a href='?src=\ref[src];econ_status=1'>[pref.economic_status]</a><br/>"
|
||||
. += "Home System: <a href='?src=\ref[src];home_system=1'>[pref.home_system]</a><br/>"
|
||||
. += "Citizenship: <a href='?src=\ref[src];citizenship=1'>[pref.citizenship]</a><br/>"
|
||||
. += "Faction: <a href='?src=\ref[src];faction=1'>[pref.faction]</a><br/>"
|
||||
@@ -60,10 +60,10 @@
|
||||
. += "<a href='?src=\ref[src];set_security_records=1'>[TextPreview(pref.sec_record,40)]</a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/general/background/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(href_list["nt_relation"])
|
||||
var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference", pref.nanotrasen_relation) as null|anything in COMPANY_ALIGNMENTS
|
||||
if(new_relation && CanUseTopic(user))
|
||||
pref.nanotrasen_relation = new_relation
|
||||
if(href_list["econ_status"])
|
||||
var/new_class = input(user, "Choose your economic status. This will affect the amount of money you will start with.", "Character Preference", pref.economic_status) as null|anything in ECONOMIC_CLASS
|
||||
if(new_class && CanUseTopic(user))
|
||||
pref.economic_status = new_class
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["home_system"])
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user