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()
@@ -264,18 +267,27 @@
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

@@ -54,3 +54,7 @@
name = "Thong"
icon_state = "thong"
has_color = TRUE
/datum/category_item/underwear/bottom/fishnet_lower
name = "Fishnets"
icon_state = "fishnet_lower"

View File

@@ -41,3 +41,15 @@
name = "Halterneck bra"
icon_state = "halterneck_bra"
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."
@@ -823,3 +1010,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
return
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."

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
@@ -86,3 +76,39 @@
amount -= i
SC.adjust_worth(i, 0)
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 = ""
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) "
if(target in admins)
admin_stuff += "/([key])"
if(!send && (target in admins) && target.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
send = 1
prefix = "(R)"
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 << "<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

@@ -6,10 +6,3 @@
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()
@@ -95,3 +95,7 @@ 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

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

View File

@@ -53,6 +53,40 @@
-->
<div class="commit sansserif">
<h2 class="date">14 June 2016</h2>
<h3 class="author">Arokha updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds video-calls on communicators for existing calls</li>
<li class="rscadd">Adds a 'decline' to incoming communicator calls</li>
<li class="rscadd">New wallets that let you color them how you want</li>
<li class="bugfix">Fixes communicators being able to hear speech</li>
<li class="bugfix">Fixes deadcalls to communicators</li>
<li class="bugfix">Fixed dropping head/foot/glove items on limb loss</li>
<li class="bugfix">Suit coolers inside mecha now work</li>
<li class="bugfix">Fixed printing '1' to world over and over</li>
<li class="bugfix">Made mech tracking beacon constructable again</li>
<li class="tweak">Change how emotes and LOOC propogate to nearby people</li>
<li class="tweak">Rewrote how get_mobs_and_objs_in_view_fast works</li>
<li class="tweak">Can now see through the red external airlock doors</li>
</ul>
<h3 class="author">Datraen updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Adds a chance for slimes to get mutation toxin for creation of prometheans (40%).</li>
<li class="bugfix">Simple animals outside of the hostile subtype won't follow you as a zombie.</li>
<li class="bugfix">Xeno hostility is more apparent now.</li>
<li class="bugfix">Slime cores can no longer create twice as many slimes through an exploit.</li>
</ul>
<h3 class="author">GinjaNinja32 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Rewrote drinking glasses. There are now eight types of glass, and drink appearance is based on color and the type of glass you put it in.</li>
<li class="rscadd">There are now 'glass extras' you can add to drinks. Straws, drink sticks, and fruit slices (yes, all of them) all work. You can add up to two extras per glass. Add extras by clicking the glass with the extra, remove by clicking the glass with an empty hand while it's in your other hand.</li>
<li class="rscadd">Adding 'fizzy' things (soda water, cola, etc) or ice to a drink will make it be fizzy or have ice floating in it.</li>
</ul>
<h3 class="author">Yoshax updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Everything produced in Robotics is now 25% cheaper to produce.</li>
</ul>
<h2 class="date">08 June 2016</h2>
<h3 class="author">Yoshax updated:</h3>
<ul class="changes bgimages16">

View File

@@ -2388,3 +2388,34 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
cabinets, consoles, fax machines, etc. This applies to all bullets.
- maptweak: The research outpost toxins department now has reinforced phoron windows.
- bugfix: Spears now do their correct damage instead of doing around half.
2016-06-14:
Arokha:
- rscadd: Adds video-calls on communicators for existing calls
- rscadd: Adds a 'decline' to incoming communicator calls
- rscadd: New wallets that let you color them how you want
- bugfix: Fixes communicators being able to hear speech
- bugfix: Fixes deadcalls to communicators
- bugfix: Fixed dropping head/foot/glove items on limb loss
- bugfix: Suit coolers inside mecha now work
- bugfix: Fixed printing '1' to world over and over
- bugfix: Made mech tracking beacon constructable again
- tweak: Change how emotes and LOOC propogate to nearby people
- tweak: Rewrote how get_mobs_and_objs_in_view_fast works
- tweak: Can now see through the red external airlock doors
Datraen:
- tweak: Adds a chance for slimes to get mutation toxin for creation of prometheans
(40%).
- bugfix: Simple animals outside of the hostile subtype won't follow you as a zombie.
- bugfix: Xeno hostility is more apparent now.
- bugfix: Slime cores can no longer create twice as many slimes through an exploit.
GinjaNinja32:
- rscadd: Rewrote drinking glasses. There are now eight types of glass, and drink
appearance is based on color and the type of glass you put it in.
- rscadd: There are now 'glass extras' you can add to drinks. Straws, drink sticks,
and fruit slices (yes, all of them) all work. You can add up to two extras per
glass. Add extras by clicking the glass with the extra, remove by clicking the
glass with an empty hand while it's in your other hand.
- rscadd: Adding 'fizzy' things (soda water, cola, etc) or ice to a drink will make
it be fizzy or have ice floating in it.
Yoshax:
- tweak: Everything produced in Robotics is now 25% cheaper to produce.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 17 KiB

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