mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-19 11:05:50 +01:00
Merge branch 'master' into sord
This commit is contained in:
@@ -80,6 +80,8 @@
|
||||
#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
|
||||
///from base of atom/Entered(): (atom/movable/entering, /atom)
|
||||
#define COMSIG_ATOM_ENTERED "atom_entered"
|
||||
/// Sent from the atom that just Entered src. From base of atom/Entered(): (/atom/entered_atom, /atom/oldLoc)
|
||||
#define COMSIG_ATOM_ENTERING "atom_entering"
|
||||
///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
|
||||
#define COMSIG_ATOM_EXIT "atom_exit"
|
||||
#define COMPONENT_ATOM_BLOCK_EXIT (1<<0)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#define ANNOUNCER_NAME "Facility PA"
|
||||
|
||||
//For custom species
|
||||
#define STARTING_SPECIES_POINTS 1
|
||||
#define STARTING_SPECIES_POINTS 2
|
||||
#define MAX_SPECIES_TRAITS 5
|
||||
|
||||
// Xenochimera thing mostly
|
||||
@@ -64,4 +64,20 @@
|
||||
#define MAT_TITANIUMGLASS "ti-glass"
|
||||
#define MAT_PLASTITANIUM "plastitanium"
|
||||
#define MAT_PLASTITANIUMHULL "plastitanium hull"
|
||||
#define MAT_PLASTITANIUMGLASS "plastitanium glass"
|
||||
#define MAT_PLASTITANIUMGLASS "plastitanium glass"
|
||||
#define MAT_GOLDHULL "gold hull"
|
||||
|
||||
#define RESIZE_MINIMUM 0.25
|
||||
#define RESIZE_MAXIMUM 2
|
||||
#define RESIZE_MINIMUM_DORMS 0.01
|
||||
#define RESIZE_MAXIMUM_DORMS 6
|
||||
|
||||
#define RESIZE_HUGE 2
|
||||
#define RESIZE_BIG 1.5
|
||||
#define RESIZE_NORMAL 1
|
||||
#define RESIZE_SMALL 0.5
|
||||
#define RESIZE_TINY 0.25
|
||||
#define RESIZE_A_HUGEBIG (RESIZE_HUGE + RESIZE_BIG) / 2
|
||||
#define RESIZE_A_BIGNORMAL (RESIZE_BIG + RESIZE_NORMAL) / 2
|
||||
#define RESIZE_A_NORMALSMALL (RESIZE_NORMAL + RESIZE_SMALL) / 2
|
||||
#define RESIZE_A_SMALLTINY (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
@@ -0,0 +1 @@
|
||||
#define WEATHER_PARTY "party"
|
||||
@@ -112,7 +112,7 @@
|
||||
'sound/ambience/generic/generic2.ogg',\
|
||||
'sound/ambience/generic/generic3.ogg'\
|
||||
)
|
||||
// 'sound/ambience/generic/generic4.ogg'\
|
||||
// 'sound/ambience/generic/generic4.ogg'
|
||||
|
||||
// Sounds of PA announcements, presumably involving shuttles?
|
||||
#define AMBIENCE_ARRIVALS list(\
|
||||
|
||||
@@ -49,11 +49,13 @@
|
||||
#define AG_SLEEPY 0x40 // fatigue/exhaustion
|
||||
|
||||
// Species spawn flags
|
||||
#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play.
|
||||
#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces)
|
||||
#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen.
|
||||
#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game.
|
||||
#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen.
|
||||
#define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play.
|
||||
#define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces)
|
||||
#define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen.
|
||||
#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game.
|
||||
#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen.
|
||||
#define SPECIES_NO_POSIBRAIN 0x20 // FBP of this species cannot have a positronic brain.
|
||||
#define SPECIES_NO_DRONEBRAIN 0x40 // FBP of this species cannot have a drone intelligence.
|
||||
|
||||
// Species appearance flags
|
||||
#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255)
|
||||
|
||||
@@ -57,7 +57,8 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_SKYBOX 30
|
||||
#define INIT_ORDER_MAPPING 25
|
||||
#define INIT_ORDER_DECALS 20
|
||||
#define INIT_ORDER_PLANTS 18 // Must initialize before atoms.
|
||||
#define INIT_ORDER_PLANTS 19 // Must initialize before atoms.
|
||||
#define INIT_ORDER_PLANETS 18
|
||||
#define INIT_ORDER_JOB 17
|
||||
#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
|
||||
#define INIT_ORDER_ATOMS 15
|
||||
@@ -68,7 +69,6 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_LIGHTING 0
|
||||
#define INIT_ORDER_AIR -1
|
||||
#define INIT_ORDER_ASSETS -3
|
||||
#define INIT_ORDER_PLANETS -4
|
||||
#define INIT_ORDER_HOLOMAPS -5
|
||||
#define INIT_ORDER_NIGHTSHIFT -6
|
||||
#define INIT_ORDER_OVERLAY -7
|
||||
|
||||
@@ -11,7 +11,7 @@ var/global/list/traits_costs = list() // Just path = cost list, saves time in c
|
||||
var/global/list/all_traits = list() // All of 'em at once (same instances)
|
||||
var/global/list/active_ghost_pods = list()
|
||||
|
||||
var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list
|
||||
var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference")
|
||||
|
||||
//stores numeric player size options indexed by name
|
||||
var/global/list/player_sizes_list = list(
|
||||
@@ -173,8 +173,8 @@ var/global/list/tf_vore_egg_types = list(
|
||||
"Spotted pink" = /obj/item/weapon/storage/vore_egg/pinkspots)
|
||||
|
||||
var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
|
||||
/obj/item/device/communicator, //TFF 19/9/19 - add option to nom communicators and commwatches,
|
||||
/obj/item/clothing/accessory/collar,
|
||||
/obj/item/device/communicator,
|
||||
/obj/item/clothing/mask,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/clothing/gloves,
|
||||
@@ -490,10 +490,11 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
var/datum/trait/instance = new path()
|
||||
if(!instance.name)
|
||||
continue //A prototype or something
|
||||
var/category = instance.category
|
||||
var/cost = instance.cost
|
||||
traits_costs[path] = cost
|
||||
all_traits[path] = instance
|
||||
switch(cost)
|
||||
switch(category)
|
||||
if(-INFINITY to -0.1)
|
||||
negative_traits[path] = instance
|
||||
if(0)
|
||||
|
||||
@@ -6,9 +6,6 @@ SUBSYSTEM_DEF(planets)
|
||||
flags = SS_BACKGROUND
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
|
||||
var/static/list/new_outdoor_turfs = list()
|
||||
var/static/list/new_outdoor_walls = list()
|
||||
|
||||
var/static/list/planets = list()
|
||||
var/static/list/z_to_planet = list()
|
||||
|
||||
@@ -20,7 +17,6 @@ SUBSYSTEM_DEF(planets)
|
||||
/datum/controller/subsystem/planets/Initialize(timeofday)
|
||||
admin_notice("<span class='danger'>Initializing planetary weather.</span>", R_DEBUG)
|
||||
createPlanets()
|
||||
allocateTurfs(TRUE)
|
||||
..()
|
||||
|
||||
/datum/controller/subsystem/planets/proc/createPlanets()
|
||||
@@ -36,64 +32,36 @@ SUBSYSTEM_DEF(planets)
|
||||
continue
|
||||
z_to_planet[Z] = NP
|
||||
|
||||
/datum/controller/subsystem/planets/proc/addTurf(var/turf/T,var/is_edge)
|
||||
if(is_edge)
|
||||
new_outdoor_walls |= T
|
||||
else
|
||||
new_outdoor_turfs |= T
|
||||
// DO NOT CALL THIS DIRECTLY UNLESS IT'S IN INITIALIZE,
|
||||
// USE turf/simulated/proc/make_indoors() and\
|
||||
// tyrf/simulated/proc/make_outdoors()
|
||||
/datum/controller/subsystem/planets/proc/addTurf(var/turf/T)
|
||||
if(z_to_planet.len >= T.z && z_to_planet[T.z])
|
||||
var/datum/planet/P = z_to_planet[T.z]
|
||||
if(!istype(P))
|
||||
return
|
||||
if(istype(T, /turf/unsimulated/wall/planetary))
|
||||
P.planet_walls += T
|
||||
else if(istype(T, /turf/simulated) && T.outdoors)
|
||||
P.planet_floors += T
|
||||
T.vis_contents |= P.weather_holder.visuals
|
||||
T.vis_contents |= P.weather_holder.special_visuals
|
||||
|
||||
|
||||
/datum/controller/subsystem/planets/proc/removeTurf(var/turf/T,var/is_edge)
|
||||
if(is_edge)
|
||||
new_outdoor_walls -= T
|
||||
else
|
||||
new_outdoor_turfs -= T
|
||||
|
||||
if(z_to_planet.len >= T.z)
|
||||
var/datum/planet/P = z_to_planet[T.z]
|
||||
if(!P)
|
||||
return
|
||||
if(is_edge)
|
||||
P.planet_floors -= T
|
||||
else
|
||||
if(istype(T, /turf/unsimulated/wall/planetary))
|
||||
P.planet_walls -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
T.vis_contents -= P.weather_holder.special_visuals
|
||||
|
||||
/datum/controller/subsystem/planets/proc/allocateTurfs(var/initial = FALSE)
|
||||
var/list/currentlist = new_outdoor_turfs
|
||||
while(currentlist.len)
|
||||
var/turf/simulated/OT = currentlist[currentlist.len]
|
||||
currentlist.len--
|
||||
if(istype(OT) && OT.outdoors && z_to_planet.len >= OT.z && z_to_planet[OT.z])
|
||||
var/datum/planet/P = z_to_planet[OT.z]
|
||||
P.planet_floors |= OT
|
||||
OT.vis_contents |= P.weather_holder.visuals
|
||||
OT.vis_contents |= P.weather_holder.special_visuals
|
||||
if(!initial && MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
currentlist = new_outdoor_walls
|
||||
while(currentlist.len)
|
||||
var/turf/unsimulated/wall/planetary/PW = currentlist[currentlist.len]
|
||||
currentlist.len--
|
||||
if(istype(PW) && z_to_planet.len >= PW.z && z_to_planet[PW.z])
|
||||
var/datum/planet/P = z_to_planet[PW.z]
|
||||
P.planet_walls |= PW
|
||||
if(!initial && MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/planets/proc/unallocateTurf(var/turf/simulated/T)
|
||||
if(istype(T) && z_to_planet[T.z])
|
||||
var/datum/planet/P = z_to_planet[T.z]
|
||||
P.planet_floors -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
T.vis_contents -= P.weather_holder.special_visuals
|
||||
else
|
||||
P.planet_floors -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
T.vis_contents -= P.weather_holder.special_visuals
|
||||
|
||||
|
||||
/datum/controller/subsystem/planets/fire(resumed = 0)
|
||||
if(new_outdoor_turfs.len || new_outdoor_walls.len)
|
||||
allocateTurfs()
|
||||
|
||||
if(!resumed)
|
||||
src.currentrun = planets.Copy()
|
||||
|
||||
@@ -153,8 +121,7 @@ SUBSYSTEM_DEF(planets)
|
||||
var/lum_g = new_brightness * GetGreenPart(new_color) / 255
|
||||
var/lum_b = new_brightness * GetBluePart (new_color) / 255
|
||||
var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs.
|
||||
for(var/I in P.planet_floors)
|
||||
var/turf/simulated/T = I
|
||||
for(var/turf/simulated/T as anything in P.planet_floors)
|
||||
if(!T.lighting_corners_initialised)
|
||||
T.generate_missing_corners()
|
||||
for(var/C in T.get_corners())
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
I = new path()
|
||||
|
||||
if(!I) // Something has gone horribly wrong, or right.
|
||||
log_debug("[name] created an Autolathe design without an assigned path. This is expected for only the Material Sheet generation.")
|
||||
log_debug("[name] created an Autolathe design without an assigned path.")
|
||||
return
|
||||
|
||||
if(I.matter && !resources)
|
||||
@@ -80,22 +80,12 @@
|
||||
if(istype(M, /datum/material/alienalloy))
|
||||
continue
|
||||
|
||||
var/obj/item/stack/material/Mat = new M.stack_type()
|
||||
|
||||
if(Mat.name in items_by_name)
|
||||
qdel(Mat)
|
||||
var/obj/item/stack/material/S = M.stack_type
|
||||
if(initial(S.name) in items_by_name)
|
||||
continue
|
||||
|
||||
var/datum/category_item/autolathe/materials/WorkDat = new(src)
|
||||
var/datum/category_item/autolathe/materials/WorkDat = new(src, M)
|
||||
|
||||
WorkDat.name = "[Mat.name]"
|
||||
WorkDat.resources = Mat.matter.Copy()
|
||||
WorkDat.is_stack = TRUE
|
||||
WorkDat.no_scale = TRUE
|
||||
WorkDat.max_stack = Mat.max_amount
|
||||
WorkDat.path = M.stack_type
|
||||
|
||||
qdel(Mat)
|
||||
|
||||
items |= WorkDat
|
||||
items_by_name[WorkDat.name] = WorkDat
|
||||
|
||||
@@ -85,7 +85,6 @@
|
||||
name = "welding mask"
|
||||
path =/obj/item/clothing/head/welding
|
||||
|
||||
//TFF 24/12/19 - Let people print more spray bottles if needed.
|
||||
/datum/category_item/autolathe/general/spraybottle
|
||||
name = "spray bottle"
|
||||
path = /obj/item/weapon/reagent_containers/spray
|
||||
|
||||
@@ -1,38 +1,23 @@
|
||||
|
||||
/datum/category_item/autolathe/materials/metal
|
||||
name = "steel sheets"
|
||||
path =/obj/item/stack/material/steel
|
||||
/datum/category_item/autolathe/materials
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
no_scale = TRUE // Prevents material duplaction exploits
|
||||
|
||||
/datum/category_item/autolathe/materials/glass
|
||||
name = "glass sheets"
|
||||
path =/obj/item/stack/material/glass
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
/datum/category_item/autolathe/materials/New(var/loc, var/mat)
|
||||
if(istype(mat, /obj/item/stack/material))
|
||||
var/obj/item/stack/material/M = mat
|
||||
name = M.name
|
||||
resources = M.matter.Copy()
|
||||
max_stack = M.max_amount
|
||||
path = M.type
|
||||
else if(istype(mat, /datum/material))
|
||||
var/datum/material/M = mat
|
||||
var/obj/item/stack/material/S = M.stack_type
|
||||
name = initial(S.name)
|
||||
resources = M.get_matter()
|
||||
max_stack = initial(S.max_amount)
|
||||
path = S
|
||||
. = ..()
|
||||
|
||||
/datum/category_item/autolathe/materials/rglass
|
||||
name = "reinforced glass sheets"
|
||||
path =/obj/item/stack/material/glass/reinforced
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/materials/rods
|
||||
/datum/category_item/autolathe/materials/rods // Not strictly a material, so they need their own define
|
||||
name = "metal rods"
|
||||
path =/obj/item/stack/rods
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/materials/plasteel
|
||||
name = "plasteel sheets"
|
||||
path =/obj/item/stack/material/plasteel
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
resources = list(MAT_PLASTEEL = 2000)
|
||||
|
||||
/datum/category_item/autolathe/materials/plastic
|
||||
name = "plastic sheets"
|
||||
path =/obj/item/stack/material/plastic
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
resources = list(MAT_PLASTIC = 2000)
|
||||
path =/obj/item/stack/rods
|
||||
@@ -0,0 +1,19 @@
|
||||
/datum/component/resize_guard
|
||||
|
||||
/datum/component/resize_guard/Initialize()
|
||||
if(!isliving(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
/datum/component/resize_guard/RegisterWithParent()
|
||||
// When our parent mob enters any atom, we check resize
|
||||
RegisterSignal(parent, COMSIG_ATOM_ENTERING, .proc/check_resize)
|
||||
|
||||
/datum/component/resize_guard/UnregisterFromParent()
|
||||
UnregisterSignal(parent, COMSIG_ATOM_ENTERING)
|
||||
|
||||
/datum/component/resize_guard/proc/check_resize()
|
||||
var/area/A = get_area(parent)
|
||||
if(A?.limit_mob_size)
|
||||
var/mob/living/L = parent
|
||||
L.resize(L.size_multiplier)
|
||||
qdel(src)
|
||||
@@ -77,13 +77,19 @@
|
||||
containertype = /obj/structure/closet/crate/focalpoint
|
||||
containername = "advanced hull shield generator crate"
|
||||
|
||||
/datum/supply_pack/eng/pointdefense
|
||||
name = "Point Defense Turret"
|
||||
contains = list(/obj/machinery/porta_turret/pointdefense/orderable)
|
||||
cost = 70
|
||||
containertype = /obj/structure/closet/crate/large/secure/heph
|
||||
containername = "point defense crate"
|
||||
access = access_security
|
||||
/datum/supply_pack/eng/point_defense_cannon_circuit
|
||||
name = "Point Defense Turret Circuit"
|
||||
contains = list(/obj/item/weapon/circuitboard/pointdefense = 2)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/heph
|
||||
containername = "point defense turret circuit crate"
|
||||
|
||||
/datum/supply_pack/eng/point_defense_control_circuit
|
||||
name = "Point Defense Controller Circuit"
|
||||
contains = list(/obj/item/weapon/circuitboard/pointdefense_control = 1)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/heph
|
||||
containername = "point defense mainframe circuit crate"
|
||||
|
||||
/datum/supply_pack/eng/electrical
|
||||
name = "Electrical maintenance crate"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
//TFF 28/8/19 - cleanup of areas placement - removes all but rogueminer_vr stuff.
|
||||
/area
|
||||
var/limit_mob_size = TRUE //If mob size is limited in the area.
|
||||
|
||||
/area/shuttle/belter
|
||||
name = "Belter Shuttle"
|
||||
|
||||
@@ -638,6 +638,7 @@
|
||||
. = ..()
|
||||
GLOB.moved_event.raise_event(AM, old_loc, AM.loc)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, old_loc)
|
||||
SEND_SIGNAL(AM, COMSIG_ATOM_ENTERING, src, old_loc)
|
||||
|
||||
/atom/Exit(atom/movable/AM, atom/new_loc)
|
||||
. = ..()
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
// Playerscale
|
||||
var/size = dna.GetUIValueRange(DNA_UI_PLAYERSCALE, player_sizes_list.len)
|
||||
if((0 < size) && (size <= player_sizes_list.len))
|
||||
H.resize(player_sizes_list[player_sizes_list[size]], FALSE)
|
||||
H.resize(player_sizes_list[player_sizes_list[size]], TRUE, ignore_prefs = TRUE)
|
||||
|
||||
// Tail/Taur Color
|
||||
H.r_tail = dna.GetUIValueRange(DNA_UI_TAIL_R, 255)
|
||||
|
||||
@@ -127,7 +127,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
if(8) //Aug
|
||||
switch(DD)
|
||||
// if(10)
|
||||
// Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer, \
|
||||
// Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer,
|
||||
// on Ahdomai. It is named after the Tajaran deity of Light, and huge celebrations are common."
|
||||
//VOREStation Add - Of course we need this.
|
||||
if(8)
|
||||
@@ -167,8 +167,8 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
Holiday["Kindness Day"] = "Kindness Day is an unofficial holiday to highlight good deeds in the \
|
||||
community, focusing on the positive power and the common thread of kindness which binds humanity and \
|
||||
friends together."
|
||||
// if(28) //Space thanksgiving.
|
||||
// Holiday["Appreciation Day"] = "Originally an old holiday from Earth, Appreciation Day follows many of the \
|
||||
if(28) //Space thanksgiving.
|
||||
Holiday["Appreciation Day"] = "Originally an old holiday from Earth, Appreciation Day follows many of the \
|
||||
traditions that its predecessor did, such as having a large feast (turkey often included), gathering with family, and being thankful \
|
||||
for what one has in life."
|
||||
if(28 > DD > 20)
|
||||
|
||||
@@ -310,26 +310,27 @@ var/global/list/additional_antag_types = list()
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client)
|
||||
clients++
|
||||
var/M_area_type = (get_turf(M))?.loc?.type
|
||||
if(ishuman(M))
|
||||
if(M.stat != DEAD)
|
||||
surviving_humans++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
if(M_area_type in escape_locations)
|
||||
escaped_humans++
|
||||
if(M.stat != DEAD)
|
||||
surviving_total++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
if(M_area_type in escape_locations)
|
||||
escaped_total++
|
||||
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape/centcom)
|
||||
if(M_area_type == /area/shuttle/escape/centcom)
|
||||
escaped_on_shuttle++
|
||||
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod1/centcom)
|
||||
if(M_area_type == /area/shuttle/escape_pod1/centcom)
|
||||
escaped_on_pod_1++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod2/centcom)
|
||||
if(M_area_type == /area/shuttle/escape_pod2/centcom)
|
||||
escaped_on_pod_2++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod3/centcom)
|
||||
if(M_area_type == /area/shuttle/escape_pod3/centcom)
|
||||
escaped_on_pod_3++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod5/centcom)
|
||||
if(M_area_type == /area/shuttle/escape_pod5/centcom)
|
||||
escaped_on_pod_5++
|
||||
|
||||
if(isobserver(M))
|
||||
|
||||
@@ -109,13 +109,13 @@
|
||||
desc = "You should probably run instead of gawking at this."
|
||||
icon = 'icons/obj/meteor.dmi'
|
||||
icon_state = "small"
|
||||
density = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/hits = 4
|
||||
var/hitpwr = 2 //Level of ex_act to be called on hit.
|
||||
var/dest
|
||||
pass_flags = PASSTABLE
|
||||
var/heavy = 0
|
||||
var/heavy = FALSE
|
||||
var/z_original
|
||||
|
||||
var/meteordrop = /obj/item/weapon/ore/iron
|
||||
@@ -147,7 +147,7 @@
|
||||
get_hit()
|
||||
|
||||
/obj/effect/meteor/Destroy()
|
||||
walk(src,0) //this cancels the walk_towards() proc
|
||||
walk(src,FALSE) //this cancels the walk_towards() proc
|
||||
GLOB.meteor_list -= src
|
||||
return ..()
|
||||
|
||||
@@ -162,10 +162,10 @@
|
||||
ram_turf(get_turf(A))
|
||||
get_hit()
|
||||
else
|
||||
die(0)
|
||||
die(FALSE)
|
||||
|
||||
/obj/effect/meteor/CanPass(atom/movable/mover, turf/target)
|
||||
return istype(mover, /obj/effect/meteor) ? 1 : ..()
|
||||
return istype(mover, /obj/effect/meteor) ? TRUE : ..()
|
||||
|
||||
/obj/effect/meteor/proc/ram_turf(var/turf/T)
|
||||
//first bust whatever is in the turf
|
||||
@@ -190,9 +190,9 @@
|
||||
/obj/effect/meteor/proc/get_hit()
|
||||
hits--
|
||||
if(hits <= 0)
|
||||
die(1)
|
||||
die(TRUE)
|
||||
|
||||
/obj/effect/meteor/proc/die(var/explode = 1)
|
||||
/obj/effect/meteor/proc/die(var/explode = TRUE)
|
||||
make_debris()
|
||||
meteor_effect(explode)
|
||||
qdel(src)
|
||||
@@ -209,16 +209,13 @@
|
||||
/obj/effect/meteor/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.excavation_amount)
|
||||
get_hit()
|
||||
if(!QDELETED(src))
|
||||
wall_power -= Proj.excavation_amount + Proj.damage + (Proj.hitscan * 25) // Instant-impact projectiles are inherently better at dealing with meteors.
|
||||
wall_power = max(1, wall_power)
|
||||
|
||||
if(wall_power < Proj.excavation_amount)
|
||||
if(prob(min(90, 100 - Proj.damage)))
|
||||
die(TRUE)
|
||||
else
|
||||
die(FALSE)
|
||||
return
|
||||
if(!QDELETED(src))
|
||||
wall_power -= Proj.excavation_amount + Proj.damage + (Proj.hitscan * 25) // Instant-impact projectiles are inherently better at dealing with meteors.
|
||||
|
||||
if(wall_power <= 0)
|
||||
die(FALSE) // If you kill the meteor, then it dies.
|
||||
return
|
||||
return
|
||||
|
||||
/obj/effect/meteor/proc/make_debris()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"wizard's cloak" = "wizard_cloak"
|
||||
)
|
||||
|
||||
// Some spell-specific variables go here, since spells themselves are temporary. Cores are more long term and more accessable than \
|
||||
// Some spell-specific variables go here, since spells themselves are temporary. Cores are more long term and more accessable than
|
||||
// mind datums. It may also allow creative players to try to pull off a 'soul jar' scenario.
|
||||
var/list/summoned_mobs = list() // Maintained horribly with maintain_summon_list().
|
||||
var/list/wards_in_use = list() // Wards don't count against the cap for other summons.
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
/datum/technomancer/equipment/default_core
|
||||
name = "Manipulation Core"
|
||||
// desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \
|
||||
// another core, don't forget to refund the old core. This has a capacity of 10,000 units of energy, and recharges at a \
|
||||
// rate of 50 units. It also reduces incoming instability from functions by 20%."
|
||||
desc = "The default core that you most likely already have. This is here in-case you change your mind after buying \
|
||||
another core, don't forget to refund the old core.<br>\
|
||||
Capacity: 10k<br>\
|
||||
|
||||
@@ -257,9 +257,17 @@
|
||||
for(var/obj/thing in E.implants)
|
||||
var/implantSubData[0]
|
||||
var/obj/item/weapon/implant/I = thing
|
||||
implantSubData["name"] = I.name
|
||||
implantSubData["known"] = istype(I) && I.known_implant
|
||||
implantData.Add(list(implantSubData))
|
||||
//VOREStation Block Edit Start
|
||||
var/obj/item/device/nif/N = thing
|
||||
if(istype(I))
|
||||
implantSubData["name"] = I.name
|
||||
implantSubData["known"] = istype(I) && I.known_implant
|
||||
implantData.Add(list(implantSubData))
|
||||
else
|
||||
implantSubData["name"] = N.name
|
||||
implantSubData["known"] = istype(N) && N.known_implant
|
||||
implantData.Add(list(implantSubData))
|
||||
//VOREStation Block Edit End
|
||||
|
||||
organData["implants"] = implantData
|
||||
organData["implants_len"] = implantData.len
|
||||
@@ -464,8 +472,11 @@
|
||||
var/unknown_body = 0
|
||||
for(var/thing in e.implants)
|
||||
var/obj/item/weapon/implant/I = thing
|
||||
var/obj/item/device/nif/N = thing //VOREStation Add: NIFs
|
||||
if(istype(I) && I.known_implant)
|
||||
imp += "[I] implanted:"
|
||||
if(istype(N) && N.known_implant) //VOREStation Add: NIFs
|
||||
imp += "[N] implanted:"
|
||||
else
|
||||
unknown_body++
|
||||
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
else
|
||||
icon_state = "dbchime-standby"
|
||||
|
||||
//TFF 3/6/19 - Port Cit RP fix of infinite frames. ToDo: Make it so that you can completely deconstruct it and reconstruct it.
|
||||
/obj/machinery/doorbell_chime/attackby(obj/item/W as obj, mob/user as mob)
|
||||
src.add_fingerprint(user)
|
||||
if(default_deconstruction_screwdriver(user, W))
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
var/list/logs = list() // Gets written to by exonet's send_message() function.
|
||||
|
||||
//TFF 3/6/19 - Port Cit RP fix for infinite frames
|
||||
circuit = /obj/item/weapon/circuitboard/telecomms/exonet_node
|
||||
// Proc: New()
|
||||
// Parameters: None
|
||||
|
||||
@@ -428,7 +428,7 @@ Class Procs:
|
||||
for(var/obj/I in contents)
|
||||
if(istype(I,/obj/item/weapon/card/id))
|
||||
I.forceMove(src.loc)
|
||||
//TFF 3/6/19 - port Cit RP fix of infinite frames. If it doesn't have a circuit board, don't create a frame. Return a smack instead. BONK!
|
||||
|
||||
if(!circuit)
|
||||
return 0
|
||||
var/obj/structure/frame/A = new /obj/structure/frame(src.loc)
|
||||
|
||||
@@ -4,11 +4,12 @@
|
||||
//
|
||||
|
||||
GLOBAL_LIST_BOILERPLATE(pointdefense_controllers, /obj/machinery/pointdefense_control)
|
||||
GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
|
||||
/obj/machinery/pointdefense_control
|
||||
name = "fire assist mainframe"
|
||||
desc = "A specialized computer designed to synchronize a variety of weapon systems and a vessel's astronav data."
|
||||
description_info = "To connect the mainframe to turrets, use a multitool to set the ident tag to that of the turrets."
|
||||
icon = 'icons/obj/pointdefense.dmi'
|
||||
icon_state = "control"
|
||||
density = TRUE
|
||||
@@ -53,7 +54,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
return TRUE
|
||||
|
||||
if(action == "toggle_active")
|
||||
var/obj/machinery/power/pointdefense/PD = locate(params["target"])
|
||||
var/obj/machinery/pointdefense/PD = locate(params["target"])
|
||||
if(!istype(PD))
|
||||
return FALSE
|
||||
|
||||
@@ -76,7 +77,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
if(id_tag)
|
||||
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
|
||||
for(var/i = 1 to LAZYLEN(pointdefense_turrets))
|
||||
var/obj/machinery/power/pointdefense/PD = pointdefense_turrets[i]
|
||||
var/obj/machinery/pointdefense/PD = pointdefense_turrets[i]
|
||||
if(!(PD.id_tag == id_tag && get_z(PD) in connected_z_levels))
|
||||
continue
|
||||
var/list/turret = list()
|
||||
@@ -117,89 +118,52 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
// The acutal point defense battery
|
||||
//
|
||||
|
||||
/obj/machinery/power/pointdefense
|
||||
/obj/machinery/pointdefense
|
||||
name = "\improper point defense battery"
|
||||
icon = 'icons/obj/pointdefense.dmi'
|
||||
icon_state = "pointdefense2"
|
||||
desc = "A Kuiper pattern anti-meteor battery. Capable of destroying most threats in a single salvo."
|
||||
description_info = "Must have the same ident tag as a fire assist mainframe on the same facility."
|
||||
description_info = "Must have the same ident tag as a fire assist mainframe on the same facility. Use a multitool to set the ident tag."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
circuit = /obj/item/weapon/circuitboard/pointdefense
|
||||
idle_power_usage = 0.1 KILOWATTS
|
||||
active_power_usage = 1 KILOWATTS
|
||||
appearance_flags = PIXEL_SCALE
|
||||
var/active = TRUE
|
||||
var/charge_cooldown = 1 SECOND //time between it can fire at different targets
|
||||
var/last_shot = 0
|
||||
var/kill_range = 18
|
||||
var/rotation_speed = 0.25 SECONDS //How quickly we turn to face threats
|
||||
var/engaging = FALSE
|
||||
var/weakref/engaging = null // The meteor we're shooting at
|
||||
var/id_tag = null
|
||||
|
||||
/obj/machinery/power/pointdefense/Initialize()
|
||||
/obj/machinery/pointdefense/Initialize()
|
||||
. = ..()
|
||||
// TODO - Remove this bit once machines are converted to Initialize
|
||||
if(ispath(circuit))
|
||||
circuit = new circuit(src)
|
||||
default_apply_parts()
|
||||
if(anchored)
|
||||
connect_to_network()
|
||||
update_icon()
|
||||
var/image/I = image(icon, icon_state = "[icon_state]_under")
|
||||
I.appearance_flags |= RESET_TRANSFORM
|
||||
underlays += I
|
||||
|
||||
/obj/machinery/power/pointdefense/examine(mob/user)
|
||||
. = ..()
|
||||
if(powernet)
|
||||
. += "It is connected to a power cable below."
|
||||
|
||||
/obj/machinery/power/pointdefense/get_description_interaction()
|
||||
/obj/machinery/pointdefense/get_description_interaction()
|
||||
. = ..()
|
||||
if(!id_tag)
|
||||
. += "[desc_panel_image("multitool")]to set ident tag and connect to a mainframe."
|
||||
|
||||
/obj/machinery/power/pointdefense/update_icon()
|
||||
/obj/machinery/pointdefense/update_icon()
|
||||
if(!active || !id_tag || inoperable())
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/machinery/power/pointdefense/default_unfasten_wrench(var/mob/user, var/obj/item/weapon/W, var/time)
|
||||
if((. = ..()))
|
||||
src.transform = null // Reset rotation if we're anchored/unanchored
|
||||
|
||||
////////// This machine is willing to take power from cables OR APCs. Handle NOPOWER stat specially here! ////////
|
||||
|
||||
/obj/machinery/power/pointdefense/connect_to_network()
|
||||
if((. = ..()))
|
||||
stat &= ~NOPOWER // We now ignore APC power
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/power/pointdefense/disconnect_from_network()
|
||||
if((. = ..()))
|
||||
power_change() // We're back on APC power.
|
||||
|
||||
/obj/machinery/power/pointdefense/power_change()
|
||||
if(powernet)
|
||||
return // We don't care, we are cable powered anyway
|
||||
/obj/machinery/pointdefense/power_change()
|
||||
var/old_stat = stat
|
||||
..()
|
||||
if(old_stat != stat)
|
||||
update_icon()
|
||||
|
||||
// Decide where to get the power to fire from
|
||||
/obj/machinery/power/pointdefense/use_power_oneoff(var/amount, var/chan = -1)
|
||||
if(powernet)
|
||||
return draw_power(amount)
|
||||
else if(powered(chan))
|
||||
use_power(amount, chan)
|
||||
return amount
|
||||
return 0
|
||||
|
||||
// Find controller with the same tag on connected z levels (if any)
|
||||
/obj/machinery/power/pointdefense/proc/get_controller()
|
||||
/obj/machinery/pointdefense/proc/get_controller()
|
||||
if(!id_tag)
|
||||
return null
|
||||
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
|
||||
@@ -208,7 +172,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels))
|
||||
return PDC
|
||||
|
||||
/obj/machinery/power/pointdefense/attackby(var/obj/item/W, var/mob/user)
|
||||
/obj/machinery/pointdefense/attackby(var/obj/item/W, var/mob/user)
|
||||
if(W?.is_multitool())
|
||||
var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text
|
||||
if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state))
|
||||
@@ -221,22 +185,21 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
return
|
||||
if(default_part_replacement(user, W))
|
||||
return
|
||||
if(default_unfasten_wrench(user, W, 40))
|
||||
return
|
||||
return ..()
|
||||
|
||||
//Guns cannot shoot through hull or generally dense turfs.
|
||||
/obj/machinery/power/pointdefense/proc/space_los(meteor)
|
||||
/obj/machinery/pointdefense/proc/space_los(meteor)
|
||||
for(var/turf/T in getline(src,meteor))
|
||||
if(T.density)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/pointdefense/proc/Shoot(var/weakref/target)
|
||||
/obj/machinery/pointdefense/proc/Shoot(var/weakref/target)
|
||||
var/obj/effect/meteor/M = target.resolve()
|
||||
if(!istype(M))
|
||||
engaging = null
|
||||
return
|
||||
engaging = TRUE
|
||||
engaging = target
|
||||
var/Angle = round(Get_Angle(src,M))
|
||||
var/matrix/rot_matrix = matrix()
|
||||
rot_matrix.Turn(Angle)
|
||||
@@ -245,80 +208,85 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
|
||||
set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH)
|
||||
|
||||
/obj/machinery/power/pointdefense/proc/finish_shot(var/weakref/target)
|
||||
//Cleanup from list
|
||||
var/obj/machinery/pointdefense_control/PC = get_controller()
|
||||
if(istype(PC))
|
||||
PC.targets -= target
|
||||
/obj/machinery/pointdefense/proc/finish_shot(var/weakref/target)
|
||||
|
||||
var/obj/machinery/pointdefense_control/PC = get_controller()
|
||||
engaging = null
|
||||
PC.targets -= target
|
||||
|
||||
engaging = FALSE
|
||||
last_shot = world.time
|
||||
var/obj/effect/meteor/M = target.resolve()
|
||||
if(!istype(M))
|
||||
return
|
||||
if(use_power_oneoff(active_power_usage) < active_power_usage)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
visible_message("[src] sputters as browns out while attempting to fire.")
|
||||
flick(src, "[initial(icon_state)]_off")
|
||||
return
|
||||
//We throw a laser but it doesnt have to hit for meteor to explode
|
||||
var/obj/item/projectile/beam/pointdefense/beam = new(get_turf(src))
|
||||
playsound(src, 'sound/weapons/mandalorian.ogg', 75, 1)
|
||||
use_power_oneoff(idle_power_usage * 10)
|
||||
beam.launch_projectile(target = M.loc, user = src)
|
||||
M.make_debris()
|
||||
qdel(M)
|
||||
|
||||
/obj/machinery/power/pointdefense/process()
|
||||
/obj/machinery/pointdefense/process()
|
||||
..()
|
||||
if(!anchored || stat & (NOPOWER|BROKEN))
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(!active)
|
||||
return
|
||||
/*
|
||||
var/desiredir = ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH
|
||||
if(dir != desiredir)
|
||||
set_dir(desiredir)
|
||||
*/
|
||||
|
||||
if(LAZYLEN(GLOB.meteor_list) > 0)
|
||||
find_and_shoot()
|
||||
|
||||
/obj/machinery/power/pointdefense/proc/find_and_shoot()
|
||||
/obj/machinery/pointdefense/proc/find_and_shoot()
|
||||
// There ARE meteors to shoot
|
||||
if(LAZYLEN(GLOB.meteor_list) == 0)
|
||||
return
|
||||
// We can shoot
|
||||
if(engaging || ((world.time - last_shot) < charge_cooldown))
|
||||
return
|
||||
|
||||
var/obj/machinery/pointdefense_control/PC = get_controller()
|
||||
if(!istype(PC))
|
||||
return
|
||||
|
||||
// Compile list of known targets
|
||||
var/list/existing_targets = list()
|
||||
for(var/weakref/WR in PC.targets)
|
||||
var/obj/effect/meteor/M = WR.resolve()
|
||||
existing_targets += M
|
||||
|
||||
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
|
||||
for(var/obj/effect/meteor/M in GLOB.meteor_list)
|
||||
var/already_targeted = FALSE
|
||||
for(var/weakref/WR in PC.targets)
|
||||
var/obj/effect/meteor/m = WR.resolve()
|
||||
if(m == M)
|
||||
already_targeted = TRUE
|
||||
break
|
||||
if(!istype(m))
|
||||
PC.targets -= WR
|
||||
|
||||
if(already_targeted)
|
||||
continue
|
||||
|
||||
if(!(M.z in connected_z_levels))
|
||||
continue
|
||||
if(get_dist(M, src) > kill_range)
|
||||
continue
|
||||
if(!emagged && space_los(M))
|
||||
// First, try and acquire new targets
|
||||
var/list/potential_targets = GLOB.meteor_list.Copy() - existing_targets
|
||||
for(var/obj/effect/meteor/M in potential_targets)
|
||||
if(targeting_check(M))
|
||||
var/weakref/target = weakref(M)
|
||||
PC.targets += target
|
||||
engaging = target
|
||||
Shoot(target)
|
||||
return
|
||||
|
||||
/obj/machinery/power/pointdefense/RefreshParts()
|
||||
// Then, focus fire on existing targets
|
||||
for(var/obj/effect/meteor/M in existing_targets)
|
||||
if(targeting_check(M))
|
||||
var/weakref/target = weakref(M)
|
||||
engaging = target
|
||||
Shoot(target)
|
||||
return
|
||||
|
||||
/obj/machinery/pointdefense/proc/targeting_check(var/obj/effect/meteor/M)
|
||||
// Target in range
|
||||
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
|
||||
if(!(M.z in connected_z_levels))
|
||||
return FALSE
|
||||
if(get_dist(M, src) > kill_range)
|
||||
return FALSE
|
||||
// If we can shoot it, then shoot
|
||||
if(emagged || !space_los(M))
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/pointdefense/RefreshParts()
|
||||
. = ..()
|
||||
// Calculates an average rating of components that affect shooting rate
|
||||
var/shootrate_divisor = total_component_rating_of_type(/obj/item/weapon/stock_parts/capacitor)
|
||||
@@ -334,7 +302,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
var/rotation_divisor = total_component_rating_of_type(/obj/item/weapon/stock_parts/manipulator)
|
||||
rotation_speed = 0.5 SECONDS / (rotation_divisor ? rotation_divisor : 1)
|
||||
|
||||
/obj/machinery/power/pointdefense/proc/Activate()
|
||||
/obj/machinery/pointdefense/proc/Activate()
|
||||
if(active)
|
||||
return FALSE
|
||||
|
||||
@@ -344,7 +312,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/pointdefense/proc/Deactivate()
|
||||
/obj/machinery/pointdefense/proc/Deactivate()
|
||||
if(!active)
|
||||
return FALSE
|
||||
playsound(src, 'sound/machines/apc_nopower.ogg', 50, 0)
|
||||
@@ -352,32 +320,3 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
|
||||
active = FALSE
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
//
|
||||
// Projectile Beam Definitions
|
||||
//
|
||||
|
||||
/obj/item/projectile/beam/pointdefense
|
||||
name = "point defense salvo"
|
||||
icon_state = "laser"
|
||||
damage = 15
|
||||
damage_type = ELECTROCUTE //You should be safe inside a voidsuit
|
||||
sharp = FALSE //"Wide" spectrum beam
|
||||
light_color = COLOR_GOLD
|
||||
|
||||
muzzle_type = /obj/effect/projectile/muzzle/pointdefense
|
||||
tracer_type = /obj/effect/projectile/tracer/pointdefense
|
||||
impact_type = /obj/effect/projectile/impact/pointdefense
|
||||
|
||||
|
||||
/obj/effect/projectile/tracer/pointdefense
|
||||
icon = 'icons/obj/projectiles_vr.dmi'
|
||||
icon_state = "beam_pointdef"
|
||||
|
||||
/obj/effect/projectile/muzzle/pointdefense
|
||||
icon = 'icons/obj/projectiles_vr.dmi'
|
||||
icon_state = "muzzle_pointdef"
|
||||
|
||||
/obj/effect/projectile/impact/pointdefense
|
||||
icon = 'icons/obj/projectiles_vr.dmi'
|
||||
icon_state = "impact_pointdef"
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
var/check_anomalies = TRUE //checks if it can shoot at unidentified lifeforms (ie xenos)
|
||||
var/check_synth = FALSE //if active, will shoot at anything not an AI or cyborg
|
||||
var/check_all = FALSE //If active, will fire on anything, including synthetics.
|
||||
var/fire_at_movement = FALSE // If active, will fire on the most recent thing to move in range, as soon as possible.
|
||||
var/ailock = FALSE // AI cannot use this
|
||||
var/check_down = FALSE //If active, will shoot to kill when lethals are also on
|
||||
var/faction = null //if set, will not fire at people in the same faction for any reason.
|
||||
@@ -96,8 +95,6 @@
|
||||
var/timeout = 10 // When a turret pops up, then finds nothing to shoot at, this number decrements until 0, when it pops down.
|
||||
var/can_salvage = TRUE // If false, salvaging doesn't give you anything.
|
||||
|
||||
var/stay_up = FALSE // If true, the turret will remain open while it is powered.
|
||||
|
||||
/obj/machinery/porta_turret/crescent
|
||||
req_one_access = list(access_cent_specops)
|
||||
enabled = FALSE
|
||||
@@ -279,31 +276,6 @@
|
||||
)
|
||||
return data
|
||||
|
||||
/obj/machinery/porta_turret/pointdefense
|
||||
name = "point-defense turret"
|
||||
turret_type = "core"
|
||||
desc = "A basic ship-mounted rock-breaker."
|
||||
description_info = "This turret is capable of blasting incoming meteors into gravel, but it is very limited in range."
|
||||
|
||||
installation = /obj/item/weapon/gun/energy/mininglaser
|
||||
|
||||
check_arrest = FALSE
|
||||
check_records = FALSE
|
||||
check_weapons = FALSE
|
||||
check_access = FALSE
|
||||
check_anomalies = FALSE
|
||||
check_synth = FALSE
|
||||
check_all = FALSE
|
||||
fire_at_movement = TRUE
|
||||
stay_up = TRUE
|
||||
ailock = FALSE
|
||||
check_down = FALSE
|
||||
|
||||
/obj/machinery/porta_turret/pointdefense/orderable
|
||||
enabled = FALSE
|
||||
anchored = FALSE
|
||||
locked = FALSE
|
||||
|
||||
/obj/machinery/porta_turret/Initialize()
|
||||
//Sets up a spark system
|
||||
spark_system = new /datum/effect/effect/system/spark_spread
|
||||
@@ -350,8 +322,6 @@
|
||||
var/obj/item/projectile/P = initial(E.projectile_type)
|
||||
//var/obj/item/ammo_casing/shottype = E.projectile_type
|
||||
|
||||
//GLOB.moved_event.register_global(src, /obj/machinery/porta_turret/proc/point_defense) //VOREStation Removal
|
||||
|
||||
projectile = P
|
||||
lethal_projectile = projectile
|
||||
shot_sound = initial(P.fire_sound)
|
||||
@@ -407,14 +377,6 @@
|
||||
lethal_shot_sound = 'sound/weapons/eluger.ogg'
|
||||
shot_sound = 'sound/weapons/Taser.ogg'
|
||||
|
||||
if(/obj/item/weapon/gun/energy/mininglaser)
|
||||
lethal_icon_color = "green"
|
||||
lethal_projectile = /obj/item/projectile/beam/mininglaser
|
||||
lethal_shot_sound = 'sound/weapons/eluger.ogg'
|
||||
icon_color = "red"
|
||||
projectile = /obj/item/projectile/beam/weaklaser
|
||||
shot_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
/obj/machinery/porta_turret/proc/isLocked(mob/user)
|
||||
if(locked && !issilicon(user))
|
||||
to_chat(user, "<span class='notice'>Controls locked.</span>")
|
||||
@@ -712,10 +674,6 @@
|
||||
popDown()
|
||||
return
|
||||
|
||||
if(stay_up)
|
||||
timeout = 10
|
||||
popUp()
|
||||
|
||||
var/list/targets = list() //list of primary targets
|
||||
var/list/secondarytargets = list() //targets that are least important
|
||||
|
||||
@@ -738,7 +696,7 @@
|
||||
if(!tryToShootAt(targets))
|
||||
if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets
|
||||
timeout--
|
||||
if(timeout <= 0 && !stay_up)
|
||||
if(timeout <= 0)
|
||||
spawn()
|
||||
popDown() // no valid targets, close the cover
|
||||
|
||||
@@ -746,14 +704,6 @@
|
||||
use_power(20000)
|
||||
health = min(health+1, maxhealth) // 1HP for 20kJ
|
||||
|
||||
// We're expecting the first arg to be a target, for this we don't care about previous and next turfs.
|
||||
/obj/machinery/porta_turret/proc/point_defense(var/atom/movable/Targ)
|
||||
if((stat & (NOPOWER|BROKEN)) || !fire_at_movement) // Are we even able or supposed to fire at non-moving targets?
|
||||
return
|
||||
|
||||
if((isliving(Targ) && assess_living(Targ)) || ((istype(Targ, /obj/item) || istype(Targ, /obj/effect/meteor)) && Targ.invisibility < INVISIBILITY_LEVEL_ONE && Targ in view(7,src))) // Is the target a living thing, if so, is it a valid target? Or if it's not living, is it in sight?
|
||||
target(Targ) // Yes? Blast it.
|
||||
|
||||
/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets)
|
||||
switch(assess_living(L))
|
||||
if(TURRET_PRIORITY_TARGET)
|
||||
@@ -780,10 +730,10 @@
|
||||
if(L.stat == DEAD && !emagged) //if the perp is dead, no need to bother really
|
||||
return TURRET_NOT_TARGET //move onto next potential victim!
|
||||
|
||||
if(get_dist(src, get_turf(L)) > 7) //if it's too far away, why bother?
|
||||
if(get_dist(src, L) > 7) //if it's too far away, why bother?
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(!(L in check_trajectory(get_turf(L), src))) //check if we have true line of sight
|
||||
if(!(L in check_trajectory(L, src))) //check if we have true line of sight
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(emagged) // If emagged not even the dead get a rest
|
||||
@@ -890,9 +840,8 @@
|
||||
last_target = target
|
||||
spawn()
|
||||
popUp() //pop the turret up if it's not already up.
|
||||
if(dir != get_dir(src, target))
|
||||
set_dir(get_dir(src, target)) //even if you can't shoot, follow the target
|
||||
playsound(src, 'sound/machines/turrets/turret_rotate.ogg', 100, 1) // Play rotating sound
|
||||
set_dir(get_dir(src, target)) //even if you can't shoot, follow the target
|
||||
playsound(src, 'sound/machines/turrets/turret_rotate.ogg', 100, 1) // Play rotating sound
|
||||
spawn()
|
||||
shootAt(target)
|
||||
return 1
|
||||
@@ -956,9 +905,6 @@
|
||||
var/check_weapons
|
||||
var/check_anomalies
|
||||
var/check_all
|
||||
var/check_down
|
||||
var/fire_at_movement
|
||||
var/stay_up
|
||||
var/ailock
|
||||
|
||||
/obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC)
|
||||
@@ -974,9 +920,6 @@
|
||||
check_weapons = TC.check_weapons
|
||||
check_anomalies = TC.check_anomalies
|
||||
check_all = TC.check_all
|
||||
check_down = TC.check_down
|
||||
fire_at_movement = TC.fire_at_movement
|
||||
stay_up = TC.stay_up
|
||||
ailock = TC.ailock
|
||||
|
||||
power_change()
|
||||
|
||||
@@ -632,7 +632,7 @@
|
||||
/obj/machinery/suit_cycler/exploration
|
||||
name = "Explorer suit cycler"
|
||||
model_text = "Exploration"
|
||||
departments = list("Exploration","Old Exploration","No Change")
|
||||
departments = list("Exploration","Expedition Medic","Old Exploration","No Change")
|
||||
|
||||
/obj/machinery/suit_cycler/exploration/Initialize()
|
||||
species -= SPECIES_TESHARI
|
||||
@@ -1113,6 +1113,9 @@
|
||||
if("Exploration")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/exploration
|
||||
parent_suit = /obj/item/clothing/suit/space/void/exploration
|
||||
if("Expedition Medic")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/expedition_medical
|
||||
parent_suit = /obj/item/clothing/suit/space/void/expedition_medical
|
||||
if("Old Exploration")
|
||||
parent_helmet = /obj/item/clothing/head/helmet/space/void/exploration/alt
|
||||
parent_suit = /obj/item/clothing/suit/space/void/exploration/alt
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
|
||||
// Old Exploration is too WIP to use right now
|
||||
/obj/machinery/suit_cycler/exploration
|
||||
req_access = list(access_explorer)
|
||||
departments = list("Exploration","No Change")
|
||||
req_access = null
|
||||
req_one_access = list(access_explorer,access_medical_equip)
|
||||
departments = list("Exploration","Expedition Medic","No Change")
|
||||
|
||||
/obj/machinery/suit_cycler/pilot
|
||||
req_access = list(access_pilot)
|
||||
|
||||
@@ -196,9 +196,6 @@
|
||||
TC.check_weapons = check_weapons
|
||||
TC.check_anomalies = check_anomalies
|
||||
TC.check_all = check_all
|
||||
TC.check_down = check_down
|
||||
TC.stay_up = stay_up
|
||||
TC.fire_at_movement = fire_at_movement
|
||||
TC.ailock = ailock
|
||||
|
||||
if(istype(control_area))
|
||||
|
||||
@@ -590,8 +590,9 @@
|
||||
desc = "An old sweet water vending machine,how did this end up here?"
|
||||
icon_state = "sovietsoda"
|
||||
product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
|
||||
products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 30) // TODO Russian soda can
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 20) // TODO Russian cola can
|
||||
products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/boda = 30, //ADDITION 04/03/2021
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/kompot = 20) //ADDITION 04/03/2021
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/cans/kvass = 20) //ADDITION 04/03/2021
|
||||
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
|
||||
vending_sound = "machines/vending/vending_cans.ogg"
|
||||
|
||||
|
||||
@@ -1410,7 +1410,6 @@
|
||||
contraband = list(/obj/item/clothing/head/syndicatefake = 1,
|
||||
/obj/item/clothing/suit/syndicatefake = 1)
|
||||
|
||||
//TFF 19/12/19 - Brig version of a seed storage vendor
|
||||
/obj/machinery/seed_storage/brig
|
||||
name = "Prisoners' food seed storage"
|
||||
starting_seeds = list(
|
||||
@@ -4540,7 +4539,6 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat = 10)
|
||||
vend_delay = 15
|
||||
|
||||
//TFF 19/12/19 - Brig version of a seed storage vendor
|
||||
/obj/machinery/seed_storage/brig
|
||||
name = "Prisoners' food seed storage"
|
||||
starting_seeds = list(
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
desc = "Used for building lights."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "tube-construct-item"
|
||||
refund_amt = 2 //TFF 17/1/20 - Oversight fix for infinite steel produciton.
|
||||
refund_amt = 2
|
||||
build_machine_type = /obj/machinery/light_construct
|
||||
reverse = 1
|
||||
|
||||
|
||||
@@ -67,9 +67,8 @@
|
||||
|
||||
//Tanning!
|
||||
for(var/obj/item/stack/hairlesshide/HH in washing)
|
||||
var/obj/item/stack/WL = new HH.wet_type(src)
|
||||
if(istype(WL))
|
||||
WL.amount = HH.amount
|
||||
var/obj/item/stack/wetleather/WL = new(src)
|
||||
WL.amount = HH.amount
|
||||
washing -= HH
|
||||
HH.forceMove(get_turf(src))
|
||||
HH.use(HH.amount)
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
The image seems important."
|
||||
listing_name = "Safety - Mech Operation"
|
||||
|
||||
//VOREStation Removal Start TFF 17/12/19 - lore not used in our station's own lore.
|
||||
//VOREStation Removal Start
|
||||
/*
|
||||
/datum/poster/nanotrasen/nt_4
|
||||
icon_state = "ntposter04"
|
||||
|
||||
@@ -87,4 +87,6 @@
|
||||
light_range = 2
|
||||
light_power = 0.5
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
//VOREStation edit ends
|
||||
/obj/effect/projectile/impact/pointdefense
|
||||
icon_state = "impact_pointdef"
|
||||
|
||||
@@ -99,4 +99,6 @@
|
||||
light_range = 2
|
||||
light_power = 0.5
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
//VOREStation edit ends
|
||||
/obj/effect/projectile/muzzle/pointdefense
|
||||
icon_state = "muzzle_pointdef"
|
||||
|
||||
@@ -129,3 +129,5 @@
|
||||
light_power = 0.5
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
/obj/effect/projectile/tracer/pointdefense
|
||||
icon_state = "beam_pointdef"
|
||||
|
||||
@@ -294,7 +294,7 @@
|
||||
icon_state = "lamp"
|
||||
force = 10
|
||||
center_of_mass = list("x" = 13,"y" = 11)
|
||||
brightness_on = 10 //TFF 27/11/19 - post refactor fix for intensity levels.
|
||||
brightness_on = 10
|
||||
w_class = ITEMSIZE_LARGE
|
||||
power_use = 0
|
||||
on = 1
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
/obj/item/stack/animalhide
|
||||
name = "hide"
|
||||
desc = "The hide of some creature."
|
||||
description_info = "Use something <b><font color='red'>sharp</font></b>, like a knife, to scrape the hairs/feathers/etc off this hide to prepare it for tanning."
|
||||
icon_state = "sheet-hide"
|
||||
drop_sound = 'sound/items/drop/cloth.ogg'
|
||||
pickup_sound = 'sound/items/pickup/cloth.ogg'
|
||||
amount = 1
|
||||
max_amount = 20
|
||||
stacktype = "hide"
|
||||
no_variants = TRUE
|
||||
|
||||
var/process_type = /obj/item/stack/hairlesshide
|
||||
// This needs to be very clearly documented for players. Whether it should stay in the main description is up for debate.
|
||||
/obj/item/stack/animalhide/examine(var/mob/user)
|
||||
. = ..()
|
||||
. += description_info
|
||||
|
||||
/obj/item/stack/animalhide/human
|
||||
name = "skin"
|
||||
@@ -18,7 +22,6 @@
|
||||
no_variants = FALSE
|
||||
drop_sound = 'sound/items/drop/leather.ogg'
|
||||
pickup_sound = 'sound/items/pickup/leather.ogg'
|
||||
amount = 1
|
||||
stacktype = "hide-human"
|
||||
|
||||
/obj/item/stack/animalhide/corgi
|
||||
@@ -26,7 +29,6 @@
|
||||
desc = "The by-product of corgi farming."
|
||||
singular_name = "corgi hide piece"
|
||||
icon_state = "sheet-corgi"
|
||||
amount = 1
|
||||
stacktype = "hide-corgi"
|
||||
|
||||
/obj/item/stack/animalhide/cat
|
||||
@@ -34,7 +36,6 @@
|
||||
desc = "The by-product of cat farming."
|
||||
singular_name = "cat hide piece"
|
||||
icon_state = "sheet-cat"
|
||||
amount = 1
|
||||
stacktype = "hide-cat"
|
||||
|
||||
/obj/item/stack/animalhide/monkey
|
||||
@@ -42,7 +43,6 @@
|
||||
desc = "The by-product of monkey farming."
|
||||
singular_name = "monkey hide piece"
|
||||
icon_state = "sheet-monkey"
|
||||
amount = 1
|
||||
stacktype = "hide-monkey"
|
||||
|
||||
/obj/item/stack/animalhide/lizard
|
||||
@@ -50,7 +50,6 @@
|
||||
desc = "Sssssss..."
|
||||
singular_name = "lizard skin piece"
|
||||
icon_state = "sheet-lizard"
|
||||
amount = 1
|
||||
stacktype = "hide-lizard"
|
||||
|
||||
/obj/item/stack/animalhide/xeno
|
||||
@@ -58,7 +57,6 @@
|
||||
desc = "The skin of a terrible creature."
|
||||
singular_name = "alien hide piece"
|
||||
icon_state = "sheet-xeno"
|
||||
amount = 1
|
||||
stacktype = "hide-xeno"
|
||||
|
||||
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
|
||||
@@ -68,7 +66,6 @@
|
||||
singular_name = "alien chitin piece"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "chitin"
|
||||
amount = 1
|
||||
stacktype = "hide-chitin"
|
||||
|
||||
/obj/item/xenos_claw
|
||||
@@ -88,19 +85,28 @@
|
||||
if(has_edge(W) || is_sharp(W))
|
||||
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
|
||||
user.visible_message("<span class='notice'>\The [user] 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")
|
||||
if(do_after(user,50))
|
||||
to_chat(user, "<span class='notice'>You cut the hair from this [src.singular_name]</span>")
|
||||
var/scraped = 0
|
||||
while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/hairlesshide/HS in user.loc)
|
||||
if(HS.amount < 50 && istype(HS, process_type))
|
||||
HS.amount++
|
||||
src.use(1)
|
||||
return
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/HS = new process_type(usr.loc)
|
||||
if(istype(HS))
|
||||
HS.amount = 1
|
||||
var/obj/item/stack/hairlesshide/H = null
|
||||
for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf
|
||||
if(HS.amount < HS.max_amount)
|
||||
H = HS
|
||||
break
|
||||
|
||||
// Either we found a valid stack, in which case increment amount,
|
||||
// Or we need to make a new stack
|
||||
if(istype(H))
|
||||
H.amount++
|
||||
else
|
||||
H = new /obj/item/stack/hairlesshide(user.loc)
|
||||
|
||||
// Increment the amount
|
||||
src.use(1)
|
||||
scraped++
|
||||
|
||||
if(scraped)
|
||||
to_chat(user, SPAN_NOTICE("You scrape the hair off [scraped] hide\s."))
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -110,31 +116,43 @@
|
||||
/obj/item/stack/hairlesshide
|
||||
name = "hairless hide"
|
||||
desc = "This hide was stripped of it's hair, but still needs tanning."
|
||||
description_info = "Get it <b><font color='blue'>wet</font></b> to continue tanning this into leather.<br>\
|
||||
You could set it in a river, wash it with a sink, or just splash water on it with a bucket."
|
||||
singular_name = "hairless hide piece"
|
||||
icon_state = "sheet-hairlesshide"
|
||||
no_variants = FALSE
|
||||
amount = 1
|
||||
max_amount = 20
|
||||
stacktype = "hairlesshide"
|
||||
var/cleaning = FALSE // Can we be water_acted, or are we busy? To prevent accidental hide duplication and the collapse of causality.
|
||||
|
||||
var/wet_type = /obj/item/stack/wetleather
|
||||
/obj/item/stack/hairlesshide/examine(var/mob/user)
|
||||
. = ..()
|
||||
. += description_info
|
||||
|
||||
/obj/item/stack/hairlesshide/water_act(var/wateramount)
|
||||
..()
|
||||
cleaning = TRUE
|
||||
while(amount > 0 && wateramount > 0)
|
||||
use(1)
|
||||
wateramount--
|
||||
new wet_type(get_turf(src))
|
||||
cleaning = FALSE
|
||||
. = ..()
|
||||
wateramount = min(amount, round(wateramount))
|
||||
for(var/i in 1 to wateramount)
|
||||
var/obj/item/stack/wetleather/H = null
|
||||
for(var/obj/item/stack/wetleather/HS in get_turf(src)) // Doesn't have a user, can't just use their loc
|
||||
if(HS.amount < HS.max_amount)
|
||||
H = HS
|
||||
break
|
||||
|
||||
// Either we found a valid stack, in which case increment amount,
|
||||
// Or we need to make a new stack
|
||||
if(istype(H))
|
||||
H.amount++
|
||||
else
|
||||
H = new /obj/item/stack/wetleather(get_turf(src))
|
||||
|
||||
return
|
||||
// Increment the amount
|
||||
src.use(1)
|
||||
|
||||
/obj/item/stack/hairlesshide/proc/rapidcure(var/stacknum = 1)
|
||||
stacknum = min(stacknum, amount)
|
||||
|
||||
while(stacknum)
|
||||
var/obj/item/stack/wetleather/I = new wet_type(get_turf(src))
|
||||
var/obj/item/stack/wetleather/I = new /obj/item/stack/wetleather(get_turf(src))
|
||||
|
||||
if(istype(I))
|
||||
I.dry()
|
||||
@@ -146,16 +164,34 @@
|
||||
/obj/item/stack/wetleather
|
||||
name = "wet leather"
|
||||
desc = "This leather has been cleaned but still needs to be dried."
|
||||
description_info = "To finish tanning the leather, you need to dry it. \
|
||||
You could place it under a <b><font color='red'>fire</font></b>, \
|
||||
put it in a <b><font color='blue'>drying rack</font></b>, \
|
||||
or build a <b><font color='brown'>tanning rack</font></b> from steel or wooden boards."
|
||||
singular_name = "wet leather piece"
|
||||
icon_state = "sheet-wetleather"
|
||||
var/wetness = 30 //Reduced when exposed to high temperautres
|
||||
var/drying_threshold_temperature = 500 //Kelvin to start drying
|
||||
no_variants = FALSE
|
||||
amount = 1
|
||||
max_amount = 20
|
||||
stacktype = "wetleather"
|
||||
|
||||
var/dry_type = /obj/item/stack/material/leather
|
||||
|
||||
/obj/item/stack/wetleather/examine(var/mob/user)
|
||||
. = ..()
|
||||
. += description_info
|
||||
. += "\The [src] is [get_dryness_text()]."
|
||||
|
||||
/obj/item/stack/wetleather/proc/get_dryness_text()
|
||||
if(wetness > 20)
|
||||
return "wet"
|
||||
if(wetness > 10)
|
||||
return "damp"
|
||||
if(wetness)
|
||||
return "almost dry"
|
||||
return "dry"
|
||||
|
||||
/obj/item/stack/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
..()
|
||||
if(exposed_temperature >= drying_threshold_temperature)
|
||||
@@ -164,17 +200,87 @@
|
||||
dry()
|
||||
|
||||
/obj/item/stack/wetleather/proc/dry()
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/material/leather/HS in src.loc)
|
||||
if(HS.amount < 50)
|
||||
HS.amount++
|
||||
wetness = initial(wetness)
|
||||
src.use(1)
|
||||
return
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/HS = new dry_type(src.loc)
|
||||
var/obj/item/stack/material/leather/L = new(src.loc)
|
||||
L.amount = amount
|
||||
use(amount)
|
||||
return L
|
||||
|
||||
if(istype(HS))
|
||||
HS.amount = 1
|
||||
wetness = initial(wetness)
|
||||
src.use(1)
|
||||
/obj/item/stack/wetleather/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified)
|
||||
. = ..()
|
||||
if(.) // If it transfers any, do a weighted average of the wetness
|
||||
var/obj/item/stack/wetleather/W = S
|
||||
var/oldamt = W.amount - .
|
||||
W.wetness = round(((oldamt * W.wetness) + (. * wetness)) / W.amount)
|
||||
|
||||
|
||||
|
||||
/obj/structure/tanning_rack
|
||||
name = "tanning rack"
|
||||
desc = "A rack used to stretch leather out and hold it taut during the tanning process."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "spike"
|
||||
|
||||
var/obj/item/stack/wetleather/drying = null
|
||||
|
||||
/obj/structure/tanning_rack/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src) // SSObj fires ~every 2s , starting from wetness 30 takes ~1m
|
||||
|
||||
/obj/structure/tanning_rack/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/tanning_rack/process()
|
||||
if(drying && drying.wetness)
|
||||
drying.wetness = max(drying.wetness - 1, 0)
|
||||
if(!drying.wetness)
|
||||
visible_message("The [drying] is dry!")
|
||||
update_icon()
|
||||
|
||||
/obj/structure/tanning_rack/examine(var/mob/user)
|
||||
. = ..()
|
||||
if(drying)
|
||||
. += "\The [drying] is [drying.get_dryness_text()]."
|
||||
|
||||
/obj/structure/tanning_rack/update_icon()
|
||||
overlays.Cut()
|
||||
if(drying)
|
||||
var/image/I
|
||||
if(drying.wetness)
|
||||
I = image(icon, "leather_wet")
|
||||
else
|
||||
I = image(icon, "leather_dry")
|
||||
add_overlay(I)
|
||||
|
||||
/obj/structure/tanning_rack/attackby(var/atom/A, var/mob/user)
|
||||
if(istype(A, /obj/item/stack/wetleather))
|
||||
if(!drying) // If not drying anything, start drying the thing
|
||||
if(user.unEquip(A, target = src))
|
||||
drying = A
|
||||
else // Drying something, add if possible
|
||||
var/obj/item/stack/wetleather/W = A
|
||||
W.transfer_to(drying, W.amount, TRUE)
|
||||
update_icon()
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/structure/tanning_rack/attack_hand(var/mob/user)
|
||||
if(drying)
|
||||
var/obj/item/stack/S = drying
|
||||
if(!drying.wetness) // If it's dry, make a stack of dry leather and prepare to put that in their hands
|
||||
var/obj/item/stack/material/leather/L = new(src)
|
||||
L.amount = drying.amount
|
||||
drying.use(drying.amount)
|
||||
S = L
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.put_in_any_hand_if_possible(S))
|
||||
S.forceMove(get_turf(src))
|
||||
else
|
||||
S.forceMove(get_turf(src))
|
||||
drying = null
|
||||
update_icon()
|
||||
|
||||
/obj/structure/tanning_rack/attack_robot(var/mob/user)
|
||||
attack_hand(user) // That has checks to
|
||||
@@ -949,7 +949,7 @@
|
||||
/obj/item/toy/plushie/mouse
|
||||
name = "mouse plush"
|
||||
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
|
||||
icon_state = "mouseplushie" //TFF 12/11/19 - updated icon to show a sprite that doesn't replicate a dead mouse. Heck you for that! >:C
|
||||
icon_state = "mouseplushie"
|
||||
pokephrase = "Squeak!"
|
||||
|
||||
/obj/item/toy/plushie/kitten
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
name = T_BOARD("point defense battery")
|
||||
board_type = new /datum/frame/frame_types/machine
|
||||
desc = "Control systems for a Kuiper pattern point defense battery. Aim away from vessel."
|
||||
build_path = /obj/machinery/power/pointdefense
|
||||
origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2, TECH_POWER = 2)
|
||||
build_path = /obj/machinery/pointdefense
|
||||
origin_tech = list(TECH_ENGINEERING = 3, TECH_COMBAT = 2)
|
||||
req_components = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser = 1,
|
||||
/obj/item/weapon/stock_parts/manipulator = 2,
|
||||
|
||||
@@ -7,4 +7,147 @@
|
||||
|
||||
/obj/random/empty_or_lootable_crate/item_to_spawn()
|
||||
return pick(/obj/random/crate,
|
||||
/obj/random/multiple/corp_crate)
|
||||
/obj/random/multiple/corp_crate)
|
||||
|
||||
/obj/random/forgotten_tram
|
||||
name = "random forgotten tram item"
|
||||
desc = "Spawns a random item that someone might accidentally leave on a tram. Sometimes spawns nothing."
|
||||
spawn_nothing_percentage = 30
|
||||
|
||||
/obj/random/forgotten_tram/item_to_spawn()
|
||||
return pick(prob(2);/obj/item/device/flashlight,
|
||||
prob(2);/obj/item/device/flashlight/glowstick,
|
||||
prob(2);/obj/item/device/flashlight/glowstick/blue,
|
||||
prob(1);/obj/item/device/flashlight/glowstick/orange,
|
||||
prob(1);/obj/item/device/flashlight/glowstick/red,
|
||||
prob(1);/obj/item/device/flashlight/glowstick/yellow,
|
||||
prob(1);/obj/item/device/flashlight/pen,
|
||||
prob(2);/obj/item/device/flashlight/maglight,
|
||||
prob(5);/obj/random/cigarettes,
|
||||
prob(5);/obj/random/soap,
|
||||
prob(5);/obj/random/drinksoft,
|
||||
prob(5);/obj/random/snack,
|
||||
prob(5);/obj/random/plushie,
|
||||
prob(2);/obj/item/weapon/storage/secure/briefcase,
|
||||
prob(4);/obj/item/weapon/storage/briefcase,
|
||||
prob(5);/obj/item/weapon/storage/backpack,
|
||||
prob(5);/obj/item/weapon/storage/backpack/medic,
|
||||
prob(5);/obj/item/weapon/storage/backpack/industrial,
|
||||
prob(5);/obj/item/weapon/storage/backpack/toxins,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag/med,
|
||||
prob(3);/obj/item/weapon/storage/backpack/dufflebag/eng,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie/med,
|
||||
prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,
|
||||
prob(4);/obj/item/weapon/storage/backpack/satchel,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/norm,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/med,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/eng,
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/tox,
|
||||
prob(5);/obj/item/weapon/storage/backpack/messenger/med,
|
||||
prob(5);/obj/item/weapon/storage/backpack/messenger/engi,
|
||||
prob(5);/obj/item/weapon/storage/backpack/messenger/tox,
|
||||
prob(3);/obj/item/weapon/storage/wallet,
|
||||
prob(1);/obj/item/clothing/gloves/black,
|
||||
prob(1);/obj/item/clothing/gloves/blue,
|
||||
prob(1);/obj/item/clothing/gloves/brown,
|
||||
prob(1);/obj/item/clothing/gloves/duty,
|
||||
prob(1);/obj/item/clothing/gloves/fingerless,
|
||||
prob(1);/obj/item/clothing/gloves/green,
|
||||
prob(1);/obj/item/clothing/gloves/grey,
|
||||
prob(1);/obj/item/clothing/gloves/orange,
|
||||
prob(1);/obj/item/clothing/gloves/yellow,
|
||||
prob(3);/obj/item/clothing/gloves/botanic_leather,
|
||||
prob(2);/obj/item/clothing/gloves/sterile/latex,
|
||||
prob(5);/obj/item/clothing/gloves/white,
|
||||
prob(5);/obj/item/clothing/gloves/rainbow,
|
||||
prob(2);/obj/item/clothing/gloves/fyellow,
|
||||
prob(1);/obj/item/clothing/glasses/rimless,
|
||||
prob(1);/obj/item/clothing/glasses/thin,
|
||||
prob(1);/obj/item/clothing/glasses/regular,
|
||||
prob(1);/obj/item/clothing/glasses/regular/rimless,
|
||||
prob(1);/obj/item/clothing/glasses/regular/thin,
|
||||
prob(1);/obj/item/clothing/glasses/fakesunglasses,
|
||||
prob(1);/obj/item/clothing/glasses/fakesunglasses/aviator,
|
||||
prob(1);/obj/item/clothing/glasses/omnihud,
|
||||
prob(4);/obj/item/clothing/head/hardhat,
|
||||
prob(3);/obj/item/clothing/head/hardhat/red,
|
||||
prob(2);/obj/item/clothing/head/hardhat/dblue,
|
||||
prob(2);/obj/item/clothing/head/hardhat/orange,
|
||||
prob(4);/obj/item/clothing/head/soft/,
|
||||
prob(4);/obj/item/clothing/head/soft/black,
|
||||
prob(4);/obj/item/clothing/head/soft/blue,
|
||||
prob(4);/obj/item/clothing/head/soft/green,
|
||||
prob(4);/obj/item/clothing/head/soft/grey,
|
||||
prob(4);/obj/item/clothing/head/soft/med,
|
||||
prob(4);/obj/item/clothing/head/soft/nanotrasen,
|
||||
prob(4);/obj/item/clothing/head/soft/red,
|
||||
prob(4);/obj/item/clothing/head/soft/orange,
|
||||
prob(4);/obj/item/clothing/head/soft/sec,
|
||||
prob(4);/obj/item/clothing/head/soft/sec/corp,
|
||||
prob(3);/obj/item/clothing/head/soft/yellow,
|
||||
prob(1);/obj/item/clothing/head/ushanka,
|
||||
prob(3);/obj/item/clothing/head/beret,
|
||||
prob(3);/obj/item/clothing/head/beret/engineering,
|
||||
prob(1);/obj/item/clothing/head/beret/purple,
|
||||
prob(3);/obj/item/clothing/head/beret/sec,
|
||||
prob(3);/obj/item/clothing/head/beret/sec/corporate/officer,
|
||||
prob(3);/obj/item/clothing/head/beret/sec/navy/officer,
|
||||
prob(3);/obj/item/clothing/head/soft/yellow,
|
||||
prob(2);/obj/item/clothing/head/orangebandana,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/bomber,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/black,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/blue,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/red,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/yellow,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/brown_jacket,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/leather_jacket,
|
||||
prob(4);/obj/item/clothing/suit/storage/toggle/labcoat,
|
||||
prob(4);/obj/item/clothing/suit/storage/toggle/labcoat/science,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/alt,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/black,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/green,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/grey,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/navy,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/tan,
|
||||
prob(4);/obj/item/clothing/suit/storage/miljacket/white,
|
||||
prob(4);/obj/item/clothing/suit/storage/trench,
|
||||
prob(3);/obj/item/clothing/suit/varsity,
|
||||
prob(3);/obj/item/clothing/suit/varsity/blue,
|
||||
prob(3);/obj/item/clothing/suit/varsity/brown,
|
||||
prob(3);/obj/item/clothing/suit/varsity/green,
|
||||
prob(3);/obj/item/clothing/suit/varsity/purple,
|
||||
prob(3);/obj/item/clothing/suit/varsity/red,
|
||||
prob(3);/obj/item/clothing/accessory/poncho,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/blue,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/green,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/purple,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/red,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cargo,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/engineering,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/medical,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/science,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/security,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/atmos,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/cargo,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/engineer,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/medical,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/mining,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/research,
|
||||
prob(3);/obj/item/clothing/accessory/poncho/roles/cloak/security,
|
||||
prob(2);/obj/item/clothing/accessory/stethoscope,
|
||||
prob(2);/obj/item/device/camera,
|
||||
prob(3);/obj/item/device/pda,
|
||||
prob(3);/obj/item/device/radio/headset,
|
||||
prob(2);/obj/item/toy/tennis,
|
||||
prob(2);/obj/item/toy/tennis/red,
|
||||
prob(2);/obj/item/toy/tennis/yellow,
|
||||
prob(2);/obj/item/toy/tennis/green,
|
||||
prob(2);/obj/item/toy/tennis/cyan,
|
||||
prob(2);/obj/item/toy/tennis/blue,
|
||||
prob(2);/obj/item/toy/tennis/purple,
|
||||
prob(2);/obj/item/clothing/ears/earmuffs,
|
||||
prob(2);/obj/item/clothing/ears/earmuffs/headphones
|
||||
)
|
||||
@@ -195,27 +195,45 @@ two tiles on initialization, and which way a cliff is facing may change during m
|
||||
displaced = TRUE
|
||||
|
||||
if(istype(T))
|
||||
visible_message(span("danger", "\The [L] falls off \the [src]!"))
|
||||
|
||||
var/safe_fall = FALSE
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
safe_fall = H.species.handle_falling(H, T, silent = TRUE, planetary = FALSE)
|
||||
|
||||
if(safe_fall)
|
||||
visible_message(span("notice", "\The [L] glides down from \the [src]."))
|
||||
else
|
||||
visible_message(span("danger", "\The [L] falls off \the [src]!"))
|
||||
L.forceMove(T)
|
||||
|
||||
// Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
|
||||
var/harm = !is_double_cliff ? 1 : 0.5
|
||||
if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
|
||||
var/obj/vehicle/vehicle = L.buckled
|
||||
vehicle.adjust_health(40 * harm)
|
||||
to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
|
||||
harm /= 2
|
||||
if(!safe_fall)
|
||||
// Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice.
|
||||
if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely.
|
||||
var/obj/vehicle/vehicle = L.buckled
|
||||
vehicle.adjust_health(40 * harm)
|
||||
to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it."))
|
||||
harm /= 2
|
||||
|
||||
playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
|
||||
L.Weaken(5 * harm)
|
||||
|
||||
playsound(L, 'sound/effects/break_stone.ogg', 70, 1)
|
||||
L.Weaken(5 * harm)
|
||||
var/fall_time = 3
|
||||
if(displaced) // Make the fall look more natural when falling sideways.
|
||||
L.pixel_z = 32 * 2
|
||||
animate(L, pixel_z = 0, time = fall_time)
|
||||
sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect.
|
||||
|
||||
if(safe_fall)
|
||||
visible_message(span("notice", "\The [L] lands on \the [T]."))
|
||||
playsound(L, "rustle", 25, 1)
|
||||
return
|
||||
|
||||
playsound(L, "punch", 70, 1)
|
||||
shake_camera(L, 1, 1)
|
||||
visible_message(span("danger", "\The [L] hits the ground!"))
|
||||
|
||||
visible_message(span("danger", "\The [L] hits \the [T]!"))
|
||||
|
||||
// The bigger they are, the harder they fall.
|
||||
// They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health.
|
||||
|
||||
@@ -34,4 +34,8 @@
|
||||
/obj/structure/window/plastitanium/full
|
||||
icon_state = "window-full"
|
||||
maxhealth = 250
|
||||
fulltile = TRUE
|
||||
fulltile = TRUE
|
||||
|
||||
/obj/structure/window/reinforced/tinted/full
|
||||
icon_state = "window-full"
|
||||
fulltile = TRUE
|
||||
|
||||
@@ -31,10 +31,14 @@ var/list/turf_edge_cache = list()
|
||||
return ..()
|
||||
|
||||
/turf/simulated/proc/make_outdoors()
|
||||
if(outdoors)
|
||||
return
|
||||
outdoors = TRUE
|
||||
SSplanets.addTurf(src)
|
||||
|
||||
/turf/simulated/proc/make_indoors()
|
||||
if(!outdoors)
|
||||
return
|
||||
outdoors = FALSE
|
||||
SSplanets.removeTurf(src)
|
||||
|
||||
|
||||
@@ -113,3 +113,8 @@ var/list/flesh_overlay_cache = list()
|
||||
icon = 'icons/turf/wall_masks_vr.dmi'
|
||||
/turf/simulated/wall/plastihull/Initialize(mapload)
|
||||
. = ..(mapload, MAT_PLASTITANIUMHULL, null,MAT_PLASTITANIUMHULL)
|
||||
|
||||
/turf/simulated/wall/ghull
|
||||
icon_state = "hull-titanium"
|
||||
/turf/simulated/wall/ghull/Initialize(mapload)
|
||||
. = ..(mapload, MAT_GOLDHULL, MAT_DIAMOND, MAT_GOLDHULL)
|
||||
@@ -21,6 +21,29 @@
|
||||
#define VIRGO3B_TURF_CREATE(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP;x/virgo3b/outdoors=TRUE;x/virgo3b/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
|
||||
#define VIRGO3B_TURF_CREATE_UN(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP
|
||||
|
||||
//Atmosphere properties
|
||||
#define VIRGO3BB_ONE_ATMOSPHERE 101.325 //kPa
|
||||
#define VIRGO3BB_AVG_TEMP 293.15 //kelvin
|
||||
|
||||
#define VIRGO3BB_PER_N2 0.78 //percent
|
||||
#define VIRGO3BB_PER_O2 0.21
|
||||
#define VIRGO3BB_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm
|
||||
#define VIRGO3BB_PER_CO2 0.01
|
||||
#define VIRGO3BB_PER_PHORON 0.00
|
||||
|
||||
//Math only beyond this point
|
||||
#define VIRGO3BB_MOL_PER_TURF (VIRGO3BB_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3BB_AVG_TEMP*R_IDEAL_GAS_EQUATION))
|
||||
#define VIRGO3BB_MOL_N2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_N2)
|
||||
#define VIRGO3BB_MOL_O2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_O2)
|
||||
#define VIRGO3BB_MOL_N2O (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_N2O)
|
||||
#define VIRGO3BB_MOL_CO2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_CO2)
|
||||
#define VIRGO3BB_MOL_PHORON (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_PHORON)
|
||||
|
||||
//Turfmakers
|
||||
#define VIRGO3BB_SET_ATMOS nitrogen=VIRGO3BB_MOL_N2;oxygen=VIRGO3BB_MOL_O2;carbon_dioxide=VIRGO3BB_MOL_CO2;phoron=VIRGO3BB_MOL_PHORON;temperature=VIRGO3BB_AVG_TEMP
|
||||
#define VIRGO3BB_TURF_CREATE(x) x/virgo3b_better/nitrogen=VIRGO3BB_MOL_N2;x/virgo3b_better/oxygen=VIRGO3BB_MOL_O2;x/virgo3b_better/carbon_dioxide=VIRGO3BB_MOL_CO2;x/virgo3b_better/phoron=VIRGO3BB_MOL_PHORON;x/virgo3b_better/temperature=VIRGO3BB_AVG_TEMP;x/virgo3b_better/outdoors=TRUE;x/virgo3b_better/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
|
||||
#define VIRGO3BB_TURF_CREATE_UN(x) x/virgo3b_better/nitrogen=VIRGO3BB_MOL_N2;x/virgo3b_better/oxygen=VIRGO3BB_MOL_O2;x/virgo3b_better/carbon_dioxide=VIRGO3BB_MOL_CO2;x/virgo3b_better/phoron=VIRGO3BB_MOL_PHORON;x/virgo3b_better/temperature=VIRGO3BB_AVG_TEMP
|
||||
|
||||
// This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters
|
||||
// are opened or other strange things occur.
|
||||
/turf/unsimulated/wall/planetary/virgo3b
|
||||
@@ -28,3 +51,9 @@
|
||||
desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps."
|
||||
alpha = 0xFF
|
||||
VIRGO3B_SET_ATMOS
|
||||
|
||||
/turf/unsimulated/wall/planetary/virgo3b_better
|
||||
name = "facility wall"
|
||||
desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps."
|
||||
alpha = 0xFF
|
||||
VIRGO3BB_SET_ATMOS
|
||||
|
||||
@@ -155,6 +155,7 @@ var/list/admin_verbs_fun = list(
|
||||
/client/proc/smite,
|
||||
/client/proc/smite_vr, //VOREStation Add,
|
||||
/client/proc/admin_lightning_strike,
|
||||
/client/proc/resize //VOREStation Add,
|
||||
)
|
||||
|
||||
var/list/admin_verbs_spawn = list(
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/client/proc/resize(var/mob/living/L in mob_list)
|
||||
set name = "Resize"
|
||||
set desc = "Resizes any living mob without any restrictions on size."
|
||||
set category = "Fun"
|
||||
if(!check_rights(R_ADMIN, R_FUN))
|
||||
return
|
||||
|
||||
var/size_multiplier = input(usr, "Input size multiplier.", "Resize", 1) as num|null
|
||||
if(!size_multiplier)
|
||||
return //cancelled
|
||||
|
||||
size_multiplier = clamp(size_multiplier, 0.01, 1000)
|
||||
var/can_be_big = L.has_large_resize_bounds()
|
||||
var/very_big = is_extreme_size(size_multiplier)
|
||||
|
||||
if(very_big && can_be_big) // made an extreme size in an area that allows it, don't assume adminbuse
|
||||
to_chat(src,"<span class='warning'>[L] will lose this size upon moving into an area where this size is not allowed.</span>")
|
||||
else if(very_big) // made an extreme size in an area that doesn't allow it, assume adminbuse
|
||||
to_chat(src,"<span class='warning'>[L] will retain this normally unallowed size outside this area.</span>")
|
||||
|
||||
L.resize(size_multiplier, animate = TRUE, uncapped = TRUE, ignore_prefs = TRUE)
|
||||
|
||||
log_and_message_admins("has changed [key_name(L)]'s size multiplier to [size_multiplier].")
|
||||
feedback_add_details("admin_verb","RESIZE")
|
||||
@@ -52,7 +52,7 @@
|
||||
return say(message)
|
||||
|
||||
/mob/living/proc/IIsAlly(mob/living/L)
|
||||
return src.faction == L.faction
|
||||
return istype(L) && src.faction == L.faction
|
||||
|
||||
/mob/living/simple_mob/IIsAlly(mob/living/L)
|
||||
. = ..()
|
||||
|
||||
@@ -1019,13 +1019,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
return
|
||||
organ = "brain"
|
||||
|
||||
var/datum/species/current_species = GLOB.all_species[pref.species]
|
||||
var/list/organ_choices = list("Normal")
|
||||
if(pref.organ_data[BP_TORSO] == "cyborg")
|
||||
organ_choices -= "Normal"
|
||||
if(organ_name == "Brain")
|
||||
organ_choices += "Cybernetic"
|
||||
organ_choices += "Positronic"
|
||||
organ_choices += "Drone"
|
||||
if(!(current_species.spawn_flags & SPECIES_NO_POSIBRAIN))
|
||||
organ_choices += "Positronic"
|
||||
if(!(current_species.spawn_flags & SPECIES_NO_DRONEBRAIN))
|
||||
organ_choices += "Drone"
|
||||
else
|
||||
organ_choices += "Assisted"
|
||||
organ_choices += "Mechanical"
|
||||
@@ -1043,7 +1046,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.organ_data[organ] = "assisted"
|
||||
if("Cybernetic")
|
||||
pref.organ_data[organ] = "assisted"
|
||||
if ("Mechanical")
|
||||
if("Mechanical")
|
||||
pref.organ_data[organ] = "mechanical"
|
||||
if("Drone")
|
||||
pref.organ_data[organ] = "digital"
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
display_name = "collar, holo"
|
||||
path = /obj/item/clothing/accessory/collar/holo
|
||||
|
||||
//TFF 17/6/19 - public loadout addition: Indigestible Holocollar
|
||||
/datum/gear/collar/holo/indigestible
|
||||
display_name = "collar, holo (indigestible)"
|
||||
path = /obj/item/clothing/accessory/collar/holo/indigestible
|
||||
|
||||
@@ -735,6 +735,12 @@
|
||||
ckeywhitelist = list("pimientopyro")
|
||||
character_name = list("Scylla Casmus")
|
||||
|
||||
/datum/gear/fluff/kiyoshi_cloak
|
||||
path = /obj/item/clothing/accessory/poncho/fluff/cloakglowing
|
||||
display_name = "glowing cloak"
|
||||
ckeywhitelist = list("pastelprincedan")
|
||||
character_name = list("Kiyoshi Maki", "Masumi Maki")
|
||||
|
||||
// Q CKEYS
|
||||
|
||||
// R CKEYS
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
character.weight_gain = pref.weight_gain
|
||||
character.weight_loss = pref.weight_loss
|
||||
character.fuzzy = pref.fuzzy
|
||||
character.resize(pref.size_multiplier, animate = FALSE)
|
||||
character.resize(pref.size_multiplier, animate = FALSE, ignore_prefs = TRUE)
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
|
||||
. += "<br>"
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//TFF 5/8/19 - moved /datum/preferences to preferences_vr.dm
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc
|
||||
name = "Misc Settings"
|
||||
sort_order = 9
|
||||
@@ -9,16 +7,15 @@
|
||||
S["directory_tag"] >> pref.directory_tag
|
||||
S["directory_erptag"] >> pref.directory_erptag
|
||||
S["directory_ad"] >> pref.directory_ad
|
||||
S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved
|
||||
S["sensorpref"] >> pref.sensorpref
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
|
||||
S["show_in_directory"] << pref.show_in_directory
|
||||
S["directory_tag"] << pref.directory_tag
|
||||
S["directory_erptag"] << pref.directory_erptag
|
||||
S["directory_ad"] << pref.directory_ad
|
||||
S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable
|
||||
S["sensorpref"] << pref.sensorpref
|
||||
|
||||
//TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout.
|
||||
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
if(pref.sensorpref > 5 || pref.sensorpref < 1)
|
||||
pref.sensorpref = 5
|
||||
@@ -28,7 +25,7 @@
|
||||
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
|
||||
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
|
||||
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
|
||||
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs
|
||||
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref))
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
|
||||
. += "<br>"
|
||||
@@ -36,7 +33,7 @@
|
||||
. += "<b>Character Directory Vore Tag:</b> <a href='?src=\ref[src];directory_tag=1'><b>[pref.directory_tag]</b></a><br>"
|
||||
. += "<b>Character Directory ERP Tag:</b> <a href='?src=\ref[src];directory_erptag=1'><b>[pref.directory_erptag]</b></a><br>"
|
||||
. += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>"
|
||||
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>" //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random
|
||||
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
|
||||
if(href_list["toggle_show_in_directory"])
|
||||
@@ -58,7 +55,6 @@
|
||||
var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes
|
||||
pref.directory_ad = msg
|
||||
return TOPIC_REFRESH
|
||||
//TFF 5/8/19 - add new thing so you can choose the sensor setting your character can get.
|
||||
else if(href_list["toggle_sensor_setting"])
|
||||
var/new_sensorpref = input(user, "Choose your character's sensor preferences:", "Character Preferences", sensorpreflist[pref.sensorpref]) as null|anything in sensorpreflist
|
||||
if (!isnull(new_sensorpref) && CanUseTopic(user))
|
||||
|
||||
@@ -153,7 +153,6 @@
|
||||
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi')
|
||||
|
||||
//TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default?
|
||||
/obj/item/clothing/under
|
||||
sensor_mode = 3
|
||||
var/sensorpref = 5
|
||||
@@ -162,7 +161,6 @@
|
||||
SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/uniform.dmi')
|
||||
|
||||
//TFF 5/8/19 - define numbers and specifics for suit sensor settings
|
||||
/obj/item/clothing/under/New(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
sensorpref = isnull(H) ? 1 : (ishuman(H) ? H.sensorpref : 1)
|
||||
|
||||
@@ -329,13 +329,33 @@
|
||||
|
||||
/obj/item/clothing/suit/space/void/exploration
|
||||
name = "exploration voidsuit"
|
||||
desc = "A lightweight, radiation-resistant voidsuit, featuring the Explorer emblem on its chest plate. Designed for exploring unknown planetary environments."
|
||||
desc = "A hazard and radiation resistant voidsuit, featuring the Explorer emblem on its chest plate. Designed for exploring unknown planetary environments."
|
||||
icon_state = "void_explorer"
|
||||
item_state_slots = list(slot_r_hand_str = "skrell_suit_black", slot_l_hand_str = "skrell_suit_black")
|
||||
armor = list(melee = 40, bullet = 15, laser = 25,energy = 35, bomb = 30, bio = 100, rad = 70)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon, \
|
||||
/obj/item/weapon/shovel,/obj/item/ammo_magazine,/obj/item/weapon/gun)
|
||||
|
||||
//SAR
|
||||
/obj/item/clothing/head/helmet/space/void/expedition_medical
|
||||
name = "exploration medic\'s voidsuit helmet"
|
||||
desc = "A radiation-resistant helmet made especially for exploring unknown planetary environments. Has a reinforced high-vis bubble style visor."
|
||||
icon_state = "helm_exp_medic"
|
||||
item_state = "helm_exp_medic"
|
||||
item_state_slots = list(slot_r_hand_str = "syndicate-helm-black", slot_l_hand_str = "syndicate-helm-black")
|
||||
armor = list(melee = 25, bullet = 10, laser = 20,energy = 30, bomb = 25, bio = 100, rad = 70)
|
||||
light_overlay = "helmet_light_dual" //explorer_light
|
||||
|
||||
/obj/item/clothing/suit/space/void/expedition_medical
|
||||
name = "exploration medic\'s voidsuit"
|
||||
desc = "A hazard and radiation resistant voidsuit, featuring the Explorer emblem and a green cross on its chest plate. Seems to be a little lighter and more flexible than the regular explorer issue."
|
||||
icon_state = "void_exp_medic"
|
||||
slowdown = 0.75
|
||||
item_state_slots = list(slot_r_hand_str = "skrell_suit_black", slot_l_hand_str = "skrell_suit_black")
|
||||
armor = list(melee = 25, bullet = 10, laser = 20,energy = 30, bomb = 25, bio = 100, rad = 70)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon, \
|
||||
/obj/item/weapon/shovel,/obj/item/ammo_magazine,/obj/item/weapon/gun,/obj/item/weapon/storage/firstaid,/obj/item/stack/medical)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/exploration/alt
|
||||
desc = "A radiation-resistant helmet retrofitted for exploring unknown planetary environments."
|
||||
icon_state = "helm_explorer2"
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
icon_state = "grey"
|
||||
rolled_sleeves = 0
|
||||
|
||||
//TFF 5/8/19 - add a non perma-set orange jumpsuit, splits prison into its own obj with override var settings.
|
||||
//TFF 5/9/19 - add a different icon_state to both jumpsuits, orange and prison. Refactors orange and prison jumpsuit slightly.
|
||||
/obj/item/clothing/under/color/orange
|
||||
name = "orange jumpsuit"
|
||||
icon_state = "orange"
|
||||
|
||||
@@ -79,6 +79,8 @@
|
||||
return
|
||||
|
||||
var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
|
||||
if(!new_size)
|
||||
return //cancelled
|
||||
|
||||
//Check AGAIN because we accepted user input which is blocking.
|
||||
if (src != H.w_uniform)
|
||||
@@ -88,9 +90,9 @@
|
||||
if (H.stat || H.restrained())
|
||||
return
|
||||
|
||||
if (isnull(H.size_multiplier))
|
||||
if (isnull(H.size_multiplier)) // Why would this ever be the case?
|
||||
to_chat(H,"<span class='warning'>The uniform panics and corrects your apparently microscopic size.</span>")
|
||||
H.resize(RESIZE_NORMAL)
|
||||
H.resize(RESIZE_NORMAL, ignore_prefs = TRUE)
|
||||
H.update_icons() //Just want the matrix transform
|
||||
return
|
||||
|
||||
@@ -102,7 +104,7 @@
|
||||
if(new_size != H.size_multiplier)
|
||||
if(!original_size)
|
||||
original_size = H.size_multiplier
|
||||
H.resize(new_size/100)
|
||||
H.resize(new_size/100, ignore_prefs = TRUE) // Ignores prefs because you can only resize yourself
|
||||
H.visible_message("<span class='warning'>The space around [H] distorts as they change size!</span>","<span class='notice'>The space around you distorts as you change size!</span>")
|
||||
else //They chose their current size.
|
||||
return
|
||||
@@ -111,7 +113,7 @@
|
||||
. = ..()
|
||||
if(. && ishuman(M) && original_size)
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.resize(original_size)
|
||||
H.resize(original_size, ignore_prefs = TRUE)
|
||||
original_size = null
|
||||
H.visible_message("<span class='warning'>The space around [H] distorts as they return to their original size!</span>","<span class='notice'>The space around you distorts as you return to your original size!</span>")
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
/datum/event/rogue_drone/announce()
|
||||
var/msg
|
||||
var/rng = rand(1,5)
|
||||
//VOREStation Edit Start TFF 16/12/19 - Sif -> Virgo 3b
|
||||
//VOREStation Edit Start
|
||||
switch(rng)
|
||||
if(1)
|
||||
msg = "A combat drone wing operating in close orbit above Virgo 3b has failed to return from a anti-piracy sweep. If any are sighted, \
|
||||
|
||||
@@ -171,3 +171,36 @@
|
||||
. = ..()
|
||||
reagents.add_reagent("rootbeer", 30)
|
||||
|
||||
//ADDITIONS BELOW THIS LINE MADE ON 04/03/2021
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/kvass
|
||||
name = "\improper Kvass"
|
||||
desc = "A true Slavic soda."
|
||||
description_fluff = "A classic slavic beverage which many Space Russians still enjoy to this day. Fun fact, it is actually considered a weak beer by non-russians."
|
||||
icon_state = "kvass"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/kvass/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("kvass", 30)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/kompot
|
||||
name = "\improper Kompot"
|
||||
desc = "A taste of russia in the summertime - canned for you consumption."
|
||||
description_fluff = "A sweet and fruity beverage that was traditionally used to preserve frutis in harsh Russian winters that is now available for widespread comsumption."
|
||||
icon_state = "kompot"
|
||||
center_of_mass = list("x"=16, "y"=10)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/kompot/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("kompot", 30)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/boda
|
||||
name = "\improper Boda"
|
||||
desc = "State regulated soda beverage. Enjoy comrades."
|
||||
icon_state = "boda"
|
||||
center_of_mass = list("x"=16, "y"=8)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/boda/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("sodawater", 30)
|
||||
@@ -58,7 +58,7 @@
|
||||
desc = "It's beef. It's roasted. It's been a staple of dining tradition for centuries."
|
||||
icon = 'icons/obj/food_vr.dmi'
|
||||
icon_state = "roastbeef"
|
||||
trash = /obj/item/trash/plate //TFF 30/11/19 - Roast beef are put on plates, not waffle trays, you dunce~
|
||||
trash = /obj/item/trash/plate
|
||||
nutriment_amt = 8
|
||||
nutriment_desc = list("cooked meat" = 5)
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
var/datum/looping_sound/microwave/soundloop
|
||||
|
||||
|
||||
// see code/modules/food/recipes_microwave.dm for recipes
|
||||
//see code/modules/food/recipes_microwave.dm for recipes
|
||||
|
||||
/*******************
|
||||
* Initialising
|
||||
@@ -283,68 +283,69 @@
|
||||
if("dispose")
|
||||
dispose()
|
||||
return TRUE
|
||||
|
||||
// /obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
|
||||
// var/dat = ""
|
||||
// if(src.broken > 0)
|
||||
// dat = {"<TT>Bzzzzttttt</TT>"}
|
||||
// else if(src.operating)
|
||||
// dat = {"<TT>Microwaving in progress!<BR>Please wait...!</TT>"}
|
||||
// else if(src.dirty==100)
|
||||
// dat = {"<TT>This microwave is dirty!<BR>Please clean it before use!</TT>"}
|
||||
// else
|
||||
// var/list/items_counts = new
|
||||
// var/list/items_measures = new
|
||||
// var/list/items_measures_p = new
|
||||
// for (var/obj/O in ((contents - component_parts) - circuit))
|
||||
// var/display_name = O.name
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
|
||||
// items_measures[display_name] = "egg"
|
||||
// items_measures_p[display_name] = "eggs"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
|
||||
// items_measures[display_name] = "tofu chunk"
|
||||
// items_measures_p[display_name] = "tofu chunks"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
|
||||
// items_measures[display_name] = "slab of meat"
|
||||
// items_measures_p[display_name] = "slabs of meat"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
|
||||
// display_name = "Turnovers"
|
||||
// items_measures[display_name] = "turnover"
|
||||
// items_measures_p[display_name] = "turnovers"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
|
||||
// items_measures[display_name] = "fillet of meat"
|
||||
// items_measures_p[display_name] = "fillets of meat"
|
||||
// items_counts[display_name]++
|
||||
// for (var/O in items_counts)
|
||||
// var/N = items_counts[O]
|
||||
// if (!(O in items_measures))
|
||||
// dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
|
||||
// else
|
||||
// if (N==1)
|
||||
// dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
|
||||
// else
|
||||
// dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
|
||||
/*
|
||||
/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
|
||||
var/dat = ""
|
||||
if(src.broken > 0)
|
||||
dat = {"<TT>Bzzzzttttt</TT>"}
|
||||
else if(src.operating)
|
||||
dat = {"<TT>Microwaving in progress!<BR>Please wait...!</TT>"}
|
||||
else if(src.dirty==100)
|
||||
dat = {"<TT>This microwave is dirty!<BR>Please clean it before use!</TT>"}
|
||||
else
|
||||
var/list/items_counts = new
|
||||
var/list/items_measures = new
|
||||
var/list/items_measures_p = new
|
||||
for (var/obj/O in ((contents - component_parts) - circuit))
|
||||
var/display_name = O.name
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
|
||||
items_measures[display_name] = "egg"
|
||||
items_measures_p[display_name] = "eggs"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
|
||||
items_measures[display_name] = "tofu chunk"
|
||||
items_measures_p[display_name] = "tofu chunks"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
|
||||
items_measures[display_name] = "slab of meat"
|
||||
items_measures_p[display_name] = "slabs of meat"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
|
||||
display_name = "Turnovers"
|
||||
items_measures[display_name] = "turnover"
|
||||
items_measures_p[display_name] = "turnovers"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
|
||||
items_measures[display_name] = "fillet of meat"
|
||||
items_measures_p[display_name] = "fillets of meat"
|
||||
items_counts[display_name]++
|
||||
for (var/O in items_counts)
|
||||
var/N = items_counts[O]
|
||||
if (!(O in items_measures))
|
||||
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
|
||||
else
|
||||
if (N==1)
|
||||
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
|
||||
else
|
||||
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
|
||||
|
||||
// for (var/datum/reagent/R in reagents.reagent_list)
|
||||
// var/display_name = R.name
|
||||
// if (R.id == "capsaicin")
|
||||
// display_name = "Hotsauce"
|
||||
// if (R.id == "frostoil")
|
||||
// display_name = "Coldsauce"
|
||||
// dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
|
||||
for (var/datum/reagent/R in reagents.reagent_list)
|
||||
var/display_name = R.name
|
||||
if (R.id == "capsaicin")
|
||||
display_name = "Hotsauce"
|
||||
if (R.id == "frostoil")
|
||||
display_name = "Coldsauce"
|
||||
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
|
||||
|
||||
// if (items_counts.len==0 && reagents.reagent_list.len==0)
|
||||
// dat = {"<B>The microwave is empty</B><BR>"}
|
||||
// else
|
||||
// dat = {"<b>Ingredients:</b><br>[dat]"}
|
||||
// dat += {"<HR><BR>\
|
||||
// <A href='?src=\ref[src];action=cook'>Turn on!<BR>\
|
||||
// <A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
|
||||
// "}
|
||||
if (items_counts.len==0 && reagents.reagent_list.len==0)
|
||||
dat = {"<B>The microwave is empty</B><BR>"}
|
||||
else
|
||||
dat = {"<b>Ingredients:</b><br>[dat]"}
|
||||
dat += {"<HR><BR>\
|
||||
<A href='?src=\ref[src];action=cook'>Turn on!<BR>\
|
||||
<A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
|
||||
"}
|
||||
|
||||
// user << browse("<HEAD><TITLE>Microwave Controls</TITLE></HEAD><TT>[dat]</TT>", "window=microwave")
|
||||
// onclose(user, "microwave")
|
||||
// return
|
||||
user << browse("<HEAD><TITLE>Microwave Controls</TITLE></HEAD><TT>[dat]</TT>", "window=microwave")
|
||||
onclose(user, "microwave")
|
||||
return
|
||||
*/
|
||||
|
||||
/***********************************
|
||||
* Microwave Menu Handling/Cooking
|
||||
|
||||
@@ -187,10 +187,10 @@
|
||||
|
||||
for(var/obj/item/stack/wetleather/WL in I.instances)
|
||||
if(!WL.wetness)
|
||||
if(WL.amount == 1)
|
||||
if(WL.amount)
|
||||
WL.forceMove(get_turf(src))
|
||||
WL.dry()
|
||||
I.instances -= WL
|
||||
WL.dry()
|
||||
break
|
||||
|
||||
WL.wetness = max(0, WL.wetness - rand(1, 3))
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
/datum/event2/event/prison_break/proc/flicker_area()
|
||||
for(var/area/A in areas_to_break)
|
||||
var/obj/machinery/power/apc/apc = A.get_apc()
|
||||
if(apc.operating) //If the apc's off, it's a little hard to overload the lights.
|
||||
if(istype(apc) && apc.operating) //If the apc's off, it's a little hard to overload the lights.
|
||||
for(var/obj/machinery/light/L in A)
|
||||
L.flicker(10)
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
|
||||
/area/engineering
|
||||
holomap_color = HOLOMAP_AREACOLOR_ENGINEERING
|
||||
//TFF 11/12/19 - Minor refactor, makes mice spawn only in Atmos.
|
||||
/area/engineering/atmos_intake
|
||||
holomap_color = null
|
||||
/area/maintenance/substation/engineering
|
||||
|
||||
@@ -94,7 +94,6 @@
|
||||
to_chat(user, "You load [W] into [src].")
|
||||
return
|
||||
|
||||
//TFF 3/6/19 - fix infinite frame creation, ported from Cit RP - also allow movement of hydroponic-related machines.
|
||||
if(default_deconstruction_screwdriver(user, W))
|
||||
return
|
||||
if(W.is_wrench())
|
||||
|
||||
@@ -1,276 +1,278 @@
|
||||
/datum/material/proc/get_recipes()
|
||||
if(!recipes)
|
||||
generate_recipes()
|
||||
return recipes
|
||||
|
||||
/datum/material/proc/generate_recipes()
|
||||
recipes = list()
|
||||
|
||||
// If is_brittle() returns true, these are only good for a single strike.
|
||||
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
if(integrity>=50)
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
if(hardness>50)
|
||||
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
/datum/material/steel/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe_list("office chairs",list( \
|
||||
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \
|
||||
))
|
||||
recipes += new/datum/stack_recipe_list("comfy chairs", list( \
|
||||
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
))
|
||||
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
|
||||
//recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
|
||||
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
))
|
||||
//recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal
|
||||
recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement
|
||||
recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe_list("modular computer frames", list( \
|
||||
new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\
|
||||
new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\
|
||||
new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\
|
||||
new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\
|
||||
))
|
||||
recipes += new/datum/stack_recipe_list("filing cabinets", list( \
|
||||
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
))
|
||||
recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
/datum/material/plasteel/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]")
|
||||
|
||||
/datum/material/stone/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
|
||||
/datum/material/stone/marble/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]")
|
||||
|
||||
/datum/material/plastic/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u
|
||||
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
|
||||
/datum/material/wood/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add
|
||||
recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]")
|
||||
|
||||
/datum/material/wood/log/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
|
||||
/datum/material/cardboard/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe_list("folders",list( \
|
||||
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \
|
||||
))
|
||||
|
||||
/datum/material/snow/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]")
|
||||
|
||||
/datum/material/snowbrick/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
/datum/material/wood/sif/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
|
||||
for(var/datum/stack_recipe/r_recipe in recipes)
|
||||
if(r_recipe.title == "wood floor tile")
|
||||
recipes -= r_recipe
|
||||
continue
|
||||
if(r_recipe.title == "wooden chair")
|
||||
recipes -= r_recipe
|
||||
continue
|
||||
|
||||
/datum/material/supermatter/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]")
|
||||
|
||||
/datum/material/cloth/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
|
||||
/datum/material/resin/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]")
|
||||
|
||||
/datum/material/leather/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
/datum/material/proc/get_recipes()
|
||||
if(!recipes)
|
||||
generate_recipes()
|
||||
return recipes
|
||||
|
||||
/datum/material/proc/generate_recipes()
|
||||
recipes = list()
|
||||
|
||||
// If is_brittle() returns true, these are only good for a single strike.
|
||||
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
if(integrity>=50)
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
if(hardness>50)
|
||||
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
|
||||
/datum/material/steel/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe_list("office chairs",list( \
|
||||
new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \
|
||||
))
|
||||
recipes += new/datum/stack_recipe_list("comfy chairs", list( \
|
||||
new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
))
|
||||
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
|
||||
//recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
|
||||
recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
|
||||
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
))
|
||||
//recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal
|
||||
recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement
|
||||
recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe_list("modular computer frames", list( \
|
||||
new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\
|
||||
new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\
|
||||
new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\
|
||||
new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\
|
||||
))
|
||||
recipes += new/datum/stack_recipe_list("filing cabinets", list( \
|
||||
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \
|
||||
))
|
||||
recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
|
||||
|
||||
/datum/material/plasteel/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]")
|
||||
|
||||
/datum/material/stone/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")
|
||||
|
||||
/datum/material/stone/marble/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]")
|
||||
|
||||
/datum/material/plastic/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u
|
||||
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u
|
||||
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
|
||||
/datum/material/wood/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add
|
||||
recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
|
||||
|
||||
/datum/material/wood/log/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
|
||||
/datum/material/cardboard/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe_list("folders",list( \
|
||||
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \
|
||||
new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \
|
||||
))
|
||||
|
||||
/datum/material/snow/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]")
|
||||
|
||||
/datum/material/snowbrick/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
|
||||
/datum/material/wood/sif/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
|
||||
for(var/datum/stack_recipe/r_recipe in recipes)
|
||||
if(r_recipe.title == "wood floor tile")
|
||||
recipes -= r_recipe
|
||||
continue
|
||||
if(r_recipe.title == "wooden chair")
|
||||
recipes -= r_recipe
|
||||
continue
|
||||
|
||||
/datum/material/supermatter/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]")
|
||||
|
||||
/datum/material/cloth/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
|
||||
/datum/material/resin/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]")
|
||||
|
||||
/datum/material/leather/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||
recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]")
|
||||
|
||||
@@ -55,4 +55,12 @@
|
||||
|
||||
/obj/fiftyspawner/plastitanium_glass
|
||||
name = "stack of plastitanium glass"
|
||||
type_to_spawn = /obj/item/stack/material/glass/plastitanium
|
||||
type_to_spawn = /obj/item/stack/material/glass/plastitanium
|
||||
|
||||
/obj/item/stack/material/gold/hull
|
||||
name = "gold hull sheets"
|
||||
icon = 'icons/obj/stacks_vr.dmi'
|
||||
icon_state = "sheet-plastitanium"
|
||||
item_state = "sheet-silver"
|
||||
no_variants = FALSE
|
||||
default_type = MAT_GOLDHULL
|
||||
@@ -53,9 +53,10 @@ var/list/name_to_material
|
||||
/proc/populate_material_list(force_remake=0)
|
||||
if(name_to_material && !force_remake) return // Already set up!
|
||||
name_to_material = list()
|
||||
for(var/type in typesof(/datum/material) - /datum/material)
|
||||
for(var/type in subtypesof(/datum/material))
|
||||
var/datum/material/new_mineral = new type
|
||||
if(!new_mineral.name)
|
||||
qdel(new_mineral)
|
||||
continue
|
||||
name_to_material[lowertext(new_mineral.name)] = new_mineral
|
||||
return 1
|
||||
|
||||
@@ -91,4 +91,14 @@
|
||||
created_fulltile_window = /obj/structure/window/plastitanium/full
|
||||
wire_product = null
|
||||
rod_product = /obj/item/stack/material/glass/plastitanium
|
||||
composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT, "glass" = SHEET_MATERIAL_AMOUNT)
|
||||
composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT, "glass" = SHEET_MATERIAL_AMOUNT)
|
||||
|
||||
/datum/material/gold/hull
|
||||
name = MAT_GOLDHULL
|
||||
stack_type = /obj/item/stack/material/gold/hull
|
||||
icon_base = "hull"
|
||||
icon_reinf = "reinf_mesh"
|
||||
explosion_resistance = 50
|
||||
|
||||
/datum/material/gold/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets.
|
||||
new /obj/item/stack/material/gold(target)
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
for(var/turf in visAdded)
|
||||
var/turf/t = turf
|
||||
if(t.obfuscations[obfuscation.type])
|
||||
if(LAZYLEN(t.obfuscations) && t.obfuscations[obfuscation.type])
|
||||
obscured -= t.obfuscations[obfuscation.type]
|
||||
for(var/eye in seenby)
|
||||
var/mob/observer/eye/m = eye
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
icon_state = "farmbot0"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
req_one_access = list(access_robotics, access_hydroponics, access_xenobiology) //TFF 11/7/19 - adds Xenobio access on behalf of Nalarac
|
||||
req_one_access = list(access_robotics, access_hydroponics, access_xenobiology)
|
||||
|
||||
var/action = "" // Used to update icon
|
||||
var/waters_trays = 1
|
||||
|
||||
@@ -181,15 +181,6 @@
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/verb/toggle_resizing_immunity()
|
||||
set name = "Toggle Resizing Immunity"
|
||||
set desc = "Toggles your ability to resist resizing attempts"
|
||||
set category = "IC"
|
||||
|
||||
resizable = !resizable
|
||||
to_chat(src, "<span class='notice'>You are now [resizable ? "susceptible" : "immune"] to being resized.</span>")
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_flip_vr()
|
||||
var/original_density = density
|
||||
var/original_passflags = pass_flags
|
||||
|
||||
@@ -492,6 +492,7 @@ This function restores all organs.
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
damageoverlaytemp = 20
|
||||
if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){damage *= 0.7}
|
||||
damage = damage*species.brute_mod
|
||||
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
@@ -504,6 +505,7 @@ This function restores all organs.
|
||||
UpdateDamageIcon()
|
||||
if(BURN)
|
||||
damageoverlaytemp = 20
|
||||
if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){damage *= 0.7}
|
||||
damage = damage*species.burn_mod
|
||||
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
var/impersonate_bodytype //For impersonating a bodytype
|
||||
var/ability_flags = 0 //Shadekin abilities/potentially other species-based?
|
||||
var/sensorpref = 5 //Suit sensor loadout pref
|
||||
var/unnaturally_resized = FALSE //If one became larger than 200%, or smaller than 25%. This flag is needed for the case when admins want someone to be very big or very small outside of dorms.
|
||||
var/wings_hidden = FALSE
|
||||
|
||||
/mob/living/carbon/human/proc/shadekin_get_energy()
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
var/their_slowdown = max(H.calculate_item_encumbrance(), 1)
|
||||
item_tally = max(item_tally, their_slowdown) // If our slowdown is less than theirs, then we become as slow as them (before species modifires).
|
||||
|
||||
item_tally /= 2 //VOREStation Add
|
||||
item_tally *= species.item_slowdown_mod
|
||||
|
||||
. += item_tally
|
||||
@@ -189,7 +190,7 @@
|
||||
if(istype(back, /obj/item/weapon/tank/jetpack))
|
||||
return back
|
||||
else if(istype(rig))
|
||||
for(var/obj/item/rig_module/maneuvering_jets.module in rig.installed_modules)
|
||||
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
|
||||
return module.jets
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
|
||||
|
||||
@@ -104,7 +104,8 @@
|
||||
else if (E.is_dislocated())
|
||||
stance_damage += 0.5
|
||||
|
||||
if(E) limb_pain = E.organ_can_feel_pain()
|
||||
if(E && (!E.is_usable() || E.is_broken() || E.is_dislocated())) //VOREStation Edit
|
||||
limb_pain = E.organ_can_feel_pain()
|
||||
|
||||
// Canes and crutches help you stand (if the latter is ever added)
|
||||
// One cane mitigates a broken leg+foot, or a missing foot.
|
||||
|
||||
@@ -62,8 +62,6 @@
|
||||
|
||||
//No need to update all of these procs if the guy is dead.
|
||||
fall() //VORESTATION EDIT. Prevents people from floating
|
||||
if(unnaturally_resized) //VORESTATION EDIT.
|
||||
handle_unnatural_size()
|
||||
if(stat != DEAD && !stasis)
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
@@ -1268,7 +1266,7 @@
|
||||
//VOREStation Add - Vampire hunger alert
|
||||
else if(get_species() == SPECIES_CUSTOM)
|
||||
var/datum/species/custom/C = species
|
||||
if(/datum/trait/bloodsucker in C.traits)
|
||||
if(/datum/trait/neutral/bloodsucker in C.traits)
|
||||
fat_alert = /obj/screen/alert/fat/vampire
|
||||
hungry_alert = /obj/screen/alert/hungry/vampire
|
||||
starving_alert = /obj/screen/alert/starving/vampire
|
||||
|
||||
@@ -78,10 +78,3 @@
|
||||
// Moving around increases germ_level faster
|
||||
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
|
||||
germ_level++
|
||||
|
||||
/mob/living/carbon/human/proc/handle_unnatural_size()
|
||||
if(!in_dorms())
|
||||
if(src.size_multiplier > 2)
|
||||
src.resize(2)
|
||||
else if (src.size_multiplier < 0.25)
|
||||
src.resize(0.25)
|
||||
@@ -413,7 +413,6 @@
|
||||
H.visible_message( \
|
||||
"<span class='notice'>[H] shakes [target]'s hand.</span>", \
|
||||
"<span class='notice'>You shake [target]'s hand.</span>", )
|
||||
//TFF 15/12/19 - Port nose booping from CHOMPStation
|
||||
else if(H.zone_sel.selecting == "mouth")
|
||||
H.visible_message( \
|
||||
"<span class='notice'>[H] boops [target]'s nose.</span>", \
|
||||
|
||||
@@ -53,6 +53,9 @@
|
||||
|
||||
var/datum/species/new_copy = new to_copy.type()
|
||||
|
||||
for(var/organ in to_copy.has_limbs)
|
||||
var/list/organ_data = to_copy.has_limbs[organ]
|
||||
new_copy.has_limbs[organ] = organ_data.Copy()
|
||||
new_copy.traits = traits
|
||||
|
||||
//If you had traits, apply them
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#define PROTEAN_EDIBLE_MATERIALS list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN)
|
||||
@@ -22,8 +22,8 @@
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 2
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
attacktext = list("slashed")
|
||||
|
||||
min_oxy = 0
|
||||
@@ -36,7 +36,7 @@
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 900
|
||||
movement_cooldown = 3
|
||||
movement_cooldown = 4
|
||||
|
||||
var/mob/living/carbon/human/humanform
|
||||
var/obj/item/organ/internal/nano/refactory/refactory
|
||||
@@ -267,9 +267,8 @@
|
||||
if(refactory && istype(A,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/S = A
|
||||
var/substance = S.material.name
|
||||
var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
|
||||
var allowed = FALSE
|
||||
for(var/material in edible_materials)
|
||||
for(var/material in PROTEAN_EDIBLE_MATERIALS)
|
||||
if(material == substance) allowed = TRUE
|
||||
if(!allowed)
|
||||
return
|
||||
@@ -282,9 +281,8 @@
|
||||
if(refactory && istype(O,/obj/item/stack/material))
|
||||
var/obj/item/stack/material/S = O
|
||||
var/substance = S.material.name
|
||||
var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
|
||||
var allowed = FALSE
|
||||
for(var/material in edible_materials)
|
||||
for(var/material in PROTEAN_EDIBLE_MATERIALS)
|
||||
if(material == substance) allowed = TRUE
|
||||
if(!allowed)
|
||||
return
|
||||
@@ -432,7 +430,7 @@ var/global/list/disallowed_protean_accessories = list(
|
||||
var/atom/reform_spot = blob.drop_location()
|
||||
|
||||
//Size update
|
||||
resize(blob.size_multiplier, FALSE)
|
||||
resize(blob.size_multiplier, FALSE, ignore_prefs = TRUE)
|
||||
|
||||
//Move them back where the blob was
|
||||
forceMove(reform_spot)
|
||||
|
||||
@@ -201,9 +201,8 @@
|
||||
|
||||
var/obj/item/stack/material/matstack = held
|
||||
var/substance = matstack.material.name
|
||||
var/list/edible_materials = list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN) //Can't eat all materials, just useful ones.
|
||||
var allowed = FALSE
|
||||
for(var/material in edible_materials)
|
||||
for(var/material in PROTEAN_EDIBLE_MATERIALS)
|
||||
if(material == substance) allowed = TRUE
|
||||
if(!allowed)
|
||||
to_chat(src,"<span class='warning'>You can't process [substance]!</span>")
|
||||
@@ -300,14 +299,14 @@
|
||||
//Sizing up
|
||||
if(cost > 0)
|
||||
if(refactory.use_stored_material(MAT_STEEL,cost))
|
||||
user.resize(size_factor)
|
||||
user.resize(size_factor, ignore_prefs = TRUE)
|
||||
else
|
||||
to_chat(user,"<span class='warning'>That size change would cost [cost] steel, which you don't have.</span>")
|
||||
//Sizing down (or not at all)
|
||||
else if(cost <= 0)
|
||||
cost = abs(cost)
|
||||
var/actually_added = refactory.add_stored_material(MAT_STEEL,cost)
|
||||
user.resize(size_factor)
|
||||
user.resize(size_factor, ignore_prefs = TRUE)
|
||||
if(actually_added != cost)
|
||||
to_chat(user,"<span class='warning'>Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.</span>")
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
if(refactory.get_stored_material(MAT_GOLD) >= METAL_PER_TICK)
|
||||
H.add_modifier(/datum/modifier/protean/gold, origin = refactory)
|
||||
|
||||
//Silver adds darksight
|
||||
//Silver adds accuracy and evasion
|
||||
if(refactory.get_stored_material(MAT_SILVER) >= METAL_PER_TICK)
|
||||
H.add_modifier(/datum/modifier/protean/silver, origin = refactory)
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
ambiguous_genders = TRUE
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_NO_POSIBRAIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
bump_flag = MONKEY
|
||||
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
@@ -162,7 +162,7 @@
|
||||
// without parachute, or falling bird without free wings goes splat.
|
||||
|
||||
// Are we landing from orbit, or handcuffed/unconscious/tied to something?
|
||||
if(planetary || !istype(H) || H.incapacitated())
|
||||
if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED))
|
||||
return ..()
|
||||
|
||||
// Are we landing on a turf? Not sure how this could not be the case, but let's be safe.
|
||||
@@ -201,7 +201,7 @@
|
||||
// Handled!
|
||||
if(!silent)
|
||||
to_chat(H, SPAN_NOTICE("You catch the air in your wings and greatly slow your fall."))
|
||||
H.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely."))
|
||||
H.Stun(2)
|
||||
landing.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely."))
|
||||
H.Stun(1)
|
||||
playsound(H, "rustle", 25, 1)
|
||||
return TRUE
|
||||
|
||||
@@ -1,31 +1,34 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/speed_slow
|
||||
/datum/trait/negative
|
||||
category = -1
|
||||
|
||||
/datum/trait/negative/speed_slow
|
||||
name = "Slowdown"
|
||||
desc = "Allows you to move slower on average than baseline."
|
||||
cost = -2
|
||||
var_changes = list("slowdown" = 0.5)
|
||||
|
||||
/datum/trait/speed_slow_plus
|
||||
/datum/trait/negative/speed_slow_plus
|
||||
name = "Major Slowdown"
|
||||
desc = "Allows you to move MUCH slower on average than baseline."
|
||||
cost = -3
|
||||
var_changes = list("slowdown" = 1.0)
|
||||
|
||||
/datum/trait/weakling
|
||||
/datum/trait/negative/weakling
|
||||
name = "Weakling"
|
||||
desc = "Causes heavy equipment to slow you down more when carried."
|
||||
cost = -1
|
||||
var_changes = list("item_slowdown_mod" = 1.5)
|
||||
|
||||
/datum/trait/weakling_plus
|
||||
/datum/trait/negative/weakling_plus
|
||||
name = "Major Weakling"
|
||||
desc = "Allows you to carry heavy equipment with much more slowdown."
|
||||
cost = -2
|
||||
var_changes = list("item_slowdown_mod" = 2.0)
|
||||
|
||||
/datum/trait/endurance_low
|
||||
/datum/trait/negative/endurance_low
|
||||
name = "Low Endurance"
|
||||
desc = "Reduces your maximum total hitpoints to 75."
|
||||
cost = -2
|
||||
@@ -35,7 +38,7 @@
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/endurance_very_low
|
||||
/datum/trait/negative/endurance_very_low
|
||||
name = "Extremely Low Endurance"
|
||||
desc = "Reduces your maximum total hitpoints to 50."
|
||||
cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
|
||||
@@ -45,108 +48,81 @@
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/minor_brute_weak
|
||||
/datum/trait/negative/minor_brute_weak
|
||||
name = "Minor Brute Weakness"
|
||||
desc = "Increases damage from brute damage sources by 15%"
|
||||
cost = -1
|
||||
var_changes = list("brute_mod" = 1.15)
|
||||
|
||||
/datum/trait/brute_weak
|
||||
/datum/trait/negative/brute_weak
|
||||
name = "Brute Weakness"
|
||||
desc = "Increases damage from brute damage sources by 25%"
|
||||
cost = -2
|
||||
var_changes = list("brute_mod" = 1.25)
|
||||
|
||||
/datum/trait/brute_weak_plus
|
||||
/datum/trait/negative/brute_weak_plus
|
||||
name = "Major Brute Weakness"
|
||||
desc = "Increases damage from brute damage sources by 50%"
|
||||
cost = -3
|
||||
var_changes = list("brute_mod" = 1.5)
|
||||
|
||||
/datum/trait/minor_burn_weak
|
||||
/datum/trait/negative/minor_burn_weak
|
||||
name = "Minor Burn Weakness"
|
||||
desc = "Increases damage from burn damage sources by 15%"
|
||||
cost = -1
|
||||
var_changes = list("burn_mod" = 1.15)
|
||||
|
||||
/datum/trait/burn_weak
|
||||
/datum/trait/negative/burn_weak
|
||||
name = "Burn Weakness"
|
||||
desc = "Increases damage from burn damage sources by 25%"
|
||||
cost = -2
|
||||
var_changes = list("burn_mod" = 1.25)
|
||||
|
||||
/datum/trait/burn_weak_plus
|
||||
/datum/trait/negative/burn_weak_plus
|
||||
name = "Major Burn Weakness"
|
||||
desc = "Increases damage from burn damage sources by 50%"
|
||||
cost = -3
|
||||
var_changes = list("burn_mod" = 1.5)
|
||||
|
||||
/datum/trait/conductive
|
||||
/datum/trait/negative/conductive
|
||||
name = "Conductive"
|
||||
desc = "Increases your susceptibility to electric shocks by 50%"
|
||||
cost = -1
|
||||
var_changes = list("siemens_coefficient" = 1.5) //This makes you a lot weaker to tasers.
|
||||
|
||||
/datum/trait/conductive_plus
|
||||
/datum/trait/negative/conductive_plus
|
||||
name = "Major Conductive"
|
||||
desc = "Increases your susceptibility to electric shocks by 100%"
|
||||
cost = -2
|
||||
cost = -1
|
||||
var_changes = list("siemens_coefficient" = 2.0) //This makes you extremely weak to tasers.
|
||||
|
||||
/datum/trait/haemophilia
|
||||
/datum/trait/negative/haemophilia
|
||||
name = "Haemophilia - Organics only"
|
||||
desc = "When you bleed, you bleed a LOT."
|
||||
cost = -2
|
||||
var_changes = list("bloodloss_rate" = 2)
|
||||
can_take = ORGANICS
|
||||
|
||||
/datum/trait/hollow
|
||||
/datum/trait/negative/hollow
|
||||
name = "Hollow Bones/Aluminum Alloy"
|
||||
desc = "Your bones and robot limbs are much easier to break."
|
||||
cost = -2 //I feel like this should be higher, but let's see where it goes
|
||||
|
||||
/datum/trait/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/negative/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
for(var/obj/item/organ/external/O in H.organs)
|
||||
O.min_broken_damage *= 0.5
|
||||
O.min_bruised_damage *= 0.5
|
||||
|
||||
/datum/trait/lightweight
|
||||
/datum/trait/negative/lightweight
|
||||
name = "Lightweight"
|
||||
desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
|
||||
cost = -2
|
||||
var_changes = list("lightweight" = 1)
|
||||
|
||||
/datum/trait/colorblind/mono
|
||||
name = "Colorblindness (Monochromancy)"
|
||||
desc = "You simply can't see colors at all, period. You are 100% colorblind."
|
||||
cost = -1
|
||||
|
||||
/datum/trait/colorblind/mono/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.add_modifier(/datum/modifier/trait/colorblind_monochrome)
|
||||
|
||||
/datum/trait/colorblind/para_vulp
|
||||
name = "Colorblindness (Para Vulp)"
|
||||
desc = "You have a severe issue with green colors and have difficulty recognizing them from red colors."
|
||||
cost = -1
|
||||
|
||||
/datum/trait/colorblind/para_vulp/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.add_modifier(/datum/modifier/trait/colorblind_vulp)
|
||||
|
||||
/datum/trait/colorblind/para_taj
|
||||
name = "Colorblindness (Para Taj)"
|
||||
desc = "You have a minor issue with blue colors and have difficulty recognizing them from red colors."
|
||||
cost = -1
|
||||
|
||||
/datum/trait/colorblind/para_taj/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.add_modifier(/datum/modifier/trait/colorblind_taj)
|
||||
|
||||
/datum/trait/neural_hypersensitivity
|
||||
/datum/trait/negative/neural_hypersensitivity
|
||||
name = "Neural Hypersensitivity"
|
||||
desc = "Your nerves are particularly sensitive to physical changes, leading to experiencing twice the intensity of pain and pleasure alike. Doubles traumatic shock."
|
||||
cost = -1
|
||||
var_changes = list("trauma_mod" = 2)
|
||||
|
||||
can_take = ORGANICS
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/metabolism_up
|
||||
/datum/trait/neutral/metabolism_up
|
||||
name = "Fast Metabolism"
|
||||
desc = "You process ingested and injected reagents faster, but get hungry faster (Teshari speed)."
|
||||
cost = 0
|
||||
var_changes = list("metabolic_rate" = 1.2, "hunger_factor" = 0.2, "metabolism" = 0.06) // +20% rate and 4x hunger (Teshari level)
|
||||
excludes = list(/datum/trait/metabolism_down, /datum/trait/metabolism_apex)
|
||||
excludes = list(/datum/trait/neutral/metabolism_down, /datum/trait/neutral/metabolism_apex)
|
||||
|
||||
/datum/trait/metabolism_down
|
||||
/datum/trait/neutral/metabolism_down
|
||||
name = "Slow Metabolism"
|
||||
desc = "You process ingested and injected reagents slower, but get hungry slower."
|
||||
cost = 0
|
||||
var_changes = list("metabolic_rate" = 0.8, "hunger_factor" = 0.04, "metabolism" = 0.0012) // -20% of default.
|
||||
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_apex)
|
||||
excludes = list(/datum/trait/neutral/metabolism_up, /datum/trait/neutral/metabolism_apex)
|
||||
|
||||
/datum/trait/metabolism_apex
|
||||
/datum/trait/neutral/metabolism_apex
|
||||
name = "Apex Metabolism"
|
||||
desc = "Finally a proper excuse for your predatory actions. Essentially doubles the fast trait rates. Good for characters with big appetites."
|
||||
cost = 0
|
||||
var_changes = list("metabolic_rate" = 1.4, "hunger_factor" = 0.4, "metabolism" = 0.012) // +40% rate and 8x hunger (Double Teshari)
|
||||
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_down)
|
||||
excludes = list(/datum/trait/neutral/metabolism_up, /datum/trait/neutral/metabolism_down)
|
||||
|
||||
/datum/trait/coldadapt
|
||||
/datum/trait/neutral/coldadapt
|
||||
name = "Cold-Adapted"
|
||||
desc = "You are able to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations."
|
||||
cost = 0
|
||||
var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 330, "heat_level_2" = 380, "heat_level_3" = 700, "breath_heat_level_1" = 360, "breath_heat_level_2" = 400, "breath_heat_level_3" = 850, "heat_discomfort_level" = 295, "body_temperature" = 290)
|
||||
excludes = list(/datum/trait/hotadapt)
|
||||
excludes = list(/datum/trait/neutral/hotadapt)
|
||||
|
||||
/datum/trait/hotadapt
|
||||
/datum/trait/neutral/hotadapt
|
||||
name = "Heat-Adapted"
|
||||
desc = "You are able to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations."
|
||||
cost = 0
|
||||
var_changes = list("heat_level_1" = 420, "heat_level_2" = 460, "heat_level_3" = 1100, "breath_heat_level_1" = 440, "breath_heat_level_2" = 510, "breath_heat_level_3" = 1500, "heat_discomfort_level" = 390, "cold_level_1" = 280, "cold_level_2" = 220, "cold_level_3" = 140, "breath_cold_level_1" = 260, "breath_cold_level_2" = 240, "breath_cold_level_3" = 120, "cold_discomfort_level" = 280, "body_temperature" = 330)
|
||||
excludes = list(/datum/trait/coldadapt)
|
||||
excludes = list(/datum/trait/neutral/coldadapt)
|
||||
|
||||
/datum/trait/autohiss_unathi
|
||||
/datum/trait/neutral/autohiss_unathi
|
||||
name = "Autohiss (Unathi)"
|
||||
desc = "You roll your S's and x's"
|
||||
cost = 0
|
||||
@@ -49,9 +49,9 @@
|
||||
),
|
||||
autohiss_exempt = list("Sinta'unathi"))
|
||||
|
||||
excludes = list(/datum/trait/autohiss_tajaran)
|
||||
excludes = list(/datum/trait/neutral/autohiss_tajaran)
|
||||
|
||||
/datum/trait/autohiss_tajaran
|
||||
/datum/trait/neutral/autohiss_tajaran
|
||||
name = "Autohiss (Tajaran)"
|
||||
desc = "You roll your R's."
|
||||
cost = 0
|
||||
@@ -60,74 +60,74 @@
|
||||
"r" = list("rr", "rrr", "rrrr")
|
||||
),
|
||||
autohiss_exempt = list("Siik"))
|
||||
excludes = list(/datum/trait/autohiss_unathi)
|
||||
excludes = list(/datum/trait/neutral/autohiss_unathi)
|
||||
|
||||
/datum/trait/bloodsucker
|
||||
/datum/trait/neutral/bloodsucker
|
||||
name = "Bloodsucker"
|
||||
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("organic_food_coeff" = 0) //The verb is given in human.dm
|
||||
|
||||
/datum/trait/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/carbon/human/proc/bloodsuck
|
||||
|
||||
/datum/trait/succubus_drain
|
||||
/datum/trait/neutral/succubus_drain
|
||||
name = "Succubus Drain"
|
||||
desc = "Makes you able to gain nutrition from draining prey in your grasp."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/succubus_drain/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/succubus_drain/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/carbon/human/proc/succubus_drain
|
||||
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_finalize
|
||||
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
|
||||
|
||||
/datum/trait/feeder
|
||||
/datum/trait/neutral/feeder
|
||||
name = "Feeder"
|
||||
desc = "Allows you to feed your prey using your own body."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/feeder/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/feeder/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/carbon/human/proc/slime_feed
|
||||
|
||||
/datum/trait/hard_vore
|
||||
/datum/trait/neutral/hard_vore
|
||||
name = "Brutal Predation"
|
||||
desc = "Allows you to tear off limbs & tear out internal organs."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/proc/shred_limb
|
||||
|
||||
/datum/trait/trashcan
|
||||
/datum/trait/neutral/trashcan
|
||||
name = "Trash Can"
|
||||
desc = "Allows you to dispose of some garbage on the go instead of having to look for a bin or littering like an animal."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("trashcan" = 1)
|
||||
|
||||
/datum/trait/trashcan/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/trashcan/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/proc/eat_trash
|
||||
|
||||
/datum/trait/gem_eater
|
||||
/datum/trait/neutral/gem_eater
|
||||
name = "Expensive Taste"
|
||||
desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("organic_food_coeff" = 0, "eat_minerals" = 1)
|
||||
|
||||
/datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/proc/eat_minerals
|
||||
|
||||
/datum/trait/synth_chemfurnace
|
||||
|
||||
/datum/trait/neutral/synth_chemfurnace
|
||||
name = "Biofuel Processor"
|
||||
desc = "You are able to gain energy through consuming and processing normal food. Energy-dense foods such as protein bars and survival food will yield the best results."
|
||||
cost = 0
|
||||
@@ -135,101 +135,101 @@
|
||||
can_take = SYNTHETICS
|
||||
var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.25)
|
||||
|
||||
/datum/trait/glowing_eyes
|
||||
/datum/trait/neutral/glowing_eyes
|
||||
name = "Glowing Eyes"
|
||||
desc = "Your eyes show up above darkness. SPOOKY! And kinda edgey too."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("has_glowing_eyes" = 1)
|
||||
|
||||
/datum/trait/glowing_body
|
||||
/datum/trait/neutral/glowing_body
|
||||
name = "Glowing Body"
|
||||
desc = "Your body glows about as much as a PDA light! Settable color and toggle in Abilities tab ingame."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/glowing_body/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/glowing_body/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/proc/glow_toggle
|
||||
H.verbs |= /mob/living/proc/glow_color
|
||||
|
||||
|
||||
//Allergen traits! Not available to any species with a base allergens var.
|
||||
/datum/trait/allergy
|
||||
/datum/trait/neutral/allergy
|
||||
name = "Allergy: Gluten"
|
||||
desc = "You're highly allergic to gluten proteins, which are found in most common grains."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var/allergen = GRAINS
|
||||
|
||||
/datum/trait/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
S.allergens |= allergen
|
||||
..(S,H)
|
||||
|
||||
/datum/trait/allergy/meat
|
||||
/datum/trait/neutral/allergy/meat
|
||||
name = "Allergy: Meat"
|
||||
desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = MEAT
|
||||
|
||||
/datum/trait/allergy/fish
|
||||
/datum/trait/neutral/allergy/fish
|
||||
name = "Allergy: Fish"
|
||||
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FISH
|
||||
|
||||
/datum/trait/allergy/fruit
|
||||
/datum/trait/neutral/allergy/fruit
|
||||
name = "Allergy: Fruit"
|
||||
desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FRUIT
|
||||
|
||||
/datum/trait/allergy/vegetable
|
||||
/datum/trait/neutral/allergy/vegetable
|
||||
name = "Allergy: Vegetable"
|
||||
desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = VEGETABLE
|
||||
|
||||
/datum/trait/allergy/nuts
|
||||
/datum/trait/neutral/allergy/nuts
|
||||
name = "Allergy: Nuts"
|
||||
desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = SEEDS
|
||||
|
||||
/datum/trait/allergy/soy
|
||||
/datum/trait/neutral/allergy/soy
|
||||
name = "Allergy: Soy"
|
||||
desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = BEANS
|
||||
|
||||
/datum/trait/allergy/dairy
|
||||
/datum/trait/neutral/allergy/dairy
|
||||
name = "Allergy: Lactose"
|
||||
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = DAIRY
|
||||
|
||||
/datum/trait/allergy/fungi
|
||||
/datum/trait/neutral/allergy/fungi
|
||||
name = "Allergy: Fungi"
|
||||
desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FUNGI
|
||||
|
||||
/datum/trait/allergy/coffee
|
||||
/datum/trait/neutral/allergy/coffee
|
||||
name = "Allergy: Coffee"
|
||||
desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = COFFEE
|
||||
|
||||
/datum/trait/allergen_reduced_effect
|
||||
|
||||
/datum/trait/neutral/allergen_reduced_effect
|
||||
name = "Reduced Allergen Reaction"
|
||||
desc = "This trait halves the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)."
|
||||
cost = 0
|
||||
@@ -237,42 +237,42 @@
|
||||
var_changes = list("allergen_damage_severity" = 0.6)
|
||||
|
||||
// Spicy Food Traits, from negative to positive.
|
||||
/datum/trait/spice_intolerance_extreme
|
||||
/datum/trait/neutral/spice_intolerance_extreme
|
||||
name = "Extreme Spice Intolerance"
|
||||
desc = "Spicy (and chilly) peppers are three times as strong. (This does not affect pepperspray.)"
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("spice_mod" = 3) // 300% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/spice_intolerance_basic
|
||||
/datum/trait/neutral/spice_intolerance_basic
|
||||
name = "Heavy Spice Intolerance"
|
||||
desc = "Spicy (and chilly) peppers are twice as strong. (This does not affect pepperspray.)"
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("spice_mod" = 2) // 200% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/spice_intolerance_slight
|
||||
/datum/trait/neutral/spice_intolerance_slight
|
||||
name = "Slight Spice Intolerance"
|
||||
desc = "You have a slight struggle with spicy foods. Spicy (and chilly) peppers are one and a half times stronger. (This does not affect pepperspray.)"
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("spice_mod" = 1.5) // 150% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/spice_tolerance_basic
|
||||
/datum/trait/neutral/spice_tolerance_basic
|
||||
name = "Spice Tolerance"
|
||||
desc = "Spicy (and chilly) peppers are only three-quarters as strong. (This does not affect pepperspray.)"
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("spice_mod" = 0.75) // 75% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/spice_tolerance_advanced
|
||||
/datum/trait/neutral/spice_tolerance_advanced
|
||||
name = "Strong Spice Tolerance"
|
||||
desc = "Spicy (and chilly) peppers are only half as strong. (This does not affect pepperspray.)"
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("spice_mod" = 0.5) // 50% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/spice_immunity
|
||||
/datum/trait/neutral/spice_immunity
|
||||
name = "Extreme Spice Tolerance"
|
||||
desc = "Spicy (and chilly) peppers are basically ineffective! (This does not affect pepperspray.)"
|
||||
cost = 0
|
||||
@@ -280,42 +280,42 @@
|
||||
var_changes = list("spice_mod" = 0.25) // 25% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
// Alcohol Traits Start Here, from negative to positive.
|
||||
/datum/trait/alcohol_intolerance_advanced
|
||||
/datum/trait/neutral/alcohol_intolerance_advanced
|
||||
name = "Liver of Air"
|
||||
desc = "The only way you can hold a drink is if it's in your own two hands, and even then you'd best not inhale too deeply near it. Drinks are three times as strong."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("alcohol_mod" = 3) // 300% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/alcohol_intolerance_basic
|
||||
/datum/trait/neutral/alcohol_intolerance_basic
|
||||
name = "Liver of Lilies"
|
||||
desc = "You have a hard time with alcohol. Maybe you just never took to it, or maybe it doesn't agree with you... either way, drinks are twice as strong."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("alcohol_mod" = 2) // 200% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/alcohol_intolerance_slight
|
||||
/datum/trait/neutral/alcohol_intolerance_slight
|
||||
name = "Liver of Tulips"
|
||||
desc = "You have a slight struggle with alcohol. Drinks are one and a half times stronger."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("alcohol_mod" = 1.5) // 150% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/alcohol_tolerance_basic
|
||||
/datum/trait/neutral/alcohol_tolerance_basic
|
||||
name = "Liver of Iron"
|
||||
desc = "You can hold drinks much better than those lily-livered land-lubbers! Arr! Drinks are only three-quarters as strong."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("alcohol_mod" = 0.75) // 75% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/alcohol_tolerance_advanced
|
||||
/datum/trait/neutral/alcohol_tolerance_advanced
|
||||
name = "Liver of Steel"
|
||||
desc = "Drinks tremble before your might! You can hold your alcohol twice as well as those blue-bellied barnacle boilers! Drinks are only half as strong."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("alcohol_mod" = 0.5) // 50% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
|
||||
/datum/trait/alcohol_immunity
|
||||
/datum/trait/neutral/alcohol_immunity
|
||||
name = "Liver of Durasteel"
|
||||
desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed."
|
||||
cost = 0
|
||||
@@ -323,99 +323,126 @@
|
||||
var_changes = list("alcohol_mod" = 0.25) // 25% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
|
||||
// Alcohol Traits End Here.
|
||||
|
||||
/datum/trait/neutral/colorblind/mono
|
||||
name = "Colorblindness (Monochromancy)"
|
||||
desc = "You simply can't see colors at all, period. You are 100% colorblind."
|
||||
cost = 0
|
||||
|
||||
/datum/trait/neutral/colorblind/mono/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.add_modifier(/datum/modifier/trait/colorblind_monochrome)
|
||||
|
||||
/datum/trait/neutral/colorblind/para_vulp
|
||||
name = "Colorblindness (Para Vulp)"
|
||||
desc = "You have a severe issue with green colors and have difficulty recognizing them from red colors."
|
||||
cost = 0
|
||||
|
||||
/datum/trait/neutral/colorblind/para_vulp/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.add_modifier(/datum/modifier/trait/colorblind_vulp)
|
||||
|
||||
/datum/trait/neutral/colorblind/para_taj
|
||||
name = "Colorblindness (Para Taj)"
|
||||
desc = "You have a minor issue with blue colors and have difficulty recognizing them from red colors."
|
||||
cost = 0
|
||||
|
||||
/datum/trait/neutral/colorblind/para_taj/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.add_modifier(/datum/modifier/trait/colorblind_taj)
|
||||
|
||||
// Body shape traits
|
||||
/datum/trait/taller
|
||||
/datum/trait/neutral/taller
|
||||
name = "Tall"
|
||||
desc = "Your body is taller than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_y" = 1.09)
|
||||
excludes = list(/datum/trait/tall, /datum/trait/short, /datum/trait/shorter)
|
||||
excludes = list(/datum/trait/neutral/tall, /datum/trait/neutral/short, /datum/trait/neutral/shorter)
|
||||
|
||||
/datum/trait/taller/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/taller/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/tall
|
||||
/datum/trait/neutral/tall
|
||||
name = "Slightly Tall"
|
||||
desc = "Your body is a bit taller than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_y" = 1.05)
|
||||
excludes = list(/datum/trait/taller, /datum/trait/short, /datum/trait/shorter)
|
||||
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/short, /datum/trait/neutral/shorter)
|
||||
|
||||
/datum/trait/tall/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/tall/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/short
|
||||
/datum/trait/neutral/short
|
||||
name = "Slightly Short"
|
||||
desc = "Your body is a bit shorter than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_y" = 0.95)
|
||||
excludes = list(/datum/trait/taller, /datum/trait/tall, /datum/trait/shorter)
|
||||
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/tall, /datum/trait/neutral/shorter)
|
||||
|
||||
/datum/trait/short/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/short/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/shorter
|
||||
/datum/trait/neutral/shorter
|
||||
name = "Short"
|
||||
desc = "Your body is shorter than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_y" = 0.915)
|
||||
excludes = list(/datum/trait/taller, /datum/trait/tall, /datum/trait/short)
|
||||
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/tall, /datum/trait/neutral/short)
|
||||
|
||||
/datum/trait/shorter/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/shorter/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/obese
|
||||
/datum/trait/neutral/obese
|
||||
name = "Very Bulky"
|
||||
desc = "Your body is much wider than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_x" = 1.095)
|
||||
excludes = list(/datum/trait/fat, /datum/trait/thin, /datum/trait/thinner)
|
||||
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/thin, /datum/trait/neutral/thinner)
|
||||
|
||||
/datum/trait/obese/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/obese/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/fat
|
||||
/datum/trait/neutral/fat
|
||||
name = "Bulky"
|
||||
desc = "Your body is wider than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_x" = 1.054)
|
||||
excludes = list(/datum/trait/obese, /datum/trait/thin, /datum/trait/thinner)
|
||||
excludes = list(/datum/trait/neutral/obese, /datum/trait/neutral/thin, /datum/trait/neutral/thinner)
|
||||
|
||||
/datum/trait/fat/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/fat/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/thin
|
||||
/datum/trait/neutral/thin
|
||||
name = "Thin"
|
||||
desc = "Your body is thinner than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_x" = 0.945)
|
||||
excludes = list(/datum/trait/fat, /datum/trait/obese, /datum/trait/thinner)
|
||||
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/obese, /datum/trait/neutral/thinner)
|
||||
|
||||
/datum/trait/thin/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/thin/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
/datum/trait/thinner
|
||||
/datum/trait/neutral/thinner
|
||||
name = "Very Thin"
|
||||
desc = "Your body is much thinner than average."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("icon_scale_x" = 0.905)
|
||||
excludes = list(/datum/trait/fat, /datum/trait/obese, /datum/trait/thin)
|
||||
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/obese, /datum/trait/neutral/thin)
|
||||
|
||||
/datum/trait/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/neutral/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.update_transform()
|
||||
|
||||
@@ -1,25 +1,28 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/speed_fast
|
||||
/datum/trait/positive
|
||||
category = 1
|
||||
|
||||
/datum/trait/positive/speed_fast
|
||||
name = "Haste"
|
||||
desc = "Allows you to move faster on average than baseline."
|
||||
cost = 4
|
||||
var_changes = list("slowdown" = -0.5)
|
||||
|
||||
/datum/trait/hardy
|
||||
/datum/trait/positive/hardy
|
||||
name = "Hardy"
|
||||
desc = "Allows you to carry heavy equipment with less slowdown."
|
||||
cost = 1
|
||||
var_changes = list("item_slowdown_mod" = 0.5)
|
||||
|
||||
/datum/trait/hardy_plus
|
||||
/datum/trait/positive/hardy_plus
|
||||
name = "Major Hardy"
|
||||
desc = "Allows you to carry heavy equipment with almost no slowdown."
|
||||
cost = 2
|
||||
var_changes = list("item_slowdown_mod" = 0.1)
|
||||
var_changes = list("item_slowdown_mod" = 0.25)
|
||||
|
||||
/datum/trait/endurance_high
|
||||
/datum/trait/positive/endurance_high
|
||||
name = "High Endurance"
|
||||
desc = "Increases your maximum total hitpoints to 125"
|
||||
cost = 4
|
||||
@@ -29,127 +32,127 @@
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/nonconductive
|
||||
/datum/trait/positive/nonconductive
|
||||
name = "Non-Conductive"
|
||||
desc = "Decreases your susceptibility to electric shocks by a 10% amount."
|
||||
cost = 1 //This effects tasers!
|
||||
var_changes = list("siemens_coefficient" = 0.9)
|
||||
|
||||
/datum/trait/positive/nonconductive_plus
|
||||
name = "Major Non-Conductive"
|
||||
desc = "Decreases your susceptibility to electric shocks by a 25% amount."
|
||||
cost = 2 //This effects tasers!
|
||||
cost = 2 //Let us not forget this effects tasers!
|
||||
var_changes = list("siemens_coefficient" = 0.75)
|
||||
|
||||
/datum/trait/nonconductive_plus
|
||||
name = "Major Non-Conductive"
|
||||
desc = "Decreases your susceptibility to electric shocks by a 50% amount."
|
||||
cost = 3 //Let us not forget this effects tasers!
|
||||
var_changes = list("siemens_coefficient" = 0.5)
|
||||
|
||||
/datum/trait/darksight
|
||||
/datum/trait/positive/darksight
|
||||
name = "Darksight"
|
||||
desc = "Allows you to see a short distance in the dark."
|
||||
cost = 1
|
||||
var_changes = list("darksight" = 5, "flash_mod" = 2.0)
|
||||
var_changes = list("darksight" = 5, "flash_mod" = 1.1)
|
||||
|
||||
/datum/trait/darksight_plus
|
||||
/datum/trait/positive/darksight_plus
|
||||
name = "Darksight (Major)"
|
||||
desc = "Allows you to see in the dark for the whole screen."
|
||||
cost = 2
|
||||
var_changes = list("darksight" = 8, "flash_mod" = 3.0)
|
||||
var_changes = list("darksight" = 8, "flash_mod" = 1.2)
|
||||
|
||||
/datum/trait/melee_attack
|
||||
/datum/trait/positive/melee_attack
|
||||
name = "Sharp Melee"
|
||||
desc = "Provides sharp melee attacks that do slightly more damage."
|
||||
cost = 1
|
||||
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp))
|
||||
|
||||
/datum/trait/melee_attack_fangs
|
||||
/datum/trait/positive/melee_attack_fangs
|
||||
name = "Sharp Melee & Numbing Fangs"
|
||||
desc = "Provides sharp melee attacks that do slightly more damage, along with fangs that makes the person bit unable to feel their body or pain."
|
||||
cost = 2
|
||||
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing))
|
||||
|
||||
/datum/trait/fangs
|
||||
/datum/trait/positive/fangs
|
||||
name = "Numbing Fangs"
|
||||
desc = "Provides fangs that makes the person bit unable to feel their body or pain."
|
||||
cost = 1
|
||||
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite/sharp/numbing))
|
||||
|
||||
/datum/trait/minor_brute_resist
|
||||
/datum/trait/positive/minor_brute_resist
|
||||
name = "Minor Brute Resist"
|
||||
desc = "Adds 15% resistance to brute damage sources."
|
||||
cost = 2
|
||||
var_changes = list("brute_mod" = 0.85)
|
||||
|
||||
/datum/trait/brute_resist
|
||||
/datum/trait/positive/brute_resist
|
||||
name = "Brute Resist"
|
||||
desc = "Adds 25% resistance to brute damage sources."
|
||||
cost = 3
|
||||
var_changes = list("brute_mod" = 0.75)
|
||||
excludes = list(/datum/trait/minor_burn_resist,/datum/trait/burn_resist)
|
||||
excludes = list(/datum/trait/positive/minor_burn_resist,/datum/trait/positive/burn_resist)
|
||||
|
||||
/datum/trait/minor_burn_resist
|
||||
/datum/trait/positive/minor_burn_resist
|
||||
name = "Minor Burn Resist"
|
||||
desc = "Adds 15% resistance to burn damage sources."
|
||||
cost = 2
|
||||
var_changes = list("burn_mod" = 0.85)
|
||||
|
||||
/datum/trait/burn_resist
|
||||
/datum/trait/positive/burn_resist
|
||||
name = "Burn Resist"
|
||||
desc = "Adds 25% resistance to burn damage sources."
|
||||
cost = 3
|
||||
var_changes = list("burn_mod" = 0.75)
|
||||
excludes = list(/datum/trait/minor_brute_resist,/datum/trait/brute_resist)
|
||||
excludes = list(/datum/trait/positive/minor_brute_resist,/datum/trait/positive/brute_resist)
|
||||
|
||||
/datum/trait/photoresistant
|
||||
/datum/trait/positive/photoresistant
|
||||
name = "Photoresistant"
|
||||
desc = "Decreases stun duration from flashes and other light-based stuns and disabilities by 50%"
|
||||
desc = "Decreases stun duration from flashes and other light-based stuns and disabilities by 20%"
|
||||
cost = 1
|
||||
var_changes = list("flash_mod" = 0.5)
|
||||
var_changes = list("flash_mod" = 0.8)
|
||||
|
||||
/datum/trait/winged_flight
|
||||
/datum/trait/positive/winged_flight
|
||||
name = "Winged Flight"
|
||||
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
|
||||
cost = 1
|
||||
cost = 0
|
||||
|
||||
/datum/trait/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/positive/winged_flight/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/proc/flying_toggle
|
||||
H.verbs |= /mob/living/proc/start_wings_hovering
|
||||
|
||||
/datum/trait/hardfeet
|
||||
/datum/trait/positive/hardfeet
|
||||
name = "Hard Feet"
|
||||
desc = "Makes your nice clawed, scaled, hooved, armored, or otherwise just awfully calloused feet immune to glass shards."
|
||||
cost = 1
|
||||
cost = 0
|
||||
var_changes = list("flags" = NO_MINOR_CUT) //Checked the flag is only used by shard stepping.
|
||||
|
||||
/datum/trait/antiseptic_saliva
|
||||
/datum/trait/positive/antiseptic_saliva
|
||||
name = "Antiseptic Saliva"
|
||||
desc = "Your saliva has especially strong antiseptic properties that can be used to heal small wounds."
|
||||
cost = 1
|
||||
|
||||
/datum/trait/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/positive/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..()
|
||||
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
|
||||
|
||||
/datum/trait/traceur
|
||||
/datum/trait/positive/traceur
|
||||
name = "Traceur"
|
||||
desc = "You're capable of parkour and can *flip over low objects (most of the time)."
|
||||
cost = 2
|
||||
var_changes = list("agility" = 90)
|
||||
|
||||
/datum/trait/snowwalker
|
||||
/datum/trait/positive/snowwalker
|
||||
name = "Snow Walker"
|
||||
desc = "You are able to move unhindered on snow."
|
||||
cost = 1
|
||||
var_changes = list("snow_movement" = -2)
|
||||
|
||||
/datum/trait/weaver
|
||||
/datum/trait/positive/weaver
|
||||
name = "Weaver"
|
||||
desc = "You can produce silk and create various articles of clothing and objects."
|
||||
cost = 2
|
||||
var_changes = list("is_weaver" = 1)
|
||||
|
||||
/datum/trait/weaver/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
/datum/trait/positive/weaver/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..()
|
||||
H.verbs |= /mob/living/carbon/human/proc/check_silk_amount
|
||||
H.verbs |= /mob/living/carbon/human/proc/toggle_silk_production
|
||||
H.verbs |= /mob/living/carbon/human/proc/weave_structure
|
||||
H.verbs |= /mob/living/carbon/human/proc/weave_item
|
||||
H.verbs |= /mob/living/carbon/human/proc/set_silk_color
|
||||
H.verbs |= /mob/living/carbon/human/proc/set_silk_color
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
var/name
|
||||
var/desc = "Contact a developer if you see this trait."
|
||||
|
||||
var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive.
|
||||
var/cost = 0
|
||||
var/category = 0 // What category this trait is. -1 is Negative, 0 is Neutral, 1 is Positive
|
||||
var/list/var_changes // A list to apply to the custom species vars.
|
||||
var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars.
|
||||
var/can_take = ORGANICS|SYNTHETICS // Can freaking synths use those.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,8 +5,6 @@
|
||||
var/ooc_notes = null
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER
|
||||
var/hunger_rate = DEFAULT_HUNGER_FACTOR
|
||||
var/resizable = TRUE
|
||||
|
||||
//custom say verbs
|
||||
var/custom_say = null
|
||||
var/custom_ask = null
|
||||
|
||||
@@ -8,7 +8,7 @@ var/list/department_radio_keys = list(
|
||||
":n" = "Science", ".n" = "Science",
|
||||
":m" = "Medical", ".m" = "Medical",
|
||||
":e" = "Engineering", ".e" = "Engineering",
|
||||
":k" = "Response Team", ".k" = "Response Team", //TFF 11/3/20 - Add Response Team to channels usable rather than resorting to :H or such.,
|
||||
":k" = "Response Team", ".k" = "Response Team",
|
||||
":s" = "Security", ".s" = "Security",
|
||||
":w" = "whisper", ".w" = "whisper",
|
||||
":t" = "Mercenary", ".t" = "Mercenary",
|
||||
@@ -27,7 +27,7 @@ var/list/department_radio_keys = list(
|
||||
":N" = "Science", ".N" = "Science",
|
||||
":M" = "Medical", ".M" = "Medical",
|
||||
":E" = "Engineering", ".E" = "Engineering",
|
||||
":k" = "Response Team", ".k" = "Response Team", //TFF 11/3/20 - Add Response Team to channels usable rather than resorting to :H or such.,
|
||||
":k" = "Response Team", ".k" = "Response Team",
|
||||
":S" = "Security", ".S" = "Security",
|
||||
":W" = "whisper", ".W" = "whisper",
|
||||
":T" = "Mercenary", ".T" = "Mercenary",
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
"Chirp" = list("chirps","chirrups","cheeps"),
|
||||
"Feline" = list("purrs","yowls","meows"),
|
||||
"Canine" = list("yaps","barks","woofs"),
|
||||
"Rodent" = list("squeaks", "SQUEAKS", "sqiks") //VOREStation Edit - TFF 22/11/19 - CHOMPStation port of pAI additions,
|
||||
"Rodent" = list("squeaks", "SQUEAKS", "sqiks") //VOREStation Edit
|
||||
)
|
||||
|
||||
var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
|
||||
@@ -330,8 +330,7 @@
|
||||
|
||||
close_up()
|
||||
|
||||
//VOREStation Removal Start - TFF 22/11/19 - Refactored in pai_vr.dm
|
||||
/*
|
||||
/* //VOREStation Removal Start
|
||||
/mob/living/silicon/pai/proc/choose_chassis()
|
||||
set category = "pAI Commands"
|
||||
set name = "Choose Chassis"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/mob/living/silicon/pai
|
||||
var/people_eaten = 0
|
||||
icon = 'icons/mob/pai_vr.dmi'
|
||||
//TFF 22/11/19 - CHOMPStation port of pAI additions.
|
||||
var/global/list/wide_chassis = list(
|
||||
"rat",
|
||||
"panther"
|
||||
@@ -36,7 +35,6 @@
|
||||
else if(people_eaten && resting)
|
||||
icon_state = "[chassis]_rest_full"
|
||||
|
||||
//TFF 22/11/19 - CHOMPStation port of pAI additions.
|
||||
if(chassis in wide_chassis)
|
||||
icon = 'icons/mob/pai_vr64x64.dmi'
|
||||
pixel_x = -16
|
||||
@@ -58,7 +56,6 @@
|
||||
else if(people_eaten && resting)
|
||||
icon_state = "[chassis]_rest_full"
|
||||
|
||||
//TFF 22/11/19 - CHOMPStation port of pAI additions.
|
||||
if(chassis in wide_chassis)
|
||||
icon = 'icons/mob/pai_vr64x64.dmi'
|
||||
pixel_x = -16
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
|
||||
// Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
|
||||
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and \
|
||||
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and
|
||||
// the projectiles have an AoE component, where as backline hivebots do not.
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/backline
|
||||
name = "backline hivebot"
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
|
||||
else if(ismob(target))
|
||||
var/mob/living/M = target
|
||||
resize(M.size_multiplier)
|
||||
resize(M.size_multiplier, ignore_prefs = TRUE)
|
||||
|
||||
//Morphed is weaker
|
||||
melee_damage_lower = melee_damage_disguised
|
||||
@@ -165,7 +165,7 @@
|
||||
maptext = null
|
||||
|
||||
size_multiplier = our_size_multiplier
|
||||
resize(size_multiplier)
|
||||
resize(size_multiplier, ignore_prefs = TRUE)
|
||||
|
||||
//Baseline stats
|
||||
melee_damage_lower = initial(melee_damage_lower)
|
||||
@@ -183,7 +183,7 @@
|
||||
/mob/living/simple_mob/vore/hostile/morph/will_show_tooltip()
|
||||
return (!morphed)
|
||||
|
||||
/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE)
|
||||
/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
|
||||
if(morphed && !ismob(form))
|
||||
return
|
||||
return ..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user