Merge remote-tracking branch 'Meghan-Rossi/master' into job_description_alt

This commit is contained in:
Meghan-Rossi
2020-03-04 19:07:37 +00:00
230 changed files with 3301 additions and 1129 deletions

View File

@@ -39,7 +39,7 @@ var/datum/antagonist/loyalists/loyalists
return
global_objectives = list()
for(var/mob/living/carbon/human/player in mob_list)
if(!player.mind || player.stat==2 || !(player.mind.assigned_role in command_positions))
if(!player.mind || player.stat==2 || !(SSjob.is_job_in_department(player.mind.assigned_role, DEPARTMENT_COMMAND)))
continue
var/datum/objective/protect/loyal_obj = new
loyal_obj.target = player.mind

View File

@@ -42,7 +42,7 @@ var/datum/antagonist/revolutionary/revs
return
global_objectives = list()
for(var/mob/living/carbon/human/player in mob_list)
if(!player.mind || player.stat==2 || !(player.mind.assigned_role in command_positions))
if(!player.mind || player.stat==2 || !(SSjob.is_job_in_department(player.mind.assigned_role, DEPARTMENT_COMMAND)))
continue
var/datum/objective/rev/rev_obj = new
rev_obj.target = player.mind

View File

@@ -4,7 +4,8 @@
/datum/job/assistant
title = "Assistant"
flag = ASSISTANT
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
sorting_order = -1
department_flag = CIVILIAN
faction = "Station"
total_positions = -1

View File

@@ -7,7 +7,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
/datum/job/captain
title = "Colony Director"
flag = CAPTAIN
department = "Command"
departments = list(DEPARTMENT_COMMAND)
sorting_order = 3 // Above everyone.
head_position = 1
department_flag = ENGSEC
faction = "Station"
@@ -58,7 +59,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
/datum/job/hop
title = "Head of Personnel"
flag = HOP
department = "Command"
departments = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_COMMAND)
sorting_order = 2 // Above the QM, below captain.
head_position = 1
department_flag = CIVILIAN
faction = "Station"
@@ -106,7 +108,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
/datum/job/secretary
title = "Command Secretary"
flag = BRIDGE
department = "Command"
departments = list(DEPARTMENT_COMMAND)
head_position = 1
department_flag = CIVILIAN
faction = "Station"

View File

@@ -7,7 +7,7 @@
/datum/job/bartender
title = "Bartender"
flag = BARTENDER
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
@@ -38,7 +38,7 @@
/datum/job/chef
title = "Chef"
flag = CHEF
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
@@ -67,7 +67,7 @@
/datum/job/hydro
title = "Botanist"
flag = BOTANIST
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
@@ -96,7 +96,8 @@
/datum/job/qm
title = "Quartermaster"
flag = QUARTERMASTER
department = "Cargo"
departments = list(DEPARTMENT_CARGO)
sorting_order = 1 // QM is above the cargo techs, but below the HoP.
head_position = 1
department_flag = CIVILIAN
faction = "Station"
@@ -127,7 +128,7 @@
/datum/job/cargo_tech
title = "Cargo Technician"
flag = CARGOTECH
department = "Cargo"
departments = list(DEPARTMENT_CARGO)
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
@@ -152,7 +153,7 @@
/datum/job/mining
title = "Shaft Miner"
flag = MINER
department = "Cargo"
departments = list(DEPARTMENT_CARGO)
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
@@ -182,7 +183,7 @@
/datum/job/janitor
title = "Janitor"
flag = JANITOR
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
@@ -210,7 +211,7 @@
/datum/job/librarian
title = "Librarian"
flag = LIBRARIAN
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
@@ -244,7 +245,7 @@
/datum/job/lawyer
title = "Internal Affairs Agent"
flag = LAWYER
department = "Internal Affairs"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 2

View File

@@ -2,7 +2,7 @@
/datum/job/chaplain
title = "Chaplain"
flag = CHAPLAIN
department = "Civilian"
departments = list(DEPARTMENT_CIVILIAN)
department_flag = CIVILIAN
faction = "Station"
total_positions = 1

View File

@@ -0,0 +1,79 @@
// A datum that holds information about a specific department.
// It is held inside, and managed by, the SSjob subsystem automatically,
// just define a department, and put that department's name in one or more job datums' departments list.
/datum/department
var/name = "NOPE" // Name used in UIs, and the index for the department assoc list in SSjob.
var/short_name = "NO" // Shorter name, used for things like external Topic() responses.
var/color = "#000000" // Color to use in UIs to represent this department.
var/list/jobs = list() // Assoc list. Key is the job title, and the value is a reference to the job datum. Populated by SSjob subsystem.
var/sorting_order = 0 // Used to sort departments, e.g. Command always being on top.
var/visible = TRUE // If false, it should not show up on things like the manifest or ID computer.
var/assignable = TRUE // Similar for above, but only for ID computers and such. Used for silicon department.
var/centcom_only = FALSE
/datum/department/command
name = DEPARTMENT_COMMAND
short_name = "Heads"
color = "#3333FF"
sorting_order = 10
/datum/department/security
name = DEPARTMENT_SECURITY
short_name = "Sec"
color = "#8E0000"
sorting_order = 6
/datum/department/engineering
name = DEPARTMENT_ENGINEERING
short_name = "Eng"
color = "#B27300"
sorting_order = 5
/datum/department/medical
name = DEPARTMENT_MEDICAL
short_name = "Med"
color = "#006600"
sorting_order = 4
/datum/department/research
name = DEPARTMENT_RESEARCH
short_name = "Sci"
color = "#A65BA6"
sorting_order = 3
/datum/department/cargo
name = DEPARTMENT_CARGO
short_name = "Car"
color = "#BB9040"
sorting_order = 2
/datum/department/civilian
name = DEPARTMENT_CIVILIAN
short_name = "Civ"
color = "#A32800"
sorting_order = 1
// Mostly for if someone wanted to rewrite manifest code to be map-agnostic.
/datum/department/misc
name = "Miscellaneous"
short_name = "Misc"
color = "#666666"
sorting_order = 0
assignable = FALSE
/datum/department/synthetic
name = DEPARTMENT_SYNTHETIC
short_name = "Bot"
color = "#222222"
sorting_order = -1
assignable = FALSE
// This one isn't very useful since no real centcom jobs exist yet.
// Instead the jobs like ERT are hardcoded in.
/datum/department/centcom
name = "Central Command"
short_name = "Centcom"
color = "#A52A2A"
sorting_order = 20 // Above Command.
centcom_only = TRUE

View File

@@ -5,7 +5,8 @@
title = "Chief Engineer"
flag = CHIEF
head_position = 1
department = "Engineering"
departments = list(DEPARTMENT_ENGINEERING, DEPARTMENT_COMMAND)
sorting_order = 2
department_flag = ENGSEC
faction = "Station"
total_positions = 1
@@ -44,7 +45,7 @@
/datum/job/engineer
title = "Station Engineer"
flag = ENGINEER
department = "Engineering"
departments = list(DEPARTMENT_ENGINEERING)
department_flag = ENGSEC
faction = "Station"
total_positions = 5
@@ -88,7 +89,7 @@
/datum/job/atmos
title = "Atmospheric Technician"
flag = ATMOSTECH
department = "Engineering"
departments = list(DEPARTMENT_ENGINEERING)
department_flag = ENGSEC
faction = "Station"
total_positions = 3

View File

@@ -16,8 +16,10 @@
var/list/alt_titles = list() // List of alternate titles; if a job has alt-titles, it MUST have one for the base job
var/req_admin_notify // If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/minimal_player_age = 0 // If you have use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
var/department = null // Does this position have a department tag?
var/list/departments = list() // List of departments this job belongs to, if any. The first one on the list will be the 'primary' department.
var/sorting_order = 0 // Used for sorting jobs so boss jobs go above regular ones, and their boss's boss is above that. Higher numbers = higher in sorting.
var/head_position = 0 // Is this position Command?
var/assignable = TRUE // Should it show up on things like the ID computer?
var/minimum_character_age = 0
var/ideal_character_age = 30
var/has_headset = TRUE //Do people with this job need to be given headsets and told how to use them? E.g. Cyborgs don't.

View File

@@ -5,7 +5,8 @@
title = "Chief Medical Officer"
flag = CMO
head_position = 1
department = "Medical"
departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_COMMAND)
sorting_order = 2
department_flag = MEDSCI
faction = "Station"
total_positions = 1
@@ -41,7 +42,7 @@
/datum/job/doctor
title = "Medical Doctor"
flag = DOCTOR
department = "Medical"
departments = list(DEPARTMENT_MEDICAL)
department_flag = MEDSCI
faction = "Station"
total_positions = 5
@@ -98,7 +99,7 @@
/datum/job/chemist
title = "Chemist"
flag = CHEMIST
department = "Medical"
departments = list(DEPARTMENT_MEDICAL)
department_flag = MEDSCI
faction = "Station"
total_positions = 2
@@ -130,7 +131,7 @@
/datum/job/geneticist
title = "Geneticist"
flag = GENETICIST
department = "Medical"
departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_RESEARCH)
department_flag = MEDSCI
faction = "Station"
total_positions = 0
@@ -156,7 +157,7 @@
/datum/job/psychiatrist
title = "Psychiatrist"
flag = PSYCHIATRIST
department = "Medical"
departments = list(DEPARTMENT_MEDICAL)
department_flag = MEDSCI
faction = "Station"
total_positions = 1
@@ -187,7 +188,7 @@
/datum/job/paramedic
title = "Paramedic"
flag = PARAMEDIC
department = "Medical"
departments = list(DEPARTMENT_MEDICAL)
department_flag = MEDSCI
faction = "Station"
total_positions = 2

View File

@@ -5,7 +5,8 @@
title = "Research Director"
flag = RD
head_position = 1
department = "Science"
departments = list(DEPARTMENT_RESEARCH, DEPARTMENT_COMMAND)
sorting_order = 2
department_flag = MEDSCI
faction = "Station"
total_positions = 1
@@ -47,7 +48,7 @@
/datum/job/scientist
title = "Scientist"
flag = SCIENTIST
department = "Science"
departments = list(DEPARTMENT_RESEARCH)
department_flag = MEDSCI
faction = "Station"
total_positions = 5
@@ -93,7 +94,7 @@
/datum/job/xenobiologist
title = "Xenobiologist"
flag = XENOBIOLOGIST
department = "Science"
departments = list(DEPARTMENT_RESEARCH)
department_flag = MEDSCI
faction = "Station"
total_positions = 3
@@ -126,7 +127,7 @@
/datum/job/roboticist
title = "Roboticist"
flag = ROBOTICIST
department = "Science"
departments = list(DEPARTMENT_RESEARCH)
department_flag = MEDSCI
faction = "Station"
total_positions = 2

View File

@@ -5,7 +5,8 @@
title = "Head of Security"
flag = HOS
head_position = 1
department = "Security"
departments = list(DEPARTMENT_SECURITY, DEPARTMENT_COMMAND)
sorting_order = 2
department_flag = ENGSEC
faction = "Station"
total_positions = 1
@@ -47,7 +48,8 @@
/datum/job/warden
title = "Warden"
flag = WARDEN
department = "Security"
departments = list(DEPARTMENT_SECURITY)
sorting_order = 1
department_flag = ENGSEC
faction = "Station"
total_positions = 1
@@ -75,7 +77,7 @@
/datum/job/detective
title = "Detective"
flag = DETECTIVE
department = "Security"
departments = list(DEPARTMENT_SECURITY)
department_flag = ENGSEC
faction = "Station"
total_positions = 2
@@ -107,7 +109,7 @@
/datum/job/officer
title = "Security Officer"
flag = OFFICER
department = "Security"
departments = list(DEPARTMENT_SECURITY)
department_flag = ENGSEC
faction = "Station"
total_positions = 4

View File

@@ -4,6 +4,8 @@
/datum/job/ai
title = "AI"
flag = AI
departments = list(DEPARTMENT_SYNTHETIC)
sorting_order = 1 // Be above their borgs.
department_flag = ENGSEC
faction = "Station"
total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm
@@ -15,6 +17,7 @@
account_allowed = 0
economic_modifier = 0
has_headset = FALSE
assignable = FALSE
outfit_type = /decl/hierarchy/outfit/job/silicon/ai
job_description = "The AI oversees the operation of the station and its crew, but has no real authority over them. \
The AI is required to follow its Laws, and Lawbound Synthetics that are linked to it are expected to follow \
@@ -43,6 +46,7 @@
/datum/job/cyborg
title = "Cyborg"
flag = CYBORG
departments = list(DEPARTMENT_SYNTHETIC)
department_flag = ENGSEC
faction = "Station"
total_positions = 2
@@ -53,6 +57,7 @@
account_allowed = 0
economic_modifier = 0
has_headset = FALSE
assignable = FALSE
outfit_type = /decl/hierarchy/outfit/job/silicon/cyborg
job_description = "A Cyborg is a mobile station synthetic, piloted by a cybernetically preserved brain. It is considered a person, but is still required \
to follow its Laws."

View File

@@ -114,7 +114,7 @@ var/global/datum/controller/occupations/job_master
if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring!
continue
if(job.title in command_positions) //If you want a command position, select it!
if(SSjob.is_job_in_department(job.title, DEPARTMENT_COMMAND)) //If you want a command position, select it!
continue
if(jobban_isbanned(player, job.title))
@@ -144,7 +144,7 @@ var/global/datum/controller/occupations/job_master
///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
proc/FillHeadPosition()
for(var/level = 1 to 3)
for(var/command_position in command_positions)
for(var/command_position in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND))
var/datum/job/job = GetJob(command_position)
if(!job) continue
var/list/candidates = FindOccupationCandidates(job, level)
@@ -184,7 +184,7 @@ var/global/datum/controller/occupations/job_master
///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
proc/CheckHeadPositions(var/level)
for(var/command_position in command_positions)
for(var/command_position in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND))
var/datum/job/job = GetJob(command_position)
if(!job) continue
var/list/candidates = FindOccupationCandidates(job, level)
@@ -422,9 +422,9 @@ var/global/datum/controller/occupations/job_master
log_game("JOINED [key_name(H)] as \"[rank]\"")
// If they're head, give them the account info for their department
if(H.mind && job.head_position)
if(H.mind && job.head_position && LAZYLEN(job.departments))
var/remembered_info = ""
var/datum/money_account/department_account = department_accounts[job.department]
var/datum/money_account/department_account = department_accounts[job.departments[1]]
if(department_account)
remembered_info += "<b>Your department's account number is:</b> #[department_account.account_number]<br>"

View File

@@ -44,91 +44,8 @@ var/const/CHAPLAIN =(1<<10)
var/const/ASSISTANT =(1<<11)
var/const/BRIDGE =(1<<12)
var/list/assistant_occupations = list(
)
var/list/command_positions = list(
"Colony Director",
"Head of Personnel",
"Head of Security",
"Chief Engineer",
"Research Director",
"Chief Medical Officer",
"Command Secretary"
)
var/list/engineering_positions = list(
"Chief Engineer",
"Station Engineer",
"Atmospheric Technician",
)
var/list/medical_positions = list(
"Chief Medical Officer",
"Medical Doctor",
"Geneticist",
"Psychiatrist",
"Chemist",
"Paramedic"
)
var/list/science_positions = list(
"Research Director",
"Scientist",
"Geneticist", //Part of both medical and science
"Roboticist",
"Xenobiologist"
)
//BS12 EDIT
var/list/cargo_positions = list(
"Quartermaster",
"Cargo Technician",
"Shaft Miner"
)
var/list/civilian_positions = list(
"Head of Personnel",
"Bartender",
"Botanist",
"Chef",
"Janitor",
"Librarian",
"Lawyer",
"Chaplain",
"Assistant"
)
var/list/security_positions = list(
"Head of Security",
"Warden",
"Detective",
"Security Officer"
)
var/list/planet_positions = list(
"Explorer",
"Pilot",
"Search and Rescue"
)
var/list/nonhuman_positions = list(
"AI",
"Cyborg",
"pAI"
)
/proc/guest_jobbans(var/job)
return ((job in command_positions) || (job in nonhuman_positions) || (job in security_positions))
return ( (job in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) || (job in SSjob.get_job_titles_in_department(DEPARTMENT_SYNTHETIC)) || (job in SSjob.get_job_titles_in_department(DEPARTMENT_SECURITY)) )
/proc/get_job_datums()
var/list/occupations = list()

View File

@@ -1,7 +1,7 @@
/obj/machinery/ai_slipper
name = "\improper AI Liquid Dispenser"
icon = 'icons/obj/device.dmi'
icon_state = "motion0"
icon_state = "liquid_dispenser"
anchored = 1.0
use_power = 1
idle_power_usage = 10
@@ -24,9 +24,9 @@
/obj/machinery/ai_slipper/update_icon()
if(stat & NOPOWER || stat & BROKEN)
icon_state = "motion0"
icon_state = "liquid_dispenser"
else
icon_state = disabled ? "motion0" : "motion3"
icon_state = disabled ? "liquid_dispenser" : "liquid_dispenser_on"
/obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses)
disabled = disabled

View File

@@ -841,7 +841,7 @@
var/chancetokill = 30*traitors_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 traitorss, 2 crew is 50% chance
if(prob(chancetokill))
var/deadguy = remove_crewmember()
eventdat += "<br>The traitor[trait2 ? "s":""] run[trait2 ? "":"s"] up to [deadguy] and murder them!"
eventdat += "<br>The traitor[trait2 ? "s":""] run[trait2 ? "":"s"] up to [deadguy] and murder[trait2 ? "" : "s"] them!"
else
eventdat += "<br>You valiantly fight off the traitor[trait2 ? "s":""]!"
eventdat += "<br>You cut the traitor[trait2 ? "s":""] up into meat... Eww"

View File

@@ -101,17 +101,18 @@
data["centcom_access"] = is_centcom()
data["all_centcom_access"] = null
data["regions"] = null
data["id_rank"] = modify && modify.assignment ? modify.assignment : "Unassigned"
data["jobs"] = list(
list("cat" = "Engineering", "jobs" = format_jobs(engineering_positions)),
list("cat" = "Medical", "jobs" = format_jobs(medical_positions)),
list("cat" = "Science", "jobs" = format_jobs(science_positions)),
list("cat" = "Security", "jobs" = format_jobs(security_positions)),
list("cat" = "Cargo", "jobs" = format_jobs(cargo_positions)),
list("cat" = "Planetside", "jobs" = format_jobs(planet_positions)),
list("cat" = "Civilian", "jobs" = format_jobs(civilian_positions)),
list("cat" = "CentCom", "jobs" = format_jobs(get_all_centcom_jobs()))
)
var/list/departments = list()
for(var/D in SSjob.get_all_department_datums())
var/datum/department/dept = D
if(!dept.assignable) // No AI ID cards for you.
continue
if(dept.centcom_only && !is_centcom())
continue
departments[++departments.len] = list("department_name" = dept.name, "jobs" = format_jobs(SSjob.get_job_titles_in_department(dept.name)) )
data["departments"] = departments
if (modify && is_centcom())
var/list/all_centcom_access = list()
@@ -208,16 +209,10 @@
if(is_centcom())
access = get_centcom_access(t1)
else
var/datum/job/jobdatum
for(var/jobtype in typesof(/datum/job))
var/datum/job/J = new jobtype
if(ckey(J.title) == ckey(t1))
jobdatum = J
break
var/datum/job/jobdatum = SSjob.get_job(t1)
if(!jobdatum)
to_chat(usr, "<span class='warning'>No log exists for this job: [t1]</span>")
return
access = jobdatum.get_access()
modify.access = access

View File

@@ -15,6 +15,7 @@
var/backup_author = ""
var/icon/backup_img = null
var/icon/backup_caption = ""
var/post_time = 0
/datum/feed_channel
var/channel_name=""
@@ -78,6 +79,7 @@
newMsg.body = msg
newMsg.time_stamp = "[stationtime2text()]"
newMsg.is_admin_message = adminMessage
newMsg.post_time = round_duration_in_ticks // Should be almost universally unique
if(message_type)
newMsg.message_type = message_type
if(photo)

View File

@@ -10,7 +10,7 @@
active_power_usage = 40000 //40 kW
var/efficiency = 40000 //will provide the modified power rate when upgraded
var/obj/item/charging = null
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash)
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit)
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
@@ -72,7 +72,7 @@
if(EW.use_external_power)
to_chat(user, "<span class='notice'>\The [EW] has no recharge port.</span>")
return
else if(!G.get_cell())
if(!G.get_cell())
to_chat(user, "\The [G] does not have a battery installed.")
return
@@ -125,27 +125,6 @@
update_use_power(1)
icon_state = icon_state_idle
else
if(istype(charging, /obj/item/modular_computer))
var/obj/item/modular_computer/C = charging
if(!C.battery_module.battery.fully_charged())
icon_state = icon_state_charging
C.battery_module.battery.give(CELLRATE*efficiency)
update_use_power(2)
else
icon_state = icon_state_charged
update_use_power(1)
return
else if(istype(charging, /obj/item/weapon/computer_hardware/battery_module))
var/obj/item/weapon/computer_hardware/battery_module/BM = charging
if(!BM.battery.fully_charged())
icon_state = icon_state_charging
BM.battery.give(CELLRATE*efficiency)
update_use_power(2)
else
icon_state = icon_state_charged
update_use_power(1)
return
var/obj/item/weapon/cell/C = charging.get_cell()
if(istype(C))
if(!C.fully_charged())

View File

@@ -1123,7 +1123,8 @@
/obj/item/toy/plushie/face_hugger = 1,
/obj/item/toy/plushie/carp = 1,
/obj/item/toy/plushie/deer = 1,
/obj/item/toy/plushie/tabby_cat = 1)
/obj/item/toy/plushie/tabby_cat = 1,
/obj/item/device/threadneedle = 3)
premium = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 1,
/obj/item/weapon/storage/trinketbox = 2)
prices = list(/obj/item/weapon/storage/fancy/heartbox = 15,
@@ -1151,7 +1152,8 @@
/obj/item/toy/plushie/face_hugger = 50,
/obj/item/toy/plushie/carp = 50,
/obj/item/toy/plushie/deer = 50,
/obj/item/toy/plushie/tabby_cat = 50)
/obj/item/toy/plushie/tabby_cat = 50,
/obj/item/device/threadneedle = 2)
/obj/machinery/vending/fishing
name = "Loot Trawler"

View File

@@ -72,7 +72,7 @@
var/obj/item/projectile/P = A
P.dispersion = deviation
process_accuracy(P, chassis.occupant, target)
P.launch_projectile_from_turf(target, chassis.occupant.zone_sel.selecting, chassis.occupant, params)
P.launch_projectile_from_turf(target, chassis.get_pilot_zone_sel(), chassis.occupant, params)
else if(istype(A, /atom/movable))
var/atom/movable/AM = A
AM.throw_at(target, 7, 1, chassis)

View File

@@ -0,0 +1,11 @@
/*
* Helper file for Exosuit / Mecha code.
*/
// Returns, at least, a usable target body position, for things like guns.
/obj/mecha/proc/get_pilot_zone_sel()
if(!occupant || !occupant.zone_sel || occupant.stat)
return BP_TORSO
return occupant.zone_sel.selecting

View File

@@ -120,6 +120,7 @@
// step_towards(M, src)
. = buckle_mob(M, forced)
playsound(src.loc, 'sound/effects/seatbelt.ogg', 50, 1)
if(.)
if(!silent)
if(M == user)
@@ -135,6 +136,7 @@
/atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
var/mob/living/M = unbuckle_mob(buckled_mob)
playsound(src.loc, 'sound/effects/seatbelt.ogg', 50, 1)
if(M)
if(M != user)
M.visible_message(\

View File

@@ -95,12 +95,12 @@
if(instant || do_after(user, 50))
new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype)
to_chat(user, "You finish drawing.")
if(config.log_graffiti)
var/msg = "[user.client.key] ([user]) has drawn [drawtype] (with [src]) at [target.x],[target.y],[target.z]."
message_admins(msg)
log_game(msg)
target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on.
if(uses)
uses--
@@ -207,3 +207,6 @@
qdel(src)
else
..()
/obj/item/weapon/pen/crayon/attack_self(var/mob/user)
return

View File

@@ -71,7 +71,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/CtrlClick()
if(issilicon(usr))
return
if(can_use(usr))
remove_pen()
return
@@ -439,6 +439,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(2) icon = 'icons/obj/pda_slim.dmi'
if(3) icon = 'icons/obj/pda_old.dmi'
if(4) icon = 'icons/obj/pda_rugged.dmi'
if(5) icon = 'icons/obj/pda_holo.dmi'
else
icon = 'icons/obj/pda_old.dmi'
log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.")

View File

@@ -122,6 +122,8 @@
data["manifest"] = PDA_Manifest
data["feeds"] = compile_news()
data["latest_news"] = get_recent_news()
if(newsfeed_channel)
data["target_feed"] = data["feeds"][newsfeed_channel]
if(cartridge) // If there's a cartridge, we need to grab the information from it
data["cart_devices"] = cartridge.get_device_status()
data["cart_templates"] = cartridge.ui_templates
@@ -280,6 +282,9 @@
var/obj/O = cartridge.internal_devices[text2num(href_list["toggle_device"])]
cartridge.active_devices ^= list(O) // Exclusive or, will toggle its presence
if(href_list["newsfeed"])
newsfeed_channel = text2num(href_list["newsfeed"])
if(href_list["cartridge_topic"] && cartridge) // Has to have a cartridge to perform these functions
cartridge.Topic(href, href_list)

View File

@@ -72,6 +72,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
var/datum/exonet_protocol/exonet = null
var/list/communicating = list()
var/update_ticks = 0
var/newsfeed_channel = 0
// Proc: New()
// Parameters: None

View File

@@ -46,23 +46,24 @@
index++
if(FM.img)
usr << browse_rsc(FM.img, "pda_news_tmp_photo_[feeds["channel"]]_[index].png")
// News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI
var/body = replacetext(FM.body, "\n", "<br>")
messages[++messages.len] = list(
"author" = FM.author,
"body" = body,
"message_type" = FM.message_type,
"time_stamp" = FM.time_stamp,
"has_image" = (FM.img != null),
"caption" = FM.caption,
"index" = index
)
// News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI
var/body = replacetext(FM.body, "\n", "<br>")
messages[++messages.len] = list(
"author" = FM.author,
"body" = body,
"message_type" = FM.message_type,
"time_stamp" = FM.time_stamp,
"has_image" = (FM.img != null),
"caption" = FM.caption,
"index" = index
)
feeds[++feeds.len] = list(
"name" = channel.channel_name,
"censored" = channel.censored,
"author" = channel.author,
"messages" = messages
"messages" = messages,
"index" = feeds.len + 1 // actually align them, since I guess the population of the list doesn't occur until after the evaluation of the new entry's contents
)
return feeds
@@ -85,14 +86,14 @@
"time_stamp" = FM.time_stamp,
"has_image" = (FM.img != null),
"caption" = FM.caption,
"time" = FM.post_time
)
// Cut out all but the youngest three
while(news.len > 3)
var/oldest = min(news[0]["time_stamp"], news[1]["time_stamp"], news[2]["time_stamp"], news[3]["time_stamp"])
for(var/i = 0, i < 4, i++)
if(news[i]["time_stamp"] == oldest)
news.Remove(news[i])
if(news.len > 3)
sortByKey(news, "time")
news.Cut(1, news.len - 2) // Last three have largest timestamps, youngest posts
news.Swap(1, 3) // List is sorted in ascending order of timestamp, we want descending
return news

View File

@@ -19,6 +19,9 @@
var/obj/item/weapon/shockpaddles/linked/paddles
var/obj/item/weapon/cell/bcell = null
/obj/item/device/defib_kit/get_cell()
return bcell
/obj/item/device/defib_kit/New() //starts without a cell for rnd
..()
if(ispath(paddles))

View File

@@ -3,10 +3,30 @@
icon = 'icons/obj/objects.dmi'
desc = "This is definitely something cool."
/datum/category_item/catalogue/information/objects/pascalb
name = "Object - Pascal B Steel Shaft Cap"
desc = "In the year 1957, the United States of America - an Earth nation - performed a series \
of earth nuclear weapons tests codenamed 'Operation Plumbbob', which remain the largest and \
longest running nuclear test series performed on the American continent. Test data included \
various altitude detonations, effects on several materials and structures at various \
distances, and the effects of radiation on military hardware and the human body. \
<br><br>\
On the 27th of August that year, in a test named 'Pascal-B' a 300t nuclear payload \
was buried in a shaft capped by a 900kg steel plate cap. The test was intended to \
verify the safety of underground detonation, but the shaft was not sufficient to \
contain the shockwave. According to experiment designer Robert Brownlee, the steel \
cap was propelled upwards at a velocity of 240,000km/h - over six times Earth's \
escape velocity. The cap appeared in only one frame of high-speed camera recording. \
<br><br>\
It had been theorized that the cap had exited earth's atmosphere and entered orbit. \
It would seem the cap traveled farther than had been possibly imagined."
value = CATALOGUER_REWARD_MEDIUM
/obj/item/poi/pascalb
icon_state = "pascalb"
name = "misshapen manhole cover"
desc = "The top of this twisted chunk of metal is faintly stamped with a five pointed star. 'Property of US Army, Pascal B - 1957'."
catalogue_data = list(/datum/category_item/catalogue/information/objects/pascalb)
/obj/item/poi/pascalb/New()
START_PROCESSING(SSobj, src)
@@ -19,6 +39,25 @@
STOP_PROCESSING(SSobj, src)
return ..()
/datum/category_item/catalogue/information/objects/oldreactor
name = "Object - 24th Century Fission Reactor Rack"
desc = "Prior to the discovery of Phoron in 2380, and the development of the hydrophoron \
supermatter reactor, most spacecraft operated on nuclear fission reactors, using processed \
radioactive material as fuel. While the design had been near-perfected by the 24th century, \
with some models capable of holding hundreds of fuel rods at one time and operating almost \
unsupervised for weeks at a time.\
<br><br>\
However, as accidents were not uncommon due to the inherent dangers of space travel and the \
nature of reactor racks such as this one fully containing the unstable fuel material, many \
fission vessels were built capable of jettisoning their entire engine sections as it was seen \
as preferable to evacuating a ship's crew and potentially losing the entire craft and its cargo. \
<br><br>\
VifGov records indicate that the colony ship ICV Kauai declared a major onboard emergency in Sif orbit \
on the 14th April 2353, citing major systems malfunction following a fire in the engine compartment. \
Due to the relatively sparse population of the planet, it was deemed safe to jettison both engine \
blocks, and the colonists were safely towed to port with no hands lost."
value = CATALOGUER_REWARD_MEDIUM
/obj/structure/closet/crate/oldreactor
name = "fission reactor rack"
desc = "Used in older models of nuclear reactors, essentially a cooling rack for high volumes of radioactive material."
@@ -26,6 +65,7 @@
icon_state = "poireactor"
icon_opened = "poireactor_open"
icon_closed = "poireactor"
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
climbable = 0
starts_with = list(
@@ -35,6 +75,7 @@
icon_state = "poireactor_broken"
name = "ruptured fission reactor rack"
desc = "This broken hunk of machinery looks extremely dangerous."
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
/obj/item/poi/brokenoldreactor/New()
START_PROCESSING(SSobj, src)
@@ -47,3 +88,29 @@
STOP_PROCESSING(SSobj, src)
return ..()
/datum/category_item/catalogue/information/objects/growthcanister
name = "Object - Growth Inhibitor 78-1"
desc = "The production of Vatborn humans is a process which involves the synthesis of over two hundred \
distinct chemical compounds. While most Vatborn are 'produced' as infants and merely genetically modified \
to encourage rapid early maturation, the specific development of the controversial 'Expedited' Vatborn calls for \
a far more intensive process.\
<br><br>\
Growth Inhibitor Type 78-1 is used in the rapid artificial maturation process to prevent the 'overdevelopment' of\
particular cell structures in the Vatborn's body, halting the otherwise inevitable development of aggressive cancerous\
growths which would be detrimental or lethal to the subject. Exposure to the compound in its pure form can cause\
devastating damage to living tissue, ceasing all regenerative activity in an organism's cells. While immediate effects\
can be halted by recent medical innovations, exposure can severely shorten a sapient's life expectancy.\
<br><br>\
In early 2564, the NanoTrasen corporation was implicated in the accidental spillage of over a dozen full cargo containers\
of Growth Inhibitor 78-1 in the Ullran Expanse of Sif, and were charged by the Sif Environmental Agency with extreme \
environmental damage and neglect."
value = CATALOGUER_REWARD_MEDIUM
/obj/structure/prop/poicanister
name = "Ruptured Chemical Canister"
desc = "A cracked open chemical canister labelled 'Growth Inhibitor 78-1'"
icon = 'icons/obj/atmos.dmi'
icon_state = "yellow-1"
catalogue_data = list(/datum/category_item/catalogue/information/objects/growthcanister)
anchored = 0
density = 1

View File

@@ -0,0 +1,7 @@
// I like the idea of this item having more uses in future.
/obj/item/device/threadneedle
name = "thread and needle"
icon = 'icons/obj/items.dmi'
icon_state = "needle_thread"
desc = "Used for most sewing and tailoring applications."

View File

@@ -874,9 +874,31 @@
anchored = 0
density = 1
var/phrase = "I don't want to exist anymore!"
var/searching = FALSE
var/opened = FALSE // has this been slit open? this will allow you to store an object in a plushie.
var/obj/item/stored_item // Note: Stored items can't be bigger than the plushie itself.
/obj/structure/plushie/examine(mob/user)
..()
if(opened)
to_chat(user, "<i>You notice an incision has been made on [src].</i>")
if(in_range(user, src) && stored_item)
to_chat(user, "<i>You can see something in there...</i>")
/obj/structure/plushie/attack_hand(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(stored_item && !searching)
searching = TRUE
if(do_after(user, 10))
to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
stored_item.forceMove(get_turf(src))
stored_item = null
searching = FALSE
return
else
searching = FALSE
if(user.a_intent == I_HELP)
user.visible_message("<span class='notice'><b>\The [user]</b> hugs [src]!</span>","<span class='notice'>You hug [src]!</span>")
else if (user.a_intent == I_HURT)
@@ -888,6 +910,34 @@
visible_message("[src] says, \"[phrase]\"")
/obj/structure/plushie/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/device/threadneedle) && opened)
to_chat(user, "You sew the hole in [src].")
opened = FALSE
return
if(is_sharp(I) && !opened)
to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
opened = TRUE
return
if(opened)
if(stored_item)
to_chat(user, "There is already something in here.")
return
if(!(I.w_class > w_class))
to_chat(user, "You place [I] inside [src].")
user.drop_from_inventory(I, src)
I.forceMove(src)
stored_item = I
return
else
to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
..()
/obj/structure/plushie/ian
name = "plush corgi"
desc = "A plushie of an adorable corgi! Don't you just want to hug it and squeeze it and call it \"Ian\"?"
@@ -921,8 +971,30 @@
w_class = ITEMSIZE_TINY
var/last_message = 0
var/pokephrase = "Uww!"
var/searching = FALSE
var/opened = FALSE // has this been slit open? this will allow you to store an object in a plushie.
var/obj/item/stored_item // Note: Stored items can't be bigger than the plushie itself.
/obj/item/toy/plushie/examine(mob/user)
..()
if(opened)
to_chat(user, "<i>You notice an incision has been made on [src].</i>")
if(in_range(user, src) && stored_item)
to_chat(user, "<i>You can see something in there...</i>")
/obj/item/toy/plushie/attack_self(mob/user as mob)
if(stored_item && !searching)
searching = TRUE
if(do_after(user, 10))
to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
stored_item.forceMove(get_turf(src))
stored_item = null
searching = FALSE
return
else
searching = FALSE
if(world.time - last_message <= 1 SECOND)
return
if(user.a_intent == I_HELP)
@@ -955,6 +1027,31 @@
if(istype(I, /obj/item/toy/plushie) || istype(I, /obj/item/organ/external/head))
user.visible_message("<span class='notice'>[user] makes \the [I] kiss \the [src]!.</span>", \
"<span class='notice'>You make \the [I] kiss \the [src]!.</span>")
return
if(istype(I, /obj/item/device/threadneedle) && opened)
to_chat(user, "You sew the hole underneath [src].")
opened = FALSE
return
if(is_sharp(I) && !opened)
to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
opened = TRUE
return
if( (!(I.w_class > w_class)) && opened)
if(stored_item)
to_chat(user, "There is already something in here.")
return
to_chat(user, "You place [I] inside [src].")
user.drop_from_inventory(I, src)
I.forceMove(src)
stored_item = I
to_chat(user, "You placed [I] into [src].")
return
return ..()
/obj/item/toy/plushie/nymph

View File

@@ -0,0 +1,72 @@
/obj/item/trash/material
icon = 'icons/obj/material_trash.dmi'
matter = list()
var/matter_chances = list() //List of lists: list(mat_name, chance, amount)
/obj/item/trash/material/Initialize()
. = ..()
if(!matter)
matter = list()
for(var/list/L in matter_chances)
if(prob(L[2]))
matter |= L[1]
matter[L[1]] += max(0, L[3] + rand(-2,2))
/obj/item/trash/material/metal
name = "scrap metal"
desc = "A piece of metal that can be recycled in an autolathe."
icon_state = "metal0"
matter_chances = list(
list(MAT_STEEL, 100, 15),
list(MAT_STEEL, 50, 10),
list(MAT_STEEL, 10, 20),
list(MAT_PLASTEEL, 10, 5),
list(MAT_PLASTEEL, 5, 10)
)
/obj/item/trash/material/metal/Initialize()
. = ..()
icon_state = "metal[rand(4)]"
/obj/item/trash/material/circuit
name = "burnt circuit"
desc = "A burnt circuit that can be recycled in an autolathe."
w_class = ITEMSIZE_SMALL
icon_state = "circuit0"
matter_chances = list(
list(MAT_GLASS, 100, 4),
list(MAT_GLASS, 50, 3),
list(MAT_PLASTIC, 40, 3),
list(MAT_SILVER, 18, 3),
list(MAT_GOLD, 17, 3),
list(MAT_DIAMOND, 4, 2),
)
/obj/item/trash/material/circuit/Initialize()
. = ..()
icon_state = "circuit[rand(3)]"
/obj/item/trash/material/device
name = "broken device"
desc = "A broken device that can be recycled in an autolathe."
w_class = ITEMSIZE_SMALL
icon_state = "device0"
matter_chances = list(
list(MAT_STEEL, 100, 10),
list(MAT_GLASS, 90, 7),
list(MAT_PLASTIC, 100, 10),
list(MAT_SILVER, 16, 7),
list(MAT_GOLD, 15, 5),
list(MAT_DIAMOND, 5, 2),
)
/obj/item/trash/material/device/Initialize()
. = ..()
icon_state = "device[rand(3)]"

View File

@@ -505,6 +505,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
slot_flags = SLOT_BELT
attack_verb = list("burnt", "singed")
var/base_state
var/activation_sound = 'sound/items/lighter_on.ogg'
var/deactivation_sound = 'sound/items/lighter_off.ogg'
/obj/item/weapon/flame/lighter/zippo
name = "\improper Zippo lighter"
@@ -512,6 +514,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon = 'icons/obj/zippo.dmi'
icon_state = "zippo"
item_state = "zippo"
activation_sound = 'sound/items/zippo_on.ogg'
deactivation_sound = 'sound/items/zippo_off.ogg'
/obj/item/weapon/flame/lighter/random
New()
@@ -526,6 +530,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
lit = 1
icon_state = "[base_state]on"
item_state = "[base_state]on"
playsound(src.loc, activation_sound, 75, 1)
if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
else
@@ -545,6 +550,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
lit = 0
icon_state = "[base_state]"
item_state = "[base_state]"
playsound(src.loc, deactivation_sound, 75, 1)
if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.</span>")
else

View File

@@ -160,6 +160,7 @@
/obj/item/weapon/melee/baton,
/obj/item/weapon/gun/energy/taser,
/obj/item/weapon/gun/energy/stunrevolver,
/obj/item/weapon/gun/magnetic/railgun/heater/pistol,
/obj/item/weapon/gun/energy/gun,
/obj/item/weapon/flame/lighter,
/obj/item/device/flashlight,

View File

@@ -142,15 +142,7 @@
name = "chameleon kit"
desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately."
starts_with = list(
/obj/item/clothing/under/chameleon,
/obj/item/clothing/head/chameleon,
/obj/item/clothing/suit/chameleon,
/obj/item/clothing/shoes/chameleon,
/obj/item/weapon/storage/backpack/chameleon,
/obj/item/clothing/gloves/chameleon,
/obj/item/clothing/mask/chameleon,
/obj/item/clothing/glasses/chameleon,
/obj/item/clothing/accessory/chameleon,
/obj/item/weapon/storage/backpack/chameleon/full,
/obj/item/weapon/gun/energy/chameleon
)

View File

@@ -110,6 +110,7 @@
/obj/item/device/flash,
/obj/item/weapon/melee/baton/loaded,
/obj/item/weapon/gun/magnetic/railgun/heater/pistol/hos,
/obj/item/weapon/rcd_ammo/large,
/obj/item/weapon/cell/device/weapon,
/obj/item/clothing/accessory/holster/waist,
/obj/item/weapon/melee/telebaton,

View File

@@ -222,6 +222,44 @@
icon_state = "plant-01"
plane = OBJ_PLANE
var/obj/item/stored_item
/obj/structure/flora/pottedplant/examine(mob/user)
..()
if(in_range(user, src) && stored_item)
to_chat(user, "<i>You can see something in there...</i>")
/obj/structure/flora/pottedplant/attackby(obj/item/I, mob/user)
if(stored_item)
to_chat(user, "<span class='notice'>[I] won't fit in. There already appears to be something in here...</span>")
return
if(I.w_class > ITEMSIZE_TINY)
to_chat(user, "<span class='notice'>[I] is too big to fit inside [src].</span>")
return
if(do_after(user, 10))
user.drop_from_inventory(I, src)
I.forceMove(src)
stored_item = I
src.visible_message("\icon[src] \icon[I] [user] places [I] into [src].")
return
else
to_chat(user, "<span class='notice'>You refrain from putting things into the plant pot.</span>")
return
..()
/obj/structure/flora/pottedplant/attack_hand(mob/user)
if(!stored_item)
to_chat(user, "<b>You see nothing of interest in [src]...</b>")
else
if(do_after(user, 10))
to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
stored_item.forceMove(get_turf(src))
stored_item = null
..()
/obj/structure/flora/pottedplant/large
name = "large potted plant"

View File

@@ -0,0 +1,366 @@
/obj/structure/salvageable
name = "broken macninery"
desc = "Broken beyond repair, but looks like you can still salvage something from this if you had a prying implement."
icon = 'icons/obj/salvageable.dmi'
density = 1
anchored = 1
var/salvageable_parts = list()
/obj/structure/salvageable/proc/dismantle()
new /obj/structure/frame (src.loc)
for(var/path in salvageable_parts)
if(prob(salvageable_parts[path]))
new path (loc)
return
/obj/structure/salvageable/attackby(obj/item/I, mob/user)
if(I.is_crowbar())
playsound(loc, I.usesound, 50, 1)
var/actual_time = I.toolspeed * 170
user.visible_message( \
"<span class='notice'>\The [user] begins salvaging from \the [src].</span>", \
"<span class='notice'>You start salvaging from \the [src].</span>")
if(do_after(user, actual_time, target = src))
user.visible_message( \
"<span class='notice'>\The [user] has salvaged \the [src].</span>", \
"<span class='notice'>You salvage \the [src].</span>")
dismantle()
qdel(src)
return TRUE
return ..()
//Types themself, use them, but not the parent object
/obj/structure/salvageable/machine
name = "broken machine"
icon_state = "machine1"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 80,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/stock_parts/capacitor = 40,
/obj/item/weapon/stock_parts/capacitor = 40,
/obj/item/weapon/stock_parts/scanning_module = 40,
/obj/item/weapon/stock_parts/scanning_module = 40,
/obj/item/weapon/stock_parts/manipulator = 40,
/obj/item/weapon/stock_parts/manipulator = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/capacitor/adv = 20,
/obj/item/weapon/stock_parts/scanning_module/adv = 20,
/obj/item/weapon/stock_parts/manipulator/nano = 20,
/obj/item/weapon/stock_parts/micro_laser/high = 20,
/obj/item/weapon/stock_parts/matter_bin/adv = 20
)
/obj/structure/salvageable/machine/Initialize()
. = ..()
icon_state = "machine[rand(0,6)]"
/obj/structure/salvageable/computer
name = "broken computer"
icon_state = "computer0"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 90,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/computer_hardware/network_card = 40,
/obj/item/weapon/computer_hardware/network_card = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/stock_parts/capacitor/adv = 30,
/obj/item/weapon/computer_hardware/network_card/advanced = 20
)
obj/structure/salvageable/computer/Initialize()
. = ..()
icon_state = "computer[rand(0,7)]"
/obj/structure/salvageable/autolathe
name = "broken autolathe"
icon_state = "autolathe"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 80,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/stock_parts/capacitor = 40,
/obj/item/weapon/stock_parts/scanning_module = 40,
/obj/item/weapon/stock_parts/manipulator = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/capacitor/adv = 20,
/obj/item/weapon/stock_parts/micro_laser/high = 20,
/obj/item/weapon/stock_parts/micro_laser/high = 20,
/obj/item/weapon/stock_parts/matter_bin/adv = 20,
/obj/item/weapon/stock_parts/matter_bin/adv = 20,
/obj/item/stack/material/steel{amount = 20} = 40,
/obj/item/stack/material/glass{amount = 20} = 40,
/obj/item/stack/material/plastic{amount = 20} = 40,
/obj/item/stack/material/plasteel{amount = 10} = 40,
/obj/item/stack/material/silver{amount = 10} = 20,
/obj/item/stack/material/gold{amount = 10} = 20,
/obj/item/stack/material/phoron{amount = 10} = 20
)
/obj/structure/salvageable/implant_container
name = "old container"
icon_state = "implant_container0"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 80,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/implant/death_alarm = 15,
/obj/item/weapon/implant/explosive = 10,
/obj/item/weapon/implant/freedom = 5,
/obj/item/weapon/implant/tracking = 10,
/obj/item/weapon/implant/chem = 10,
/obj/item/weapon/implantcase = 30,
/obj/item/weapon/implanter = 30,
/obj/item/stack/material/steel{amount = 10} = 30,
/obj/item/stack/material/glass{amount = 10} = 30,
/obj/item/stack/material/silver{amount = 10} = 30
)
obj/structure/salvageable/implant_container/Initialize()
. = ..()
icon_state = "implant_container[rand(0,1)]"
/obj/structure/salvageable/data
name = "broken data storage"
icon_state = "data0"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 90,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/computer_hardware/network_card = 40,
/obj/item/weapon/computer_hardware/network_card = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/hard_drive = 50,
/obj/item/weapon/computer_hardware/hard_drive = 50,
/obj/item/weapon/computer_hardware/hard_drive = 50,
/obj/item/weapon/computer_hardware/hard_drive = 50,
/obj/item/weapon/computer_hardware/hard_drive = 50,
/obj/item/weapon/computer_hardware/hard_drive = 50,
/obj/item/weapon/computer_hardware/hard_drive/advanced = 30,
/obj/item/weapon/computer_hardware/hard_drive/advanced = 30,
/obj/item/weapon/computer_hardware/network_card/advanced = 20
)
obj/structure/salvageable/data/Initialize()
. = ..()
icon_state = "data[rand(0,1)]"
/obj/structure/salvageable/server
name = "broken server"
icon_state = "server0"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 90,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/computer_hardware/network_card = 40,
/obj/item/weapon/computer_hardware/network_card = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/stock_parts/subspace/amplifier = 40,
/obj/item/weapon/stock_parts/subspace/amplifier = 40,
/obj/item/weapon/stock_parts/subspace/analyzer = 40,
/obj/item/weapon/stock_parts/subspace/analyzer = 40,
/obj/item/weapon/stock_parts/subspace/ansible = 40,
/obj/item/weapon/stock_parts/subspace/ansible = 40,
/obj/item/weapon/stock_parts/subspace/transmitter = 40,
/obj/item/weapon/stock_parts/subspace/transmitter = 40,
/obj/item/weapon/stock_parts/subspace/crystal = 30,
/obj/item/weapon/stock_parts/subspace/crystal = 30,
/obj/item/weapon/computer_hardware/network_card/advanced = 20
)
obj/structure/salvageable/server/Initialize()
. = ..()
icon_state = "server[rand(0,1)]"
/obj/structure/salvageable/personal
name = "personal terminal"
icon_state = "personal0"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 90,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 70,
/obj/item/trash/material/circuit = 60,
/obj/item/trash/material/metal = 60,
/obj/item/weapon/computer_hardware/network_card = 60,
/obj/item/weapon/computer_hardware/network_card/advanced = 40,
/obj/item/weapon/computer_hardware/network_card/wired = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/processor_unit = 60,
/obj/item/weapon/computer_hardware/processor_unit/small = 50,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 40,
/obj/item/weapon/computer_hardware/processor_unit/photonic/small = 30,
/obj/item/weapon/computer_hardware/hard_drive = 60,
/obj/item/weapon/computer_hardware/hard_drive/advanced = 40
)
obj/structure/salvageable/personal/Initialize()
. = ..()
icon_state = "personal[rand(0,12)]"
new /obj/structure/table/reinforced (loc)
/obj/structure/salvageable/bliss
name = "strange terminal"
icon_state = "bliss0"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 90,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 60,
/obj/item/weapon/computer_hardware/hard_drive/cluster = 50
)
obj/structure/salvageable/bliss/Initialize()
. = ..()
icon_state = "bliss[rand(0,1)]"
/obj/structure/salvageable/bliss/attackby(obj/item/I, mob/user)
if((. = ..()))
playsound(user, 'sound/machines/shutdown.ogg', 60, 1)
//////////////////
//// ONE STAR ////
//////////////////
/obj/structure/salvageable/machine_os
name = "broken machine"
icon_state = "os-machine"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 80,
/obj/item/weapon/stock_parts/capacitor = 40,
/obj/item/weapon/stock_parts/capacitor = 40,
/obj/item/weapon/stock_parts/scanning_module = 40,
/obj/item/weapon/stock_parts/scanning_module = 40,
/obj/item/weapon/stock_parts/manipulator = 40,
/obj/item/weapon/stock_parts/manipulator = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/micro_laser = 40,
/obj/item/weapon/stock_parts/matter_bin = 40,
/obj/item/weapon/stock_parts/matter_bin = 40
)
/obj/structure/salvageable/computer_os
name = "broken computer"
icon_state = "os-computer"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 90,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 40,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/network_card/advanced = 40
)
/obj/structure/salvageable/implant_container_os
name = "old container"
icon_state = "os-container"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 80,
/obj/item/weapon/implant/death_alarm = 30,
/obj/item/weapon/implant/explosive = 20,
/obj/item/weapon/implant/freedom = 20,
/obj/item/weapon/implant/tracking = 30,
/obj/item/weapon/implant/chem = 30,
/obj/item/weapon/implantcase = 30,
/obj/item/weapon/implanter = 30
)
/obj/structure/salvageable/data_os
name = "broken data storage"
icon_state = "os-data"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 90,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 90,
/obj/item/weapon/computer_hardware/processor_unit/small = 60,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 50,
/obj/item/weapon/computer_hardware/hard_drive/super = 50,
/obj/item/weapon/computer_hardware/hard_drive/super = 50,
/obj/item/weapon/computer_hardware/hard_drive/cluster = 50,
/obj/item/weapon/computer_hardware/network_card/wired = 40
)
/obj/structure/salvageable/server_os
name = "broken server"
icon_state = "os-server"
salvageable_parts = list(
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/stack/material/glass{amount = 5} = 90,
/obj/item/weapon/computer_hardware/network_card/wired = 40,
/obj/item/weapon/computer_hardware/network_card/wired = 40,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 40,
/obj/item/weapon/stock_parts/subspace/amplifier = 40,
/obj/item/weapon/stock_parts/subspace/amplifier = 40,
/obj/item/weapon/stock_parts/subspace/analyzer = 40,
/obj/item/weapon/stock_parts/subspace/analyzer = 40,
/obj/item/weapon/stock_parts/subspace/ansible = 40,
/obj/item/weapon/stock_parts/subspace/ansible = 40,
/obj/item/weapon/stock_parts/subspace/transmitter = 40,
/obj/item/weapon/stock_parts/subspace/transmitter = 40,
/obj/item/weapon/stock_parts/subspace/crystal = 30,
/obj/item/weapon/stock_parts/subspace/crystal = 30,
/obj/item/weapon/computer_hardware/network_card/wired = 20
)
/obj/structure/salvageable/console_os
name = "pristine console"
desc = "Despite being in pristine condition this console doesn't respond to anything, but looks like you can still salvage something from this."
icon_state = "os_console"
salvageable_parts = list(
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/computer_hardware/processor_unit/small = 40,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/network_card/advanced = 40
)
/obj/structure/salvageable/console_broken_os
name = "broken console"
icon_state = "os_console_broken"
salvageable_parts = list(
/obj/item/stack/cable_coil{amount = 5} = 90,
/obj/item/weapon/stock_parts/console_screen = 80,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/stock_parts/capacitor = 60,
/obj/item/weapon/computer_hardware/processor_unit = 40,
/obj/item/weapon/computer_hardware/processor_unit/photonic = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/network_card/advanced = 40
)

View File

@@ -124,6 +124,12 @@
/obj/structure/bed/chair/comfy/lime/New(var/newloc,var/newmaterial)
..(newloc,"steel","lime")
/obj/structure/bed/chair/comfy/yellow/New(var/newloc,var/newmaterial)
..(newloc,"steel","yellow")
/obj/structure/bed/chair/comfy/orange/New(var/newloc,var/newmaterial)
..(newloc,"steel","orange")
/obj/structure/bed/chair/office
anchored = 0
buckle_movable = 1
@@ -219,8 +225,8 @@
/obj/structure/bed/chair/sofa/update_icon()
if(applies_material_colour && sofa_material)
material = get_material_by_name(sofa_material)
color = material.icon_colour
var/material/color_material = get_material_by_name(sofa_material)
color = color_material.icon_colour
if(sofa_material == "carpet")
name = "red [initial(name)]"
@@ -271,6 +277,9 @@
/obj/structure/bed/chair/sofa/yellow
sofa_material = "yellow"
/obj/structure/bed/chair/sofa/orange
sofa_material = "orange"
//sofa directions
/obj/structure/bed/chair/sofa/left
@@ -362,3 +371,12 @@
/obj/structure/bed/chair/sofa/yellow/corner
icon_state = "sofacorner"
/obj/structure/bed/chair/sofa/orange/left
icon_state = "sofaend_left"
/obj/structure/bed/chair/sofa/orange/right
icon_state = "sofaend_right"
/obj/structure/bed/chair/sofa/orange/corner
icon_state = "sofacorner"

View File

@@ -161,3 +161,17 @@ var/list/shoreline_icon_cache = list()
if(L.get_water_protection() < 1)
return FALSE
return ..()
/turf/simulated/floor/water/contaminated
desc = "This water smells pretty acrid."
var poisonlevel = 10
turf/simulated/floor/water/contaminated/Entered(atom/movable/AM, atom/oldloc)
..()
if(istype(AM, /mob/living))
var/mob/living/L = AM
if(L.isSynthetic())
return
poisonlevel *= 1 - L.get_water_protection()
if(poisonlevel > 0)
L.adjustToxLoss(poisonlevel)

View File

@@ -148,14 +148,14 @@ var/world_topic_spam_protect_time = world.timeofday
else if(T == "manifest")
var/list/positions = list()
var/list/set_names = list(
"heads" = command_positions,
"sec" = security_positions,
"eng" = engineering_positions,
"med" = medical_positions,
"sci" = science_positions,
"car" = cargo_positions,
"civ" = civilian_positions,
"bot" = nonhuman_positions
"heads" = SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND),
"sec" = SSjob.get_job_titles_in_department(DEPARTMENT_SECURITY),
"eng" = SSjob.get_job_titles_in_department(DEPARTMENT_ENGINEERING),
"med" = SSjob.get_job_titles_in_department(DEPARTMENT_MEDICAL),
"sci" = SSjob.get_job_titles_in_department(DEPARTMENT_RESEARCH),
"car" = SSjob.get_job_titles_in_department(DEPARTMENT_CARGO),
"civ" = SSjob.get_job_titles_in_department(DEPARTMENT_CIVILIAN),
"bot" = SSjob.get_job_titles_in_department(DEPARTMENT_SYNTHETIC)
)
for(var/datum/data/record/t in data_core.general)