Merge pull request #358 from VOREStation/sync

Polaris Sync
This commit is contained in:
Arokha Sieyes
2016-06-14 19:29:43 -04:00
committed by GitHub
113 changed files with 5124 additions and 4579 deletions

View File

@@ -50,6 +50,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
#define NETWORK_SECURITY "Security"
#define NETWORK_TELECOM "Tcomsat"
#define NETWORK_THUNDER "Thunderdome"
#define NETWORK_COMMUNICATORS "Communicators"
// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them.
var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret")

View File

@@ -248,8 +248,11 @@
. |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down.
return .
/proc/get_mobs_and_objs_in_view_fast(var/turf/T, var/range, var/checkghosts = 1)
//Uses dview to quickly return mobs and objects in view,
// then adds additional mobs or objects if they are in range 'smartly',
// based on their presence in lists of players or registered objects
// Type: 1-audio, 2-visual, 0-neither
/proc/get_mobs_and_objs_in_view_fast(var/turf/T, var/range, var/type = 1)
var/list/mobs = list()
var/list/objs = list()
@@ -261,21 +264,30 @@
mobs += AM
hearturfs += AM.locs[1]
else if(isobj(AM))
objs += AM
objs += AM
hearturfs += AM.locs[1]
//A list of every mob with a client
for(var/mob/M in player_list)
if(checkghosts && M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
mobs |= M
continue
if(M.loc && M.locs[1] in hearturfs)
mobs |= M
else if(M.stat == DEAD)
switch(type)
if(1) //Audio messages use ghost_ears
if(M.is_preference_enabled(/datum/client_preference/ghost_ears))
mobs |= M
if(2) //Visual messages use ghost_sight
if(M.is_preference_enabled(/datum/client_preference/ghost_sight))
mobs |= M
//For objects below the top level who still want to hear
for(var/obj/O in listening_objects)
if(O.loc && O.locs[1] in hearturfs)
objs |= O
return list("mobs" = mobs, "objs" = objs)
#define SIGN(X) ((X<0)?-1:1)
proc

View File

@@ -11,6 +11,7 @@ var/global/list/human_mob_list = list() //List of all human mobs and sub-type
var/global/list/silicon_mob_list = list() //List of all silicon mobs, including clientless
var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player
var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player
var/global/list/listening_objects = list() //List of all objects which care about receiving messages (communicators, radios, etc)
var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions

View File

@@ -1257,7 +1257,7 @@ var/list/WALLITEMS = list(
arglist = list2params(arglist)
return "<a href='?src=\ref[D];[arglist]'>[content]</a>"
/proc/get_random_colour(var/simple, var/lower, var/upper)
/proc/get_random_colour(var/simple, var/lower=0, var/upper=255)
var/colour
if(simple)
colour = pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))

View File

@@ -6,12 +6,14 @@ var/datum/global_hud/global_hud = new()
var/list/global_huds = list(
global_hud.druggy,
global_hud.blurry,
global_hud.whitense,
global_hud.vimpaired,
global_hud.darkMask,
global_hud.nvg,
global_hud.thermal,
global_hud.meson,
global_hud.science)
global_hud.science
)
/datum/hud/var/obj/screen/grab_intent
/datum/hud/var/obj/screen/hurt_intent
@@ -21,6 +23,7 @@ var/list/global_huds = list(
/datum/global_hud
var/obj/screen/druggy
var/obj/screen/blurry
var/obj/screen/whitense
var/list/vimpaired
var/list/darkMask
var/obj/screen/nvg
@@ -53,6 +56,14 @@ var/list/global_huds = list(
blurry.layer = 17
blurry.mouse_opacity = 0
//static overlay effect for cameras and the like
whitense = new /obj/screen()
whitense.screen_loc = ui_entire_screen
whitense.icon = 'icons/effects/static.dmi'
whitense.icon_state = "1 light"
whitense.layer = 17
whitense.mouse_opacity = 0
nvg = setup_overlay("nvg_hud")
thermal = setup_overlay("thermal_hud")
meson = setup_overlay("meson_hud")

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,104 @@
/*
* Here is where any supply packs related
* to being atmospherics tasks live.
*/
/datum/supply_packs/atmos
group = "Atmospherics"
/datum/supply_packs/atmos/internals
name = "Internals crate"
contains = list(
/obj/item/clothing/mask/gas = 3,
/obj/item/weapon/tank/air = 3
)
cost = 10
containertype = /obj/structure/closet/crate/internals
containername = "Internals crate"
/datum/supply_packs/atmos/evacuation
name = "Emergency equipment"
contains = list(
/obj/item/weapon/storage/toolbox/emergency = 2,
/obj/item/clothing/suit/storage/hazardvest = 2,
/obj/item/clothing/suit/storage/vest = 2,
/obj/item/weapon/tank/emergency_oxygen/engi = 4,
/obj/item/clothing/suit/space/emergency = 4,
/obj/item/clothing/head/helmet/space/emergency = 4,
/obj/item/clothing/mask/gas = 4
)
cost = 45
containertype = /obj/structure/closet/crate/internals
containername = "Emergency crate"
/datum/supply_packs/atmos/inflatable
name = "Inflatable barriers"
contains = list(/obj/item/weapon/storage/briefcase/inflatable = 3)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Inflatable Barrier Crate"
/datum/supply_packs/atmos/canister_empty
name = "Empty gas canister"
cost = 7
containername = "Empty gas canister crate"
containertype = /obj/structure/largecrate
contains = list(/obj/machinery/portable_atmospherics/canister)
/datum/supply_packs/atmos/canister_air
name = "Air canister"
cost = 10
containername = "Air canister crate"
containertype = /obj/structure/largecrate
contains = list(/obj/machinery/portable_atmospherics/canister/air)
/datum/supply_packs/atmos/canister_oxygen
name = "Oxygen canister"
cost = 15
containername = "Oxygen canister crate"
containertype = /obj/structure/largecrate
contains = list(/obj/machinery/portable_atmospherics/canister/oxygen)
/datum/supply_packs/atmos/canister_nitrogen
name = "Nitrogen canister"
cost = 10
containername = "Nitrogen canister crate"
containertype = /obj/structure/largecrate
contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen)
/datum/supply_packs/atmos/canister_phoron
name = "Phoron gas canister"
cost = 60
containername = "Phoron gas canister crate"
containertype = /obj/structure/closet/crate/secure/large
access = access_atmospherics
contains = list(/obj/machinery/portable_atmospherics/canister/phoron)
/datum/supply_packs/atmos/canister_sleeping_agent
name = "N2O gas canister"
cost = 40
containername = "N2O gas canister crate"
containertype = /obj/structure/closet/crate/secure/large
access = access_atmospherics
contains = list(/obj/machinery/portable_atmospherics/canister/sleeping_agent)
/datum/supply_packs/atmos/canister_carbon_dioxide
name = "Carbon dioxide gas canister"
cost = 40
containername = "CO2 canister crate"
containertype = /obj/structure/closet/crate/secure/large
access = access_atmospherics
contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide)
/datum/supply_packs/atmos/voidsuits
name = "Atmospheric voidsuits"
contains = list(
/obj/item/clothing/suit/space/void/atmos = 2,
/obj/item/clothing/head/helmet/space/void/atmos = 2,
/obj/item/clothing/mask/breath = 2,
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2,
)
cost = 45
containertype = "/obj/structure/closet/crate/secure"
containername = "Atmospheric voidsuit crate"
access = access_atmospherics

View File

@@ -0,0 +1,44 @@
/*
* Here is where any supply packs that may or may not be legal
* and require modification of the supply controller live.
*/
/datum/supply_packs/randomised/contraband
num_contained = 5
contains = list(
/obj/item/seeds/bloodtomatoseed,
/obj/item/weapon/storage/pill_bottle/zoom,
/obj/item/weapon/storage/pill_bottle/happy,
/obj/item/weapon/reagent_containers/food/drinks/bottle/pwine
)
name = "Contraband crate"
cost = 30
containertype = /obj/structure/closet/crate
containername = "Unlabeled crate"
contraband = 1
group = "Operations"
/datum/supply_packs/security/specialops
name = "Special Ops supplies"
contains = list(
/obj/item/weapon/storage/box/emps,
/obj/item/weapon/grenade/smokebomb = 3,
/obj/item/weapon/pen/reagent/paralysis,
/obj/item/weapon/grenade/chem_grenade/incendiary
)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Special Ops crate"
hidden = 1
/datum/supply_packs/security/bolt_rifles_mosin
name = "Surplus militia rifles"
contains = list(
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin = 3,
/obj/item/ammo_magazine/clip/a762 = 6
)
cost = 50
hidden = 1
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Weapons crate"

View File

@@ -0,0 +1,303 @@
/*
* Here is where any supply packs
* related to engineering tasks live.
*/
/datum/supply_packs/eng
group = "Engineering"
/datum/supply_packs/eng/lightbulbs
name = "Replacement lights"
contains = list(/obj/item/weapon/storage/box/lights/mixed = 3)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Replacement lights"
/datum/supply_packs/eng/metal50
name = "50 metal sheets"
contains = list(/obj/item/stack/material/steel)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
containername = "Metal sheets crate"
/datum/supply_packs/eng/glass50
name = "50 glass sheets"
contains = list(/obj/item/stack/material/glass)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
containername = "Glass sheets crate"
/datum/supply_packs/eng/wood50
name = "50 wooden planks"
contains = list(/obj/item/stack/material/wood)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
containername = "Wooden planks crate"
/datum/supply_packs/eng/plastic50
name = "50 plastic sheets"
contains = list(/obj/item/stack/material/plastic)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
containername = "Plastic sheets crate"
/datum/supply_packs/eng/smescoil
name = "Superconducting Magnetic Coil"
contains = list(/obj/item/weapon/smes_coil)
cost = 75
containertype = /obj/structure/closet/crate
containername = "Superconducting Magnetic Coil crate"
/datum/supply_packs/eng/electrical
name = "Electrical maintenance crate"
contains = list(
/obj/item/weapon/storage/toolbox/electrical = 2,
/obj/item/clothing/gloves/yellow = 2,
/obj/item/weapon/cell = 2,
/obj/item/weapon/cell/high = 2
)
cost = 15
containertype = /obj/structure/closet/crate
containername = "Electrical maintenance crate"
/datum/supply_packs/eng/mechanical
name = "Mechanical maintenance crate"
contains = list(
/obj/item/weapon/storage/belt/utility/full = 3,
/obj/item/clothing/suit/storage/hazardvest = 3,
/obj/item/clothing/head/welding = 2,
/obj/item/clothing/head/hardhat
)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Mechanical maintenance crate"
/datum/supply_packs/eng/fueltank
name = "Fuel tank crate"
contains = list(/obj/structure/reagent_dispensers/fueltank)
cost = 8
containertype = /obj/structure/largecrate
containername = "fuel tank crate"
/datum/supply_packs/eng/solar
name = "Solar Pack crate"
contains = list(
/obj/item/solar_assembly = 21,
/obj/item/weapon/circuitboard/solar_control,
/obj/item/weapon/tracker_electronics,
/obj/item/weapon/paper/solar
)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Solar pack crate"
/datum/supply_packs/eng/engine
name = "Emitter crate"
contains = list(/obj/machinery/power/emitter = 2)
cost = 10
containertype = /obj/structure/closet/crate/secure
containername = "Emitter crate"
access = access_ce
/datum/supply_packs/engine/eng/field_gen
name = "Field Generator crate"
contains = list(/obj/machinery/field_generator = 2)
containertype = /obj/structure/closet/crate/secure
containername = "Field Generator crate"
access = access_ce
/datum/supply_packs/eng/engine/sing_gen
name = "Singularity Generator crate"
contains = list(/obj/machinery/the_singularitygen)
containertype = /obj/structure/closet/crate/secure
containername = "Singularity Generator crate"
access = access_ce
/datum/supply_packs/eng/engine/collector
name = "Collector crate"
contains = list(/obj/machinery/power/rad_collector = 3)
containername = "Collector crate"
/datum/supply_packs/eng/engine/PA
name = "Particle Accelerator crate"
cost = 40
contains = list(
/obj/structure/particle_accelerator/fuel_chamber,
/obj/machinery/particle_accelerator/control_box,
/obj/structure/particle_accelerator/particle_emitter/center,
/obj/structure/particle_accelerator/particle_emitter/left,
/obj/structure/particle_accelerator/particle_emitter/right,
/obj/structure/particle_accelerator/power_box,
/obj/structure/particle_accelerator/end_cap
)
containertype = /obj/structure/closet/crate/secure
containername = "Particle Accelerator crate"
access = access_ce
/datum/supply_packs/eng/robotics
name = "Robotics assembly crate"
contains = list(
/obj/item/device/assembly/prox_sensor = 3,
/obj/item/weapon/storage/toolbox/electrical,
/obj/item/device/flash = 4,
/obj/item/weapon/cell/high = 2
)
cost = 10
containertype = /obj/structure/closet/crate/secure/gear
containername = "Robotics assembly"
access = access_robotics
/datum/supply_packs/eng/robolimbs_basic
name = "Basic robolimb blueprints"
contains = list(
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/xion
)
cost = 15
containertype = /obj/structure/closet/crate/secure/gear
containername = "Robolimb blueprints (basic)"
access = access_robotics
/datum/supply_packs/eng/robolimbs_adv
name = "All robolimb blueprints"
contains = list(
/obj/item/weapon/disk/limb/bishop,
/obj/item/weapon/disk/limb/hesphiastos,
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/veymed,
/obj/item/weapon/disk/limb/wardtakahashi,
/obj/item/weapon/disk/limb/xion,
/obj/item/weapon/disk/limb/zenghu,
)
cost = 40
containertype = /obj/structure/closet/crate/secure/gear
containername = "Robolimb blueprints (adv)"
access = access_robotics
/datum/supply_packs/eng/shield_gen
contains = list(/obj/item/weapon/circuitboard/shield_gen)
name = "Bubble shield generator circuitry"
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "bubble shield generator circuitry crate"
access = access_ce
/datum/supply_packs/eng/shield_gen_ex
contains = list(/obj/item/weapon/circuitboard/shield_gen_ex)
name = "Hull shield generator circuitry"
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "hull shield generator circuitry crate"
access = access_ce
/datum/supply_packs/eng/shield_cap
contains = list(/obj/item/weapon/circuitboard/shield_cap)
name = "Bubble shield capacitor circuitry"
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "shield capacitor circuitry crate"
access = access_ce
/datum/supply_packs/eng/smbig
name = "Supermatter Core"
contains = list(/obj/machinery/power/supermatter)
cost = 150
containertype = /obj/structure/closet/crate/secure/phoron
containername = "Supermatter crate (CAUTION)"
access = access_ce
/datum/supply_packs/eng/teg
contains = list(/obj/machinery/power/generator)
name = "Mark I Thermoelectric Generator"
cost = 75
containertype = /obj/structure/closet/crate/secure/large
containername = "Mk1 TEG crate"
access = access_engine
/datum/supply_packs/eng/circulator
contains = list(/obj/machinery/atmospherics/binary/circulator)
name = "Binary atmospheric circulator"
cost = 60
containertype = /obj/structure/closet/crate/secure/large
containername = "Atmospheric circulator crate"
access = access_engine
/datum/supply_packs/eng/air_dispenser
contains = list(/obj/machinery/pipedispenser/orderable)
name = "Pipe Dispenser"
cost = 35
containertype = /obj/structure/closet/crate/secure/large
containername = "Pipe Dispenser Crate"
access = access_atmospherics
/datum/supply_packs/eng/disposals_dispenser
contains = list(/obj/machinery/pipedispenser/disposal/orderable)
name = "Disposals Pipe Dispenser"
cost = 35
containertype = /obj/structure/closet/crate/secure/large
containername = "Disposal Dispenser Crate"
access = access_atmospherics
/datum/supply_packs/eng/radsuit
contains = list(
/obj/item/clothing/suit/radiation = 3,
/obj/item/clothing/head/radiation = 3
)
name = "Radiation suits package"
cost = 20
containertype = /obj/structure/closet/radiation
containername = "Radiation suit locker"
/datum/supply_packs/eng/pacman_parts
name = "P.A.C.M.A.N. portable generator parts"
cost = 45
containername = "P.A.C.M.A.N. Portable Generator Construction Kit"
containertype = /obj/structure/closet/crate/secure
access = access_tech_storage
contains = list(
/obj/item/weapon/stock_parts/micro_laser,
/obj/item/weapon/stock_parts/capacitor,
/obj/item/weapon/stock_parts/matter_bin,
/obj/item/weapon/circuitboard/pacman
)
/datum/supply_packs/eng/super_pacman_parts
name = "Super P.A.C.M.A.N. portable generator parts"
cost = 55
containername = "Super P.A.C.M.A.N. portable generator construction kit"
containertype = /obj/structure/closet/crate/secure
access = access_tech_storage
contains = list(
/obj/item/weapon/stock_parts/micro_laser,
/obj/item/weapon/stock_parts/capacitor,
/obj/item/weapon/stock_parts/matter_bin,
/obj/item/weapon/circuitboard/pacman/super
)
/datum/supply_packs/eng/painters
name = "Station Painting Supplies"
cost = 10
containername = "station painting supplies crate"
containertype = /obj/structure/closet/crate
contains = list(
/obj/item/device/pipe_painter = 2,
/obj/item/device/floor_painter = 2,
/obj/item/device/closet_painter = 2
)
/datum/supply_packs/eng/voidsuits
name = "Engineering voidsuits"
contains = list(
/obj/item/clothing/suit/space/void/engineering = 2,
/obj/item/clothing/head/helmet/space/void/engineering = 2,
/obj/item/clothing/mask/breath = 2,
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Engineering voidsuit crate"
access = access_engine_equip

View File

@@ -0,0 +1,72 @@
/*
* Here is where any supply packs related
* to being hospitable tasks live
*/
/datum/supply_packs/hospitality
group = "Hospitality"
/datum/supply_packs/hospitality/party
name = "Party equipment"
contains = list(
/obj/item/weapon/storage/box/mixedglasses = 2,
/obj/item/weapon/storage/box/glasses/square,
/obj/item/weapon/reagent_containers/food/drinks/shaker,
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,
/obj/item/weapon/lipstick/random,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 2,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 4,
)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Party equipment"
/datum/supply_packs/hospitality/barsupplies
name = "Bar supplies"
contains = list(
/obj/item/weapon/storage/box/glasses/cocktail,
/obj/item/weapon/storage/box/glasses/rocks,
/obj/item/weapon/storage/box/glasses/square,
/obj/item/weapon/storage/box/glasses/pint,
/obj/item/weapon/storage/box/glasses/wine,
/obj/item/weapon/storage/box/glasses/shake,
/obj/item/weapon/storage/box/glasses/shot,
/obj/item/weapon/storage/box/glasses/mug,
/obj/item/weapon/reagent_containers/food/drinks/shaker,
/obj/item/weapon/storage/box/glass_extras/straws,
/obj/item/weapon/storage/box/glass_extras/sticks
)
cost = 10
containertype = /obj/structure/closet/crate
containername = "crate of bar supplies"
/datum/supply_packs/hospitality/lasertag
name = "Lasertag equipment"
contains = list(
/obj/item/weapon/gun/energy/lasertag/red,
/obj/item/clothing/suit/redtag,
/obj/item/weapon/gun/energy/lasertag/blue,
/obj/item/clothing/suit/bluetag
)
containertype = /obj/structure/closet
containername = "Lasertag Closet"
cost = 20
/datum/supply_packs/randomised/hospitality/
group = "Hospitality"
/datum/supply_packs/randomised/hospitality/pizza
num_contained = 5
contains = list(
/obj/item/pizzabox/margherita,
/obj/item/pizzabox/mushroom,
/obj/item/pizzabox/meat,
/obj/item/pizzabox/vegetable
)
name = "Surprise pack of five pizzas"
cost = 15
containertype = /obj/structure/closet/crate/freezer
containername = "Pizza crate"

View File

@@ -0,0 +1,161 @@
/*
* Here is where any supply packs
* related to hydroponics tasks live.
*/
/datum/supply_packs/hydro
group = "Hydroponics"
/datum/supply_packs/hydro/monkey
name = "Monkey crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes)
cost = 20
containertype = /obj/structure/closet/crate/freezer
containername = "Monkey crate"
/datum/supply_packs/hydro/farwa
name = "Farwa crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes/farwacubes)
cost = 30
containertype = /obj/structure/closet/crate/freezer
containername = "Farwa crate"
/datum/supply_packs/hydro/neara
name = "Neaera crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes/neaeracubes)
cost = 30
containertype = /obj/structure/closet/crate/freezer
containername = "Neaera crate"
/datum/supply_packs/hydro/stok
name = "Stok crate"
contains = list (/obj/item/weapon/storage/box/monkeycubes/stokcubes)
cost = 30
containertype = /obj/structure/closet/crate/freezer
containername = "Stok crate"
/datum/supply_packs/hydro/lisa
name = "Corgi Crate"
contains = list()
cost = 50
containertype = /obj/structure/largecrate/animal/corgi
containername = "Corgi Crate"
/datum/supply_packs/hydro/hydroponics
name = "Hydroponics Supply Crate"
contains = list(
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 2,
/obj/item/weapon/material/hatchet,
/obj/item/weapon/material/minihoe,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/suit/apron,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/storage/box/botanydisk
)
cost = 15
containertype = /obj/structure/closet/crate/hydroponics
containername = "Hydroponics crate"
access = access_hydroponics
/datum/supply_packs/hydro/cow
name = "Cow crate"
cost = 30
containertype = /obj/structure/largecrate/animal/cow
containername = "Cow crate"
access = access_hydroponics
/datum/supply_packs/hydro/goat
name = "Goat crate"
cost = 25
containertype = /obj/structure/largecrate/animal/goat
containername = "Goat crate"
access = access_hydroponics
/datum/supply_packs/hydro/chicken
name = "Chicken crate"
cost = 20
containertype = /obj/structure/largecrate/animal/chick
containername = "Chicken crate"
access = access_hydroponics
/datum/supply_packs/hydro/seeds
name = "Seeds crate"
contains = list(
/obj/item/seeds/chiliseed,
/obj/item/seeds/berryseed,
/obj/item/seeds/cornseed,
/obj/item/seeds/eggplantseed,
/obj/item/seeds/tomatoseed,
/obj/item/seeds/appleseed,
/obj/item/seeds/soyaseed,
/obj/item/seeds/wheatseed,
/obj/item/seeds/carrotseed,
/obj/item/seeds/harebell,
/obj/item/seeds/lemonseed,
/obj/item/seeds/orangeseed,
/obj/item/seeds/grassseed,
/obj/item/seeds/sunflowerseed,
/obj/item/seeds/chantermycelium,
/obj/item/seeds/potatoseed,
/obj/item/seeds/sugarcaneseed
)
cost = 10
containertype = /obj/structure/closet/crate/hydroponics
containername = "Seeds crate"
access = access_hydroponics
/datum/supply_packs/hydro/weedcontrol
name = "Weed control crate"
contains = list(
/obj/item/weapon/material/hatchet = 2,
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
/obj/item/clothing/mask/gas = 2,
/obj/item/weapon/grenade/chem_grenade/antiweed = 2
)
cost = 25
containertype = /obj/structure/closet/crate/hydroponics
containername = "Weed control crate"
access = access_hydroponics
/datum/supply_packs/hydro/exoticseeds
name = "Exotic seeds crate"
contains = list(
/obj/item/seeds/replicapod = 2,
/obj/item/seeds/libertymycelium,
/obj/item/seeds/reishimycelium,
/obj/item/seeds/random = 6,
/obj/item/seeds/kudzuseed
)
cost = 15
containertype = /obj/structure/closet/crate/hydroponics
containername = "Exotic Seeds crate"
access = access_hydroponics
/datum/supply_packs/hydro/watertank
name = "Water tank crate"
contains = list(/obj/structure/reagent_dispensers/watertank)
cost = 8
containertype = /obj/structure/largecrate
containername = "water tank crate"
/datum/supply_packs/hydro/bee_keeper
name = "Beekeeping crate"
contains = list(
/obj/item/beehive_assembly,
/obj/item/bee_smoker,
/obj/item/honey_frame = 5,
/obj/item/bee_pack
)
cost = 40
containertype = /obj/structure/closet/crate/hydroponics
containername = "Beekeeping crate"
access = access_hydroponics
/datum/supply_packs/hydro/tray
name = "Empty hydroponics tray"
cost = 30
containertype = /obj/structure/closet/crate/hydroponics
containername = "Hydroponics tray crate"
contains = list(/obj/machinery/portable_atmospherics/hydroponics{anchored = 0})
access = access_hydroponics

View File

@@ -0,0 +1,313 @@
/*
* Here is where any supply packs
* related to medical tasks live.
*/
/datum/supply_packs/med
group = "Medical"
/datum/supply_packs/med/medical
name = "Medical crate"
contains = list(
/obj/item/weapon/storage/firstaid/regular,
/obj/item/weapon/storage/firstaid/fire,
/obj/item/weapon/storage/firstaid/toxin,
/obj/item/weapon/storage/firstaid/o2,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin,
/obj/item/weapon/storage/box/syringes,
/obj/item/weapon/storage/box/autoinjectors
)
cost = 10
containertype = /obj/structure/closet/crate/medical
containername = "Medical crate"
/datum/supply_packs/med/bloodpack
name = "BloodPack crate"
contains = list(/obj/item/weapon/storage/box/bloodpacks = 3)
cost = 10
containertype = /obj/structure/closet/crate/medical
containername = "BloodPack crate"
/datum/supply_packs/med/bodybag
name = "Body bag crate"
contains = list(/obj/item/weapon/storage/box/bodybags = 3)
cost = 10
containertype = /obj/structure/closet/crate/medical
containername = "Body bag crate"
/datum/supply_packs/med/cryobag
name = "Stasis bag crate"
contains = list(/obj/item/bodybag/cryobag = 3)
cost = 50
containertype = /obj/structure/closet/crate/medical
containername = "Stasis bag crate"
/datum/supply_packs/med/surgery
name = "Surgery crate"
contains = list(
/obj/item/weapon/cautery,
/obj/item/weapon/surgicaldrill,
/obj/item/clothing/mask/breath/medical,
/obj/item/weapon/tank/anesthetic,
/obj/item/weapon/FixOVein,
/obj/item/weapon/hemostat,
/obj/item/weapon/scalpel,
/obj/item/weapon/bonegel,
/obj/item/weapon/retractor,
/obj/item/weapon/bonesetter,
/obj/item/weapon/circular_saw
)
cost = 25
containertype = "/obj/structure/closet/crate/secure"
containername = "Surgery crate"
access = access_medical
/datum/supply_packs/med/sterile
name = "Sterile equipment crate"
contains = list(
/obj/item/clothing/under/rank/medical/green = 2,
/obj/item/clothing/head/surgery/green = 2,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves,
/obj/item/weapon/storage/belt/medical = 3
)
cost = 15
containertype = "/obj/structure/closet/crate"
containername = "Sterile equipment crate"
/datum/supply_packs/med/voidsuits
name = "Medical voidsuits"
contains = list(
/obj/item/clothing/suit/space/void/medical = 2,
/obj/item/clothing/head/helmet/space/void/medical = 2,
/obj/item/clothing/mask/breath = 2,
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical voidsuit crate"
access = access_medical_equip
/datum/supply_packs/med/extragear
name = "Medical surplus equipment"
contains = list(
/obj/item/weapon/storage/belt/medical = 3,
/obj/item/clothing/glasses/hud/health = 3,
/obj/item/device/radio/headset/headset_med/alt = 3,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical = 3
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical surplus equipment"
access = access_medical
/datum/supply_packs/med/cmogear
name = "Chief medical officer equipment"
contains = list(
/obj/item/weapon/storage/belt/medical,
/obj/item/device/radio/headset/heads/cmo,
/obj/item/clothing/under/rank/chief_medical_officer,
/obj/item/weapon/reagent_containers/hypospray,
/obj/item/clothing/accessory/stethoscope,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/suit/storage/toggle/labcoat/cmo,
/obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/shoes/white,
/obj/item/weapon/cartridge/cmo,
/obj/item/clothing/gloves/latex,
/obj/item/device/healthanalyzer,
/obj/item/device/flashlight/pen,
/obj/item/weapon/reagent_containers/syringe
)
cost = 60
containertype = "/obj/structure/closet/crate/secure"
containername = "Chief medical officer equipment"
access = access_cmo
/datum/supply_packs/med/doctorgear
name = "Medical Doctor equipment"
contains = list(
/obj/item/weapon/storage/belt/medical,
/obj/item/device/radio/headset/headset_med,
/obj/item/clothing/under/rank/medical,
/obj/item/clothing/accessory/stethoscope,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/mask/surgical,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/clothing/shoes/white,
/obj/item/weapon/cartridge/medical,
/obj/item/clothing/gloves/latex,
/obj/item/device/healthanalyzer,
/obj/item/device/flashlight/pen,
/obj/item/weapon/reagent_containers/syringe
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical Doctor equipment"
access = access_medical_equip
/datum/supply_packs/med/chemistgear
name = "Chemist equipment"
contains = list(
/obj/item/weapon/storage/box/beakers,
/obj/item/device/radio/headset/headset_med,
/obj/item/weapon/storage/box/autoinjectors,
/obj/item/clothing/under/rank/chemist,
/obj/item/clothing/glasses/science,
/obj/item/clothing/suit/storage/toggle/labcoat/chemist,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/shoes/white,
/obj/item/weapon/cartridge/chemistry,
/obj/item/clothing/gloves/latex,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/device/healthanalyzer,
/obj/item/weapon/storage/box/pillbottles,
/obj/item/weapon/reagent_containers/syringe
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Chemist equipment"
access = access_chemistry
/datum/supply_packs/med/paramedicgear
name = "Paramedic equipment"
contains = list(
/obj/item/weapon/storage/belt/medical/emt,
/obj/item/device/radio/headset/headset_med,
/obj/item/clothing/under/rank/medical/black,
/obj/item/clothing/accessory/armband/medgreen,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/suit/storage/toggle/labcoat/emt,
/obj/item/clothing/under/rank/medical/paramedic,
/obj/item/clothing/suit/storage/toggle/fr_jacket,
/obj/item/clothing/mask/gas,
/obj/item/clothing/under/rank/medical/paramedic,
/obj/item/clothing/accessory/stethoscope,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/gloves/latex,
/obj/item/device/healthanalyzer,
/obj/item/weapon/cartridge/medical,
/obj/item/device/flashlight/pen,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/clothing/accessory/storage/white_vest
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Paramedic equipment"
access = access_medical_equip
/datum/supply_packs/med/psychiatristgear
name = "Psychiatrist equipment"
contains = list(
/obj/item/clothing/under/rank/psych,
/obj/item/device/radio/headset/headset_med,
/obj/item/clothing/under/rank/psych/turtleneck,
/obj/item/clothing/shoes/laceup,
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/shoes/white,
/obj/item/weapon/clipboard,
/obj/item/weapon/folder/white,
/obj/item/weapon/pen,
/obj/item/weapon/cartridge/medical
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Psychiatrist equipment"
access = access_psychiatrist
/datum/supply_packs/med/medicalscrubs
name = "Medical scrubs"
contains = list(
/obj/item/clothing/shoes/white = 3,,
/obj/item/clothing/under/rank/medical/blue = 3,
/obj/item/clothing/under/rank/medical/green = 3,
/obj/item/clothing/under/rank/medical/purple = 3,
/obj/item/clothing/under/rank/medical/black = 3,
/obj/item/clothing/head/surgery = 3,
/obj/item/clothing/head/surgery/purple = 3,
/obj/item/clothing/head/surgery/blue = 3,
/obj/item/clothing/head/surgery/green = 3,
/obj/item/clothing/head/surgery/black = 3,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical scrubs crate"
access = access_medical_equip
/datum/supply_packs/med/autopsy
name = "Autopsy equipment"
contains = list(
/obj/item/weapon/folder/white,
/obj/item/device/camera,
/obj/item/device/camera_film = 2,
/obj/item/weapon/autopsy_scanner,
/obj/item/weapon/scalpel,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves,
/obj/item/weapon/pen
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Autopsy equipment crate"
access = access_morgue
/datum/supply_packs/med/medicaluniforms
name = "Medical uniforms"
contains = list(
/obj/item/clothing/shoes/white = 3,
/obj/item/clothing/under/rank/chief_medical_officer,
/obj/item/clothing/under/rank/geneticist,
/obj/item/clothing/under/rank/virologist,
/obj/item/clothing/under/rank/nursesuit,
/obj/item/clothing/under/rank/nurse,
/obj/item/clothing/under/rank/orderly,
/obj/item/clothing/under/rank/medical = 3,
/obj/item/clothing/under/rank/medical/paramedic = 3,
/obj/item/clothing/suit/storage/toggle/labcoat = 3,
/obj/item/clothing/suit/storage/toggle/labcoat/cmo,
/obj/item/clothing/suit/storage/toggle/labcoat/emt,
/obj/item/clothing/suit/storage/toggle/labcoat/cmoalt,
/obj/item/clothing/suit/storage/toggle/labcoat/genetics,
/obj/item/clothing/suit/storage/toggle/labcoat/virologist,
/obj/item/clothing/suit/storage/toggle/labcoat/chemist,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical uniform crate"
access = access_medical_equip
/datum/supply_packs/med/medicalbiosuits
name = "Medical biohazard gear"
contains = list(
/obj/item/clothing/head/bio_hood = 3,
/obj/item/clothing/suit/bio_suit = 3,
/obj/item/clothing/head/bio_hood/virology = 2,
/obj/item/clothing/suit/bio_suit/cmo,
/obj/item/clothing/head/bio_hood/cmo,
/obj/item/clothing/mask/gas = 5,
/obj/item/weapon/tank/oxygen = 5,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/gloves
)
cost = 50
containertype = "/obj/structure/closet/crate/secure"
containername = "Medical biohazard equipment"
access = access_medical_equip
/datum/supply_packs/med/portablefreezers
name = "Portable freezers crate"
contains = list(/obj/item/weapon/storage/box/freezer = 7)
cost = 25
containertype = "/obj/structure/closet/crate/secure"
containername = "Portable freezers"
access = access_medical_equip

View File

@@ -0,0 +1,268 @@
/*
* Here is where any supply packs
* that don't belong elsewhere live.
*/
/datum/supply_packs/misc
group = "Miscellaneous"
/datum/supply_packs/randomised/misc
group = "Miscellaneous"
/datum/supply_packs/misc/wizard
name = "Wizard costume"
contains = list(
/obj/item/weapon/staff,
/obj/item/clothing/suit/wizrobe/fake,
/obj/item/clothing/shoes/sandal,
/obj/item/clothing/head/wizard/fake
)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Wizard costume crate"
/datum/supply_packs/misc/foam_weapons
name = "Foam Weapon Crate"
contains = list(
/obj/item/weapon/material/sword/foam = 2,
/obj/item/weapon/material/twohanded/baseballbat/foam = 2,
/obj/item/weapon/material/twohanded/spear/foam = 2,
/obj/item/weapon/material/twohanded/fireaxe/foam = 2
)
cost = 80
containertype = /obj/structure/closet/crate
containername = "foam weapon crate"
/datum/supply_packs/randomised/misc/hats
num_contained = 4
contains = list(
/obj/item/clothing/head/collectable/chef,
/obj/item/clothing/head/collectable/paper,
/obj/item/clothing/head/collectable/tophat,
/obj/item/clothing/head/collectable/captain,
/obj/item/clothing/head/collectable/beret,
/obj/item/clothing/head/collectable/welding,
/obj/item/clothing/head/collectable/flatcap,
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/head/collectable/kitty,
/obj/item/clothing/head/collectable/rabbitears,
/obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/collectable/hardhat,
/obj/item/clothing/head/collectable/HoS,
/obj/item/clothing/head/collectable/thunderdome,
/obj/item/clothing/head/collectable/swat,
/obj/item/clothing/head/collectable/slime,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/collectable/slime,
/obj/item/clothing/head/collectable/xenom,
/obj/item/clothing/head/collectable/petehat
)
name = "Collectable hat crate!"
cost = 200
containertype = /obj/structure/closet/crate
containername = "Collectable hats crate! Brought to you by Bass.inc!"
/datum/supply_packs/randomised/misc/costume
num_contained = 3
contains = list(
/obj/item/clothing/suit/pirate,
/obj/item/clothing/suit/judgerobe,
/obj/item/clothing/suit/wcoat,
/obj/item/clothing/suit/hastur,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/suit/nun,
/obj/item/clothing/suit/imperium_monk,
/obj/item/clothing/suit/ianshirt,
/obj/item/clothing/under/gimmick/rank/captain/suit,
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit,
/obj/item/clothing/under/lawyer/purpsuit,
/obj/item/clothing/under/rank/mailman,
/obj/item/clothing/under/dress/dress_saloon,
/obj/item/clothing/suit/suspenders,
/obj/item/clothing/suit/storage/toggle/labcoat/mad,
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit,
/obj/item/clothing/under/schoolgirl,
/obj/item/clothing/under/owl,
/obj/item/clothing/under/waiter,
/obj/item/clothing/under/gladiator,
/obj/item/clothing/under/soviet,
/obj/item/clothing/under/scratch,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/clothing/suit/chef,
/obj/item/clothing/suit/apron/overalls,
/obj/item/clothing/under/redcoat,
/obj/item/clothing/under/kilt
)
name = "Costumes crate"
cost = 10
containertype = /obj/structure/closet/crate
containername = "Actor Costumes"
/datum/supply_packs/misc/formal_wear
contains = list(
/obj/item/clothing/head/bowler,
/obj/item/clothing/head/that,
/obj/item/clothing/suit/storage/toggle/internalaffairs,
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket,
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket,
/obj/item/clothing/under/suit_jacket,
/obj/item/clothing/under/suit_jacket/female,
/obj/item/clothing/under/suit_jacket/really_black,
/obj/item/clothing/under/suit_jacket/red,
/obj/item/clothing/under/lawyer/bluesuit,
/obj/item/clothing/under/lawyer/purpsuit,
/obj/item/clothing/shoes/black = 2,
/obj/item/clothing/shoes/leather,
/obj/item/clothing/suit/wcoat
)
name = "Formalwear closet"
cost = 30
containertype = /obj/structure/closet
containername = "Formalwear for the best occasions."
/datum/supply_packs/randomised/misc/card_packs
num_contained = 5
contains = list(
/obj/item/weapon/pack/cardemon,
/obj/item/weapon/pack/spaceball,
/obj/item/weapon/deck/holder
)
name = "Trading Card Crate"
cost = 10
containertype = /obj/structure/closet/crate
containername = "cards crate"
/datum/supply_packs/misc/eftpos
contains = list(/obj/item/device/eftpos)
name = "EFTPOS scanner"
cost = 10
containertype = /obj/structure/closet/crate
containername = "EFTPOS crate"
/datum/supply_packs/misc/cardboard_sheets
contains = list(/obj/item/stack/material/cardboard)
name = "50 cardboard sheets"
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
containername = "Cardboard sheets crate"
/datum/supply_packs/misc/carpet
name = "Imported carpet"
containertype = /obj/structure/closet/crate
containername = "Imported carpet crate"
cost = 15
contains = list(
/obj/item/stack/tile/carpet,
/obj/item/stack/tile/carpet/blue
)
amount = 50
/datum/supply_packs/misc/linoleum
name = "Linoleum"
containertype = /obj/structure/closet/crate
containername = "Linoleum crate"
cost = 15
contains = list(/obj/item/stack/tile/linoleum)
amount = 50
/datum/supply_packs/misc/witch
name = "Witch costume"
containername = "Witch costume"
containertype = /obj/structure/closet
cost = 20
contains = list(
/obj/item/clothing/suit/wizrobe/marisa/fake,
/obj/item/clothing/shoes/sandal,
/obj/item/clothing/head/wizard/marisa/fake,
/obj/item/weapon/staff/broom
)
/datum/supply_packs/randomised/misc/costume_hats
name = "Costume hats"
containername = "Actor hats crate"
containertype = /obj/structure/closet
cost = 10
num_contained = 3
contains = list(
/obj/item/clothing/head/redcoat,
/obj/item/clothing/head/mailman,
/obj/item/clothing/head/plaguedoctorhat,
/obj/item/clothing/head/pirate,
/obj/item/clothing/head/hasturhood,
/obj/item/clothing/head/powdered_wig,
/obj/item/clothing/head/hairflower,
/obj/item/clothing/head/hairflower/yellow,
/obj/item/clothing/head/hairflower/blue,
/obj/item/clothing/head/hairflower/pink,
/obj/item/clothing/mask/gas/owl_mask,
/obj/item/clothing/mask/gas/monkeymask,
/obj/item/clothing/head/helmet/gladiator,
/obj/item/clothing/head/ushanka
)
/datum/supply_packs/randomised/misc/dresses
name = "Womens formal dress locker"
containername = "Pretty dress locker"
containertype = /obj/structure/closet
cost = 15
num_contained = 3
contains = list(
/obj/item/clothing/under/wedding/bride_orange,
/obj/item/clothing/under/wedding/bride_purple,
/obj/item/clothing/under/wedding/bride_blue,
/obj/item/clothing/under/wedding/bride_red,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/clothing/under/sundress,
/obj/item/clothing/under/dress/dress_green,
/obj/item/clothing/under/dress/dress_pink,
/obj/item/clothing/under/dress/dress_orange,
/obj/item/clothing/under/dress/dress_yellow,
/obj/item/clothing/under/dress/dress_saloon
)
/datum/supply_packs/randomised/misc/exosuit_mod
num_contained = 1
contains = list(
/obj/item/device/kit/paint/ripley,
/obj/item/device/kit/paint/ripley/death,
/obj/item/device/kit/paint/ripley/flames_red,
/obj/item/device/kit/paint/ripley/flames_blue
)
name = "Random APLU modkit"
cost = 200
containertype = /obj/structure/closet/crate
containername = "heavy crate"
/datum/supply_packs/randomised/misc/exosuit_mod/durand
contains = list(
/obj/item/device/kit/paint/durand,
/obj/item/device/kit/paint/durand/seraph,
/obj/item/device/kit/paint/durand/phazon
)
name = "Random Durand exosuit modkit"
/datum/supply_packs/randomised/misc/exosuit_mod/gygax
contains = list(
/obj/item/device/kit/paint/gygax,
/obj/item/device/kit/paint/gygax/darkgygax,
/obj/item/device/kit/paint/gygax/recitence
)
name = "Random Gygax exosuit modkit"
/datum/supply_packs/misc/chaplaingear
name = "Chaplain equipment"
contains = list(
/obj/item/clothing/under/rank/chaplain,
/obj/item/clothing/shoes/black,
/obj/item/clothing/suit/nun,
/obj/item/clothing/head/nun_hood,
/obj/item/clothing/suit/chaplain_hoodie,
/obj/item/clothing/head/chaplain_hood,
/obj/item/clothing/suit/holidaypriest,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/weapon/storage/backpack/cultpack,
/obj/item/weapon/storage/fancy/candle_box = 3
)
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Chaplain equipment crate"

View File

@@ -0,0 +1,75 @@
/*
* Here is where any supply packs
* related to operations live.
*/
/datum/supply_packs/ops
group = "Operations"
/datum/supply_packs/ops/mule
name = "Mulebot Crate"
contains = list()
cost = 20
containertype = /obj/structure/largecrate/animal/mulebot
containername = "Mulebot Crate"
/datum/supply_packs/ops/cargotrain
name = "Cargo Train Tug"
contains = list(/obj/vehicle/train/cargo/engine)
cost = 45
containertype = /obj/structure/largecrate
containername = "Cargo Train Tug Crate"
/datum/supply_packs/ops/cargotrailer
name = "Cargo Train Trolley"
contains = list(/obj/vehicle/train/cargo/trolley)
cost = 15
containertype = /obj/structure/largecrate
containername = "Cargo Train Trolley Crate"
/datum/supply_packs/ops/hoverpod
name = "Hoverpod Shipment"
contains = list()
cost = 80
containertype = /obj/structure/largecrate/hoverpod
containername = "Hoverpod Crate"
/datum/supply_packs/ops/artscrafts
name = "Arts and Crafts supplies"
contains = list(
/obj/item/weapon/storage/fancy/crayons,
/obj/item/device/camera,
/obj/item/device/camera_film = 2,
/obj/item/weapon/storage/photo_album,
/obj/item/weapon/packageWrap,
/obj/item/weapon/reagent_containers/glass/paint/red,
/obj/item/weapon/reagent_containers/glass/paint/green,
/obj/item/weapon/reagent_containers/glass/paint/blue,
/obj/item/weapon/reagent_containers/glass/paint/yellow,
/obj/item/weapon/reagent_containers/glass/paint/purple,
/obj/item/weapon/reagent_containers/glass/paint/black,
/obj/item/weapon/reagent_containers/glass/paint/white,
/obj/item/weapon/contraband/poster,
/obj/item/weapon/wrapping_paper = 3
)
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Arts and Crafts crate"
/datum/supply_packs/randomised/ops
group = "Operations"
/datum/supply_packs/randomised/ops/webbing
name = "Webbing crate"
num_contained = 4
contains = list(
/obj/item/clothing/accessory/storage/black_vest,
/obj/item/clothing/accessory/storage/brown_vest,
/obj/item/clothing/accessory/storage/white_vest,
/obj/item/clothing/accessory/storage/black_drop_pouches,
/obj/item/clothing/accessory/storage/brown_drop_pouches,
/obj/item/clothing/accessory/storage/white_drop_pouches,
/obj/item/clothing/accessory/storage/webbing
)
cost = 15
containertype = "/obj/structure/closet/crate"
containername = "Webbing crate"

View File

@@ -0,0 +1,57 @@
/*
* Here is where any supply packs
* related to security tasks live
*/
/datum/supply_packs/sci
group = "Science"
/datum/supply_packs/sci/virus
name = "Virus sample crate"
contains = list(/obj/item/weapon/virusdish/random = 4)
cost = 25
containertype = "/obj/structure/closet/crate/secure"
containername = "Virus sample crate"
access = access_cmo
/datum/supply_packs/sci/coolanttank
name = "Coolant tank crate"
contains = list(/obj/structure/reagent_dispensers/coolanttank)
cost = 16
containertype = /obj/structure/largecrate
containername = "coolant tank crate"
/datum/supply_packs/sci/mecha_ripley
name = "Circuit Crate (\"Ripley\" APLU)"
contains = list(
/obj/item/weapon/book/manual/ripley_build_and_repair,
/obj/item/weapon/circuitboard/mecha/ripley/main,
/obj/item/weapon/circuitboard/mecha/ripley/peripherals
)
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "APLU \"Ripley\" Circuit Crate"
access = access_robotics
/datum/supply_packs/sci/mecha_odysseus
name = "Circuit Crate (\"Odysseus\")"
contains = list(
/obj/item/weapon/circuitboard/mecha/odysseus/peripherals,
/obj/item/weapon/circuitboard/mecha/odysseus/main
)
cost = 25
containertype = /obj/structure/closet/crate/secure
containername = "\"Odysseus\" Circuit Crate"
access = access_robotics
/datum/supply_packs/sci/phoron
name = "Phoron assembly crate"
contains = list(
/obj/item/weapon/tank/phoron = 3,
/obj/item/device/assembly/igniter = 3,
/obj/item/device/assembly/prox_sensor = 3,
/obj/item/device/assembly/timer = 3
)
cost = 10
containertype = /obj/structure/closet/crate/secure/phoron
containername = "Phoron assembly crate"
access = access_tox_storage

View File

@@ -0,0 +1,28 @@
/datum/supply_packs/sci/some_robolimbs
name = "Basic Robolimb Blueprints"
contains = list(
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/xion,
/obj/item/weapon/disk/limb/talon
)
cost = 15
containertype = /obj/structure/closet/crate/secure
containername = "Basic Robolimb Blueprint Crate"
access = access_robotics
/datum/supply_packs/sci/all_robolimbs
name = "Advanced Robolimb Blueprints"
contains = list(
/obj/item/weapon/disk/limb/bishop,
/obj/item/weapon/disk/limb/hesphiastos,
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/veymed,
/obj/item/weapon/disk/limb/wardtakahashi,
/obj/item/weapon/disk/limb/xion,
/obj/item/weapon/disk/limb/zenghu,
/obj/item/weapon/disk/limb/talon
)
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "Advanced Robolimb Blueprint Crate"
access = access_robotics

View File

@@ -0,0 +1,526 @@
/*
* Here is where any supply packs
* related to security tasks live
*/
/datum/supply_packs/security
group = "Security"
access = access_security
/datum/supply_packs/security/beanbagammo
name = "Beanbag shells"
contains = list(/obj/item/weapon/storage/box/beanbags = 3)
cost = 30
containertype = /obj/structure/closet/crate
containername = "Beanbag shells"
access = null
/datum/supply_packs/security/weapons
name = "Weapons crate"
contains = list(
/obj/item/weapon/melee/baton = 2,
/obj/item/weapon/gun/energy/gun = 2,
/obj/item/weapon/gun/energy/taser = 2,
/obj/item/weapon/gun/projectile/colt/detective = 2,
/obj/item/weapon/storage/box/flashbangs = 2
)
cost = 40
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Weapons crate"
/datum/supply_packs/security/flareguns
name = "Flare guns crate"
contains = list(
/obj/item/weapon/gun/projectile/sec/flash,
/obj/item/ammo_magazine/c45m/flash,
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/flare,
/obj/item/weapon/storage/box/flashshells
)
cost = 25
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Flare gun crate"
/datum/supply_packs/security/eweapons
name = "Experimental weapons crate"
contains = list(
/obj/item/weapon/gun/energy/xray = 2,
/obj/item/weapon/shield/energy = 2)
cost = 125
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Experimental weapons crate"
access = access_armory
/datum/supply_packs/randomised/security
group = "Security"
access = access_security
/datum/supply_packs/randomised/security/armor
num_contained = 5
contains = list(
/obj/item/clothing/suit/storage/vest,
/obj/item/clothing/suit/storage/vest/officer,
/obj/item/clothing/suit/storage/vest/warden,
/obj/item/clothing/suit/storage/vest/hos,
/obj/item/clothing/suit/storage/vest/pcrc,
/obj/item/clothing/suit/storage/vest/detective,
/obj/item/clothing/suit/storage/vest/heavy,
/obj/item/clothing/suit/storage/vest/heavy/officer,
/obj/item/clothing/suit/storage/vest/heavy/warden,
/obj/item/clothing/suit/storage/vest/heavy/hos,
/obj/item/clothing/suit/storage/vest/heavy/pcrc
)
name = "Armor crate"
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "Armor crate"
/datum/supply_packs/security/riot_gear
name = "Riot gear crate"
contains = list(
/obj/item/weapon/melee/baton = 3,
/obj/item/weapon/shield/riot = 3,
/obj/item/weapon/handcuffs = 3,
/obj/item/weapon/storage/box/flashbangs,
/obj/item/weapon/storage/box/beanbags,
/obj/item/weapon/storage/box/handcuffs
)
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "riot gear crate"
access = access_armory
/datum/supply_packs/security/riot_armor
name = "Riot armor set crate"
contains = list(
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/gloves/arm_guard/riot,
/obj/item/clothing/shoes/leg_guard/riot
)
cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "riot armor set crate"
access = access_armory
/datum/supply_packs/security/ablative_armor
name = "Ablative armor set crate"
contains = list(
/obj/item/clothing/head/helmet/laserproof,
/obj/item/clothing/suit/armor/laserproof,
/obj/item/clothing/gloves/arm_guard/laserproof,
/obj/item/clothing/shoes/leg_guard/laserproof
)
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "ablative armor set crate"
access = access_armory
/datum/supply_packs/security/bullet_resistant_armor
name = "Bullet resistant armor set crate"
contains = list(
/obj/item/clothing/head/helmet/bulletproof,
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/gloves/arm_guard/bulletproof,
/obj/item/clothing/shoes/leg_guard/bulletproof
)
cost = 35
containertype = /obj/structure/closet/crate/secure
containername = "bullet resistant armor set crate"
access = access_armory
/datum/supply_packs/security/combat_armor
name = "Combat armor set crate"
contains = list(
/obj/item/clothing/head/helmet/combat,
/obj/item/clothing/suit/armor/combat,
/obj/item/clothing/gloves/arm_guard/combat,
/obj/item/clothing/shoes/leg_guard/combat
)
cost = 40
containertype = /obj/structure/closet/crate/secure
containername = "combat armor set crate"
access = access_armory
/datum/supply_packs/security/tactical
name = "Tactical suits"
containertype = /obj/structure/closet/crate/secure
containername = "Tactical Suit Locker"
cost = 60
access = access_armory
contains = list(
/obj/item/clothing/under/tactical,
/obj/item/clothing/suit/armor/tactical,
/obj/item/clothing/head/helmet/tactical,
/obj/item/clothing/mask/balaclava/tactical,
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/weapon/storage/belt/security/tactical,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/gloves/black,
/obj/item/clothing/under/tactical,
/obj/item/clothing/suit/armor/tactical,
/obj/item/clothing/head/helmet/tactical,
/obj/item/clothing/mask/balaclava/tactical,
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/weapon/storage/belt/security/tactical,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/gloves/black
)
/datum/supply_packs/security/energyweapons
name = "Energy weapons crate"
contains = list(/obj/item/weapon/gun/energy/laser = 3)
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "energy weapons crate"
access = access_armory
/datum/supply_packs/security/shotgun
name = "Shotgun crate"
contains = list(
/obj/item/weapon/storage/box/shotgunammo,
/obj/item/weapon/storage/box/shotgunshells,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 2
)
cost = 65
containertype = /obj/structure/closet/crate/secure
containername = "Shotgun crate"
access = access_armory
/datum/supply_packs/security/erifle
name = "Energy marksman crate"
contains = list(/obj/item/weapon/gun/energy/sniperrifle = 2)
cost = 90
containertype = /obj/structure/closet/crate/secure
containername = "Energy marksman crate"
access = access_armory
/datum/supply_packs/security/shotgunammo
name = "Ballistic ammunition crate"
contains = list(
/obj/item/weapon/storage/box/shotgunammo = 2,
/obj/item/weapon/storage/box/shotgunshells = 2
)
cost = 60
containertype = /obj/structure/closet/crate/secure
containername = "ballistic ammunition crate"
access = access_armory
/datum/supply_packs/security/ionweapons
name = "Electromagnetic weapons crate"
contains = list(
/obj/item/weapon/gun/energy/ionrifle = 2,
/obj/item/weapon/storage/box/emps
)
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "electromagnetic weapons crate"
access = access_armory
/datum/supply_packs/randomised/security/automatic
name = "Automatic weapon crate"
num_contained = 2
contains = list(
/obj/item/weapon/gun/projectile/automatic/wt550,
/obj/item/weapon/gun/projectile/automatic/z8
)
cost = 90
containertype = /obj/structure/closet/crate/secure
containername = "Automatic weapon crate"
access = access_armory
/datum/supply_packs/randomised/security/autoammo
name = "Automatic weapon ammunition crate"
num_contained = 6
contains = list(
/obj/item/ammo_magazine/mc9mmt,
/obj/item/ammo_magazine/mc9mmt/rubber,
/obj/item/ammo_magazine/a556
)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "Automatic weapon ammunition crate"
access = access_armory
/datum/supply_packs/security/energy_guns
name = "energy guns crate"
contains = list(/obj/item/weapon/gun/energy/gun = 2)
cost = 50
containertype = /obj/structure/closet/crate/secure
containername = "energy guns crate"
access = access_armory
/datum/supply_packs/security/securitybarriers
name = "Security barrier crate"
contains = list(/obj/machinery/deployable/barrier = 4)
cost = 20
containertype = /obj/structure/closet/crate/secure/gear
containername = "Security barrier crate"
access = null
/datum/supply_packs/security/securityshieldgen
name = "Wall shield Generators"
contains = list(/obj/machinery/shieldwallgen = 4)
cost = 20
containertype = /obj/structure/closet/crate/secure
containername = "wall shield generators crate"
access = access_teleporter
/datum/supply_packs/security/voidsuits
name = "Security voidsuits"
contains = list(
/obj/item/clothing/suit/space/void/security = 2,
/obj/item/clothing/head/helmet/space/void/security = 2,
/obj/item/clothing/mask/breath = 2,
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 55
containertype = "/obj/structure/closet/crate/secure"
containername = "Security voidsuit crate"
/datum/supply_packs/randomised/security/holster
name = "Holster crate"
num_contained = 4
contains = list(
/obj/item/clothing/accessory/holster,
/obj/item/clothing/accessory/holster/armpit,
/obj/item/clothing/accessory/holster/waist,
/obj/item/clothing/accessory/holster/hip
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Holster crate"
/datum/supply_packs/security/extragear
name = "Security surplus equipment"
contains = list(
/obj/item/weapon/storage/belt/security = 3,
/obj/item/clothing/glasses/sunglasses/sechud = 3,
/obj/item/device/radio/headset/headset_sec/alt = 3,
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 3
)
cost = 25
containertype = "/obj/structure/closet/crate/secure"
containername = "Security surplus equipment"
access = null
/datum/supply_packs/security/detectivegear
name = "Forensic investigation equipment"
contains = list(
/obj/item/weapon/storage/box/evidence = 2,
/obj/item/clothing/suit/storage/vest/detective,
/obj/item/weapon/cartridge/detective,
/obj/item/device/radio/headset/headset_sec,
/obj/item/taperoll/police,
/obj/item/clothing/glasses/sunglasses,
/obj/item/device/camera,
/obj/item/weapon/folder/red,
/obj/item/weapon/folder/blue,
/obj/item/weapon/storage/belt/detective,
/obj/item/clothing/gloves/black,
/obj/item/device/taperecorder,
/obj/item/device/mass_spectrometer,
/obj/item/device/camera_film = 2,
/obj/item/weapon/storage/photo_album,
/obj/item/device/reagent_scanner,
/obj/item/device/flashlight/maglight,
/obj/item/weapon/storage/briefcase/crimekit
)
cost = 40
containertype = "/obj/structure/closet/crate/secure"
containername = "Forensic equipment"
access = access_forensics_lockers
/datum/supply_packs/security/detectiveclothes
name = "Investigation apparel"
contains = list(
/obj/item/clothing/under/det/black = 2,
/obj/item/clothing/under/det/grey = 2,
/obj/item/clothing/head/det/grey = 2,
/obj/item/clothing/under/det = 2,
/obj/item/clothing/head/det = 2,
/obj/item/clothing/suit/storage/det_trench,
/obj/item/clothing/suit/storage/det_trench/grey,
/obj/item/clothing/suit/storage/forensics/red,
/obj/item/clothing/suit/storage/forensics/blue,
/obj/item/clothing/under/det/corporate = 2,
/obj/item/clothing/accessory/badge/holo/detective = 2,
/obj/item/clothing/gloves/black = 2
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Investigation clothing"
access = access_forensics_lockers
/datum/supply_packs/security/officergear
name = "Officer equipment"
contains = list(
/obj/item/clothing/suit/storage/vest/officer,
/obj/item/clothing/head/helmet,
/obj/item/weapon/cartridge/security,
/obj/item/clothing/accessory/badge/holo,
/obj/item/clothing/accessory/badge/holo/cord,
/obj/item/device/radio/headset/headset_sec,
/obj/item/weapon/storage/belt/security,
/obj/item/device/flash,
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/grenade/flashbang,
/obj/item/weapon/melee/baton/loaded,
/obj/item/clothing/glasses/sunglasses/sechud,
/obj/item/taperoll/police,
/obj/item/clothing/gloves/black,
/obj/item/device/hailer,
/obj/item/device/flashlight/flare,
/obj/item/clothing/accessory/storage/black_vest,
/obj/item/clothing/head/soft/sec/corp,
/obj/item/clothing/under/rank/security/corp,
/obj/item/weapon/gun/energy/taser,
/obj/item/device/flashlight/maglight
)
cost = 30
containertype = "/obj/structure/closet/crate/secure"
containername = "Officer equipment"
access = access_brig
/datum/supply_packs/security/wardengear
name = "Warden equipment"
contains = list(
/obj/item/clothing/suit/storage/vest/warden,
/obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/warden/corp,
/obj/item/clothing/suit/armor/vest/warden,
/obj/item/clothing/suit/armor/vest/warden/alt,
/obj/item/clothing/head/helmet/warden,
/obj/item/weapon/cartridge/security,
/obj/item/device/radio/headset/headset_sec,
/obj/item/clothing/glasses/sunglasses/sechud,
/obj/item/taperoll/police,
/obj/item/device/hailer,
/obj/item/clothing/accessory/badge/holo/warden,
/obj/item/weapon/storage/box/flashbangs,
/obj/item/weapon/storage/belt/security,
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/melee/baton/loaded,
/obj/item/weapon/storage/box/holobadge,
/obj/item/clothing/head/beret/sec/corporate/warden,
/obj/item/device/flashlight/maglight
)
cost = 45
containertype = "/obj/structure/closet/crate/secure"
containername = "Warden equipment"
access = access_armory
/datum/supply_packs/security/headofsecgear
name = "Head of security equipment"
contains = list(
/obj/item/clothing/head/helmet/HoS,
/obj/item/clothing/suit/storage/vest/hos,
/obj/item/clothing/under/rank/head_of_security/corp,
/obj/item/clothing/suit/armor/hos,
/obj/item/clothing/head/helmet/HoS/dermal,
/obj/item/weapon/cartridge/hos,
/obj/item/device/radio/headset/heads/hos,
/obj/item/clothing/glasses/sunglasses/sechud,
/obj/item/weapon/storage/belt/security,
/obj/item/device/flash,
/obj/item/device/hailer,
/obj/item/clothing/accessory/badge/holo/hos,
/obj/item/clothing/accessory/holster/waist,
/obj/item/weapon/melee/telebaton,
/obj/item/weapon/shield/riot/tele,
/obj/item/clothing/head/beret/sec/corporate/hos,
/obj/item/device/flashlight/maglight
)
cost = 65
containertype = "/obj/structure/closet/crate/secure"
containername = "Head of security equipment"
access = access_hos
/datum/supply_packs/security/securityclothing
name = "Security uniform crate"
contains = list(
/obj/item/weapon/storage/backpack/satchel/sec = 2,
/obj/item/weapon/storage/backpack/security = 2,
/obj/item/clothing/accessory/armband = 4,
/obj/item/clothing/under/rank/security = 4,
/obj/item/clothing/under/rank/security2 = 4,
/obj/item/clothing/under/rank/warden,
/obj/item/clothing/under/rank/head_of_security,
/obj/item/clothing/suit/armor/hos/jensen,
/obj/item/clothing/head/soft/sec = 4,
/obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Security uniform crate"
/datum/supply_packs/security/navybluesecurityclothing
name = "Navy blue security uniform crate"
contains = list(
/obj/item/weapon/storage/backpack/satchel/sec = 2,
/obj/item/weapon/storage/backpack/security = 2,
/obj/item/clothing/under/rank/security/navyblue = 4,
/obj/item/clothing/suit/security/navyofficer = 4,
/obj/item/clothing/under/rank/warden/navyblue,
/obj/item/clothing/suit/security/navywarden,
/obj/item/clothing/under/rank/head_of_security/navyblue,
/obj/item/clothing/suit/security/navyhos,
/obj/item/clothing/head/beret/sec/navy/officer = 4,
/obj/item/clothing/head/beret/sec/navy/warden,
/obj/item/clothing/head/beret/sec/navy/hos,
/obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Navy blue security uniform crate"
/datum/supply_packs/security/corporatesecurityclothing
name = "Corporate security uniform crate"
contains = list(
/obj/item/weapon/storage/backpack/satchel/sec = 2,
/obj/item/weapon/storage/backpack/security = 2,
/obj/item/clothing/under/rank/security/corp = 4,
/obj/item/clothing/head/soft/sec/corp = 4,
/obj/item/clothing/under/rank/warden/corp,
/obj/item/clothing/under/rank/head_of_security/corp,
/obj/item/clothing/head/beret/sec = 4,
/obj/item/clothing/head/beret/sec/corporate/warden,
/obj/item/clothing/head/beret/sec/corporate/hos,
/obj/item/clothing/under/det/corporate = 2,
/obj/item/clothing/gloves/black = 4,
/obj/item/weapon/storage/box/holobadge
)
cost = 20
containertype = "/obj/structure/closet/crate/secure"
containername = "Corporate security uniform crate"
/datum/supply_packs/security/biosuit
name = "Security biohazard gear"
contains = list(
/obj/item/clothing/head/bio_hood/security,
/obj/item/clothing/under/rank/security,
/obj/item/clothing/suit/bio_suit/security,
/obj/item/clothing/shoes/white,
/obj/item/clothing/mask/gas,
/obj/item/weapon/tank/oxygen,
/obj/item/clothing/gloves/latex
)
cost = 35
containertype = "/obj/structure/closet/crate/secure"
containername = "Security biohazard gear"
/datum/supply_packs/security/bolt_rifles_competitive
name = "Competitive shooting crate"
contains = list(
/obj/item/device/assembly/timer,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice = 2,
/obj/item/ammo_magazine/clip/a762/practice = 4,
/obj/item/target = 2,
/obj/item/target/alien = 2,
/obj/item/target/syndicate = 2
)
cost = 40
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Weapons crate"

View File

@@ -0,0 +1,123 @@
/*
* Here is where any supply packs
* related to civilian tasks live
*/
/datum/supply_packs/supply
group = "Supply"
/datum/supply_packs/supply/food
name = "Kitchen supply crate"
contains = list(
/obj/item/weapon/reagent_containers/food/condiment/flour = 6,
/obj/item/weapon/reagent_containers/food/drinks/milk = 3,
/obj/item/weapon/reagent_containers/food/drinks/soymilk = 2,
/obj/item/weapon/storage/fancy/egg_box = 2,
/obj/item/weapon/reagent_containers/food/snacks/tofu = 4,
/obj/item/weapon/reagent_containers/food/snacks/meat = 4
)
cost = 10
containertype = /obj/structure/closet/crate/freezer
containername = "Food crate"
/datum/supply_packs/supply/toner
name = "Toner cartridges"
contains = list(/obj/item/device/toner = 6)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Toner cartridges"
/datum/supply_packs/supply/janitor
name = "Janitorial supplies"
contains = list(
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/item/weapon/mop,
/obj/item/clothing/under/rank/janitor,
/obj/item/weapon/cartridge/janitor,
/obj/item/clothing/gloves/black,
/obj/item/clothing/head/soft/purple,
/obj/item/weapon/storage/belt/janitor,
/obj/item/clothing/shoes/galoshes,
/obj/item/weapon/caution = 4,
/obj/item/weapon/storage/bag/trash,
/obj/item/device/lightreplacer,
/obj/item/weapon/reagent_containers/spray/cleaner,
/obj/item/weapon/reagent_containers/glass/rag,
/obj/item/weapon/grenade/chem_grenade/cleaner = 3,
/obj/structure/mopbucket
)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Janitorial supplies"
/datum/supply_packs/supply/boxes
name = "Empty boxes"
contains = list(/obj/item/weapon/storage/box = 10)
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Empty box crate"
/datum/supply_packs/supply/bureaucracy
contains = list(
/obj/item/weapon/clipboard = 2,
/obj/item/weapon/pen/red,
/obj/item/weapon/pen/blue,
/obj/item/weapon/pen/blue,
/obj/item/device/camera_film,
/obj/item/weapon/folder/blue,
/obj/item/weapon/folder/red,
/obj/item/weapon/folder/yellow,
/obj/item/weapon/hand_labeler,
/obj/item/weapon/tape_roll,
/obj/structure/filingcabinet/chestdrawer{anchored = 0},
/obj/item/weapon/paper_bin
)
name = "Office supplies"
cost = 15
containertype = /obj/structure/closet/crate
containername = "Office supplies crate"
/datum/supply_packs/supply/spare_pda
name = "Spare PDAs"
cost = 10
containertype = /obj/structure/closet/crate
containername = "Spare PDA crate"
contains = list(/obj/item/device/pda = 3)
/datum/supply_packs/supply/voidsuits
name = "Mining voidsuits"
contains = list(
/obj/item/clothing/suit/space/void/mining = 2,
/obj/item/clothing/head/helmet/space/void/mining = 2,
/obj/item/clothing/mask/breath = 2,
/obj/item/weapon/tank/oxygen = 2
)
cost = 35
containertype = "/obj/structure/closet/crate/secure"
containername = "Mining voidsuit crate"
access = access_mining
/datum/supply_packs/supply/minergear
name = "Shaft miner equipment"
contains = list(
/obj/item/weapon/storage/backpack/industrial,
/obj/item/weapon/storage/backpack/satchel/eng,
/obj/item/clothing/suit/storage/hooded/wintercoat/miner,
/obj/item/device/radio/headset/headset_cargo,
/obj/item/clothing/under/rank/miner,
/obj/item/clothing/gloves/black,
/obj/item/clothing/shoes/black,
/obj/item/device/analyzer,
/obj/item/weapon/storage/bag/ore,
/obj/item/device/flashlight/lantern,
/obj/item/weapon/shovel,
/obj/item/weapon/pickaxe,
/obj/item/weapon/mining_scanner,
/obj/item/clothing/glasses/material,
/obj/item/clothing/glasses/meson
)
cost = 15
containertype = "/obj/structure/closet/crate/secure"
containername = "Shaft miner equipment"
access = access_mining

View File

@@ -0,0 +1,37 @@
//SUPPLY PACKS
//NOTE: only secure crate types use the access var (and are lockable)
//NOTE: hidden packs only show up when the computer has been hacked.
//ANOTER NOTE: Contraband is obtainable through modified supplycomp circuitboards.
//BIG NOTE: Don't add living things to crates, that's bad, it will break the shuttle.
//NEW NOTE: Do NOT set the price of any crates below 7 points. Doing so allows infinite points.
var/list/all_supply_groups = list("Operations","Security","Hospitality","Engineering","Atmospherics","Medical","Reagents","Reagent Cartridges","Science","Hydroponics", "Supply", "Miscellaneous")
/datum/supply_packs
var/name = null
var/list/contains = list()
var/manifest = ""
var/amount = null
var/cost = null
var/containertype = null
var/containername = null
var/access = null
var/hidden = 0
var/contraband = 0
var/group = "Operations"
/datum/supply_packs/New()
manifest += "<ul>"
for(var/path in contains)
if(!path || !ispath(path, /atom))
continue
var/atom/O = path
manifest += "<li>[initial(O.name)]</li>"
manifest += "</ul>"
/datum/supply_packs/randomised
var/num_contained //number of items picked to be contained in a randomised crate
/datum/supply_packs/randomised/New()
manifest += "Contains any [num_contained] of:"
..()

View File

@@ -1,20 +0,0 @@
/datum/supply_packs/robolimbs_basic
name = "Basic robolimb blueprints"
contains = list(
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/xion,
/obj/item/weapon/disk/limb/talon
)
/datum/supply_packs/robolimbs_adv
name = "All robolimb blueprints"
contains = list(
/obj/item/weapon/disk/limb/bishop,
/obj/item/weapon/disk/limb/hesphiastos,
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/veymed,
/obj/item/weapon/disk/limb/wardtakahashi,
/obj/item/weapon/disk/limb/xion,
/obj/item/weapon/disk/limb/zenghu,
/obj/item/weapon/disk/limb/talon
)

View File

@@ -53,4 +53,8 @@
/datum/category_item/underwear/bottom/thong
name = "Thong"
icon_state = "thong"
has_color = TRUE
has_color = TRUE
/datum/category_item/underwear/bottom/fishnet_lower
name = "Fishnets"
icon_state = "fishnet_lower"

View File

@@ -40,4 +40,16 @@
/datum/category_item/underwear/top/halterneck_bra
name = "Halterneck bra"
icon_state = "halterneck_bra"
has_color = TRUE
has_color = TRUE
/datum/category_item/underwear/top/fishnet_base
name = "Fishnet top"
icon_state = "fishnet_body"
/datum/category_item/underwear/top/fishnet_sleeves
name = "Fishnet with sleeves"
icon_state = "fishnet_sleeves"
/datum/category_item/underwear/top/fishnet_gloves
name = "Fishnet with gloves"
icon_state = "fishnet_gloves"

View File

@@ -0,0 +1,58 @@
/*
* Datum that holds the instances and information about the items stored. Currently used in SmartFridges and Vending Machines.
*/
/datum/stored_item
var/item_name = "name" //Name of the item(s) displayed
var/item_path = null
var/amount = 0
var/list/instances //What items are actually stored
var/stored //The thing holding it is
/datum/stored_item/New(var/stored, var/path, var/name = null, var/amount = 0)
src.item_path = path
if(!name)
var/atom/tmp = path
src.item_name = initial(tmp.name)
else
src.item_name = name
src.amount = amount
src.stored = stored
..()
/datum/stored_item/Destroy()
stored = null
if(instances)
for(var/product in instances)
qdel(product)
instances.Cut()
. = ..()
/datum/stored_item/proc/get_amount()
return instances ? instances.len : amount
/datum/stored_item/proc/get_product(var/product_location)
if(!get_amount() || !product_location)
return
init_products()
var/atom/movable/product = instances[instances.len] // Remove the last added product
instances -= product
product.forceMove(product_location)
/datum/stored_item/proc/add_product(var/atom/movable/product)
if(product.type != item_path)
return 0
init_products()
product.forceMove(stored)
instances += product
/datum/stored_item/proc/init_products()
if(instances)
return
instances = list()
for(var/i = 1 to amount)
var/new_product = new item_path(stored)
instances += new_product

View File

@@ -0,0 +1,13 @@
/**
* Datum used to hold further information about a product in a vending machine
*/
/datum/stored_item/vending_product
var/price = 0 // Price to buy one
var/display_color = null // Display color for vending machine listing
var/category = CAT_NORMAL // CAT_HIDDEN for contraband, CAT_COIN for premium
/datum/stored_item/vending_product/New(var/stored, var/path, var/name = null, var/amount = 1, var/price = 0, var/color = null, var/category = CAT_NORMAL)
..(stored, path, name, amount)
src.price = price
src.display_color = color
src.category = category

View File

@@ -9,6 +9,7 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_bar)
alt_titles = list("Barista")
@@ -38,6 +39,7 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_kitchen)
alt_titles = list("Cook")
@@ -65,6 +67,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_hydroponics)
alt_titles = list("Hydroponicist")
@@ -98,6 +101,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/cargo/head
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
@@ -128,6 +132,7 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/cargo
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
@@ -153,6 +158,7 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/cargo
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
@@ -192,6 +198,7 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
alt_titles = list("Custodian")
@@ -218,6 +225,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library)
alt_titles = list("Journalist")
@@ -244,6 +252,7 @@
spawn_positions = 2
supervisors = "company officials and Corporate Regulations"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
economic_modifier = 7
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
minimal_access = list(access_lawyer, access_sec_doors, access_heads)

View File

@@ -9,6 +9,7 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
idtype = /obj/item/weapon/card/id/civilian
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_morgue, access_chapel_office, access_crematorium)
alt_titles = list("Counselor")

View File

@@ -9,7 +9,7 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#7F6E2C"
idtype = /obj/item/weapon/card/id/silver
idtype = /obj/item/weapon/card/id/engineering/head
req_admin_notify = 1
economic_modifier = 10
@@ -59,6 +59,7 @@
spawn_positions = 5
supervisors = "the chief engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
@@ -96,6 +97,7 @@
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#5B4D20"
idtype = /obj/item/weapon/card/id/engineering
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)

View File

@@ -9,7 +9,7 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#026865"
idtype = /obj/item/weapon/card/id/silver
idtype = /obj/item/weapon/card/id/medical/head
req_admin_notify = 1
economic_modifier = 10
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
@@ -48,6 +48,7 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical
economic_modifier = 7
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
@@ -109,6 +110,7 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical
economic_modifier = 5
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_chemistry)
@@ -170,6 +172,7 @@
economic_modifier = 5
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
alt_titles = list("Psychologist")
@@ -202,6 +205,7 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
idtype = /obj/item/weapon/card/id/medical
economic_modifier = 4
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks)

View File

@@ -9,7 +9,7 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#AD6BAD"
idtype = /obj/item/weapon/card/id/silver
idtype = /obj/item/weapon/card/id/science/head
req_admin_notify = 1
economic_modifier = 15
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
@@ -51,6 +51,7 @@
spawn_positions = 3
supervisors = "the research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
@@ -81,6 +82,7 @@
spawn_positions = 2
supervisors = "the research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
@@ -111,6 +113,7 @@
spawn_positions = 2
supervisors = "research director"
selection_color = "#633D63"
idtype = /obj/item/weapon/card/id/science
economic_modifier = 5
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.

View File

@@ -9,7 +9,7 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#8E2929"
idtype = /obj/item/weapon/card/id/silver
idtype = /obj/item/weapon/card/id/security/head
req_admin_notify = 1
economic_modifier = 10
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
@@ -56,6 +56,7 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
@@ -93,6 +94,7 @@
spawn_positions = 2
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security
alt_titles = list("Forensic Technician","Investigator")
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
@@ -135,6 +137,7 @@
spawn_positions = 4
supervisors = "the head of security"
selection_color = "#601C1C"
idtype = /obj/item/weapon/card/id/security
alt_titles = list("Junior Officer")
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)

View File

@@ -38,13 +38,33 @@
/datum/autolathe/recipe/drinkingglass
name = "drinking glass"
path = /obj/item/weapon/reagent_containers/food/drinks/drinkingglass
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/square
category = "General"
New()
..()
var/obj/O = path
name = initial(O.name) // generic recipes yay
/datum/autolathe/recipe/shotglass/
name = "shot glass"
path = /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass
category = "General"
/datum/autolathe/recipe/drinkingglass/rocks
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks
/datum/autolathe/recipe/drinkingglass/shake
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/shake
/datum/autolathe/recipe/drinkingglass/cocktail
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail
/datum/autolathe/recipe/drinkingglass/shot
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/shot
/datum/autolathe/recipe/drinkingglass/pint
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/pint
/datum/autolathe/recipe/drinkingglass/mug
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/mug
/datum/autolathe/recipe/drinkingglass/wine
path = /obj/item/weapon/reagent_containers/food/drinks/glass2/wine
/datum/autolathe/recipe/flashlight
name = "flashlight"

View File

@@ -35,10 +35,13 @@
var/affected_by_emp_until = 0
var/client_huds = list()
/obj/machinery/camera/New()
wires = new(src)
assembly = new(src)
assembly.state = 4
client_huds |= global_hud.whitense
/* // Use this to look for cameras that have the same c_tag.
for(var/obj/machinery/camera/C in cameranet.cameras)

View File

@@ -17,7 +17,8 @@ var/global/list/station_networks = list(
NETWORK_RESEARCH_OUTPOST,
NETWORK_ROBOTS,
NETWORK_PRISON,
NETWORK_SECURITY
NETWORK_SECURITY,
NETWORK_COMMUNICATORS
)
var/global/list/engineering_networks = list(
NETWORK_ENGINE,

View File

@@ -87,6 +87,7 @@
name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext
opacity = 0
/obj/machinery/door/airlock/glass
name = "Glass Airlock"

View File

@@ -1,63 +1,3 @@
/*
* Datum that holds the instances and information about the items in the smartfridge.
*/
/datum/data/stored_item
var/item_name = "name" //Name of the item(s) displayed
var/item_path = null
var/amount = 0
var/list/instances //What items are actually stored
var/fridge //The attatched fridge
/datum/data/stored_item/New(var/fridge, var/path, var/name = null, var/amount = 0)
..()
src.item_path = path
if(!name)
var/atom/tmp = path
src.item_name = initial(tmp.name)
else
src.item_name = name
src.amount = amount
src.fridge = fridge
/datum/data/stored_item/Destroy()
fridge = null
if(instances)
for(var/product in instances)
qdel(product)
instances.Cut()
. = ..()
/datum/data/stored_item/proc/get_amount()
return instances ? instances.len : amount
/datum/data/stored_item/proc/get_product(var/product_location)
if(!get_amount() || !product_location)
return
init_products()
var/atom/movable/product = instances[instances.len] // Remove the last added product
instances -= product
product.forceMove(product_location)
/datum/data/stored_item/proc/add_product(var/atom/movable/product)
if(product.type != item_path)
return 0
init_products()
product.forceMove(fridge)
instances += product
/datum/data/stored_item/proc/init_products()
if(instances)
return
instances = list()
for(var/i = 1 to amount)
var/new_product = new item_path(fridge)
instances += new_product
/* SmartFridge. Much todo
*/
/obj/machinery/smartfridge
@@ -76,7 +16,7 @@
var/icon_off = "smartfridge-off"
var/icon_panel = "smartfridge-panel"
var/list/item_records = list()
var/datum/data/stored_item/currently_vending = null //What we're putting out of the machine.
var/datum/stored_item/currently_vending = null //What we're putting out of the machine.
var/seconds_electrified = 0;
var/shoot_inventory = 0
var/locked = 0
@@ -96,6 +36,8 @@
/obj/machinery/smartfridge/Destroy()
qdel(wires)
for(var/A in item_records) //Get rid of item records.
qdel(A)
wires = null
return ..()
@@ -129,7 +71,7 @@
/obj/machinery/smartfridge/secure/extract/New()
..()
var/datum/data/stored_item/I = new(src, /obj/item/xenoproduct/slime/core)
var/datum/stored_item/I = new(src, /obj/item/xenoproduct/slime/core)
item_records.Add(I)
for(var/i=1 to 5)
var/obj/item/xenoproduct/slime/core/C = new(src)
@@ -220,23 +162,29 @@
icon_state = icon_off
else
icon_state = icon_on
if(contents.len)
var/hasItems
for(var/datum/stored_item/I in item_records)
if(I.get_amount())
hasItems = 1
break
if(hasItems)
overlays += "drying_rack_filled"
if(!not_working)
overlays += "drying_rack_drying"
/obj/machinery/smartfridge/drying_rack/proc/dry()
for(var/datum/data/stored_item/I in item_records)
for(var/datum/stored_item/I in item_records)
for(var/obj/item/weapon/reagent_containers/food/snacks/S in I.instances)
if(S.dry) continue
if(S.dried_type == S.type)
S.dry = 1
S.name = "dried [S.name]"
S.color = "#AAAAAA"
I.get_product(loc)
I.instances -= S
S.forceMove(get_turf(src))
else
var/D = S.dried_type
new D(loc)
new D(get_turf(src))
qdel(S)
return
return
@@ -286,46 +234,22 @@
if(accept_check(O))
user.remove_from_mob(O)
var/hasRecord = FALSE //Check to see if this passes or not.
for(var/datum/data/stored_item/I in item_records)
if(istype(O, I.item_path))
stock(O, I)
qdel(O)
return
if(!hasRecord)
var/datum/data/stored_item/item = new/datum/data/stored_item(src, O.type)
stock(O, item)
item_records.Add(item)
stock(O)
user.visible_message("<span class='notice'>[user] has added \the [O] to \the [src].</span>", "<span class='notice'>You add \the [O] to \the [src].</span>")
nanomanager.update_uis(src)
else if(istype(O, /obj/item/weapon/storage/bag))
var/obj/item/weapon/storage/bag/P = O
var/plants_loaded = 0
for(var/obj/G in P.contents)
if(accept_check(G))
plants_loaded++
var/hasRecord = FALSE //Check to see if this passes or not.
for(var/datum/data/stored_item/I in item_records)
if(istype(G, I.item_path))
if(G.name == I.item_name)
stock(G, I)
hasRecord = TRUE
if(!hasRecord)
var/datum/data/stored_item/item = new/datum/data/stored_item(src, G.type, G.name)
stock(G, item)
item_records.Add(item)
stock(G)
plants_loaded = 1
if(plants_loaded)
user.visible_message("<span class='notice'>[user] loads \the [src] with \the [P].</span>", "<span class='notice'>You load \the [src] with \the [P].</span>")
if(P.contents.len > 0)
user << "<span class='notice'>Some items are refused.</span>"
nanomanager.update_uis(src)
else
user << "<span class='notice'>\The [src] smartly refuses [O].</span>"
return 1
@@ -337,11 +261,20 @@
user << "You short out the product lock on [src]."
return 1
/obj/machinery/smartfridge/proc/stock(obj/item/O, var/datum/data/stored_item/I)
I.add_product(O)
/obj/machinery/smartfridge/proc/stock(obj/item/O)
var/hasRecord = FALSE //Check to see if this passes or not.
for(var/datum/stored_item/I in item_records)
if((O.type == I.item_path) && (O.name == I.item_name))
I.add_product(O)
hasRecord = TRUE
break
if(!hasRecord)
var/datum/stored_item/item = new/datum/stored_item(src, O.type, O.name)
item.add_product(O)
item_records.Add(item)
nanomanager.update_uis(src)
/obj/machinery/smartfridge/proc/vend(datum/data/stored_item/I)
/obj/machinery/smartfridge/proc/vend(datum/stored_item/I)
I.get_product(get_turf(src))
nanomanager.update_uis(src)
@@ -370,7 +303,7 @@
var/list/items[0]
for (var/i=1 to length(item_records))
var/datum/data/stored_item/I = item_records[i]
var/datum/stored_item/I = item_records[i]
var/count = I.get_amount()
if(count > 0)
items.Add(list(list("display_name" = html_encode(capitalize(I.item_name)), "vend" = i, "quantity" = count)))
@@ -400,7 +333,7 @@
if(href_list["vend"])
var/index = text2num(href_list["vend"])
var/amount = text2num(href_list["amount"])
var/datum/data/stored_item/I = item_records[index]
var/datum/stored_item/I = item_records[index]
var/count = I.get_amount()
// Sanity check, there are probably ways to press the button when it shouldn't be possible.
@@ -419,8 +352,8 @@
if(!target)
return 0
for(var/datum/data/stored_item/I in src.item_records)
throw_item = I.get_product(loc)
for(var/datum/stored_item/I in item_records)
throw_item = I.get_product(get_turf(src))
if (!throw_item)
continue
break

View File

@@ -1,69 +1,3 @@
/**
* Datum used to hold information about a product in a vending machine
*/
/datum/data/vending_product
var/product_name = "generic" // Display name for the product
var/product_path = null
var/amount = 0 // The original amount held in the vending machine
var/list/instances
var/price = 0 // Price to buy one
var/display_color = null // Display color for vending machine listing
var/category = CAT_NORMAL // CAT_HIDDEN for contraband, CAT_COIN for premium
var/vending_machine // The vending machine we belong to
/datum/data/vending_product/New(var/vending_machine, var/path, var/name = null, var/amount = 1, var/price = 0, var/color = null, var/category = CAT_NORMAL)
..()
src.product_path = path
if(!name)
var/atom/tmp = path
src.product_name = initial(tmp.name)
else
src.product_name = name
src.amount = amount
src.price = price
src.display_color = color
src.category = category
src.vending_machine = vending_machine
/datum/data/vending_product/Destroy()
vending_machine = null
if(instances)
for(var/product in instances)
qdel(product)
instances.Cut()
. = ..()
/datum/data/vending_product/proc/get_amount()
return instances ? instances.len : amount
/datum/data/vending_product/proc/add_product(var/atom/movable/product)
if(product.type != product_path)
return 0
init_products()
product.forceMove(vending_machine)
instances += product
/datum/data/vending_product/proc/get_product(var/product_location)
if(!get_amount() || !product_location)
return
init_products()
var/atom/movable/product = instances[instances.len] // Remove the last added product
instances -= product
product.forceMove(product_location)
return product
/datum/data/vending_product/proc/init_products()
if(instances)
return
instances = list()
for(var/i = 1 to amount)
var/new_product = new product_path(vending_machine)
instances += new_product
/**
* A vending machine
*/
@@ -89,7 +23,7 @@
var/vend_ready = 1 //Are we ready to vend?? Is it time??
var/vend_delay = 10 //How long does it take to vend?
var/categories = CAT_NORMAL // Bitmask of cats we're currently showing
var/datum/data/vending_product/currently_vending = null // What we're requesting payment for right now
var/datum/stored_item/vending_product/currently_vending = null // What we're requesting payment for right now
var/status_message = "" // Status screen messages like "insufficient funds", displayed in NanoUI
var/status_error = 0 // Set to 1 if status_message is an error
@@ -169,7 +103,7 @@
var/category = current_list[2]
for(var/entry in current_list[1])
var/datum/data/vending_product/product = new/datum/data/vending_product(src, entry)
var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
product.price = (entry in src.prices) ? src.prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
@@ -182,7 +116,7 @@
wires = null
qdel(coin)
coin = null
for(var/datum/data/vending_product/R in product_records)
for(var/datum/stored_item/vending_product/R in product_records)
qdel(R)
product_records = null
return ..()
@@ -276,10 +210,9 @@
return
else
for(var/datum/data/vending_product/R in product_records)
if(istype(W, R.product_path))
for(var/datum/stored_item/vending_product/R in product_records)
if(istype(W, R.item_path) && (W.name == R.item_name))
stock(W, R, user)
qdel(W)
return
..()
@@ -374,7 +307,7 @@
// create entry in the purchaser's account log
var/datum/transaction/T = new()
T.target_name = "[vendor_account.owner_name] (via [src.name])"
T.purpose = "Purchase of [currently_vending.product_name]"
T.purpose = "Purchase of [currently_vending.item_name]"
if(currently_vending.price > 0)
T.amount = "([currently_vending.price])"
else
@@ -400,7 +333,7 @@
var/datum/transaction/T = new()
T.target_name = target
T.purpose = "Purchase of [currently_vending.product_name]"
T.purpose = "Purchase of [currently_vending.item_name]"
T.amount = "[currently_vending.price]"
T.source_terminal = src.name
T.date = current_date_string
@@ -432,7 +365,7 @@
var/list/data = list()
if(currently_vending)
data["mode"] = 1
data["product"] = currently_vending.product_name
data["product"] = currently_vending.item_name
data["price"] = currently_vending.price
data["message_err"] = 0
data["message"] = src.status_message
@@ -442,14 +375,14 @@
var/list/listed_products = list()
for(var/key = 1 to src.product_records.len)
var/datum/data/vending_product/I = src.product_records[key]
var/datum/stored_item/vending_product/I = src.product_records[key]
if(!(I.category & src.categories))
continue
listed_products.Add(list(list(
"key" = key,
"name" = I.product_name,
"name" = I.item_name,
"price" = I.price,
"color" = I.display_color,
"amount" = I.get_amount())))
@@ -497,7 +430,7 @@
return
var/key = text2num(href_list["vend"])
var/datum/data/vending_product/R = product_records[key]
var/datum/stored_item/vending_product/R = product_records[key]
// This should not happen unless the request from NanoUI was bad
if(!(R.category & src.categories))
@@ -526,7 +459,7 @@
src.add_fingerprint(usr)
nanomanager.update_uis(src)
/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user)
/obj/machinery/vending/proc/vend(datum/stored_item/vending_product/R, mob/user)
if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH
usr << "<span class='warning'>Access denied.</span>" //Unless emagged of course
flick(src.icon_deny,src)
@@ -581,7 +514,7 @@
* Checks if item is vendable in this machine should be performed before
* calling. W is the item being inserted, R is the associated vending_product entry.
*/
/obj/machinery/vending/proc/stock(obj/item/weapon/W, var/datum/data/vending_product/R, var/mob/user)
/obj/machinery/vending/proc/stock(obj/item/weapon/W, var/datum/stored_item/vending_product/R, var/mob/user)
if(!user.unEquip(W))
return
@@ -635,7 +568,7 @@
//Oh no we're malfunctioning! Dump out some product and break.
/obj/machinery/vending/proc/malfunction()
for(var/datum/data/vending_product/R in src.product_records)
for(var/datum/stored_item/vending_product/R in src.product_records)
while(R.get_amount()>0)
R.get_product(loc)
break
@@ -651,7 +584,7 @@
if(!target)
return 0
for(var/datum/data/vending_product/R in src.product_records)
for(var/datum/stored_item/vending_product/R in src.product_records)
throw_item = R.get_product(loc)
if (!throw_item)
continue
@@ -697,37 +630,45 @@
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "boozeomat"
icon_deny = "boozeomat-deny"
products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 10,
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 5,
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 5,
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 15,
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 5,
/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 5,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass = 30,
/obj/item/weapon/reagent_containers/food/drinks/ice = 10,
/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/tea = 15)
/obj/item/weapon/reagent_containers/food/drinks/tea = 15,
/obj/item/weapon/glass_extra/stick = 30,
/obj/item/weapon/glass_extra/straw = 30)
contraband = list()
vend_delay = 15
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
@@ -790,6 +731,30 @@
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
/obj/machinery/vending/fitness
name = "SweatMAX"
desc = "Fueled by your inner inadequacy!"
icon_state = "fitness"
products = list(/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton = 8,
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 8,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 8,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 8,
/obj/item/weapon/reagent_containers/pill/diet = 8,
/obj/item/weapon/towel/random = 8)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton = 3,
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate = 3,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 20,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 5,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 5,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 5,
/obj/item/weapon/reagent_containers/pill/diet = 25,
/obj/item/weapon/towel/random = 40)
contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4)
//This one's from bay12
/obj/machinery/vending/cart
name = "PTech"
@@ -930,7 +895,7 @@
for(var/entry in current_list[1])
var/obj/item/seeds/S = new entry(src)
var/name = S.name
var/datum/data/vending_product/product = new/datum/data/vending_product(src, entry, name)
var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name)
product.price = (entry in src.prices) ? src.prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
@@ -959,7 +924,11 @@
/obj/item/weapon/material/kitchen/utensil/knife = 6,
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
/obj/item/weapon/material/knife = 3,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,
/obj/item/weapon/material/kitchen/rollingpin = 2,
/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 8,
/obj/item/weapon/glass_extra/stick = 15,
/obj/item/weapon/glass_extra/straw = 15,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/weapon/storage/toolbox/lunchbox = 3,
/obj/item/weapon/storage/toolbox/lunchbox/heart = 3,
@@ -971,16 +940,15 @@
/obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3)
contraband = list(/obj/item/weapon/material/kitchen/rollingpin = 2,
/obj/item/weapon/material/knife/butch = 2)
contraband = list(/obj/item/weapon/material/knife/butch = 2)
/obj/machinery/vending/sovietsoda
name = "BODA"
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/drinkingglass/soda = 30)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20)
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
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
/obj/machinery/vending/tool
@@ -1046,25 +1014,3 @@
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
/obj/machinery/vending/fitness
name = "SweatMAX"
desc = "Fueled by your inner inadequacy!"
icon_state = "fitness"
products = list(/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton = 8,
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate = 8,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask/proteinshake = 8,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask = 8,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 8,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 8,
/obj/item/weapon/reagent_containers/pill/diet = 8)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton = 3,
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate = 3,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask/proteinshake = 20,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask = 5,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 5,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 5,
/obj/item/weapon/reagent_containers/pill/diet = 25)
contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4)

View File

@@ -183,9 +183,9 @@
if(materials[S.material.name] + amnt <= res_max_amount)
if(S && S.amount >= 1)
var/count = 0
overlays += "pros-load-metal"
overlays += "fab-load-metal"
spawn(10)
overlays -= "pros-load-metal"
overlays -= "fab-load-metal"
while(materials[S.material.name] + amnt <= res_max_amount && S.amount >= 1)
materials[S.material.name] += amnt
S.use(1)

View File

@@ -17,6 +17,10 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
origin_tech = list(TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2, TECH_DATA = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
var/video_range = 4
var/obj/machinery/camera/communicator/video_source // Their camera
var/obj/machinery/camera/communicator/camera // Our camera
var/list/voice_mobs = list()
var/list/voice_requests = list()
var/list/voice_invites = list()
@@ -61,6 +65,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
all_communicators = sortAtom(all_communicators)
node = get_exonet_node()
processing_objects |= src
camera = new(src)
camera.name = "[src] #[rand(100,999)]"
camera.c_tag = camera.name
//This is a pretty terrible way of doing this.
spawn(5 SECONDS) //Wait for our mob to finish spawning.
if(ismob(loc))
@@ -72,6 +79,14 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
register_device(S.loc)
initialize_exonet(S.loc)
// Proc: examine()
// Parameters: user - the user doing the examining
// Description: Allows the user to click a link when examining to look at video if one is going.
/obj/item/device/communicator/examine(mob/user)
. = ..(user, 1)
if(. && video_source)
user << "<span class='notice'>It looks like it's on a video call: <a href='?src=\ref[src];watchvideo=1'>\[view\]</a></span>"
// Proc: initialize_exonet()
// Parameters: 1 (user - the person the communicator belongs to)
// Description: Sets up the exonet datum, gives the device an address, and then gets a node reference. Afterwards, populates the device
@@ -255,27 +270,27 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
//Now for ghosts who we pretend have communicators.
for(var/mob/observer/dead/O in known_devices)
if(O.client && O.client.prefs.communicator_visibility == 1 && O.exonet)
communicators[++communicators.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address)
communicators[++communicators.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address, "ref" = "\ref[O]")
//Lists all the other communicators that we invited.
for(var/obj/item/device/communicator/comm in voice_invites)
if(comm.exonet)
invites[++invites.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address)
invites[++invites.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address, "ref" = "\ref[comm]")
//Ghosts we invited.
for(var/mob/observer/dead/O in voice_invites)
if(O.exonet && O.client)
invites[++invites.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address)
invites[++invites.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address, "ref" = "\ref[O]")
//Communicators that want to talk to us.
for(var/obj/item/device/communicator/comm in voice_requests)
if(comm.exonet)
requests[++requests.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address)
requests[++requests.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address, "ref" = "\ref[comm]")
//Ghosts that want to talk to us.
for(var/mob/observer/dead/O in voice_requests)
if(O.exonet && O.client)
requests[++requests.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address)
requests[++requests.len] = list("name" = sanitize("[O.client.prefs.real_name]'s communicator"), "address" = O.exonet.address, "ref" = "\ref[O]")
//Now for all the voice mobs inside the communicator.
for(var/mob/living/voice/voice in contents)
@@ -283,12 +298,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
//Finally, all the communicators linked to this one.
for(var/obj/item/device/communicator/comm in communicating)
connected_communicators[++connected_communicators.len] = list("name" = sanitize(comm.name), "true_name" = sanitize(comm.name))
connected_communicators[++connected_communicators.len] = list("name" = sanitize(comm.name), "true_name" = sanitize(comm.name), "ref" = "\ref[comm]")
//Devices that have been messaged or recieved messages from.
for(var/obj/item/device/communicator/comm in im_contacts)
if(comm.exonet)
im_contacts_ui[++im_contacts_ui.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address)
im_contacts_ui[++im_contacts_ui.len] = list("name" = sanitize(comm.name), "address" = comm.exonet.address, "ref" = "\ref[comm]")
//Actual messages.
for(var/I in im_list)
@@ -311,6 +326,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
data["requestsReceived"] = requests
data["voice_mobs"] = voices
data["communicating"] = connected_communicators
data["video_comm"] = video_source ? "\ref[video_source.loc]" : null
data["imContacts"] = im_contacts_ui
data["imList"] = im_list_ui
data["time"] = worldtime2text()
@@ -323,7 +339,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 450, 700)
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -342,9 +358,20 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(new_name)
owner = new_name
name = "[owner]'s [initial(name)]"
if(camera)
camera.name = name
camera.c_tag = name
if(href_list["toggle_visibility"])
network_visibility = !network_visibility
switch(network_visibility)
if(1) //Visible, becoming invisbile
network_visibility = 0
if(camera)
camera.remove_network(NETWORK_COMMUNICATORS)
if(0) //Invisible, becoming visible
network_visibility = 1
if(camera)
camera.add_network(NETWORK_COMMUNICATORS)
if(href_list["toggle_ringer"])
ringer = !ringer
@@ -369,6 +396,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/their_address = href_list["dial"]
exonet.send_message(their_address, "voice")
if(href_list["decline"])
var/ref_to_remove = href_list["decline"]
var/atom/decline = locate(ref_to_remove)
if(decline)
del_request(decline)
if(href_list["message"])
if(!get_connection_to_tcomms())
usr << "<span class='danger'>Error: Cannot connect to Exonet node.</span>"
@@ -383,10 +416,24 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/name_to_disconnect = href_list["disconnect"]
for(var/mob/living/voice/V in contents)
if(name_to_disconnect == V.name)
close_connection(usr, V, "[usr] hung up.")
close_connection(usr, V, "[usr] hung up")
for(var/obj/item/device/communicator/comm in communicating)
if(name_to_disconnect == comm.name)
close_connection(usr, comm, "[usr] hung up.")
close_connection(usr, comm, "[usr] hung up")
if(href_list["startvideo"])
var/ref_to_video = href_list["startvideo"]
var/obj/item/device/communicator/comm = locate(ref_to_video)
if(comm)
connect_video(usr, comm)
if(href_list["endvideo"])
if(video_source)
end_video()
if(href_list["watchvideo"])
if(video_source)
watch_video(usr,video_source.loc)
if(href_list["copy"])
target_address = href_list["copy"]
@@ -396,9 +443,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(href_list["hang_up"])
for(var/mob/living/voice/V in contents)
close_connection(usr, V, "[usr] hung up.")
close_connection(usr, V, "[usr] hung up")
for(var/obj/item/device/communicator/comm in communicating)
close_connection(usr, comm, "[usr] hung up.")
close_connection(usr, comm, "[usr] hung up")
if(href_list["switch_tab"])
selected_tab = href_list["switch_tab"]
@@ -473,6 +520,28 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
owner = user.name
name = "[owner]'s [initial(name)]"
if(camera)
camera.name = name
camera.c_tag = name
// Proc: add_communicating()
// Parameters: 1 (comm - the communicator to add to communicating)
// Description: Used when this communicator gets a new communicator to relay say/me messages to
/obj/item/device/communicator/proc/add_communicating(obj/item/device/communicator/comm)
if(!comm || !istype(comm)) return
communicating |= comm
listening_objects |= src
update_icon()
// Proc: del_communicating()
// Parameters: 1 (comm - the communicator to remove from communicating)
// Description: Used when this communicator is being asked to stop relaying say/me messages to another
/obj/item/device/communicator/proc/del_communicating(obj/item/device/communicator/comm)
if(!comm || !istype(comm)) return
communicating.Remove(comm)
update_icon()
// Proc: open_connection()
// Parameters: 2 (user - the person who initiated the connecting being opened, candidate - the communicator or observer that will connect to the device)
@@ -507,8 +576,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
comm.visible_message("<span class='notice'>\icon[src] Connection to [src] at [exonet.address] established.</span>")
sleep(20)
communicating |= comm
comm.communicating |= src
src.add_communicating(comm)
comm.add_communicating(src)
// Proc: open_connection_to_ghost()
// Parameters: 2 (user - the person who initiated this, candidate - the ghost that will be turned into a voice mob)
@@ -530,6 +599,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
new_voice.mind = candidate.mind //Transfer the mind, if any.
new_voice.ckey = candidate.ckey //Finally, bring the client over.
voice_mobs.Add(new_voice)
listening_objects |= src
var/obj/screen/blackness = new() //Makes a black screen, so the candidate can't see what's going on before actually 'connecting' to the communicator.
blackness.screen_loc = ui_entire_screen
@@ -580,15 +650,22 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
visible_message("<span class='danger'>\icon[src] [reason].</span>")
voice_mobs.Remove(voice)
qdel(voice)
update_icon()
for(var/obj/item/device/communicator/comm in communicating) //Now we handle real communicators.
if(target && comm != target)
continue
src.del_communicating(comm)
comm.del_communicating(src)
comm.visible_message("<span class='danger'>\icon[src] [reason].</span>")
visible_message("<span class='danger'>\icon[src] [reason].</span>")
comm.communicating.Remove(src)
communicating.Remove(comm)
update_icon()
if(comm.camera && video_source == comm.camera) //We hung up on the person on video
end_video()
if(camera && comm.video_source == camera) //We hung up on them while they were watching us
comm.end_video()
if(voice_mobs.len == 0 && communicating.len == 0)
listening_objects.Remove(src)
// Proc: request()
// Parameters: 1 (candidate - the ghost or communicator wanting to call the device)
@@ -625,6 +702,29 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
if(L)
L << "<span class='notice'>\icon[src] Communications request from [who].</span>"
// Proc: del_request()
// Parameters: 1 (candidate - the ghost or communicator to be declined)
// Description: Declines a request and cleans up both ends
/obj/item/device/communicator/proc/del_request(var/atom/candidate)
if(!(candidate in voice_requests))
return
if(isobserver(candidate))
candidate << "<span class='warning'>Your communicator call request was declined.</span>"
else if(istype(candidate, /obj/item/device/communicator))
var/obj/item/device/communicator/comm = candidate
comm.voice_invites -= src
voice_requests -= candidate
//Search for holder of our device.
var/mob/living/us = null
if(loc && isliving(loc))
us = loc
if(us)
us << "<span class='notice'>\icon[src] Declined request.</span>"
// Proc: request_im()
// Parameters: 3 (candidate - the communicator wanting to message the device, origin_address - the address of the sender, text - the message)
// Description: Response to a communicator trying to message the device.
@@ -675,6 +775,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
voice_invites.Cut()
all_communicators -= src
processing_objects -= src
listening_objects.Remove(src)
qdel(camera)
camera = null
if(exonet)
exonet.remove_address()
exonet = null
@@ -684,7 +787,11 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// Parameters: None
// Description: Self explanatory
/obj/item/device/communicator/update_icon()
if(voice_mobs.len > 0)
if(video_source)
icon_state = "communicator-video"
return
if(voice_mobs.len || communicating.len)
icon_state = "communicator-active"
return
@@ -700,10 +807,18 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
/obj/item/device/communicator/see_emote(mob/living/M, text)
var/rendered = "\icon[src] <span class='message'>[text]</span>"
for(var/obj/item/device/communicator/comm in communicating)
for(var/mob/mob in viewers(get_turf(comm))) //We can't use visible_message(), or else we will get an infinite loop if two communicators hear each other.
mob.show_message(rendered)
for(var/mob/living/voice/V in comm.contents)
V.show_message(rendered)
var/turf/T = get_turf(comm)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0) //Range of 3 since it's a tiny video display
var/list/mobs_to_relay = in_range["mobs"]
for(var/mob/mob in mobs_to_relay) //We can't use visible_message(), or else we will get an infinite loop if two communicators hear each other.
var/dst = get_dist(get_turf(mob),get_turf(comm))
if(dst <= video_range)
mob.show_message(rendered)
else
mob << "You can barely see some movement on \the [src]'s display."
..()
// Proc: hear_talk()
@@ -712,9 +827,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
// Description: Relays the speech to all linked communicators.
/obj/item/device/communicator/hear_talk(mob/living/M, text, verb, datum/language/speaking)
for(var/obj/item/device/communicator/comm in communicating)
var/list/mobs_to_relay = list()
mobs_to_relay |= viewers(get_turf(comm))
mobs_to_relay |= comm.contents //Needed so ghost-callers can see speech.
var/turf/T = get_turf(comm)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/mobs_to_relay = in_range["mobs"]
for(var/mob/mob in mobs_to_relay)
//Can whoever is hearing us understand?
if(!mob.say_understands(M, speaking))
@@ -736,7 +854,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
/obj/item/device/communicator/show_message(msg, type, alt, alt_type)
var/rendered = "\icon[src] <span class='message'>[msg]</span>"
for(var/obj/item/device/communicator/comm in communicating)
for(var/mob/mob in hearers(get_turf(comm))) //Ditto for audible messages.
var/turf/T = get_turf(comm)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/mobs_to_relay = in_range["mobs"]
for(var/mob/mob in mobs_to_relay)
mob.show_message(rendered)
..()
@@ -792,7 +915,71 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
src << "A communications request has been sent to [chosen_communicator]. Now you need to wait until someone answers."
/obj/item/device/communicator/integrated //For synths who have no hands.
// Proc: connect_video()
// Parameters: user - the mob doing the viewing of video, comm - the communicator at the far end
// Description: Sets up a videocall and puts the first view into it using watch_video, and updates the icon
/obj/item/device/communicator/proc/connect_video(mob/user,obj/item/device/communicator/comm)
if((!user) || (!comm) || user.stat) return //KO or dead, or already in a video
if(video_source) //Already in a video
user << "<span class='danger'>You are already connected to a video call!</span>"
if(user.blinded) //User is blinded
user << "<span class='danger'>You cannot see well enough to do that!</span>"
if(!(src in comm.communicating) || !comm.camera) //You called someone with a broken communicator or one that's fake or yourself or something
user << "<span class='danger'>\icon[src]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.</span>"
user << "<span class='notice'>\icon[src] Attempting to start video over existing call.</span>"
sleep(30)
user << "<span class='notice'>\icon[src] Please wait...</span>"
video_source = comm.camera
comm.visible_message("<span class='danger'>\icon[src] New video connection from [comm].</span>")
watch_video(user)
update_icon()
// Proc: watch_video()
// Parameters: user - the mob doing the viewing of video
// Description: Moves a mob's eye to the far end for the duration of viewing the far end
/obj/item/device/communicator/proc/watch_video(mob/user)
if(!Adjacent(user) || !video_source) return
user.set_machine(video_source)
user.reset_view(video_source)
user << "<span class='notice'>Now viewing video session. To leave camera view: OOC -> Cancel Camera View</span>"
spawn(0)
while(user.machine == video_source && Adjacent(user))
var/turf/T = get_turf(video_source)
if(!T || !is_on_same_plane_or_station(T.z, user.z) || !video_source.can_use())
user << "<span class='warning'>The screen bursts into static, then goes black.</span>"
video_cleanup(user)
return
sleep(10)
video_cleanup(user)
// Proc: video_cleanup()
// Parameters: user - the mob who doesn't want to see video anymore
// Description: Cleans up mob's client when they stop watching a video
/obj/item/device/communicator/proc/video_cleanup(mob/user)
if(!user) return
user.reset_view(null)
user.unset_machine()
// Proc: end_video()
// Parameters: reason - the text reason to print for why it ended
// Description: Ends the video call by clearing video_source
/obj/item/device/communicator/proc/end_video(var/reason)
video_source = null
. = "<span class='danger'>\icon[src] [reason ? reason : "Video session ended"].</span>"
visible_message(.)
update_icon()
//For synths who have no hands.
/obj/item/device/communicator/integrated
name = "integrated communicator"
desc = "A circuit used for long-range communications, able to be integrated into a system."
@@ -822,4 +1009,13 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
usr << "You can't do that because you are dead!"
return
src.attack_self(usr)
src.attack_self(usr)
// A camera preset for spawning in the communicator
/obj/machinery/camera/communicator
network = list(NETWORK_COMMUNICATORS)
/obj/machinery/camera/communicator/New()
..()
client_huds |= global_hud.whitense
client_huds |= global_hud.darkMask

View File

@@ -66,7 +66,7 @@
if (ishuman(loc))
var/mob/living/carbon/human/H = loc
if(istype(H.loc, /obj/mecha))
var/obj/mecha/M = loc
var/obj/mecha/M = H.loc
return M.return_temperature()
else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell))
return H.loc:air_contents.temperature

View File

@@ -82,7 +82,7 @@ RSF
product = new /obj/item/clothing/mask/smokable/cigarette()
used_energy = 10
if(2)
product = new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass()
product = new /obj/item/weapon/reagent_containers/food/drinks/glass2()
used_energy = 50
if(3)
product = new /obj/item/weapon/paper()

View File

@@ -15,7 +15,8 @@
name = "card"
desc = "Does card things."
icon = 'icons/obj/card.dmi'
w_class = 1.0
w_class = 1
slot_flags = SLOT_EARS
var/associated_account_number = 0
var/list/files = list( )
@@ -117,6 +118,9 @@
var/icon/front
var/icon/side
var/primary_color = rgb(0,0,0) // Obtained by eyedroppering the stripe in the middle of the card
var/secondary_color = rgb(0,0,0) // Likewise for the oval in the top-left corner
//alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system
var/assignment = null //can be alt title or the actual job
var/rank = null //actual job
@@ -262,3 +266,88 @@
/obj/item/weapon/card/id/centcom/ERT/New()
..()
access |= get_all_station_access()
// Department-flavor IDs
/obj/item/weapon/card/id/medical
name = "identification card"
desc = "A card issued to station medical staff."
icon_state = "med"
primary_color = rgb(189,237,237)
secondary_color = rgb(223,255,255)
/obj/item/weapon/card/id/medical/head
name = "identification card"
desc = "A card which represents care and compassion."
icon_state = "medGold"
primary_color = rgb(189,237,237)
secondary_color = rgb(255,223,127)
/obj/item/weapon/card/id/security
name = "identification card"
desc = "A card issued to station security staff."
icon_state = "sec"
primary_color = rgb(189,47,0)
secondary_color = rgb(223,127,95)
/obj/item/weapon/card/id/security/head
name = "identification card"
desc = "A card which represents honor and protection."
icon_state = "secGold"
primary_color = rgb(189,47,0)
secondary_color = rgb(255,223,127)
/obj/item/weapon/card/id/engineering
name = "identification card"
desc = "A card issued to station engineering staff."
icon_state = "eng"
primary_color = rgb(189,94,0)
secondary_color = rgb(223,159,95)
/obj/item/weapon/card/id/engineering/head
name = "identification card"
desc = "A card which represents creativity and ingenuity."
icon_state = "engGold"
primary_color = rgb(189,94,0)
secondary_color = rgb(255,223,127)
/obj/item/weapon/card/id/science
name = "identification card"
desc = "A card issued to station science staff."
icon_state = "sci"
primary_color = rgb(142,47,142)
secondary_color = rgb(191,127,191)
/obj/item/weapon/card/id/science/head
name = "identification card"
desc = "A card which represents knowledge and reasoning."
icon_state = "sciGold"
primary_color = rgb(142,47,142)
secondary_color = rgb(255,223,127)
/obj/item/weapon/card/id/cargo
name = "identification card"
desc = "A card issued to station cargo staff."
icon_state = "cargo"
primary_color = rgb(142,94,0)
secondary_color = rgb(191,159,95)
/obj/item/weapon/card/id/cargo/head
name = "identification card"
desc = "A card which represents service and planning."
icon_state = "cargoGold"
primary_color = rgb(142,94,0)
secondary_color = rgb(255,223,127)
/obj/item/weapon/card/id/civilian
name = "identification card"
desc = "A card issued to station civilian staff."
icon_state = "civ"
primary_color = rgb(0,94,142)
secondary_color = rgb(95,159,191)
/obj/item/weapon/card/id/civilian/head //This is not the HoP. There's no position that uses this right now.
name = "identification card"
desc = "A card which represents common sense and responsibility."
icon_state = "civGold"
primary_color = rgb(0,94,142)
secondary_color = rgb(255,223,127)

View File

@@ -312,15 +312,6 @@
for(var/i = 1 to 7)
new /obj/item/clothing/glasses/regular(src)
/obj/item/weapon/storage/box/drinkingglasses
name = "box of drinking glasses"
desc = "It has a picture of drinking glasses on it."
/obj/item/weapon/storage/box/drinkingglasses/New()
..()
for(var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
/obj/item/weapon/storage/box/cdeathalarm_kit
name = "death alarm kit"
desc = "Box of stuff used to implant death alarms."
@@ -570,4 +561,4 @@
/obj/item/weapon/storage/box/ambrosiadeus/New()
..()
for(var/i = 1 to 7)
new /obj/item/seeds/ambrosiadeusseed(src)
new /obj/item/seeds/ambrosiadeusseed(src)

View File

@@ -2,7 +2,8 @@
name = "wallet"
desc = "It can hold a few small and personal things."
storage_slots = 10
icon_state = "wallet"
icon = 'icons/obj/wallet.dmi'
icon_state = "wallet-orange"
w_class = 2
can_hold = list(
/obj/item/weapon/spacecash,
@@ -27,7 +28,6 @@
var/obj/item/weapon/card/id/front_id = null
/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location)
. = ..(W, new_location)
if(.)
@@ -45,23 +45,14 @@
update_icon()
/obj/item/weapon/storage/wallet/update_icon()
overlays.Cut()
if(front_id)
switch(front_id.icon_state)
if("id")
icon_state = "walletid"
return
if("silver")
icon_state = "walletid_silver"
return
if("gold")
icon_state = "walletid_gold"
return
if("centcom")
icon_state = "walletid_centcom"
return
icon_state = "wallet"
var/tiny_state = "id-generic"
if("id-"+front_id.icon_state in icon_states(icon))
tiny_state = "id-"+front_id.icon_state
var/image/tiny_image = new/image(icon, icon_state = tiny_state)
tiny_image.appearance_flags = RESET_COLOR
overlays += tiny_image
/obj/item/weapon/storage/wallet/GetID()
return front_id
@@ -73,7 +64,6 @@
else
return ..()
/obj/item/weapon/storage/wallet/random/New()
..()
var/amount = rand(50, 100) + rand(50, 100) // Triangular distribution from 100 to 200
@@ -85,4 +75,40 @@
while(amount >= i)
amount -= i
SC.adjust_worth(i, 0)
SC.update_icon()
SC.update_icon()
/obj/item/weapon/storage/wallet/poly
name = "polychromic wallet"
desc = "You can recolor it! Fancy! The future is NOW!"
icon_state = "wallet-white"
/obj/item/weapon/storage/wallet/poly/New()
..()
verbs |= /obj/item/weapon/storage/wallet/poly/proc/change_color
color = "#"+get_random_colour()
update_icon()
/obj/item/weapon/storage/wallet/poly/proc/change_color()
set name = "Change Wallet Color"
set category = "Object"
set desc = "Change the color of the wallet."
set src in usr
if(usr.stat || usr.restrained() || usr.incapacitated())
return
var/new_color = input(usr, "Pick a new color", "Wallet Color", color) as color|null
if(new_color && (new_color != color))
color = new_color
/obj/item/weapon/storage/wallet/poly/emp_act()
var/original_state = icon_state
icon_state = "wallet-emp"
update_icon()
spawn(200)
if(src)
icon_state = original_state
update_icon()

View File

@@ -12,3 +12,7 @@
/obj/item/weapon/towel/attack_self(mob/living/user as mob)
user.visible_message(text("<span class='notice'>[] uses [] to towel themselves off.</span>", user, src))
playsound(user, 'sound/weapons/towelwipe.ogg', 25, 1)
/obj/item/weapon/towel/random/New()
..()
color = "#"+get_random_colour()

View File

@@ -109,7 +109,13 @@
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
var/mob/source = mob.get_looc_source()
var/list/heard = get_mobs_or_objects_in_view(7, get_turf(source), 1, 0)
var/turf/T = get_turf(source)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/m_viewers = in_range["mobs"]
var/list/receivers = list() // Clients, not mobs.
var/list/r_receivers = list()
var/display_name = key
if(holder && holder.fakekey)
@@ -117,34 +123,33 @@
if(mob.stat != DEAD)
display_name = mob.name
for(var/client/target in clients)
if(target.is_preference_enabled(/datum/client_preference/show_looc))
var/prefix = ""
var/admin_stuff = ""
var/send = 0
// Everyone in normal viewing range of the LOOC
for(var/mob/viewer in m_viewers)
if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc))
receivers |= viewer.client
else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
var/mob/observer/eye/E = viewer
if(E.owner && E.owner.client)
receivers |= E.owner.client
if(target in admins)
admin_stuff += "/([key])"
if(target != src)
admin_stuff += "([admin_jump_link(mob, target.holder)])"
// Admins with RLOOC displayed who weren't already in
for(var/client/admin in admins)
if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
r_receivers |= admin
if(target.mob in heard)
send = 1
if(isAI(target.mob))
prefix = "(Core) "
// Send a message
for(var/client/target in receivers)
var/admin_stuff = ""
if(target in admins)
admin_stuff += "/([key])"
else if(isAI(target.mob)) // Special case
var/mob/living/silicon/ai/A = target.mob
if(A.eyeobj in hearers(7, source))
send = 1
prefix = "(Eye) "
target << "<span class='ooc'><span class='looc'>" + create_text_tag("looc", "LOOC:", target) + " <EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span></span>"
if(!send && (target in admins) && target.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
send = 1
prefix = "(R)"
if(send)
target << "<span class='ooc'><span class='looc'>" + create_text_tag("looc", "LOOC:", target) + " <span class='prefix'>[prefix]</span><EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span></span>"
for(var/client/target in r_receivers)
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
target << "<span class='ooc'><span class='looc'>" + create_text_tag("looc", "LOOC:", target) + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span></span>"
/mob/proc/get_looc_source()
return src

View File

@@ -15,6 +15,10 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
/datum/category_item/player_setup_item/antagonism/basic/sanitize_character()
pref.uplinklocation = sanitize_inlist(pref.uplinklocation, uplink_locations, initial(pref.uplinklocation))
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/antagonism/basic/copy_to_mob(var/mob/living/carbon/human/character)
character.exploit_record = pref.exploit_record
/datum/category_item/player_setup_item/antagonism/basic/content(var/mob/user)
. +="<b>Uplink Type : <a href='?src=\ref[src];antagtask=1'>[pref.uplinklocation]</a></b>"
. +="<br>"

View File

@@ -40,6 +40,25 @@ datum/preferences/proc/set_biological_gender(var/gender)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/basic/copy_to_mob(var/mob/living/carbon/human/character)
if(config.humans_need_surnames)
var/firstspace = findtext(pref.real_name, " ")
var/name_length = length(pref.real_name)
if(!firstspace) //we need a surname
pref.real_name += " [pick(last_names)]"
else if(firstspace == name_length)
pref.real_name += "[pick(last_names)]"
character.real_name = pref.real_name
character.name = character.real_name
if(character.dna)
character.dna.real_name = character.real_name
character.gender = pref.biological_gender
character.identifying_gender = pref.identifying_gender
character.age = pref.age
/datum/category_item/player_setup_item/general/basic/content()
. = list()
. += "<b>Name:</b> "

View File

@@ -76,6 +76,53 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(!pref.organ_data) pref.organ_data = list()
if(!pref.rlimb_data) pref.rlimb_data = list()
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character)
// Copy basic values
character.r_eyes = pref.r_eyes
character.g_eyes = pref.g_eyes
character.b_eyes = pref.b_eyes
character.h_style = pref.h_style
character.r_hair = pref.r_hair
character.g_hair = pref.g_hair
character.b_hair = pref.b_hair
character.f_style = pref.f_style
character.r_facial = pref.r_facial
character.g_facial = pref.g_facial
character.b_facial = pref.b_facial
character.r_skin = pref.r_skin
character.g_skin = pref.g_skin
character.b_skin = pref.b_skin
character.s_tone = pref.s_tone
character.h_style = pref.h_style
character.f_style = pref.f_style
character.b_type = pref.b_type
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/status = pref.organ_data[name]
var/obj/item/organ/external/O = character.organs_by_name[name]
if(O)
if(status == "amputated")
O.remove_rejuv()
else if(status == "cyborg")
if(pref.rlimb_data[name])
O.robotize(pref.rlimb_data[name])
else
O.robotize()
for(var/name in list(O_HEART,O_EYES,O_BRAIN))
var/status = pref.organ_data[name]
if(!status)
continue
var/obj/item/organ/I = character.internal_organs_by_name[name]
if(I)
if(status == "assisted")
I.mechassist()
else if(status == "mechanical")
I.robotize()
return
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
. = list()
if(!pref.preview_icon)

View File

@@ -18,6 +18,30 @@
S["backbag"] << pref.backbag
S["pdachoice"] << pref.pdachoice
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/equipment/copy_to_mob(var/mob/living/carbon/human/character)
character.all_underwear.Cut()
character.all_underwear_metadata.Cut()
for(var/underwear_category_name in pref.all_underwear)
var/datum/category_group/underwear/underwear_category = global_underwear.categories_by_name[underwear_category_name]
if(underwear_category)
var/underwear_item_name = pref.all_underwear[underwear_category_name]
character.all_underwear[underwear_category_name] = underwear_category.items_by_name[underwear_item_name]
if(pref.all_underwear_metadata[underwear_category_name])
character.all_underwear_metadata[underwear_category_name] = pref.all_underwear_metadata[underwear_category_name]
else
pref.all_underwear -= underwear_category_name
// TODO - Looks like this is duplicating the work of sanitize_character() if so, remove
if(pref.backbag > 4 || pref.backbag < 1)
pref.backbag = 1 //Same as above
character.backbag = pref.backbag
if(pref.pdachoice > 3 || pref.pdachoice < 1)
pref.pdachoice = 1
character.pdachoice = pref.pdachoice
/datum/category_item/player_setup_item/general/equipment/sanitize_character()
if(!islist(pref.gear)) pref.gear = list()

View File

@@ -30,6 +30,16 @@
pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation))
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/background/copy_to_mob(var/mob/living/carbon/human/character)
character.med_record = pref.med_record
character.sec_record = pref.sec_record
character.gen_record = pref.gen_record
character.home_system = pref.home_system
character.citizenship = pref.citizenship
character.personal_faction = pref.faction
character.religion = pref.religion
/datum/category_item/player_setup_item/general/background/content(var/mob/user)
. += "<b>Background Information</b><br>"
. += "[company_name] Relation: <a href='?src=\ref[src];nt_relation=1'>[pref.nanotrasen_relation]</a><br/>"

View File

@@ -36,6 +36,18 @@
/datum/category_item/player_setup_item/general/flavor/sanitize_character()
return
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/flavor/copy_to_mob(var/mob/living/carbon/human/character)
character.flavor_texts["general"] = pref.flavor_texts["general"]
character.flavor_texts["head"] = pref.flavor_texts["head"]
character.flavor_texts["face"] = pref.flavor_texts["face"]
character.flavor_texts["eyes"] = pref.flavor_texts["eyes"]
character.flavor_texts["torso"] = pref.flavor_texts["torso"]
character.flavor_texts["arms"] = pref.flavor_texts["arms"]
character.flavor_texts["hands"] = pref.flavor_texts["hands"]
character.flavor_texts["legs"] = pref.flavor_texts["legs"]
character.flavor_texts["feet"] = pref.flavor_texts["feet"]
/datum/category_item/player_setup_item/general/flavor/content(var/mob/user)
. += "<b>Flavor:</b><br>"
. += "<a href='?src=\ref[src];flavor_text=open'>Set Flavor Text</a><br/>"

View File

@@ -29,9 +29,13 @@
path = /obj/item/clothing/accessory/armband/science
/datum/gear/accessory/wallet
display_name = "wallet"
display_name = "wallet, orange"
path = /obj/item/weapon/storage/wallet/random
/datum/gear/accessory/wallet_poly
display_name = "wallet, polychromic"
path = /obj/item/weapon/storage/wallet/poly
/datum/gear/accessory/holster
display_name = "holster, armpit"
path = /obj/item/clothing/accessory/holster/armpit
@@ -172,32 +176,32 @@
/datum/gear/accessory/brown_vest
display_name = "webbing, engineering"
path = /obj/item/clothing/accessory/storage/brown_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/black_vest
display_name = "webbing, security"
path = /obj/item/clothing/accessory/storage/black_vest
allowed_roles = list("Security Officer","Head of Security","Warden")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/white_vest
display_name = "webbing, medical"
path = /obj/item/clothing/accessory/storage/white_vest
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/brown_drop_pouches
display_name = "drop pouches, engineering"
path = /obj/item/clothing/accessory/storage/brown_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/black_drop_pouches
display_name = "drop pouches, security"
path = /obj/item/clothing/accessory/storage/black_drop_pouches
allowed_roles = list("Security Officer","Head of Security","Warden")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/white_drop_pouches
display_name = "drop pouches, medical"
path = /obj/item/clothing/accessory/storage/white_drop_pouches
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/webbing
display_name = "webbing, simple"

View File

@@ -17,3 +17,19 @@
/datum/gear/ashtray
display_name = "ashtray, plastic"
path = /obj/item/weapon/material/ashtray/plastic
/datum/gear/cigar
display_name = "cigar"
path = /obj/item/clothing/mask/smokable/cigarette/cigar
/datum/gear/cigarettes
display_name = "cigarette selection"
path = /obj/item/weapon/storage/fancy/cigarettes
/datum/gear/cigarettes/New()
..()
var/list/cigarettes = list()
for(var/cigarette in (typesof(/obj/item/weapon/storage/fancy/cigarettes) - typesof(/obj/item/weapon/storage/fancy/cigarettes/killthroat)))
var/obj/item/weapon/storage/fancy/cigarettes/cigarette_brand = cigarette
cigarettes[initial(cigarette_brand.name)] = cigarette_brand
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cigarettes))

View File

@@ -72,6 +72,10 @@
for(var/datum/category_group/player_setup_category/PS in categories)
PS.save_preferences(S)
/datum/category_collection/player_setup_collection/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.copy_to_mob(C)
/datum/category_collection/player_setup_collection/proc/header()
var/dat = ""
for(var/datum/category_group/player_setup_category/PS in categories)
@@ -143,6 +147,10 @@
for(var/datum/category_item/player_setup_item/PI in items)
PI.save_preferences(S)
/datum/category_group/player_setup_category/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_item/player_setup_item/PI in items)
PI.copy_to_mob(C)
/datum/category_group/player_setup_category/proc/content(var/mob/user)
. = "<table style='width:100%'><tr style='vertical-align:top'><td style='width:50%'>"
var/current = 0
@@ -201,6 +209,12 @@
/datum/category_item/player_setup_item/proc/save_preferences(var/savefile/S)
return
/*
* Called when the item is asked to apply its per character settings to a new mob.
*/
/datum/category_item/player_setup_item/proc/copy_to_mob(var/mob/living/carbon/human/C)
return
/datum/category_item/player_setup_item/proc/content()
return

View File

@@ -18,6 +18,11 @@
if(!pref.skills.len) pref.ZeroSkills()
if(pref.used_skillpoints < 0) pref.used_skillpoints = 0
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/skills/copy_to_mob(var/mob/living/carbon/human/character)
character.skills = pref.skills
character.used_skillpoints = pref.used_skillpoints
/datum/category_item/player_setup_item/skills/content()
. = list()
. += "<b>Select your Skills</b><br>"

View File

@@ -1,15 +1,3 @@
// Super Global Stuff
/datum/category_collection/player_setup_collection/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.copy_to_mob(C)
/datum/category_group/player_setup_category/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_item/player_setup_item/PI in items)
PI.copy_to_mob(C)
/datum/category_item/player_setup_item/proc/copy_to_mob(var/mob/living/carbon/human/C)
return
// Global stuff that will put us on the map
/datum/category_group/player_setup_category/vore
name = "VORE"

View File

@@ -254,123 +254,14 @@ datum/preferences
// Sanitizing rather than saving as someone might still be editing when copy_to occurs.
player_setup.sanitize_setup()
// VOREStation Edit - Start
player_setup.copy_to_mob(character)
// VOREStation Edit - End
// This needs to happen before anything else becuase it sets some variables.
character.set_species(species)
// Special Case: This references variables owned by two different datums, so do it here.
if(be_random_name)
real_name = random_name(identifying_gender,species)
if(config.humans_need_surnames)
var/firstspace = findtext(real_name, " ")
var/name_length = length(real_name)
if(!firstspace) //we need a surname
real_name += " [pick(last_names)]"
else if(firstspace == name_length)
real_name += "[pick(last_names)]"
character.real_name = real_name
character.name = character.real_name
if(character.dna)
character.dna.real_name = character.real_name
character.flavor_texts["general"] = flavor_texts["general"]
character.flavor_texts["head"] = flavor_texts["head"]
character.flavor_texts["face"] = flavor_texts["face"]
character.flavor_texts["eyes"] = flavor_texts["eyes"]
character.flavor_texts["torso"] = flavor_texts["torso"]
character.flavor_texts["arms"] = flavor_texts["arms"]
character.flavor_texts["hands"] = flavor_texts["hands"]
character.flavor_texts["legs"] = flavor_texts["legs"]
character.flavor_texts["feet"] = flavor_texts["feet"]
character.med_record = med_record
character.sec_record = sec_record
character.gen_record = gen_record
character.exploit_record = exploit_record
character.gender = biological_gender
character.identifying_gender = identifying_gender
character.age = age
character.b_type = b_type
character.r_eyes = r_eyes
character.g_eyes = g_eyes
character.b_eyes = b_eyes
character.h_style = h_style
character.r_hair = r_hair
character.g_hair = g_hair
character.b_hair = b_hair
character.f_style = f_style
character.r_facial = r_facial
character.g_facial = g_facial
character.b_facial = b_facial
character.r_skin = r_skin
character.g_skin = g_skin
character.b_skin = b_skin
character.s_tone = s_tone
character.h_style = h_style
character.f_style = f_style
character.home_system = home_system
character.citizenship = citizenship
character.personal_faction = faction
character.religion = religion
character.skills = skills
character.used_skillpoints = used_skillpoints
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/status = organ_data[name]
var/obj/item/organ/external/O = character.organs_by_name[name]
if(O)
if(status == "amputated")
O.remove_rejuv()
else if(status == "cyborg")
if(rlimb_data[name])
O.robotize(rlimb_data[name])
else
O.robotize()
for(var/name in list(O_HEART,O_EYES,O_BRAIN))
var/status = organ_data[name]
if(!status)
continue
var/obj/item/organ/I = character.internal_organs_by_name[name]
if(I)
if(status == "assisted")
I.mechassist()
else if(status == "mechanical")
I.robotize()
character.all_underwear.Cut()
character.all_underwear_metadata.Cut()
for(var/underwear_category_name in all_underwear)
var/datum/category_group/underwear/underwear_category = global_underwear.categories_by_name[underwear_category_name]
if(underwear_category)
var/underwear_item_name = all_underwear[underwear_category_name]
character.all_underwear[underwear_category_name] = underwear_category.items_by_name[underwear_item_name]
if(all_underwear_metadata[underwear_category_name])
character.all_underwear_metadata[underwear_category_name] = all_underwear_metadata[underwear_category_name]
else
all_underwear -= underwear_category_name
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
if(pdachoice > 3 || pdachoice < 1)
pdachoice = 1
character.pdachoice = pdachoice
// Ask the preferences datums to apply their own settings to the new mob
player_setup.copy_to_mob(character)
if(icon_updates)
character.force_update_limbs()

View File

@@ -6,7 +6,7 @@
#define LOC_VAULT 5
#define LOC_CONSTR 6
#define LOC_TECH 7
#define LOC_TACTICAL 8
#define LOC_GARDEN 8
#define VERM_MICE 0
#define VERM_LIZARDS 1
@@ -50,9 +50,9 @@
if(LOC_TECH)
spawn_area_type = /area/storage/tech
locstring = "technical storage"
if(LOC_TACTICAL)
spawn_area_type = /area/security/tactical
locstring = "tactical equipment storage"
if(LOC_GARDEN)
spawn_area_type = /area/hydroponics/garden
locstring = "the public garden"
for(var/areapath in typesof(spawn_area_type))
var/area/A = locate(areapath)
@@ -102,7 +102,7 @@
#undef LOC_HYDRO
#undef LOC_VAULT
#undef LOC_TECH
#undef LOC_TACTICAL
#undef LOC_GARDEN
#undef VERM_MICE
#undef VERM_LIZARDS

View File

@@ -1,7 +1,7 @@
// All mobs should have custom emote, really..
//m_type == 1 --> visual.
//m_type == 2 --> audible
/mob/proc/custom_emote(var/m_type=1,var/message = null)
/mob/proc/custom_emote(var/m_type=1,var/message = null,var/range=world.view)
if(stat || !use_me && usr == src)
src << "You are unable to emote."
return
@@ -23,42 +23,23 @@
if (message)
log_emote("[name]/[key] : [message]")
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Maybe some people are okay with that.
for(var/mob/M in player_list)
if (!M.client)
continue //skip monkeys and leavers
if (istype(M, /mob/new_player))
continue
if(findtext(message," snores.")) //Because we have so many sleeping people.
break
if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_sight) && !(M in viewers(src,null)))
M.show_message(message, m_type)
var/turf/T = get_turf(src)
if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,range,2)
var/list/m_viewers = in_range["mobs"]
var/list/o_viewers = in_range["objs"]
if (m_type & 1)
var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null)
for(var/I in see)
if(isobj(I))
spawn(0)
if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
O.see_emote(src, message, 1)
else if(ismob(I))
var/mob/M = I
M.show_message(message, 1)
else if (m_type & 2)
var/list/hear = get_mobs_or_objects_in_view(world.view,src)
for(var/I in hear)
if(isobj(I))
spawn(0)
if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
O.see_emote(src, message, 2)
else if(ismob(I))
var/mob/M = I
M.show_message(message, 2)
for(var/mob/M in m_viewers)
spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes.
if(M)
M.show_message(message, m_type)
for(var/obj/O in o_viewers)
spawn(0)
if(O)
O.see_emote(src, message, m_type)
/mob/proc/emote_dead(var/message)

View File

@@ -1050,7 +1050,11 @@
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
client.images.Remove(hud)
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science)
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science, global_hud.whitense)
if(istype(client.eye,/obj/machinery/camera))
var/obj/machinery/camera/cam = client.eye
client.screen |= cam.client_huds
if(damageoverlay.overlays)
damageoverlay.overlays = list()

View File

@@ -5,11 +5,4 @@
destroy_surroundings = 1
a_intent = I_HURT
hostile = 1
/mob/living/simple_animal/hostile/Life()
. = ..()
if(!.)
walk(src, 0)
return 0

View File

@@ -118,6 +118,8 @@
living_mob_list += src
stat = CONSCIOUS
density = 1
else
walk(src, 0)
return 0

View File

@@ -42,12 +42,9 @@
// Parameters: None
// Description: Adds a static overlay to the client's screen.
/mob/living/voice/Login()
var/obj/screen/static_effect = new() //Since what the player sees is essentially a video feed, from a vast distance away, the view isn't going to be perfect.
static_effect.screen_loc = ui_entire_screen
static_effect.icon = 'icons/effects/static.dmi'
static_effect.icon_state = "1 light"
static_effect.mouse_opacity = 0 //So the static doesn't get in the way of clicking.
client.screen.Add(static_effect)
..()
client.screen |= global_hud.whitense
client.screen |= global_hud.darkMask
// Proc: Destroy()
// Parameters: None
@@ -110,7 +107,7 @@
// Proc: say()
// Parameters: 4 (generic say() arguments)
// Description: Adds a speech bubble to the communicator device, then calls ..() to do the real work.
/mob/living/voice/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="")
/mob/living/voice/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/whispering=0)
//Speech bubbles.
if(comm)
var/speech_bubble_test = say_test(message)
@@ -122,4 +119,8 @@
M << speech_bubble
src << speech_bubble
..(message, speaking, verb, alt_name) //mob/living/say() can do the actual talking.
..(message, speaking, verb, alt_name, whispering) //mob/living/say() can do the actual talking.
/mob/living/voice/custom_emote(var/m_type=1,var/message = null,var/range=world.view)
if(!comm) return
..(m_type,message,comm.video_range)

View File

@@ -508,9 +508,14 @@
/mob/new_player/is_ready()
return ready && ..()
// Prevents lobby players from seeing say, even with ghostears
/mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
return
// Prevents lobby players from seeing emotes, even with ghosteyes
/mob/new_player/show_message(msg, type, alt, alt_type)
return
/mob/new_player/hear_radio()
return

View File

@@ -1105,7 +1105,6 @@ Note that amputating the affected organ does in fact remove the infection from t
W.loc = owner
/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children = 0)
if(!owner)
return
var/is_robotic = robotic >= ORGAN_ROBOT
@@ -1161,6 +1160,8 @@ Note that amputating the affected organ does in fact remove the infection from t
qdel(spark_system)
qdel(src)
victim.update_body()
/obj/item/organ/external/proc/disfigure(var/type = "brute")
if (disfigured)
return
@@ -1246,216 +1247,3 @@ Note that amputating the affected organ does in fact remove the infection from t
if(6 to INFINITY)
flavor_text += "a ton of [wound]\s"
return english_list(flavor_text)
/****************************************************
ORGAN DEFINES
****************************************************/
/obj/item/organ/external/chest
name = "upper body"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 100
min_broken_damage = 35
w_class = 5
body_part = UPPER_TORSO
vital = 1
amputation_point = "spine"
joint = "neck"
dislocated = -1
gendered_icon = 1
cannot_amputate = 1
parent_organ = null
encased = "ribcage"
organ_rel_size = 70
base_miss_chance = 10
/obj/item/organ/external/chest/robotize()
if(..())
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
/obj/item/organ/external/groin
name = "lower body"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 35
w_class = 5
body_part = LOWER_TORSO
vital = 1
parent_organ = BP_TORSO
amputation_point = "lumbar"
joint = "hip"
dislocated = -1
gendered_icon = 1
organ_rel_size = 30
/obj/item/organ/external/arm
organ_tag = "l_arm"
name = "left arm"
icon_name = "l_arm"
max_damage = 50
min_broken_damage = 30
w_class = 3
body_part = ARM_LEFT
parent_organ = BP_TORSO
joint = "left elbow"
amputation_point = "left shoulder"
can_grasp = 1
/obj/item/organ/external/arm/right
organ_tag = "r_arm"
name = "right arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
joint = "right elbow"
amputation_point = "right shoulder"
/obj/item/organ/external/leg
organ_tag = "l_leg"
name = "left leg"
icon_name = "l_leg"
max_damage = 50
min_broken_damage = 30
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = BP_GROIN
joint = "left knee"
amputation_point = "left hip"
can_stand = 1
/obj/item/organ/external/leg/right
organ_tag = "r_leg"
name = "right leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
icon_position = RIGHT
joint = "right knee"
amputation_point = "right hip"
/obj/item/organ/external/foot
organ_tag = "l_foot"
name = "left foot"
icon_name = "l_foot"
min_broken_damage = 15
w_class = 2
body_part = FOOT_LEFT
icon_position = LEFT
parent_organ = "l_leg"
joint = "left ankle"
amputation_point = "left ankle"
can_stand = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/foot/removed()
if(owner) owner.u_equip(owner.shoes)
..()
/obj/item/organ/external/foot/right
organ_tag = "r_foot"
name = "right foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
icon_position = RIGHT
parent_organ = "r_leg"
joint = "right ankle"
amputation_point = "right ankle"
/obj/item/organ/external/hand
organ_tag = "l_hand"
name = "left hand"
icon_name = "l_hand"
min_broken_damage = 15
w_class = 2
body_part = HAND_LEFT
parent_organ = "l_arm"
joint = "left wrist"
amputation_point = "left wrist"
can_grasp = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/hand/removed()
owner.u_equip(owner.gloves)
..()
/obj/item/organ/external/hand/right
organ_tag = "r_hand"
name = "right hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
parent_organ = "r_arm"
joint = "right wrist"
amputation_point = "right wrist"
/obj/item/organ/external/head
organ_tag = BP_HEAD
icon_name = "head"
name = "head"
max_damage = 75
min_broken_damage = 35
w_class = 3
body_part = HEAD
vital = 1
parent_organ = BP_TORSO
joint = "jaw"
amputation_point = "neck"
gendered_icon = 1
encased = "skull"
base_miss_chance = 40
var/eye_icon = "eyes_s"
// These organs are important for robotizing at chargen.
/obj/item/organ/external/head/robotize(var/company, var/skip_prosthetics, var/keep_organs)
return ..(company, skip_prosthetics, 1)
/obj/item/organ/external/head/removed()
if(owner)
name = "[owner.real_name]'s head"
owner.u_equip(owner.glasses)
owner.u_equip(owner.head)
owner.u_equip(owner.l_ear)
owner.u_equip(owner.r_ear)
owner.u_equip(owner.wear_mask)
spawn(1)
owner.update_hair()
..()
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
if (!disfigured)
if (brute_dam > 40)
if (prob(50))
disfigure("brute")
if (burn_dam > 40)
disfigure("burn")
/obj/item/organ/external/head/skrell
eye_icon = "skrell_eyes_s"
/obj/item/organ/external/head/seromi
eye_icon = "eyes_seromi"
/obj/item/organ/external/head/no_eyes
eye_icon = "blank_eyes"
/obj/item/organ/external/head/no_eyes/diona
max_damage = 50
min_broken_damage = 25
cannot_break = 1
amputation_point = "branch"
joint = "structural ligament"
dislocated = -1
vital = 0
/obj/item/organ/external/head/no_eyes/diona/removed()
var/mob/living/carbon/human/H = owner
..()
if(!istype(H) || !H.organs || !H.organs.len)
H.death()
if(prob(50) && spawn_diona_nymph(get_turf(src)))
qdel(src)

View File

@@ -43,10 +43,6 @@ var/global/list/limb_icon_cache = list()
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/removed()
get_icon()
..()
/obj/item/organ/external/head/get_icon()
..()

View File

@@ -198,3 +198,12 @@
/obj/item/organ/internal/diona/node/removed()
return
/obj/item/organ/external/head/no_eyes/diona
max_damage = 50
min_broken_damage = 25
cannot_break = 1
amputation_point = "branch"
joint = "structural ligament"
dislocated = -1
vital = 0

View File

@@ -18,6 +18,13 @@
cannot_amputate = 1
parent_organ = null
encased = "ribcage"
organ_rel_size = 70
base_miss_chance = 10
/obj/item/organ/external/chest/robotize()
if(..())
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
/obj/item/organ/external/groin
name = "lower body"
@@ -33,6 +40,7 @@
joint = "hip"
dislocated = -1
gendered_icon = 1
organ_rel_size = 30
/obj/item/organ/external/arm
organ_tag = "l_arm"
@@ -93,7 +101,8 @@
can_stand = 1
/obj/item/organ/external/foot/removed()
if(owner) owner.u_equip(owner.shoes)
if(owner)
owner.drop_from_inventory(owner.shoes)
..()
/obj/item/organ/external/foot/right
@@ -118,9 +127,12 @@
joint = "left wrist"
amputation_point = "left wrist"
can_grasp = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/hand/removed()
owner.u_equip(owner.gloves)
if(owner)
owner.drop_from_inventory(owner.gloves)
..()
/obj/item/organ/external/hand/right
@@ -147,18 +159,24 @@
gendered_icon = 1
cannot_gib = 1
encased = "skull"
base_miss_chance = 40
var/can_intake_reagents = 1
var/eye_icon = "eyes_s"
/obj/item/organ/external/head/robotize(var/company, var/skip_prosthetics, var/keep_organs)
return ..(company, skip_prosthetics, 1)
/obj/item/organ/external/head/removed()
if(owner)
name = "[owner.real_name]'s head"
owner.u_equip(owner.glasses)
owner.u_equip(owner.head)
owner.u_equip(owner.l_ear)
owner.u_equip(owner.r_ear)
owner.u_equip(owner.wear_mask)
owner.drop_from_inventory(owner.glasses)
owner.drop_from_inventory(owner.head)
owner.drop_from_inventory(owner.l_ear)
owner.drop_from_inventory(owner.r_ear)
owner.drop_from_inventory(owner.wear_mask)
spawn(1)
owner.update_hair()
get_icon()
..()
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
@@ -169,3 +187,12 @@
disfigure("brute")
if (burn_dam > 40)
disfigure("burn")
/obj/item/organ/external/head/skrell
eye_icon = "skrell_eyes_s"
/obj/item/organ/external/head/seromi
eye_icon = "eyes_seromi"
/obj/item/organ/external/head/no_eyes
eye_icon = "blank_eyes"

View File

@@ -606,7 +606,6 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/stack/cable_coil/transfer_to(obj/item/stack/cable_coil/S)
if(!istype(S))
world << 1
return
..()

View File

@@ -124,6 +124,13 @@
magazine_type = /obj/item/ammo_magazine/a50
allowed_magazines = list(/obj/item/ammo_magazine/a50)
/obj/item/weapon/gun/projectile/deagle/update_icon()
..()
if(ammo_magazine)
icon_state = "[initial(icon_state)]"
else
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/deagle/gold
desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses .50 AE rounds."
icon_state = "deagleg"

View File

@@ -349,7 +349,7 @@
return
if (istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/glass2) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
if (beaker)

View File

@@ -26,17 +26,19 @@
var/overdose = 0
var/scannable = 0 // Shows up on health analyzers.
var/affects_dead = 0
var/glass_icon_state = null
var/glass_name = null
var/glass_desc = null
var/glass_center_of_mass = null
var/cup_icon_state = null
var/cup_name = null
var/cup_desc = null
var/cup_center_of_mass = null
var/color = "#000000"
var/color_weight = 1
var/glass_icon = DRINK_ICON_DEFAULT
var/glass_name = "something"
var/glass_desc = "It's a glass of... what, exactly?"
var/list/glass_special = null // null equivalent to list()
/datum/reagent/proc/remove_self(var/amount) // Shortcut
holder.remove_reagent(id, amount)

View File

@@ -6,8 +6,7 @@
metabolism = REM * 5
color = "#C80000"
glass_icon_state = "glass_red"
glass_name = "glass of tomato juice"
glass_name = "tomato juice"
glass_desc = "Are you sure this is tomato juice?"
/datum/reagent/blood/initialize_data(var/newdata)
@@ -91,8 +90,7 @@
color = "#0064C877"
metabolism = REM * 10
glass_icon_state = "glass_clear"
glass_name = "glass of water"
glass_name = "water"
glass_desc = "The father of all refreshments."
/datum/reagent/water/touch_turf(var/turf/simulated/T)
@@ -154,8 +152,7 @@
reagent_state = LIQUID
color = "#660000"
glass_icon_state = "dr_gibb_glass"
glass_name = "glass of welder fuel"
glass_name = "welder fuel"
glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
/datum/reagent/fuel/touch_turf(var/turf/T)

View File

@@ -66,8 +66,7 @@
var/targ_temp = 310
var/halluci = 0
glass_icon_state = "glass_clear"
glass_name = "glass of ethanol"
glass_name = "ethanol"
glass_desc = "A well-known alcohol with a variety of applications."
/datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount)
@@ -368,9 +367,10 @@
description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
reagent_state = SOLID
color = "#FFFFFF"
glass_icon_state = "iceglass"
glass_name = "glass of sugar"
glass_name = "sugar"
glass_desc = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
glass_icon = DRINK_ICON_NOISY
/datum/reagent/sugar/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.nutrition += removed * 3

View File

@@ -112,8 +112,7 @@
color = "#C8A5DC"
affects_dead = 1 //This can even heal dead people.
glass_icon_state = "golden_cup"
glass_name = "golden cup"
glass_name = "liquid gold"
glass_desc = "It's magic. We don't have to explain it."
/datum/reagent/adminordrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
@@ -197,8 +196,7 @@
description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality."
color = "#E0E8EF"
glass_icon_state = "glass_clear"
glass_name = "glass of holy water"
glass_name = "holy water"
glass_desc = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality."
/datum/reagent/water/holywater/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)

View File

@@ -331,13 +331,10 @@
id = "beer2"
description = "An alcoholic beverage made from malted grains, hops, yeast, and water. The fermentation appears to be incomplete." //If the players manage to analyze this, they deserve to know something is wrong.
reagent_state = LIQUID
color = "#664300"
color = "#FFD300"
glass_icon_state = "beerglass"
glass_name = "glass of beer"
glass_name = "beer"
glass_desc = "A freezing pint of beer"
glass_center_of_mass = list("x"=16, "y"=8)
/* Drugs */
/datum/reagent/space_drugs

View File

@@ -0,0 +1,146 @@
#define DRINK_ICON_FILE 'icons/pdrink.dmi'
/var/const/DRINK_FIZZ = "fizz"
/var/const/DRINK_ICE = "ice"
/var/const/DRINK_ICON_DEFAULT = ""
/var/const/DRINK_ICON_NOISY = "_noise"
/obj/item/weapon/reagent_containers/food/drinks/glass2
name = "glass" // Name when empty
var/base_name = "glass" // Name to put in front of drinks, i.e. "[base_name] of [contents]"
desc = "A generic drinking glass." // Description when empty
icon = DRINK_ICON_FILE
var/base_icon = "square" // Base icon name
volume = 30
var/list/filling_states // List of percentages full that have icons
var/list/extras = list() // List of extras. Two extras maximum
var/rim_pos
center_of_mass = list("x"=16, "y"=10)
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10,15,30)
flags = OPENCONTAINER
/obj/item/weapon/reagent_containers/food/drinks/glass2/examine(mob/M as mob)
..()
for(var/I in extras)
if(istype(I, /obj/item/weapon/glass_extra))
M << "There is \a [I] in \the [src]."
else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/fruit_slice))
M << "There is \a [I] on the rim."
else
M << "There is \a [I] somewhere on the glass. Somehow."
if(has_ice())
M << "There is some ice floating in the drink."
if(has_fizz())
M << "It is fizzing slightly."
/obj/item/weapon/reagent_containers/food/drinks/glass2/proc/has_ice()
if(reagents.reagent_list.len > 0)
var/datum/reagent/R = reagents.get_master_reagent()
if(!((R.id == "ice") || ("ice" in R.glass_special))) // if it's not a cup of ice, and it's not already supposed to have ice in, see if the bartender's put ice in it
if(reagents.has_reagent("ice", reagents.total_volume / 10)) // 10% ice by volume
return 1
return 0
/obj/item/weapon/reagent_containers/food/drinks/glass2/proc/has_fizz()
if(reagents.reagent_list.len > 0)
var/datum/reagent/R = reagents.get_master_reagent()
if(!("fizz" in R.glass_special))
var/totalfizzy = 0
for(var/datum/reagent/re in reagents.reagent_list)
if("fizz" in re.glass_special)
totalfizzy += re.volume
if(totalfizzy >= reagents.total_volume / 5) // 20% fizzy by volume
return 1
return 0
/obj/item/weapon/reagent_containers/food/drinks/glass2/New()
..()
icon_state = base_icon
/obj/item/weapon/reagent_containers/food/drinks/glass2/on_reagent_change()
..()
update_icon()
/obj/item/weapon/reagent_containers/food/drinks/glass2/proc/can_add_extra(obj/item/weapon/glass_extra/GE)
if(!("[base_icon]_[GE.glass_addition]left" in icon_states(DRINK_ICON_FILE)))
return 0
if(!("[base_icon]_[GE.glass_addition]right" in icon_states(DRINK_ICON_FILE)))
return 0
return 1
/obj/item/weapon/reagent_containers/food/drinks/glass2/update_icon()
underlays.Cut()
if (reagents.reagent_list.len > 0)
var/datum/reagent/R = reagents.get_master_reagent()
name = "[base_name] of [R.glass_name ? R.glass_name : "something"]"
desc = R.glass_desc ? R.glass_desc : initial(desc)
var/list/under_liquid = list()
var/list/over_liquid = list()
var/amnt = 100
var/percent = round((reagents.total_volume / volume) * 100)
for(var/k in filling_states)
if(percent <= k)
amnt = k
break
if(has_ice())
over_liquid |= "[base_icon][amnt]_ice"
if(has_fizz())
over_liquid |= "[base_icon][amnt]_fizz"
for(var/S in R.glass_special)
if("[base_icon]_[S]" in icon_states(DRINK_ICON_FILE))
under_liquid |= "[base_icon]_[S]"
else if("[base_icon][amnt]_[S]" in icon_states(DRINK_ICON_FILE))
over_liquid |= "[base_icon][amnt]_[S]"
for(var/k in under_liquid)
underlays += image(DRINK_ICON_FILE, src, k, -3)
var/image/filling = image(DRINK_ICON_FILE, src, "[base_icon][amnt][R.glass_icon]", -2)
filling.color = reagents.get_color()
underlays += filling
for(var/k in over_liquid)
underlays += image(DRINK_ICON_FILE, src, k, -1)
else
name = initial(name)
desc = initial(desc)
var/side = "left"
for(var/item in extras)
if(istype(item, /obj/item/weapon/glass_extra))
var/obj/item/weapon/glass_extra/GE = item
var/image/I = image(DRINK_ICON_FILE, src, "[base_icon]_[GE.glass_addition][side]")
if(GE.glass_color)
I.color = GE.glass_color
underlays += I
else if(istype(item, /obj/item/weapon/reagent_containers/food/snacks/fruit_slice))
var/obj/FS = item
var/image/I = image(FS)
var/fsy = rim_pos[1] - 20
var/fsx = rim_pos[side == "left" ? 2 : 3] - 16
var/matrix/M = matrix()
M.Scale(0.5)
M.Translate(fsx, fsy)
I.transform = M
underlays += I
else continue
side = "right"

View File

@@ -0,0 +1,72 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/attackby(obj/item/I as obj, mob/user as mob)
if(extras.len >= 2) return ..() // max 2 extras, one on each side of the drink
if(istype(I, /obj/item/weapon/glass_extra))
var/obj/item/weapon/glass_extra/GE = I
if(can_add_extra(GE))
extras += GE
user.remove_from_mob(GE)
GE.loc = src
user << "<span class=notice>You add \the [GE] to \the [src].</span>"
update_icon()
else
user << "<span class=warning>There's no space to put \the [GE] on \the [src]!</span>"
else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/fruit_slice))
if(!rim_pos)
user << "<span class=warning>There's no space to put \the [I] on \the [src]!</span>"
return
var/obj/item/weapon/reagent_containers/food/snacks/fruit_slice/FS = I
extras += FS
user.remove_from_mob(FS)
FS.pixel_x = 0 // Reset its pixel offsets so the icons work!
FS.pixel_y = 0
FS.loc = src
user << "<span class=notice>You add \the [FS] to \the [src].</span>"
update_icon()
else
return ..()
/obj/item/weapon/reagent_containers/food/drinks/glass2/attack_hand(mob/user as mob)
if(src != user.get_inactive_hand())
return ..()
if(!extras.len)
user << "<span class=warning>There's nothing on the glass to remove!</span>"
return
var/choice = input(user, "What would you like to remove from the glass?") as null|anything in extras
if(!choice || !(choice in extras))
return
if(user.put_in_active_hand(choice))
user << "<span class=notice>You remove \the [choice] from \the [src].</span>"
extras -= choice
else
user << "<span class=warning>Something went wrong, please try again.</span>"
update_icon()
/obj/item/weapon/glass_extra
name = "generic glass addition"
desc = "This goes on a glass."
var/glass_addition
var/glass_desc
var/glass_color
w_class = 1
icon = DRINK_ICON_FILE
/obj/item/weapon/glass_extra/stick
name = "stick"
desc = "This goes in a glass."
glass_addition = "stick"
glass_desc = "There is a stick in the glass."
icon_state = "stick"
/obj/item/weapon/glass_extra/straw
name = "straw"
desc = "This goes in a glass."
glass_addition = "straw"
glass_desc = "There is a straw in the glass."
icon_state = "straw"
#undef DRINK_ICON_FILE

View File

@@ -0,0 +1,75 @@
/obj/item/weapon/storage/box/mixedglasses
name = "glassware box"
desc = "A box of assorted glassware"
can_hold = list(/obj/item/weapon/reagent_containers/food/drinks/glass2)
New()
..()
new /obj/item/weapon/reagent_containers/food/drinks/glass2/square(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/shake(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/shot(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/pint(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/mug(src)
new /obj/item/weapon/reagent_containers/food/drinks/glass2/wine(src)
/obj/item/weapon/storage/box/glasses
name = "box of glasses"
var/glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2
can_hold = list(/obj/item/weapon/reagent_containers/food/drinks/glass2)
New()
..()
for(var/i = 1 to 7)
new glass_type(src)
/obj/item/weapon/storage/box/glasses/square
name = "box of half-pint glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/square
/obj/item/weapon/storage/box/glasses/rocks
name = "box of rocks glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks
/obj/item/weapon/storage/box/glasses/shake
name = "box of milkshake glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/shake
/obj/item/weapon/storage/box/glasses/cocktail
name = "box of cocktail glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail
/obj/item/weapon/storage/box/glasses/shot
name = "box of shot glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/shot
/obj/item/weapon/storage/box/glasses/pint
name = "box of pint glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/pint
/obj/item/weapon/storage/box/glasses/mug
name = "box of glass mugs"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/mug
/obj/item/weapon/storage/box/glasses/wine
name = "box of wine glasses"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/glass2/wine
/obj/item/weapon/storage/box/glass_extras
name = "box of cocktail garnishings"
var/extra_type = /obj/item/weapon/glass_extra
can_hold = list(/obj/item/weapon/glass_extra)
storage_slots = 14
New()
..()
for(var/i = 1 to 14)
new extra_type(src)
/obj/item/weapon/storage/box/glass_extras/straws
name = "box of straws"
extra_type = /obj/item/weapon/glass_extra/straw
/obj/item/weapon/storage/box/glass_extras/sticks
name = "box of drink sticks"
extra_type = /obj/item/weapon/glass_extra/stick

View File

@@ -0,0 +1,72 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/square
name = "half-pint glass"
base_name = "glass"
base_icon = "square"
desc = "Your standard drinking glass."
filling_states = list(20, 40, 60, 80, 100)
volume = 30
possible_transfer_amounts = list(5,10,15,30)
rim_pos = list(23,13,20) // y, x0, x1
/obj/item/weapon/reagent_containers/food/drinks/glass2/rocks
name = "rocks glass"
base_name = "glass"
base_icon = "rocks"
filling_states = list(25, 50, 75, 100)
volume = 20
possible_transfer_amounts = list(5,10,20)
rim_pos = list(21, 10, 23)
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake
name = "milkshake glass"
base_name = "glass"
base_icon = "shake"
filling_states = list(25, 50, 75, 100)
volume = 30
possible_transfer_amounts = list(5,10,15,30)
rim_pos = list(25, 13, 21)
/obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail
name = "cocktail glass"
base_name = "glass"
base_icon = "cocktail"
filling_states = list(33, 66, 100)
volume = 15
possible_transfer_amounts = list(5,10,15)
rim_pos = list(22, 13, 21)
/obj/item/weapon/reagent_containers/food/drinks/glass2/shot
name = "shot glass"
base_name = "shot"
base_icon = "shot"
filling_states = list(33, 66, 100)
volume = 5
possible_transfer_amounts = list(1,2,5)
rim_pos = list(17, 13, 21)
/obj/item/weapon/reagent_containers/food/drinks/glass2/pint
name = "pint glass"
base_name = "pint"
base_icon = "pint"
filling_states = list(16, 33, 50, 66, 83, 100)
volume = 60
possible_transfer_amounts = list(5,10,15,30,60)
rim_pos = list(25, 12, 21)
/obj/item/weapon/reagent_containers/food/drinks/glass2/mug
name = "glass mug"
base_name = "mug"
base_icon = "mug"
filling_states = list(25, 50, 75, 100)
volume = 40
possible_transfer_amounts = list(5,10,20,40)
rim_pos = list(22, 12, 20)
/obj/item/weapon/reagent_containers/food/drinks/glass2/wine
name = "wine glass"
base_name = "glass"
base_icon = "wine"
filling_states = list(20, 40, 60, 80, 100)
volume = 25
possible_transfer_amounts = list(5, 10, 15, 25)
rim_pos = list(25, 12, 21)

View File

@@ -0,0 +1,31 @@
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask
name = "fitness shaker"
base_name = "shaker"
desc = "Big enough to contain enough protein to get perfectly swole. Don't mind the bits."
icon_state = "fitness-cup_black"
base_icon = "fitness-cup"
volume = 100
matter = list("plastic" = 2000)
filling_states = list(10,20,30,40,50,60,70,80,90,100)
possible_transfer_amounts = list(5, 10, 15, 25)
rim_pos = null // no fruit slices
var/lid_color = "black"
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/New()
..()
lid_color = pick("black", "red", "blue")
update_icon()
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/update_icon()
..()
icon_state = "[base_icon]_[lid_color]"
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake
name = "protein shake"
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake/New()
..()
reagents.add_reagent("nutriment", 30)
reagents.add_reagent("iron", 10)
reagents.add_reagent("protein", 35)
reagents.add_reagent("water", 25)

View File

@@ -11,7 +11,13 @@
volume = 50
/obj/item/weapon/reagent_containers/food/drinks/on_reagent_change()
return
if (reagents.reagent_list.len > 0)
var/datum/reagent/R = reagents.get_master_reagent()
if(R.price_tag)
price_tag = R.price_tag
else
price_tag = null
return
/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user as mob)
if(!is_open_container())
@@ -96,13 +102,16 @@
volume = 150
flags = CONDUCT | OPENCONTAINER
/obj/item/weapon/reagent_containers/food/drinks/golden_cup/on_reagent_change()
..()
///////////////////////////////////////////////Drinks
//Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly
// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50.
// Formatting is the same as food.
/obj/item/weapon/reagent_containers/food/drinks/milk
name = "Space Milk"
name = "milk carton"
desc = "It's milk. White and nutritious goodness!"
icon_state = "milk"
item_state = "carton"
@@ -113,7 +122,7 @@
reagents.add_reagent("milk", 50)
/obj/item/weapon/reagent_containers/food/drinks/soymilk
name = "SoyMilk"
name = "soymilk carton"
desc = "It's soy milk. White and nutritious goodness!"
icon_state = "soymilk"
item_state = "carton"
@@ -123,7 +132,7 @@
reagents.add_reagent("soymilk", 50)
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton
name = "Small Carton of Milk"
name = "small milk carton"
volume = 30
icon_state = "mini-milk"
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/New()
@@ -131,16 +140,16 @@
reagents.add_reagent("milk", 30)
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate
name = "Small Carton of Chocolate Milk"
name = "small chocolate milk carton"
desc = "It's milk! This one is in delicious chocolate flavour."
icon_state = "mini-milk_choco"
/obj/item/weapon/reagent_containers/food/drinks/milk/smallcarton/chocolate/New()
..()
reagents.add_reagent("chocolate_milk", 30)
/obj/item/weapon/reagent_containers/food/drinks/coffee
name = "Robust Coffee"
name = "\improper Robust Coffee"
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
center_of_mass = list("x"=15, "y"=10)
@@ -149,7 +158,7 @@
reagents.add_reagent("coffee", 30)
/obj/item/weapon/reagent_containers/food/drinks/tea
name = "Duke Purple Tea"
name = "cup of Duke Purple Tea"
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
icon_state = "teacup"
item_state = "coffee"
@@ -160,7 +169,7 @@
reagents.add_reagent("tea", 30)
/obj/item/weapon/reagent_containers/food/drinks/ice
name = "Ice Cup"
name = "cup of ice"
desc = "Careful, cold ice, do not chew."
icon_state = "coffee"
center_of_mass = list("x"=15, "y"=10)
@@ -169,7 +178,7 @@
reagents.add_reagent("ice", 30)
/obj/item/weapon/reagent_containers/food/drinks/h_chocolate
name = "Dutch Hot Coco"
name = "cup of Dutch hot coco"
desc = "Made in Space South America."
icon_state = "hot_coco"
item_state = "coffee"
@@ -189,7 +198,7 @@
reagents.add_reagent("dry_ramen", 30)
/obj/item/weapon/reagent_containers/food/drinks/sillycup
name = "Paper Cup"
name = "paper cup"
desc = "A paper water cup."
icon_state = "water_cup_e"
possible_transfer_amounts = null
@@ -199,6 +208,7 @@
..()
/obj/item/weapon/reagent_containers/food/drinks/sillycup/on_reagent_change()
..()
if(reagents.total_volume)
icon_state = "water_cup"
else
@@ -211,13 +221,16 @@
// icon states.
/obj/item/weapon/reagent_containers/food/drinks/shaker
name = "Shaker"
name = "shaker"
desc = "A metal shaker to mix drinks in."
icon_state = "shaker"
amount_per_transfer_from_this = 10
volume = 120
center_of_mass = list("x"=17, "y"=10)
/obj/item/weapon/reagent_containers/food/drinks/shaker/on_reagent_change()
..()
/obj/item/weapon/reagent_containers/food/drinks/teapot
name = "teapot"
desc = "An elegant teapot. It simply oozes class."
@@ -227,13 +240,19 @@
volume = 120
center_of_mass = list("x"=17, "y"=7)
/obj/item/weapon/reagent_containers/food/drinks/teapot/on_reagent_change()
..()
/obj/item/weapon/reagent_containers/food/drinks/flask
name = "Captain's Flask"
name = "\improper Captain's flask"
desc = "A metal flask belonging to the captain"
icon_state = "flask"
volume = 60
center_of_mass = list("x"=17, "y"=7)
/obj/item/weapon/reagent_containers/food/drinks/flask/on_reagent_change()
..()
/obj/item/weapon/reagent_containers/food/drinks/flask/shiny
name = "shiny flask"
desc = "A shiny metal flask. It appears to have a Greek symbol inscribed on it."
@@ -245,7 +264,7 @@
icon_state = "lithiumflask"
/obj/item/weapon/reagent_containers/food/drinks/flask/detflask
name = "Detective's Flask"
name = "\improper Detective's flask"
desc = "A metal flask with a leather band and golden badge belonging to the detective."
icon_state = "detflask"
volume = 60
@@ -271,3 +290,7 @@
icon_state = "britcup"
volume = 30
center_of_mass = list("x"=15, "y"=13)
/obj/item/weapon/reagent_containers/food/drinks/britcup/on_reagent_change()
..()

View File

@@ -0,0 +1,39 @@
/obj/item/weapon/reagent_containers/food/drinks/cup
name = "coffee cup"
desc = "The container of oriental luxuries."
icon_state = "cup_empty"
amount_per_transfer_from_this = 5
volume = 30
center_of_mass = list("x"=16, "y"=16)
/obj/item/weapon/reagent_containers/food/drinks/cup/on_reagent_change()
..()
if (reagents.reagent_list.len > 0)
var/datum/reagent/R = reagents.get_master_reagent()
if(R.cup_icon_state)
icon_state = R.cup_icon_state
else
icon_state = "cup_brown"
if(R.cup_name)
name = R.cup_name
else
name = "Cup of.. what?"
if(R.cup_desc)
desc = R.cup_desc
else
desc = "You can't really tell what this is."
if(R.cup_center_of_mass)
center_of_mass = R.cup_center_of_mass
else
center_of_mass = list("x"=16, "y"=16)
else
icon_state = "cup_empty"
name = "coffee cup"
desc = "The container of oriental luxuries."
center_of_mass = list("x"=16, "y"=16)
return

View File

@@ -11,7 +11,7 @@
id = "ripley_chassis"
build_path = /obj/item/mecha_parts/chassis/ripley
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 20000)
materials = list(DEFAULT_WALL_MATERIAL = 15000)
/datum/design/item/mechfab/ripley/chassis/firefighter
name = "Firefigher chassis"
@@ -23,35 +23,35 @@
id = "ripley_torso"
build_path = /obj/item/mecha_parts/part/ripley_torso
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 40000, "glass" = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 30000, "glass" = 11250)
/datum/design/item/mechfab/ripley/left_arm
name = "Ripley left arm"
id = "ripley_left_arm"
build_path = /obj/item/mecha_parts/part/ripley_left_arm
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 25000)
materials = list(DEFAULT_WALL_MATERIAL = 18750)
/datum/design/item/mechfab/ripley/right_arm
name = "Ripley right arm"
id = "ripley_right_arm"
build_path = /obj/item/mecha_parts/part/ripley_right_arm
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 25000)
materials = list(DEFAULT_WALL_MATERIAL = 18750)
/datum/design/item/mechfab/ripley/left_leg
name = "Ripley left leg"
id = "ripley_left_leg"
build_path = /obj/item/mecha_parts/part/ripley_left_leg
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 30000)
materials = list(DEFAULT_WALL_MATERIAL = 22500)
/datum/design/item/mechfab/ripley/right_leg
name = "Ripley right leg"
id = "ripley_right_leg"
build_path = /obj/item/mecha_parts/part/ripley_right_leg
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 30000)
materials = list(DEFAULT_WALL_MATERIAL = 22500)
/datum/design/item/mechfab/odysseus
category = "Odysseus"
@@ -61,49 +61,49 @@
id = "odysseus_chassis"
build_path = /obj/item/mecha_parts/chassis/odysseus
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 20000)
materials = list(DEFAULT_WALL_MATERIAL = 15000)
/datum/design/item/mechfab/odysseus/torso
name = "Odysseus torso"
id = "odysseus_torso"
build_path = /obj/item/mecha_parts/part/odysseus_torso
time = 18
materials = list(DEFAULT_WALL_MATERIAL = 25000)
materials = list(DEFAULT_WALL_MATERIAL = 18750)
/datum/design/item/mechfab/odysseus/head
name = "Odysseus head"
id = "odysseus_head"
build_path = /obj/item/mecha_parts/part/odysseus_head
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 7500)
/datum/design/item/mechfab/odysseus/left_arm
name = "Odysseus left arm"
id = "odysseus_left_arm"
build_path = /obj/item/mecha_parts/part/odysseus_left_arm
time = 12
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/mechfab/odysseus/right_arm
name = "Odysseus right arm"
id = "odysseus_right_arm"
build_path = /obj/item/mecha_parts/part/odysseus_right_arm
time = 12
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/mechfab/odysseus/left_leg
name = "Odysseus left leg"
id = "odysseus_left_leg"
build_path = /obj/item/mecha_parts/part/odysseus_left_leg
time = 13
materials = list(DEFAULT_WALL_MATERIAL = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 11250)
/datum/design/item/mechfab/odysseus/right_leg
name = "Odysseus right leg"
id = "odysseus_right_leg"
build_path = /obj/item/mecha_parts/part/odysseus_right_leg
time = 13
materials = list(DEFAULT_WALL_MATERIAL = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 11250)
/datum/design/item/mechfab/gygax
category = "Gygax"
@@ -113,56 +113,56 @@
id = "gygax_chassis"
build_path = /obj/item/mecha_parts/chassis/gygax
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 25000)
materials = list(DEFAULT_WALL_MATERIAL = 18750)
/datum/design/item/mechfab/gygax/torso
name = "Gygax torso"
id = "gygax_torso"
build_path = /obj/item/mecha_parts/part/gygax_torso
time = 30
materials = list(DEFAULT_WALL_MATERIAL = 50000, "glass" = 20000)
materials = list(DEFAULT_WALL_MATERIAL = 37500, "glass" = 15000)
/datum/design/item/mechfab/gygax/head
name = "Gygax head"
id = "gygax_head"
build_path = /obj/item/mecha_parts/part/gygax_head
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 20000, "glass" = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 7500)
/datum/design/item/mechfab/gygax/left_arm
name = "Gygax left arm"
id = "gygax_left_arm"
build_path = /obj/item/mecha_parts/part/gygax_left_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 30000)
materials = list(DEFAULT_WALL_MATERIAL = 22500)
/datum/design/item/mechfab/gygax/right_arm
name = "Gygax right arm"
id = "gygax_right_arm"
build_path = /obj/item/mecha_parts/part/gygax_right_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 30000)
materials = list(DEFAULT_WALL_MATERIAL = 22500)
/datum/design/item/mechfab/gygax/left_leg
name = "Gygax left leg"
id = "gygax_left_leg"
build_path = /obj/item/mecha_parts/part/gygax_left_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 35000)
materials = list(DEFAULT_WALL_MATERIAL = 26250)
/datum/design/item/mechfab/gygax/right_leg
name = "Gygax right leg"
id = "gygax_right_leg"
build_path = /obj/item/mecha_parts/part/gygax_right_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 35000)
materials = list(DEFAULT_WALL_MATERIAL = 26250)
/datum/design/item/mechfab/gygax/armour
name = "Gygax armour plates"
id = "gygax_armour"
build_path = /obj/item/mecha_parts/part/gygax_armour
time = 60
materials = list(DEFAULT_WALL_MATERIAL = 50000, "diamond" = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 37500, "diamond" = 7500)
/datum/design/item/mechfab/durand
category = "Durand"
@@ -172,75 +172,74 @@
id = "durand_chassis"
build_path = /obj/item/mecha_parts/chassis/durand
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 25000)
materials = list(DEFAULT_WALL_MATERIAL = 18750)
/datum/design/item/mechfab/durand/torso
name = "Durand torso"
id = "durand_torso"
build_path = /obj/item/mecha_parts/part/durand_torso
time = 30
materials = list(DEFAULT_WALL_MATERIAL = 55000, "glass" = 20000, "silver" = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 41250, "glass" = 15000, "silver" = 7500)
/datum/design/item/mechfab/durand/head
name = "Durand head"
id = "durand_head"
build_path = /obj/item/mecha_parts/part/durand_head
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 10000, "silver" = 3000)
materials = list(DEFAULT_WALL_MATERIAL = 18750, "glass" = 7500, "silver" = 2250)
/datum/design/item/mechfab/durand/left_arm
name = "Durand left arm"
id = "durand_left_arm"
build_path = /obj/item/mecha_parts/part/durand_left_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000)
materials = list(DEFAULT_WALL_MATERIAL = 26250, "silver" = 2250)
/datum/design/item/mechfab/durand/right_arm
name = "Durand right arm"
id = "durand_right_arm"
build_path = /obj/item/mecha_parts/part/durand_right_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000)
materials = list(DEFAULT_WALL_MATERIAL = 26250, "silver" = 2250)
/datum/design/item/mechfab/durand/left_leg
name = "Durand left leg"
id = "durand_left_leg"
build_path = /obj/item/mecha_parts/part/durand_left_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000)
materials = list(DEFAULT_WALL_MATERIAL = 30000, "silver" = 2250)
/datum/design/item/mechfab/durand/right_leg
name = "Durand right leg"
id = "durand_right_leg"
build_path = /obj/item/mecha_parts/part/durand_right_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000)
materials = list(DEFAULT_WALL_MATERIAL = 30000, "silver" = 2250)
/datum/design/item/mechfab/durand/armour
name = "Durand armour plates"
id = "durand_armour"
build_path = /obj/item/mecha_parts/part/durand_armour
time = 60
materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000)
/datum/design/item/mecha_tracking
name = "Exosuit tracking beacon"
build_type = MECHFAB
time = 5
materials = list(DEFAULT_WALL_MATERIAL = 500)
build_path = /obj/item/mecha_parts/mecha_tracking
category = "Misc"
materials = list(DEFAULT_WALL_MATERIAL = 37500, "uranium" = 7500)
/datum/design/item/mecha
build_type = MECHFAB
category = "Exosuit Equipment"
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/mecha/AssembleDesignDesc()
if(!desc)
desc = "Allows for the construction of \a '[item_name]' exosuit module."
/datum/design/item/mecha/tracking
name = "Exosuit tracking beacon"
id = "mech_tracker"
time = 5
materials = list(DEFAULT_WALL_MATERIAL = 375)
build_path = /obj/item/mecha_parts/mecha_tracking
/datum/design/item/mecha/hydraulic_clamp
name = "Hydraulic clamp"
id = "hydraulic_clamp"
@@ -265,20 +264,20 @@
name = "Flare launcher"
id = "mecha_flare_gun"
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flare
materials = list(DEFAULT_WALL_MATERIAL = 12500)
materials = list(DEFAULT_WALL_MATERIAL = 9375)
/datum/design/item/mecha/sleeper
name = "Sleeper"
id = "mech_sleeper"
build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper
materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 3750, "glass" = 7500)
/datum/design/item/mecha/syringe_gun
name = "Syringe gun"
id = "mech_syringe_gun"
build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000)
materials = list(DEFAULT_WALL_MATERIAL = 2250, "glass" = 1500)
/*
/datum/design/item/mecha/syringe_gun
@@ -292,7 +291,7 @@
name = "Passenger compartment"
id = "mech_passenger"
build_path = /obj/item/mecha_parts/mecha_equipment/tool/passenger
materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 3750, "glass" = 3750)
//obj/item/mecha_parts/mecha_equipment/repair_droid,
//obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING
@@ -352,7 +351,7 @@
desc = "A weapon that violates the Geneva Convention at 6 rounds per minute."
id = "clusterbang_launcher"
req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3)
materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 6000, "uranium" = 6000)
materials = list(DEFAULT_WALL_MATERIAL = 15000, "gold" = 4500, "uranium" = 4500)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
// *** Nonweapon modules
@@ -375,7 +374,7 @@
desc = "An exosuit-mounted rapid construction device."
id = "mech_rcd"
time = 120
materials = list(DEFAULT_WALL_MATERIAL = 30000, "phoron" = 25000, "silver" = 20000, "gold" = 20000)
materials = list(DEFAULT_WALL_MATERIAL = 22500, "phoron" = 18750, "silver" = 15000, "gold" = 15000)
req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4, TECH_ENGINEERING = 4)
build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
@@ -391,7 +390,7 @@
desc = "Automated repair droid, exosuits' best companion. BEEP BOOP"
id = "mech_repair_droid"
req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINEERING = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 1000, "silver" = 2000, "glass" = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "gold" = 750, "silver" = 1500, "glass" = 3750)
build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
/datum/design/item/mecha/phoron_generator
@@ -399,13 +398,13 @@
id = "mech_phoron_generator"
req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINEERING = 2)
build_path = /obj/item/mecha_parts/mecha_equipment/generator
materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "silver" = 375, "glass" = 750)
/datum/design/item/mecha/energy_relay
name = "Energy relay"
id = "mech_energy_relay"
req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "silver" = 3000, "glass" = 2000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "gold" = 1500, "silver" = 2250, "glass" = 1500)
build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
/datum/design/item/mecha/ccw_armor
@@ -413,14 +412,14 @@
desc = "Exosuit close-combat armor booster."
id = "mech_ccw_armor"
req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4)
materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 11250, "silver" = 3750)
build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
/datum/design/item/mecha/proj_armor
desc = "Exosuit projectile armor booster."
id = "mech_proj_armor"
req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING = 3)
materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 15000, "gold" = 3750)
build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
/datum/design/item/mecha/diamond_drill
@@ -428,7 +427,7 @@
desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger."
id = "mech_diamond_drill"
req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "diamond" = 6500)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "diamond" = 4875)
build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
/datum/design/item/mecha/generator_nuclear
@@ -436,7 +435,7 @@
desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy."
id = "mech_generator_nuclear"
req_tech = list(TECH_POWER= 3, TECH_ENGINEERING = 3, TECH_MATERIAL = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "silver" = 375, "glass" = 750)
build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
/datum/design/item/synthetic_flash
@@ -444,6 +443,6 @@
id = "sflash"
req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
build_type = MECHFAB
materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 750)
materials = list(DEFAULT_WALL_MATERIAL = 562, "glass" = 562)
build_path = /obj/item/device/flash/synthetic
category = "Misc"

View File

@@ -49,7 +49,7 @@
//////////////////// Prosthetics ////////////////////
/datum/design/item/prosfab/pros/torso
time = 35
materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 10000, "plasteel" = 2000)
materials = list(DEFAULT_WALL_MATERIAL = 45000, "glass" = 7500, "plasteel" = 1500)
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 3, TECH_DATA = 3) //Saving the values just in case
var/gender = MALE
@@ -72,7 +72,7 @@
id = "pros_head"
build_path = /obj/item/organ/external/head
time = 30
materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 5000, "plasteel" = 1000)
materials = list(DEFAULT_WALL_MATERIAL = 18750, "glass" = 3750, "plasteel" = 750)
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 3, TECH_DATA = 3) //Saving the values just in case
/datum/design/item/prosfab/pros/l_arm
@@ -80,63 +80,63 @@
id = "pros_l_arm"
build_path = /obj/item/organ/external/arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 18000)
materials = list(DEFAULT_WALL_MATERIAL = 13500)
/datum/design/item/prosfab/pros/l_hand
name = "Prosthetic left hand"
id = "pros_l_hand"
build_path = /obj/item/organ/external/hand
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/prosfab/pros/l_leg
name = "Prosthetic left leg"
id = "pros_l_leg"
build_path = /obj/item/organ/external/leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 11250)
/datum/design/item/prosfab/pros/l_foot
name = "Prosthetic left foot"
id = "pros_l_foot"
build_path = /obj/item/organ/external/foot
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/prosfab/pros/r_arm
name = "Prosthetic right arm"
id = "pros_r_arm"
build_path = /obj/item/organ/external/arm/right
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 18000)
materials = list(DEFAULT_WALL_MATERIAL = 13500)
/datum/design/item/prosfab/pros/r_hand
name = "Prosthetic right hand"
id = "pros_r_hand"
build_path = /obj/item/organ/external/hand/right
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/prosfab/pros/r_leg
name = "Prosthetic right leg"
id = "pros_r_leg"
build_path = /obj/item/organ/external/leg/right
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 11250)
/datum/design/item/prosfab/pros/r_foot
name = "Prosthetic right foot"
id = "pros_r_foot"
build_path = /obj/item/organ/external/foot/right
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/prosfab/pros/cell
name = "Prosthetic powercell"
id = "pros_cell"
build_path = /obj/item/organ/internal/cell
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 4000, "plasteel" = 2000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "glass" = 3000, "plasteel" = 1500)
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
/datum/design/item/prosfab/pros/eyes
@@ -144,63 +144,63 @@
id = "pros_eyes"
build_path = /obj/item/organ/internal/eyes/robot
time = 15
materials = list(DEFAULT_WALL_MATERIAL = 7500, "glass" = 7500)
materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 5625)
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
//////////////////// Cyborg Parts ////////////////////
/datum/design/item/prosfab/cyborg
category = "Cyborg Parts"
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 3750)
/datum/design/item/prosfab/cyborg/exoskeleton
name = "Robot exoskeleton"
id = "robot_exoskeleton"
build_path = /obj/item/robot_parts/robot_suit
time = 50
materials = list(DEFAULT_WALL_MATERIAL = 50000)
materials = list(DEFAULT_WALL_MATERIAL = 37500)
/datum/design/item/prosfab/cyborg/torso
name = "Robot torso"
id = "robot_torso"
build_path = /obj/item/robot_parts/chest
time = 35
materials = list(DEFAULT_WALL_MATERIAL = 40000)
materials = list(DEFAULT_WALL_MATERIAL = 30000)
/datum/design/item/prosfab/cyborg/head
name = "Robot head"
id = "robot_head"
build_path = /obj/item/robot_parts/head
time = 35
materials = list(DEFAULT_WALL_MATERIAL = 25000)
materials = list(DEFAULT_WALL_MATERIAL = 18750)
/datum/design/item/prosfab/cyborg/l_arm
name = "Robot left arm"
id = "robot_l_arm"
build_path = /obj/item/robot_parts/l_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 18000)
materials = list(DEFAULT_WALL_MATERIAL = 13500)
/datum/design/item/prosfab/cyborg/r_arm
name = "Robot right arm"
id = "robot_r_arm"
build_path = /obj/item/robot_parts/r_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 18000)
materials = list(DEFAULT_WALL_MATERIAL = 13500)
/datum/design/item/prosfab/cyborg/l_leg
name = "Robot left leg"
id = "robot_l_leg"
build_path = /obj/item/robot_parts/l_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 11250)
/datum/design/item/prosfab/cyborg/r_leg
name = "Robot right leg"
id = "robot_r_leg"
build_path = /obj/item/robot_parts/r_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000)
materials = list(DEFAULT_WALL_MATERIAL = 11250)
//////////////////// Cyborg Internals ////////////////////
@@ -208,7 +208,7 @@
category = "Cyborg Internals"
build_type = PROSFAB
time = 12
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/prosfab/cyborg/component/binary_communication_device
name = "Binary communication device"
@@ -246,7 +246,7 @@
category = "Cyborg Modules"
build_type = PROSFAB
time = 12
materials = list(DEFAULT_WALL_MATERIAL = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500)
/datum/design/item/prosfab/robot_upgrade/rename
name = "Rename module"
@@ -264,28 +264,28 @@
name = "Emergency restart module"
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
id = "borg_restart_module"
materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 45000, "glass" = 3750)
build_path = /obj/item/borg/upgrade/restart
/datum/design/item/prosfab/robot_upgrade/vtec
name = "VTEC module"
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
id = "borg_vtec_module"
materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000)
materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 4500, "gold" = 3750)
build_path = /obj/item/borg/upgrade/vtec
/datum/design/item/prosfab/robot_upgrade/tasercooler
name = "Rapid taser cooling module"
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
id = "borg_taser_module"
materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500)
materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 4500, "gold" = 1500, "diamond" = 375)
build_path = /obj/item/borg/upgrade/tasercooler
/datum/design/item/prosfab/robot_upgrade/jetpack
name = "Jetpack module"
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
id = "borg_jetpack_module"
materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "phoron" = 11250, "uranium" = 15000)
build_path = /obj/item/borg/upgrade/jetpack
/datum/design/item/prosfab/robot_upgrade/syndicate
@@ -293,5 +293,5 @@
desc = "Allows for the construction of lethal upgrades for cyborgs."
id = "borg_syndicate_module"
req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000)
materials = list(DEFAULT_WALL_MATERIAL = 7500, "glass" = 11250, "diamond" = 7500)
build_path = /obj/item/borg/upgrade/syndicate

View File

@@ -40,7 +40,7 @@
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/E = tool
user.visible_message("<span class='notice'>[user] has attached [target]'s [E.name] to the [E.amputation_point].</span>>", \
user.visible_message("<span class='notice'>[user] has attached [target]'s [E.name] to the [E.amputation_point].</span>", \
"<span class='notice'>You have attached [target]'s [E.name] to the [E.amputation_point].</span>")
user.drop_from_inventory(E)
E.replaced(target)

View File

@@ -126,6 +126,7 @@
spawn(30)
icon_state = "scanner_0old"
qdel(occupant)
occupant = null //If qdel's being slow or acting up, let's make sure we can't make more cores from this one.
inuse = 0
eject_contents()
update_light_color()

View File

@@ -99,6 +99,7 @@
/obj/machinery/xenobio/proc/finished_task()
active = 0
in_use = 0
if(failed_task)
failed_task = 0
visible_message("\icon[src] [src] pings unhappily, flashing a red warning light.")
@@ -332,7 +333,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "xenobio_editor.tmpl", "Biological Genetic Bombarder UI", 470, 450)
ui = new(user, src, ui_key, "xenobio_editor.tmpl", "biological genetic bombarder UI", 470, 450)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
@@ -375,21 +376,21 @@
/obj/machinery/xenobio/editor/proc/move_into_editor(var/mob/user,var/mob/living/victim)
if(src.occupant)
user << "<span class='danger'>The biological genetic bombarder is full, empty it first!</span>"
user << "<span class='danger'>The [src] is full, empty it first!</span>"
return
if(in_use)
user << "<span class='danger'>The biological genetic bombarder is locked and running, wait for it to finish.</span>"
user << "<span class='danger'>The [src] is locked and running, wait for it to finish.</span>"
return
if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) )
user << "<span class='danger'>This is not a suitable subject for the biological genetic bombarder!</span>"
user << "<span class='danger'>This is not a suitable subject for the [src]!</span>"
return
user.visible_message("<span class='danger'>[user] starts to put [victim] into the biological genetic bombarder!</span>")
user.visible_message("<span class='danger'>[user] starts to put [victim] into the [src]!</span>")
src.add_fingerprint(user)
if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant)
user.visible_message("<span class='danger'>[user] stuffs [victim] into the biological genetic bombarder!</span>")
user.visible_message("<span class='danger'>[user] stuffs [victim] into the [src]!</span>")
if(victim.client)
victim.client.perspective = EYE_PERSPECTIVE
victim.client.eye = src

View File

@@ -67,19 +67,20 @@
src.occupant = victim
/obj/machinery/xenobio2/manualinjector/proc/eject_contents()
for(var/obj/thing in (contents - component_parts - circuit - beaker))
thing.forceMove(loc)
eject_xeno()
eject_beaker()
return
/obj/machinery/xenobio2/manualinjector/proc/eject_xeno()
if(occupant)
occupant.forceMove(loc)
occupant = null
return
/obj/machinery/xenobio2/manualinjector/proc/eject_beaker()
if(beaker)
var/obj/item/weapon/reagent_containers/glass/beaker/B = beaker
B.loc = loc
beaker = null
return
/obj/machinery/xenobio2/manualinjector/proc/inject_reagents()
if(!occupant)

View File

@@ -99,7 +99,7 @@
injector.inject_reagents()
active = 0
if(href_list["eject_occupant"])
injector.eject_contents()
injector.eject_xeno()
if(href_list["eject_beaker"])
injector.eject_beaker()

View File

@@ -73,12 +73,14 @@
icon_state = "restruct_1"
spawn(30)
var/mob/living/simple_animal/xeno/slime/S = new(src)
S.traitdat = core.traits
S.traitdat = new() //New instance, so that if the core is deleted, the slime retains a trait datum.
S.nameVar = core.nameVar
S.name = "[S.nameVar] baby slime"
core.traits.copy_traits(S.traitdat)
S.ProcessTraits()
qdel(core)
spawn(30)
qdel(core)
core = null //If qdel's being a bit slow or acting up, let's just make sure we can't clone the core.
inuse = 0
eject_slime()
icon_state = "restruct_0"

View File

@@ -24,7 +24,23 @@ Slime specific procs go here.
traitdat.traits[TRAIT_XENO_CANLEARN] = prob(68)
traitdat.traits[TRAIT_XENO_SPEED] = round(rand(-10,10))
/mob/living/simple_animal/xeno/slime/RandomChemicals()
..()
if(prob(40))
var/hasMutToxin
for(var/R in traitdat.chems)
if(R == "mutationtoxin")
hasMutToxin = 1
var/chemamount
if(hasMutToxin)
var/list/chemchoices = (xenoChemList - traitdat.chems)
var/chemtype = pick(chemchoices)
chemamount = rand(1,5)
traitdat.chems[chemtype] = chemamount
else
chemamount = rand(1,5)
traitdat.chems["mutationtoxin"] = chemamount
/mob/living/simple_animal/xeno/slime/proc/GrowUp()
GenerateAdult()

View File

@@ -4,6 +4,7 @@ Slime definitions, Life and New live here.
/mob/living/simple_animal/xeno/slime //Adult values are found here
nameVar = "grey" //When mutated, nameVar might change.
desc = "A shifting, mass of goo."
faction = "slime"
speak_emote = list("garbles", "chirps", "blurbles")
colored = 1
color = "#CACACA"
@@ -68,6 +69,7 @@ Slime definitions, Life and New live here.
"toxin" = list("toxic" = 0.5),
"carpotoxin" = list("toxic" = 1, "mut" = 1.5),
"phoron" = list("toxic" = 1.5, "mut" = 0.03),
"virusfood" = list("nutr" = 1.5, "mut" = 0.32),
"cyanide" = list("toxic" = 3.5),
"slimejelly" = list("nutr" = 0.5),
"amutationtoxin" = list("toxic" = 0.1, "heal" = 1.5, "mut" = 3),

View File

@@ -8,6 +8,7 @@ Also includes Life and New
/mob/living/simple_animal/xeno
name = "Xeno"
real_name = "Xeno"
faction = "xeno" //Needs to be set.
desc = "Something's broken, yell at someone."
melee_damage_lower = 0
melee_damage_upper = 0
@@ -46,33 +47,32 @@ Also includes Life and New
//Life additions
/mob/living/simple_animal/xeno/Life()
if(src.stat == DEAD)
return 0
if(stasis)
stasis--
if(stasis < 0)
stasis = 0
return 0
..()
handle_reagents()
if((mut_level >= mut_max) && !(mutable & NOMUT))
Mutate()
mut_level -= mut_max
if(!(stat == DEAD))
handle_reagents()
if((mut_level >= mut_max) && !(mutable & NOMUT))
Mutate()
mut_level -= mut_max
ProcessSpeechBuffer()
ProcessSpeechBuffer()
//Have to feed the xenos somehow.
if(nutrition < 0)
nutrition = 0
if((nutrition > 0 ) && traitdat.traits[TRAIT_XENO_EATS])
if(nutrition >= 300)
nutrition -= hunger_factor
else
if(traitdat.traits[TRAIT_XENO_EATS])
health = starve_damage
//Have to feed the xenos somehow.
if(nutrition < 0)
nutrition = 0
if((nutrition > 0 ) && traitdat.traits[TRAIT_XENO_EATS])
if(nutrition >= 300)
nutrition -= hunger_factor
else
if(traitdat.traits[TRAIT_XENO_EATS])
health = starve_damage
return 1 //Everything worked okay.
return 1 //Everything worked okay.
/mob/living/simple_animal/xeno/New()
@@ -94,4 +94,8 @@ Also includes Life and New
if(!health)
stat = DEAD
/mob/living/simple_animal/xeno/Destroy()
traitdat.Destroy() //Let's clean up after ourselves.
traitdat = null
..()

View File

@@ -10,4 +10,9 @@ Xenobiological product lives here as a basic type.
var/source = "Unknown"
var/product = "mess"
var/nameVar = "blah"
/obj/item/xenoproduct/Destroy()
traits.Destroy() //Let's not leave any traits hanging around.
traits = null
..()