Merge remote-tracking branch 'ParadiseSS13/master' into multi-instance-support

This commit is contained in:
AffectedArc07
2021-10-12 20:27:07 +01:00
168 changed files with 4097 additions and 8536 deletions
+78 -32
View File
@@ -624,43 +624,89 @@ GLOBAL_VAR_INIT(nologevent, 0)
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
/proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode
if(!SSticker || !SSticker.mode)
return 0
/**
* A proc that return whether the mob is a "Special Character" aka Antagonist
*
* Arguments:
* * M - the mob you're checking
* *
*/
/proc/is_special_character(mob/M)
if(!SSticker.mode)
return FALSE
if(!istype(M))
return 0
if((M.mind in SSticker.mode.head_revolutionaries) || (M.mind in SSticker.mode.revolutionaries))
if(SSticker.mode.config_tag == "revolution")
return 2
return 1
if(M.mind in SSticker.mode.cult)
if(SSticker.mode.config_tag == "cult")
return 2
return 1
if(M.mind in SSticker.mode.syndicates)
if(SSticker.mode.config_tag == "nuclear")
return 2
return 1
if(M.mind in SSticker.mode.wizards)
if(SSticker.mode.config_tag == "wizard")
return 2
return 1
if(M.mind in SSticker.mode.changelings)
if(SSticker.mode.config_tag == "changeling")
return 2
return 1
if(M.mind in SSticker.mode.abductors)
if(SSticker.mode.config_tag == "abduction")
return 2
return 1
return FALSE
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.emagged)
return 1
if(M.mind&&M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
return 1
return TRUE
if(M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
return TRUE
return FALSE
return 0
/**
* A proc that return an array of capitalized strings containing name of the antag types they are
*
* Arguments:
* * M - the mob you're checking
*/
/proc/get_antag_type_strings_list(mob/M) // return an array of all the antag types they are with name
var/list/antag_list = list()
if(!SSticker.mode || !istype(M) || !M.mind)
return FALSE
if(M.mind in SSticker.mode.head_revolutionaries)
antag_list += "Head Rev"
if(M.mind in SSticker.mode.revolutionaries)
antag_list += "Revolutionary"
if(M.mind in SSticker.mode.cult)
antag_list += "Cultist"
if(M.mind in SSticker.mode.syndicates)
antag_list += "Nuclear Operative"
if(M.mind in SSticker.mode.wizards)
antag_list += "Wizard"
if(M.mind in SSticker.mode.changelings)
antag_list += "Changeling"
if(M.mind in SSticker.mode.abductors)
antag_list += "Abductor"
if(M.mind in SSticker.mode.vampires)
antag_list += "Vampire"
if(M.mind in SSticker.mode.vampire_enthralled)
antag_list += "Vampire Thrall"
if(M.mind in SSticker.mode.shadows)
antag_list += "Shadowling"
if(M.mind in SSticker.mode.shadowling_thralls)
antag_list += "Shadowling Thrall"
if(M.mind.has_antag_datum(/datum/antagonist/traitor))
antag_list += "Traitor"
if(M.mind.has_antag_datum(/datum/antagonist/mindslave))
antag_list += "Mindslave"
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.emagged)
antag_list += "Emagged Borg"
if(!length(antag_list) && M.mind.special_role) // Snowflake check. If none of the above but still special, then other antag. Technically not accurate.
antag_list += "Other Antag(s)"
return antag_list
/**
* A proc that return a string containing all the singled out antags . Empty string if not antag
*
* Usually, you'd return a FALSE, but since this is consumed by javascript you're in
* for a world of hurt if you pass a byond FALSE which get converted into a fucking string anyway and pass for TRUE in check. Fuck.
* It always append "(May be other antag)"
* Arguments:
* * M - the mob you're checking
* *
*/
/proc/get_antag_type_truncated_plaintext_string(mob/M as mob)
var/list/antag_list = get_antag_type_strings_list(M)
if(length(antag_list))
return antag_list.Join(" & ") + " " + "(May be other antag)"
return ""
/datum/admins/proc/spawn_atom(object as text)
set category = "Debug"
+13 -10
View File
@@ -363,17 +363,20 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
if(!check_rights(R_ADMIN))
return
if(!isliving(mob))
return
if(mob)
if(mob.invisibility == INVISIBILITY_OBSERVER)
mob.invisibility = initial(mob.invisibility)
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
mob.add_to_all_human_data_huds()
//TODO: Make some kind of indication for the badmin that they are currently invisible
else
mob.invisibility = INVISIBILITY_OBSERVER
to_chat(mob, "<span class='notice'>Invisimin on. You are now as invisible as a ghost.</span>")
mob.remove_from_all_data_huds()
if(mob.invisibility == INVISIBILITY_OBSERVER)
mob.invisibility = initial(mob.invisibility)
mob.add_to_all_human_data_huds()
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
log_admin("[key_name(mob)] has turned Invisimin OFF")
else
mob.invisibility = INVISIBILITY_OBSERVER
mob.remove_from_all_data_huds()
to_chat(mob, "<span class='notice'>Invisimin on. You are now as invisible as a ghost.</span>")
log_admin("[key_name(mob)] has turned Invisimin ON")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Invisimin")
/client/proc/player_panel_new()
set name = "Player Panel"
+5 -5
View File
@@ -65,7 +65,7 @@
}
function expand(id,job,name,real_name,image,key,ip,antagonist,mobUID,client_ckey,eyeUID){
function expand(id,job,name,real_name,image,key,ip,antagonists,mobUID,client_ckey,eyeUID){
clearAll();
@@ -89,8 +89,8 @@
if(eyeUID)
body += "|<a href='?src=[UID()];adminplayerobservefollow="+eyeUID+"'>EYE</a>"
body += "<br>"
if(antagonist > 0)
body += "<font size='2'><a href='?src=[UID()];check_antagonist=1'><font color='red'><b>Antagonist</b></font></a></font>";
if(antagonists)
body += "<font size='2'><a href='?src=[UID()];check_antagonist=1'><font color='red'><b>"+antagonists+"</b></font></a></font>";
body += "</td></tr></table>";
@@ -227,7 +227,7 @@
var/color = "#e6e6e6"
if(i%2 == 0)
color = "#f2f2f2"
var/is_antagonist = is_special_character(M)
var/antagonist_string = get_antag_type_truncated_plaintext_string(M)
var/M_job = ""
@@ -305,7 +305,7 @@
<td align='center' bgcolor='[color]'>
<span id='notice_span[i]'></span>
<a id='link[i]'
onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]",[is_antagonist],"[M.UID()]","[client_ckey]","[M_eyeUID]")'
onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]","[antagonist_string]","[M.UID()]","[client_ckey]","[M_eyeUID]")'
>
<b id='search[i]'>[M_name] - [M_rname] - [M_key] ([M_job])</b>
</a>
+1 -9
View File
@@ -47,16 +47,8 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown", "the", "a", "an", "of"
SSdiscord.send2discord_simple_noadmins("**\[Adminhelp]** [key_name(src)]: [msg]", check_send_always = TRUE)
if("Mentorhelp")
var/alerttext
var/list/mentorcount = staff_countup(R_MENTOR)
var/active_mentors = mentorcount[1]
var/inactive_mentors = mentorcount[3]
if(active_mentors <= 0)
if(inactive_mentors)
alerttext = " | **ALL MENTORS AFK**"
else
alerttext = " | **NO MENTORS ONLINE**"
log_admin("[selected_type]: [key_name(src)]: [msg] - heard by [active_mentors] non-AFK mentors.")
SSdiscord.send2discord_simple(DISCORD_WEBHOOK_MENTOR, "[key_name(src)]: [msg][alerttext]")
SSdiscord.send2discord_simple_mentor("[key_name(src)]: [msg]")
+2 -2
View File
@@ -357,8 +357,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
pai.real_name = pai.name
pai.key = choice.key
card.setPersonality(pai)
for(var/datum/paiCandidate/candidate in GLOB.paiController.pai_candidates)
if(candidate.key == choice.key)
for(var/datum/pai_save/candidate in GLOB.paiController.pai_candidates)
if(candidate.owner.ckey == choice.ckey)
GLOB.paiController.pai_candidates.Remove(candidate)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -203,7 +203,7 @@
log_world("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [html_encode("[O.vars[variable]]")] ([accepted] objects modified)")
/proc/get_all_of_type(T, subtypes = TRUE)
var/list/typecache = list()
+4 -4
View File
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
return
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[html_encode("[var_value]")]")
/client/proc/mod_list(list/L, atom/O, original_name, objectvar, index, autodetect_class = FALSE)
if(!check_rights(R_VAREDIT))
@@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
return
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[html_encode("[original_var]")]")
return
if(VV_TEXT)
@@ -514,7 +514,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
return
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[html_encode("[new_var]")]")
/proc/vv_varname_lockcheck(param_var_name)
if(param_var_name in GLOB.VVlocked)
@@ -630,5 +630,5 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args)
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [html_encode("[var_new]")]"
message_admins(msg)
@@ -25,7 +25,6 @@
"Locker Toilets",
"Maintenance Bar",
"Medical Secondary Storage",
"Mechanic Workshop",
"Port Emergency Storage",
"Psych Room",
"Toxins Launch Room",
@@ -206,9 +206,7 @@
immunity = list(TYPE_GROUND)
area_blacklist = list(/area/maintenance)
area_whitelist = list(/area/hallway,
/area/escapepodbay,
/area/engine/mechanic_workshop,
/area/security/podbay)
/area/escapepodbay)
/datum/mob_type/bluespace
name = "Bluespace"
@@ -213,9 +213,6 @@
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Oh really now?' You hear a clicking sound. 'Team, get back here. We have trouble'. Then the line goes dead.</span>")
for(var/thing in GLOB.landmarks_list)
var/obj/effect/landmark/L = thing
if(L.name == "wildwest_syndipod")
var/obj/spacepod/syndi/P = new /obj/spacepod/syndi(get_turf(L))
P.name = "Syndi Recon Pod"
if(L.name == "wildwest_syndibackup")
var/mob/living/simple_animal/hostile/syndicate/ranged/space/R = new /mob/living/simple_animal/hostile/syndicate/ranged/space(get_turf(L))
R.name = "Syndi Recon Team"
+3
View File
@@ -114,6 +114,9 @@
/// Is the client watchlisted
var/watchlisted = FALSE
/// Client's pAI save
var/datum/pai_save/pai_save
/client/vv_edit_var(var_name, var_value)
switch(var_name)
// I know we will never be in a world where admins are editing client vars to let people bypass TOS
+10 -6
View File
@@ -147,14 +147,10 @@
karma_purchase(karma,5,"job","Brig Physician")
if("3")
karma_purchase(karma,30,"job","Nanotrasen Representative")
if("5")
if("4")
karma_purchase(karma,30,"job","Blueshield")
if("6")
karma_purchase(karma,30,"job","Mechanic")
if("7")
if("5")
karma_purchase(karma,45,"job","Magistrate")
if("9")
karma_purchase(karma,30,"job","Security Pod Pilot")
return
if(href_list["KarmaBuy2"])
var/karma=verify_karma()
@@ -202,6 +198,11 @@
..() //redirect to hsrc.Topic()
/client/proc/get_display_key()
var/fakekey = src?.holder?.fakekey
return fakekey ? fakekey : key
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. <a href='http://www.byond.com/membership'>Click here to find out more</a>.")
@@ -286,6 +287,8 @@
log_client_to_db(tdata) // Make sure our client exists in the DB
pai_save = new(src)
// This is where we load all of the clients stuff from the DB
if(SSdbcore.IsConnected())
// Load in all our client data from the DB
@@ -453,6 +456,7 @@
GLOB.clients -= src
SSinstancing.update_playercache() // Clear us out
QDEL_NULL(chatOutput)
QDEL_NULL(pai_save)
if(movingmob)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
@@ -0,0 +1,8 @@
/datum/client_login_processor/pai_save
priority = 40
/datum/client_login_processor/pai_save/get_query(client/C)
return C.pai_save.get_query()
/datum/client_login_processor/pai_save/process_result(datum/db_query/Q, client/C)
C.pai_save.load_data(Q)
+6 -28
View File
@@ -115,7 +115,7 @@
if(!isemptylist(player_alt_titles))
playertitlelist = list2params(player_alt_titles)
if(!isemptylist(loadout_gear))
gearlist = list2params(loadout_gear)
gearlist = json_encode(loadout_gear)
var/datum/db_query/firstquery = SSdbcore.NewQuery("SELECT slot FROM characters WHERE ckey=:ckey ORDER BY slot", list(
"ckey" = C.ckey
@@ -438,7 +438,7 @@
//socks
socks = query.item[49]
body_accessory = query.item[50]
loadout_gear = params2list(query.item[51])
loadout_gear = query.item[51]
autohiss_mode = text2num(query.item[52])
//Sanitize
@@ -507,6 +507,7 @@
socks = sanitize_text(socks, initial(socks))
body_accessory = sanitize_text(body_accessory, initial(body_accessory))
loadout_gear = sanitize_json(loadout_gear)
if(!player_alt_titles)
player_alt_titles = new()
@@ -1379,29 +1380,6 @@
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_karma_high)
switch(job_karma_high)
if(JOB_MECHANIC)
clothes_s = new /icon(uniform_dmi, "mechanic_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/belt.dmi', "utility"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "hardhat0_yellow"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "engiepack"), ICON_OVERLAY)
if(3)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel-eng"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
if(JOB_PILOT)
clothes_s = new /icon(uniform_dmi, "secred_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/suit.dmi', "bomber"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "securitypack"), ICON_OVERLAY)
if(3)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel-sec"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
if(JOB_BRIGDOC)
clothes_s = new /icon(uniform_dmi, "medical_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "white"), ICON_UNDERLAY)
@@ -1480,11 +1458,11 @@
/datum/character_save/proc/get_gear_metadata(datum/gear/G)
. = loadout_gear[G.display_name]
/datum/character_save/proc/get_gear_metadata(datum/gear/G) // NYI
. = loadout_gear[G.type]
if(!.)
. = list()
loadout_gear[G.display_name] = .
loadout_gear[G.type] = .
/datum/character_save/proc/get_tweak_metadata(datum/gear/G, datum/gear_tweak/tweak)
var/list/metadata = get_gear_metadata(G)
@@ -96,29 +96,17 @@
if(href_list["preference"] == "gear")
if(href_list["toggle_gear"])
var/datum/gear/TG = GLOB.gear_datums[href_list["toggle_gear"]]
if(TG.display_name in active_character.loadout_gear)
active_character.loadout_gear -= TG.display_name
var/datum/gear/TG = GLOB.gear_datums[text2path(href_list["toggle_gear"])]
if(TG && (TG.type in active_character.loadout_gear))
active_character.loadout_gear -= TG.type
else
if(TG.donator_tier && user.client.donator_level < TG.donator_tier)
to_chat(user, "<span class='warning'>That gear is only available at a higher donation tier than you are on.</span>")
return
var/total_cost = 0
var/list/type_blacklist = list()
for(var/gear_name in active_character.loadout_gear)
var/datum/gear/G = GLOB.gear_datums[gear_name]
if(istype(G))
if(!G.subtype_cost_overlap)
if(G.subtype_path in type_blacklist)
continue
type_blacklist += G.subtype_path
total_cost += G.cost
build_loadout(TG)
if((total_cost + TG.cost) <= max_gear_slots)
active_character.loadout_gear += TG.display_name
else if(href_list["gear"] && href_list["tweak"])
var/datum/gear/gear = GLOB.gear_datums[href_list["gear"]]
else if(href_list["gear"] && href_list["tweak"]) // NYI
var/datum/gear/gear = GLOB.gear_datums[text2path(href_list["gear"])]
var/datum/gear_tweak/tweak = locate(href_list["tweak"])
if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
return
@@ -10,17 +10,27 @@ GLOBAL_LIST_EMPTY(gear_datums)
..()
/datum/gear
var/display_name //Name/index. Must be unique.
var/description //Description of this gear. If left blank will default to the description of the pathed item.
var/path //Path to item.
var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
var/whitelisted //Term to check the whitelist for..
/// Displayed name of the item listing.
var/display_name
/// Description of the item listing. If left blank will default to the description of the pathed item.
var/description
/// Typepath of the item.
var/path
/// Loadout points cost to select the item listing.
var/cost = 1
/// Slot to equip the item to.
var/slot
/// List of job roles which can spawn with the item.
var/list/allowed_roles
/// Loadout category of the item listing.
var/sort_category = "General"
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
var/subtype_path = /datum/gear //for skipping organizational subtypes (optional)
var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time
/// List of datums which will alter the item after it has been spawned. (NYI)
var/list/gear_tweaks = list()
/// Set on empty category datums to skip them being added to the list. (/datum/gear/accessory, /datum/gear/suit/coat/job, etc.)
var/main_typepath = /datum/gear
/// Does selecting a second item with the same `main_typepath` cost loadout points.
var/subtype_selection_cost = TRUE
/// Patreon donator tier needed to select this item listing.
var/donator_tier = 0
/datum/gear/New()
@@ -1,203 +1,215 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/accessory
subtype_path = /datum/gear/accessory
main_typepath = /datum/gear/accessory
slot = slot_tie
sort_category = "Accessories"
/datum/gear/accessory/scarf
display_name = "scarf"
display_name = "Scarf"
path = /obj/item/clothing/accessory/scarf
/datum/gear/accessory/scarf/red
display_name = "scarf, red"
display_name = "Scarf, red"
path = /obj/item/clothing/accessory/scarf/red
/datum/gear/accessory/scarf/green
display_name = "scarf, green"
display_name = "Scarf, green"
path = /obj/item/clothing/accessory/scarf/green
/datum/gear/accessory/scarf/darkblue
display_name = "scarf, dark blue"
display_name = "Scarf, dark blue"
path = /obj/item/clothing/accessory/scarf/darkblue
/datum/gear/accessory/scarf/purple
display_name = "scarf, purple"
display_name = "Scarf, purple"
path = /obj/item/clothing/accessory/scarf/purple
/datum/gear/accessory/scarf/yellow
display_name = "scarf, yellow"
display_name = "Scarf, yellow"
path = /obj/item/clothing/accessory/scarf/yellow
/datum/gear/accessory/scarf/orange
display_name = "scarf, orange"
display_name = "Scarf, orange"
path = /obj/item/clothing/accessory/scarf/orange
/datum/gear/accessory/scarf/lightblue
display_name = "scarf, light blue"
display_name = "Scarf, light blue"
path = /obj/item/clothing/accessory/scarf/lightblue
/datum/gear/accessory/scarf/white
display_name = "scarf, white"
display_name = "Scarf, white"
path = /obj/item/clothing/accessory/scarf/white
/datum/gear/accessory/scarf/black
display_name = "scarf, black"
display_name = "Scarf, black"
path = /obj/item/clothing/accessory/scarf/black
/datum/gear/accessory/scarf/zebra
display_name = "scarf, zebra"
display_name = "Scarf, zebra"
path = /obj/item/clothing/accessory/scarf/zebra
/datum/gear/accessory/scarf/christmas
display_name = "scarf, christmas"
display_name = "Scarf, christmas"
path = /obj/item/clothing/accessory/scarf/christmas
/datum/gear/accessory/scarf/stripedred
display_name = "scarf, striped red"
display_name = "Scarf, striped red"
path = /obj/item/clothing/accessory/stripedredscarf
/datum/gear/accessory/scarf/stripedgreen
display_name = "scarf, striped green"
display_name = "Scarf, striped green"
path = /obj/item/clothing/accessory/stripedgreenscarf
/datum/gear/accessory/scarf/stripedblue
display_name = "scarf, striped blue"
display_name = "Scarf, striped blue"
path = /obj/item/clothing/accessory/stripedbluescarf
/datum/gear/accessory/holobadge
display_name = "holobadge, pin"
display_name = "Holobadge, pin"
path = /obj/item/clothing/accessory/holobadge
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/accessory/holobadge_n
display_name = "holobadge, cord"
display_name = "Holobadge, cord"
path = /obj/item/clothing/accessory/holobadge/cord
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/accessory/tieblue
display_name = "tie, blue"
display_name = "Tie, blue"
path = /obj/item/clothing/accessory/blue
/datum/gear/accessory/tiered
display_name = "tie, red"
display_name = "Tie, red"
path = /obj/item/clothing/accessory/red
/datum/gear/accessory/tieblack
display_name = "tie, black"
display_name = "Tie, black"
path = /obj/item/clothing/accessory/black
/datum/gear/accessory/tiehorrible
display_name = "tie, vomit green"
display_name = "Tie, vomit green"
path = /obj/item/clothing/accessory/horrible
/datum/gear/accessory/stethoscope
display_name = "stethoscope"
display_name = "Stethoscope"
path = /obj/item/clothing/accessory/stethoscope
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Paramedic", "Brig Physician")
/datum/gear/accessory/cowboyshirt
display_name = "cowboy shirt, black"
display_name = "Cowboy shirt, black"
path = /obj/item/clothing/accessory/cowboyshirt
/datum/gear/accessory/cowboyshirt/short_sleeved
display_name = "cowboy shirt, short sleeved black"
display_name = "Cowboy shirt, short sleeved black"
path = /obj/item/clothing/accessory/cowboyshirt/short_sleeved
/datum/gear/accessory/cowboyshirt/white
display_name = "cowboy shirt, white"
display_name = "Cowboy shirt, white"
path = /obj/item/clothing/accessory/cowboyshirt/white
/datum/gear/accessory/cowboyshirt/white/short_sleeved
display_name = "cowboy shirt, short sleeved white"
display_name = "Cowboy shirt, short sleeved white"
path = /obj/item/clothing/accessory/cowboyshirt/white/short_sleeved
/datum/gear/accessory/cowboyshirt/pink
display_name = "cowboy shirt, pink"
display_name = "Cowboy shirt, pink"
path = /obj/item/clothing/accessory/cowboyshirt/pink
/datum/gear/accessory/cowboyshirt/pink/short_sleeved
display_name = "cowboy shirt, short sleeved pink"
display_name = "Cowboy shirt, short sleeved pink"
path = /obj/item/clothing/accessory/cowboyshirt/pink/short_sleeved
/datum/gear/accessory/cowboyshirt/red
display_name = "cowboy shirt, red"
display_name = "Cowboy shirt, red"
path = /obj/item/clothing/accessory/cowboyshirt/red
/datum/gear/accessory/cowboyshirt/red/short_sleeved
display_name = "cowboy shirt, short sleeved red"
display_name = "Cowboy shirt, short sleeved red"
path = /obj/item/clothing/accessory/cowboyshirt/red/short_sleeved
/datum/gear/accessory/cowboyshirt/navy
display_name = "cowboy shirt, navy"
display_name = "Cowboy shirt, navy"
path = /obj/item/clothing/accessory/cowboyshirt/navy
/datum/gear/accessory/cowboyshirt/navy/short_sleeved
display_name = "cowboy shirt, short sleeved navy"
display_name = "Cowboy shirt, short sleeved navy"
path = /obj/item/clothing/accessory/cowboyshirt/navy/short_sleeved
/datum/gear/accessory/locket
display_name = "gold locket"
display_name = "Gold locket"
path = /obj/item/clothing/accessory/necklace/locket
/datum/gear/accessory/necklace
display_name = "simple necklace"
display_name = "Simple necklace"
path = /obj/item/clothing/accessory/necklace
/datum/gear/accessory/corset
display_name = "corset, black"
display_name = "Corset, black"
path = /obj/item/clothing/accessory/corset
/datum/gear/accessory/corsetred
display_name = "corset, red"
display_name = "Corset, red"
path = /obj/item/clothing/accessory/corset/red
/datum/gear/accessory/corsetblue
display_name = "corset, blue"
display_name = "Corset, blue"
path = /obj/item/clothing/accessory/corset/blue
/datum/gear/accessory/armband_red
display_name = "armband"
display_name = "Armband"
path = /obj/item/clothing/accessory/armband
/datum/gear/accessory/armband_civ
display_name = "armband, blue-yellow"
display_name = "Armband, blue-yellow"
path = /obj/item/clothing/accessory/armband/yb
/datum/gear/accessory/armband_job
subtype_path = /datum/gear/accessory/armband_job
subtype_cost_overlap = FALSE
main_typepath = /datum/gear/accessory/armband_job
subtype_selection_cost = FALSE
/datum/gear/accessory/armband_job/sec
display_name = " armband, security"
display_name = "Armband, security"
path = /obj/item/clothing/accessory/armband/sec
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician")
/datum/gear/accessory/armband_job/cargo
display_name = "cargo armband"
display_name = "Armband, cargo"
path = /obj/item/clothing/accessory/armband/cargo
allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner")
/datum/gear/accessory/armband_job/medical
display_name = "armband, medical"
display_name = "Armband, medical"
path = /obj/item/clothing/accessory/armband/med
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician")
/datum/gear/accessory/armband_job/emt
display_name = "armband, EMT"
display_name = "Armband, EMT"
path = /obj/item/clothing/accessory/armband/medgreen
allowed_roles = list("Paramedic", "Brig Physician")
/datum/gear/accessory/armband_job/engineering
display_name = "armband, engineering"
display_name = "Armband, engineering"
path = /obj/item/clothing/accessory/armband/engine
allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist")
/datum/gear/accessory/armband_job/hydro
display_name = "armband, hydroponics"
display_name = "Armband, hydroponics"
path = /obj/item/clothing/accessory/armband/hydro
allowed_roles = list("Botanist")
/datum/gear/accessory/armband_job/sci
display_name = "armband, science"
display_name = "Armband, science"
path = /obj/item/clothing/accessory/armband/science
allowed_roles = list("Research Director","Scientist", "Roboticist")
@@ -1,24 +1,37 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/lipstick
display_name = "lipstick, red"
display_name = "Lipstick, red"
path = /obj/item/lipstick
sort_category = "Cosmetics"
/datum/gear/lipstick/black
display_name = "lipstick, black"
display_name = "Lipstick, black"
path = /obj/item/lipstick/black
/datum/gear/lipstick/jade
display_name = "lipstick, jade"
display_name = "Lipstick, jade"
path = /obj/item/lipstick/jade
/datum/gear/lipstick/purple
display_name = "lipstick, purple"
display_name = "Lipstick, purple"
path = /obj/item/lipstick/purple
/datum/gear/lipstick/blue
display_name = "lipstick, blue"
display_name = "Lipstick, blue"
path = /obj/item/lipstick/blue
/datum/gear/lipstick/lime
display_name = "lipstick, lime"
display_name = "Lipstick, lime"
path = /obj/item/lipstick/lime
@@ -1,7 +1,20 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/donor
donator_tier = 2
sort_category = "Donor"
subtype_path = /datum/gear/donor
main_typepath = /datum/gear/donor
/datum/gear/donor/furgloves
display_name = "Fur Gloves"
@@ -1,136 +1,149 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/dice
display_name = "a d20"
display_name = "D20"
path = /obj/item/dice/d20
/datum/gear/uplift
display_name = "a pack of Uplifts"
display_name = "Pack of Uplifts"
path = /obj/item/storage/fancy/cigarettes/cigpack_uplift
/datum/gear/robust
display_name = "a pack of Robusts"
display_name = "Pack of Robusts"
path = /obj/item/storage/fancy/cigarettes/cigpack_robust
/datum/gear/carp
display_name = "a pack of Carps"
display_name = "Pack of Carps"
path = /obj/item/storage/fancy/cigarettes/cigpack_carp
/datum/gear/midori
display_name = "a pack of Midoris"
display_name = "Pack of Midoris"
path = /obj/item/storage/fancy/cigarettes/cigpack_midori
/datum/gear/smokingpipe
display_name = "smoking pipe"
display_name = "Smoking pipe"
path = /obj/item/clothing/mask/cigarette/pipe
cost = 2
/datum/gear/lighter
display_name = "a cheap lighter"
display_name = "Cheap lighter"
path = /obj/item/lighter
/datum/gear/matches
display_name = "a box of matches"
display_name = "Box of matches"
path = /obj/item/storage/box/matches
/datum/gear/candlebox
display_name = "a box candles"
display_name = "Box of candles"
description = "For setting the mood or for occult rituals."
path = /obj/item/storage/fancy/candle_box/full
/datum/gear/rock
display_name = "a pet rock"
display_name = "Pet rock"
path = /obj/item/toy/pet_rock
/datum/gear/camera
display_name = "a camera"
display_name = "Camera"
path = /obj/item/camera
/datum/gear/redfoxplushie
display_name = "a red fox plushie"
display_name = "Red fox plushie"
path = /obj/item/toy/plushie/red_fox
/datum/gear/blackcatplushie
display_name = "a black cat plushie"
display_name = "Black cat plushie"
path = /obj/item/toy/plushie/black_cat
/datum/gear/voxplushie
display_name = "a vox plushie"
display_name = "Vox plushie"
path = /obj/item/toy/plushie/voxplushie
/datum/gear/lizardplushie
display_name = "a lizard plushie"
display_name = "Lizard plushie"
path = /obj/item/toy/plushie/lizardplushie
/datum/gear/deerplushie
display_name = "a deer plushie"
display_name = "Deer plushie"
path = /obj/item/toy/plushie/deer
/datum/gear/carpplushie
display_name = "a carp plushie"
display_name = "Carp plushie"
path = /obj/item/toy/carpplushie
/datum/gear/sechud
display_name = "a classic security HUD"
display_name = "Classic security HUD"
path = /obj/item/clothing/glasses/hud/security
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent","Magistrate")
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Internal Affairs Agent","Magistrate")
/datum/gear/cryaonbox
display_name = "a box of crayons"
display_name = "Box of crayons"
path = /obj/item/storage/fancy/crayons
/datum/gear/cane
display_name = "a walking cane"
display_name = "Walking cane"
path = /obj/item/cane
/datum/gear/cards
display_name = "a deck of standard cards"
display_name = "Deck of standard cards"
path = /obj/item/deck/cards
/datum/gear/doublecards
display_name = "a double deck of standard cards"
display_name = "Double deck of standard cards"
path = /obj/item/deck/doublecards
/datum/gear/tarot
display_name = "a deck of tarot cards"
display_name = "Deck of tarot cards"
path = /obj/item/deck/tarot
/datum/gear/headphones
display_name = "a pair of headphones"
display_name = "Headphones"
path = /obj/item/clothing/ears/headphones
/datum/gear/fannypack
display_name = "a fannypack"
display_name = "Fannypack"
path = /obj/item/storage/belt/fannypack
/datum/gear/blackbandana
display_name = "bandana, black"
display_name = "Bandana, black"
path = /obj/item/clothing/mask/bandana/black
/datum/gear/purplebandana
display_name = "bandana, purple"
display_name = "Bandana, purple"
path = /obj/item/clothing/mask/bandana/purple
/datum/gear/orangebandana
display_name = "bandana, orange"
display_name = "Bandana, orange"
path = /obj/item/clothing/mask/bandana/orange
/datum/gear/greenbandana
display_name = "bandana, green"
display_name = "Bandana, green"
path = /obj/item/clothing/mask/bandana/green
/datum/gear/bluebandana
display_name = "bandana, blue"
display_name = "Bandana, blue"
path = /obj/item/clothing/mask/bandana/blue
/datum/gear/redbandana
display_name = "bandana, red"
display_name = "Bandana, red"
path = /obj/item/clothing/mask/bandana/red
/datum/gear/goldbandana
display_name = "bandana, gold"
display_name = "Bandana, gold"
path = /obj/item/clothing/mask/bandana/gold
/datum/gear/skullbandana
display_name = "bandana, skull"
display_name = "Bandana, skull"
path = /obj/item/clothing/mask/bandana/skull
/datum/gear/mob_hunt_game
@@ -143,54 +156,54 @@
//////////////////////
/datum/gear/mug
display_name = "random coffee mug"
display_name = "Coffee mug, random"
description = "A randomly colored coffee mug. You'll need to supply your own beverage though."
path = /obj/item/reagent_containers/food/drinks/mug
sort_category = "Mugs"
/datum/gear/novelty_mug
display_name = "novelty coffee mug"
display_name = "Coffee mug, novelty"
description = "A random novelty coffee mug. You'll need to supply your own beverage though."
path = /obj/item/reagent_containers/food/drinks/mug/novelty
cost = 2
sort_category = "Mugs"
/datum/gear/mug/flask
display_name = "flask"
display_name = "Flask"
description = "A flask for drink transportation. You'll need to supply your own beverage though."
path = /obj/item/reagent_containers/food/drinks/flask/barflask
/datum/gear/mug/department
subtype_path = /datum/gear/mug/department
main_typepath = /datum/gear/mug/department
sort_category = "Mugs"
subtype_cost_overlap = FALSE
subtype_selection_cost = FALSE
/datum/gear/mug/department/eng
display_name = "engineer coffee mug"
display_name = "Coffee mug, engineering"
description = "An engineer's coffee mug, emblazoned in the colors of the Engineering department."
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
allowed_roles = list("Chief Engineer", "Station Engineer", "Life Support Specialist")
path = /obj/item/reagent_containers/food/drinks/mug/eng
/datum/gear/mug/department/med
display_name = "doctor coffee mug"
display_name = "Coffee mug, medical"
description = "A doctor's coffee mug, emblazoned in the colors of the Medical department."
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Coroner")
path = /obj/item/reagent_containers/food/drinks/mug/med
/datum/gear/mug/department/sci
display_name = "scientist coffee mug"
display_name = "Coffee mug, science"
description = "A scientist's coffee mug, emblazoned in the colors of the Science department."
allowed_roles = list("Research Director", "Scientist", "Roboticist")
path = /obj/item/reagent_containers/food/drinks/mug/sci
/datum/gear/mug/department/sec
display_name = "officer coffee mug"
display_name = "Coffee mug, security"
description = "An officer's coffee mug, emblazoned in the colors of the Security department."
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot", "Brig Physician", "Internal Affairs Agent")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Internal Affairs Agent")
path = /obj/item/reagent_containers/food/drinks/mug/sec
/datum/gear/mug/department/serv
display_name = "crewmember coffee mug"
display_name = "Coffee mug, service"
description = "A crewmember's coffee mug, emblazoned in the colors of the Service department."
path = /obj/item/reagent_containers/food/drinks/mug/serv
@@ -1,10 +1,23 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/glasses
subtype_path = /datum/gear/glasses
main_typepath = /datum/gear/glasses
slot = slot_glasses
sort_category = "Glasses"
/datum/gear/glasses/sunglasses
display_name = "cheap sunglasses"
display_name = "Cheap sunglasses"
path = /obj/item/clothing/glasses/sunglasses_fake
/datum/gear/glasses/eyepatch
@@ -1,5 +1,18 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/gloves
subtype_path = /datum/gear/gloves
main_typepath = /datum/gear/gloves
slot = slot_gloves
sort_category = "Gloves"
@@ -1,184 +1,197 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/hat
subtype_path = /datum/gear/hat
main_typepath = /datum/gear/hat
slot = slot_head
sort_category = "Headwear"
/datum/gear/hat/hhat_yellow
display_name = "hardhat, yellow"
display_name = "Hardhat, yellow"
path = /obj/item/clothing/head/hardhat
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
allowed_roles = list("Chief Engineer", "Station Engineer", "Life Support Specialist")
/datum/gear/hat/hhat_orange
display_name = "hardhat, orange"
display_name = "Hardhat, orange"
path = /obj/item/clothing/head/hardhat/orange
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
allowed_roles = list("Chief Engineer", "Station Engineer", "Life Support Specialist")
/datum/gear/hat/hhat_blue
display_name = "hardhat, blue"
display_name = "Hardhat, blue"
path = /obj/item/clothing/head/hardhat/dblue
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
allowed_roles = list("Chief Engineer", "Station Engineer", "Life Support Specialist")
/datum/gear/hat/that
display_name = "top hat"
display_name = "Top hat"
path = /obj/item/clothing/head/that
/datum/gear/hat/flatcap
display_name = "flat cap"
display_name = "Flat cap"
path = /obj/item/clothing/head/flatcap
/datum/gear/hat/witch
display_name = "witch hat"
display_name = "Witch hat"
path = /obj/item/clothing/head/wizard/marisa/fake
/datum/gear/hat/piratecaphat
display_name = "pirate captian hat"
display_name = "Pirate captian hat"
path = /obj/item/clothing/head/pirate
/datum/gear/hat/fez
display_name = "fez"
display_name = "Fez"
path = /obj/item/clothing/head/fez
/datum/gear/hat/rasta
display_name = "rasta hat"
display_name = "Rasta hat"
path = /obj/item/clothing/head/beanie/rasta
/datum/gear/hat/bfedora
display_name = "fedora, black"
display_name = "Fedora, black"
path = /obj/item/clothing/head/fedora
/datum/gear/hat/wfedora
display_name = "fedora, white"
display_name = "Fedora, white"
path = /obj/item/clothing/head/fedora/whitefedora
/datum/gear/hat/brfedora
display_name = "fedora, brown"
display_name = "Fedora, brown"
path = /obj/item/clothing/head/fedora/brownfedora
/datum/gear/hat/capcsec
display_name = "security corporate cap"
display_name = "Security cap, corporate"
path = /obj/item/clothing/head/soft/sec/corp
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Security Officer")
/datum/gear/hat/capsec
display_name = "security cap"
display_name = "Security cap"
path = /obj/item/clothing/head/soft/sec
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Security Officer")
/datum/gear/hat/capred
display_name = "cap, red"
display_name = "Cap, red"
path = /obj/item/clothing/head/soft/red
/datum/gear/hat/capblue
display_name = "cap, blue"
display_name = "Cap, blue"
path = /obj/item/clothing/head/soft/blue
/datum/gear/hat/capgreen
display_name = "cap, green"
display_name = "Cap, green"
path = /obj/item/clothing/head/soft/green
/datum/gear/hat/capblack
display_name = "cap, black"
display_name = "Cap, black"
path = /obj/item/clothing/head/soft/black
/datum/gear/hat/cappurple
display_name = "cap, purple"
display_name = "Cap, purple"
path = /obj/item/clothing/head/soft/purple
/datum/gear/hat/capwhite
display_name = "cap, white"
display_name = "Cap, white"
path = /obj/item/clothing/head/soft/mime
/datum/gear/hat/caporange
display_name = "cap, orange"
display_name = "Cap, orange"
path = /obj/item/clothing/head/soft/orange
/datum/gear/hat/capgrey
display_name = "cap, grey"
display_name = "Cap, grey"
path = /obj/item/clothing/head/soft/grey
/datum/gear/hat/capyellow
display_name = "cap, yellow"
display_name = "Cap, yellow"
path = /obj/item/clothing/head/soft/yellow
/datum/gear/hat/cowboyhat
display_name = "cowboy hat, brown"
display_name = "Cowboy hat, brown"
path = /obj/item/clothing/head/cowboyhat
/datum/gear/hat/cowboyhat/tan
display_name = "cowboy hat, tan"
display_name = "Cowboy hat, tan"
path = /obj/item/clothing/head/cowboyhat/tan
/datum/gear/hat/cowboyhat/black
display_name = "cowboy hat, black"
display_name = "Cowboy hat, black"
path = /obj/item/clothing/head/cowboyhat/black
/datum/gear/hat/cowboyhat/white
display_name = "cowboy hat, white"
display_name = "Cowboy hat, white"
path = /obj/item/clothing/head/cowboyhat/white
/datum/gear/hat/cowboyhat/pink
display_name = "cowboy hat, pink"
display_name = "Cowboy hat, pink"
path = /obj/item/clothing/head/cowboyhat/pink
/datum/gear/hat/beret_purple
display_name = "beret, purple"
display_name = "Beret, purple"
path = /obj/item/clothing/head/beret/purple_normal
/datum/gear/hat/beret_black
display_name = "beret, black"
display_name = "Beret, black"
path = /obj/item/clothing/head/beret/black
/datum/gear/hat/beret_blue
display_name = "beret, blue"
display_name = "Beret, blue"
path = /obj/item/clothing/head/beret/blue
/datum/gear/hat/beret_red
display_name = "beret, red"
display_name = "Beret, red"
path = /obj/item/clothing/head/beret
/datum/gear/hat/beret_job
subtype_path = /datum/gear/hat/beret_job
subtype_cost_overlap = FALSE
main_typepath = /datum/gear/hat/beret_job
subtype_selection_cost = FALSE
/datum/gear/hat/beret_job/sec
display_name = "security beret"
display_name = "Beret, security"
path = /obj/item/clothing/head/beret/sec
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Security Officer")
/datum/gear/hat/beret_job/sci
display_name = "science beret"
display_name = "Beret, science"
path = /obj/item/clothing/head/beret/sci
allowed_roles = list("Research Director", "Scientist")
/datum/gear/hat/beret_job/med
display_name = "medical beret"
display_name = "Beret, medical"
path = /obj/item/clothing/head/beret/med
allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner")
/datum/gear/hat/beret_job/eng
display_name = "engineering beret"
display_name = "Beret, engineering"
path = /obj/item/clothing/head/beret/eng
allowed_roles = list("Chief Engineer", "Station Engineer")
/datum/gear/hat/beret_job/atmos
display_name = "atmospherics beret"
display_name = "Beret, atmospherics"
path = /obj/item/clothing/head/beret/atmos
allowed_roles = list("Chief Engineer", "Life Support Specialist")
/datum/gear/hat/surgicalcap_purple
display_name = "surgical cap, purple"
display_name = "Surgical cap, purple"
path = /obj/item/clothing/head/surgery/purple
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
/datum/gear/hat/surgicalcap_green
display_name = "surgical cap, green"
display_name = "Surgical cap, green"
path = /obj/item/clothing/head/surgery/green
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
/datum/gear/hat/flowerpin
display_name = "hair flower"
display_name = "Hair flower"
path = /obj/item/clothing/head/hairflower
/datum/gear/hat/capsolgov
display_name = "cap, Sol Gov"
display_name = "Cap, Sol Gov"
path = /obj/item/clothing/head/soft/solgov
@@ -1,47 +1,60 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/racial
sort_category = "Racial"
subtype_path = /datum/gear/racial
main_typepath = /datum/gear/racial
cost = 1
/datum/gear/racial/taj
display_name = "embroidered veil"
display_name = "Embroidered veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind
slot = slot_glasses
/datum/gear/racial/taj/sec
display_name = "sleek veil"
display_name = "Sleek veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built security HUD."
path = /obj/item/clothing/glasses/hud/security/tajblind
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent", "Magistrate")
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Internal Affairs Agent", "Magistrate")
cost = 2
/datum/gear/racial/taj/med
display_name = "lightweight veil"
display_name = "Lightweight veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. This one has an in-built medical HUD."
path = /obj/item/clothing/glasses/hud/health/tajblind
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner")
cost = 2
/datum/gear/racial/taj/sci
display_name = "hi-tech veil"
display_name = "Hi-tech veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind/sci
cost = 2
/datum/gear/racial/taj/eng
display_name = "industrial veil"
display_name = "Industrial veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind/eng
cost = 2
/datum/gear/racial/taj/cargo
display_name = "khaki veil"
display_name = "Khaki veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
path = /obj/item/clothing/glasses/tajblind/cargo
cost = 2
/datum/gear/racial/footwraps
display_name = "cloth footwraps"
display_name = "Cloth footwraps"
path = /obj/item/clothing/shoes/footwraps
slot = slot_shoes
@@ -1,54 +1,67 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/shoes
subtype_path = /datum/gear/shoes
main_typepath = /datum/gear/shoes
slot = slot_shoes
sort_category = "Shoes"
/datum/gear/shoes/sandals
display_name = "sandals, wooden"
display_name = "Sandals, wooden"
path = /obj/item/clothing/shoes/sandal
/datum/gear/shoes/winterboots
display_name = "winter boots"
display_name = "Winter boots"
path = /obj/item/clothing/shoes/winterboots
/datum/gear/shoes/workboots
display_name = "work boots"
display_name = "Work boots"
path = /obj/item/clothing/shoes/workboots
/datum/gear/shoes/fancysandals
display_name = "sandals, fancy"
display_name = "Sandals, fancy"
path = /obj/item/clothing/shoes/sandal/fancy
/datum/gear/shoes/dressshoes
display_name = "dress shoes"
display_name = "Dress shoes"
path = /obj/item/clothing/shoes/centcom
/datum/gear/shoes/cowboyboots
display_name = "cowboy boots, brown"
display_name = "Cowboy boots, brown"
path = /obj/item/clothing/shoes/cowboy
/datum/gear/shoes/cowboyboots_black
display_name = "cowboy boots, black"
display_name = "Cowboy boots, black"
path = /obj/item/clothing/shoes/cowboy/black
/datum/gear/shoes/cowboyboots/white
display_name = "cowboy boots, white"
display_name = "Cowboy boots, white"
path = /obj/item/clothing/shoes/cowboy/white
/datum/gear/shoes/cowboyboots/pink
display_name = "cowboy boots, pink"
display_name = "Cowboy boots, pink"
path = /obj/item/clothing/shoes/cowboy/pink
/datum/gear/shoes/jackboots
display_name = "jackboots"
display_name = "Jackboots"
path = /obj/item/clothing/shoes/jackboots
/datum/gear/shoes/jacksandals
display_name = "jacksandals"
display_name = "Jacksandals"
path = /obj/item/clothing/shoes/jackboots/jacksandals
/datum/gear/shoes/laceup
display_name = "laceup shoes"
display_name = "Laceup shoes"
path = /obj/item/clothing/shoes/laceup
/datum/gear/shoes/blackshoes
@@ -1,227 +1,238 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/suit
subtype_path = /datum/gear/suit
main_typepath = /datum/gear/suit
slot = slot_wear_suit
sort_category = "External Wear"
//WINTER COATS
/datum/gear/suit/coat
subtype_path = /datum/gear/suit/coat
main_typepath = /datum/gear/suit/coat
/datum/gear/suit/coat/grey
display_name = "winter coat"
display_name = "Winter coat"
path = /obj/item/clothing/suit/hooded/wintercoat
/datum/gear/suit/coat/job
subtype_path = /datum/gear/suit/coat/job
subtype_cost_overlap = FALSE
main_typepath = /datum/gear/suit/coat/job
subtype_selection_cost = FALSE
/datum/gear/suit/coat/job/sec
display_name = "winter coat, security"
display_name = "Winter coat, security"
path = /obj/item/clothing/suit/hooded/wintercoat/security
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/suit/coat/job/captain
display_name = "winter coat, captain"
display_name = "Winter coat, captain"
path = /obj/item/clothing/suit/hooded/wintercoat/captain
allowed_roles = list("Captain")
/datum/gear/suit/coat/job/med
display_name = "winter coat, medical"
display_name = "Winter coat, medical"
path = /obj/item/clothing/suit/hooded/wintercoat/medical
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician" , "Coroner")
/datum/gear/suit/coat/job/sci
display_name = "winter coat, science"
display_name = "Winter coat, science"
path = /obj/item/clothing/suit/hooded/wintercoat/science
allowed_roles = list("Scientist", "Research Director")
/datum/gear/suit/coat/job/engi
display_name = "winter coat, engineering"
display_name = "Winter coat, engineering"
path = /obj/item/clothing/suit/hooded/wintercoat/engineering
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic")
allowed_roles = list("Chief Engineer", "Station Engineer")
/datum/gear/suit/coat/job/atmos
display_name = "winter coat, atmospherics"
display_name = "Winter coat, atmospherics"
path = /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
allowed_roles = list("Chief Engineer", "Life Support Specialist")
/datum/gear/suit/coat/job/hydro
display_name = "winter coat, hydroponics"
display_name = "Winter coat, hydroponics"
path = /obj/item/clothing/suit/hooded/wintercoat/hydro
allowed_roles = list("Botanist")
/datum/gear/suit/coat/job/cargo
display_name = "winter coat, cargo"
display_name = "Winter coat, cargo"
path = /obj/item/clothing/suit/hooded/wintercoat/cargo
allowed_roles = list("Quartermaster", "Cargo Technician")
/datum/gear/suit/coat/job/miner
display_name = "winter coat, miner"
display_name = "Winter coat, mining"
path = /obj/item/clothing/suit/hooded/wintercoat/miner
allowed_roles = list("Shaft Miner")
//LABCOATS
/datum/gear/suit/labcoat_emt
display_name = "labcoat, paramedic"
display_name = "Labcoat, paramedic"
path = /obj/item/clothing/suit/storage/labcoat/emt
allowed_roles = list("Chief Medical Officer", "Paramedic")
//JACKETS
/datum/gear/suit/leather_jacket
display_name = "leather jacket"
display_name = "Leather jacket"
path = /obj/item/clothing/suit/jacket/leather
/datum/gear/suit/motojacket
display_name = "leather motorcycle jacket"
display_name = "Leather motorcycle jacket"
path = /obj/item/clothing/suit/jacket/motojacket
/datum/gear/suit/br_tcoat
display_name = "trenchcoat, brown"
display_name = "Trenchcoat, brown"
path = /obj/item/clothing/suit/browntrenchcoat
/datum/gear/suit/bl_tcoat
display_name = "trenchcoat, black"
display_name = "Trenchcoat, black"
path = /obj/item/clothing/suit/blacktrenchcoat
/datum/gear/suit/bomber_jacket
display_name = "bomber jacket"
display_name = "Bomber jacket"
path = /obj/item/clothing/suit/jacket
/datum/gear/suit/ol_miljacket
display_name = "military jacket, olive"
display_name = "Military jacket, olive"
path = /obj/item/clothing/suit/jacket/miljacket
/datum/gear/suit/nv_miljacket
display_name = "military jacket, navy"
display_name = "Military jacket, navy"
path = /obj/item/clothing/suit/jacket/miljacket/navy
/datum/gear/suit/ds_miljacket
display_name = "military jacket, desert"
display_name = "Military jacket, desert"
path = /obj/item/clothing/suit/jacket/miljacket/desert
/datum/gear/suit/wh_miljacket
display_name = "military jacket, white"
display_name = "Military jacket, white"
path = /obj/item/clothing/suit/jacket/miljacket/white
/datum/gear/suit/secjacket
display_name = "security jacket"
display_name = "Security jacket"
path = /obj/item/clothing/suit/armor/secjacket
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/suit/secbomberjacket
display_name = "security bomber jacket"
path = /obj/item/clothing/suit/jacket/pilot
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
display_name = "Security bomber jacket"
path = /obj/item/clothing/suit/jacket/secbomber
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/suit/ianshirt
display_name = "Ian Shirt"
path = /obj/item/clothing/suit/ianshirt
/datum/gear/suit/poncho
display_name = "poncho, classic"
display_name = "Poncho, classic"
path = /obj/item/clothing/suit/poncho
/datum/gear/suit/grponcho
display_name = "poncho, green"
display_name = "Poncho, green"
path = /obj/item/clothing/suit/poncho/green
/datum/gear/suit/rdponcho
display_name = "poncho, red"
display_name = "Poncho, red"
path = /obj/item/clothing/suit/poncho/red
/datum/gear/suit/tphoodie
display_name = "hoodie, Tharsis Polytech"
display_name = "Hoodie, Tharsis Polytech"
path = /obj/item/clothing/suit/hooded/hoodie/tp
/datum/gear/suit/nthoodie
display_name = "hoodie, Nanotrasen"
display_name = "Hoodie, Nanotrasen"
path = /obj/item/clothing/suit/hooded/hoodie/nt
/datum/gear/suit/lamhoodie
display_name = "hoodie, Lunar Academy of Medicine"
display_name = "Hoodie, Lunar Academy of Medicine"
path = /obj/item/clothing/suit/hooded/hoodie/lam
/datum/gear/suit/cuthoodie
display_name = "hoodie, Canaan University of Technology"
display_name = "Hoodie, Canaan University of Technology"
path = /obj/item/clothing/suit/hooded/hoodie/cut
/datum/gear/suit/mithoodie
display_name = "hoodie, Martian Institute of Technology"
display_name = "Hoodie, Martian Institute of Technology"
path = /obj/item/clothing/suit/hooded/hoodie/mit
/datum/gear/suit/bluehoodie
display_name = "hoodie, blue"
display_name = "Hoodie, blue"
path = /obj/item/clothing/suit/hooded/hoodie/blue
/datum/gear/suit/blackhoodie
display_name = "hoodie, black"
display_name = "Hoodie, black"
path = /obj/item/clothing/suit/hooded/hoodie
//SUITS!
/datum/gear/suit/blacksuit
display_name = "suit jacket, black"
display_name = "Suit jacket, black"
path = /obj/item/clothing/suit/storage/lawyer/blackjacket
/datum/gear/suit/bluesuit
display_name = "suit jacket, blue"
display_name = "Suit jacket, blue"
path = /obj/item/clothing/suit/storage/lawyer/bluejacket
/datum/gear/suit/purplesuit
display_name = "suit jacket, purple"
display_name = "Suit jacket, purple"
path = /obj/item/clothing/suit/storage/lawyer/purpjacket
//Mantles!
/datum/gear/suit/mantle
display_name = "mantle"
display_name = "Mantle"
path = /obj/item/clothing/suit/mantle
/datum/gear/suit/old_scarf
display_name = "old scarf"
display_name = "Old scarf"
path = /obj/item/clothing/suit/mantle/old
/datum/gear/suit/regal_shawl
display_name = "regal shawl"
display_name = "Regal shawl"
path = /obj/item/clothing/suit/mantle/regal
/datum/gear/suit/mantle/job
subtype_path = /datum/gear/suit/mantle/job
subtype_cost_overlap = FALSE
main_typepath = /datum/gear/suit/mantle/job
subtype_selection_cost = FALSE
/datum/gear/suit/mantle/job/captain
display_name = "mantle, captain"
display_name = "Mantle, captain"
path = /obj/item/clothing/suit/mantle/armor/captain
allowed_roles = list("Captain")
/datum/gear/suit/mantle/job/ce
display_name = "mantle, chief engineer"
display_name = "Mantle, chief engineer"
path = /obj/item/clothing/suit/mantle/chief_engineer
allowed_roles = list("Chief Engineer")
/datum/gear/suit/mantle/job/cmo
display_name = "mantle, chief medical officer"
display_name = "Mantle, chief medical officer"
path = /obj/item/clothing/suit/mantle/labcoat/chief_medical_officer
allowed_roles = list("Chief Medical Officer")
/datum/gear/suit/mantle/job/hos
display_name = "mantle, head of security"
display_name = "Mantle, head of security"
path = /obj/item/clothing/suit/mantle/armor
allowed_roles = list("Head of Security")
/datum/gear/suit/mantle/job/hop
display_name = "mantle, head of personnel"
display_name = "Mantle, head of personnel"
path = /obj/item/clothing/suit/mantle/armor/head_of_personnel
allowed_roles = list("Head of Personnel")
/datum/gear/suit/mantle/job/rd
display_name = "mantle, research director"
display_name = "Mantle, research director"
path = /obj/item/clothing/suit/mantle/labcoat
allowed_roles = list("Research Director")
//Robes!
/datum/gear/suit/witch
display_name = "witch robes"
display_name = "Witch robes"
path = /obj/item/clothing/suit/wizrobe/marisa/fake
@@ -1,96 +1,105 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
// Uniform slot
/datum/gear/uniform
subtype_path = /datum/gear/uniform
main_typepath = /datum/gear/uniform
slot = slot_w_uniform
sort_category = "Uniforms and Casual Dress"
/datum/gear/uniform/suit
subtype_path = /datum/gear/uniform/suit
main_typepath = /datum/gear/uniform/suit
//there's a lot more colors than I thought there were @_@
/datum/gear/uniform/suit/jumpsuitblack
display_name = "jumpsuit, black"
display_name = "Jumpsuit, black"
path = /obj/item/clothing/under/color/black
/datum/gear/uniform/suit/jumpsuitblue
display_name = "jumpsuit, blue"
display_name = "Jumpsuit, blue"
path = /obj/item/clothing/under/color/blue
/datum/gear/uniform/suit/jumpsuitgreen
display_name = "jumpsuit, green"
display_name = "Jumpsuit, green"
path = /obj/item/clothing/under/color/green
/datum/gear/uniform/suit/jumpsuitgrey
display_name = "jumpsuit, grey"
display_name = "Jumpsuit, grey"
path = /obj/item/clothing/under/color/grey
/datum/gear/uniform/suit/jumpsuitorange
display_name = "jumpsuit, orange"
display_name = "Jumpsuit, orange"
path = /obj/item/clothing/under/color/orange
/datum/gear/uniform/suit/jumpsuitpink
display_name = "jumpsuit, pink"
display_name = "Jumpsuit, pink"
path = /obj/item/clothing/under/color/pink
/datum/gear/uniform/suit/jumpsuitred
display_name = "jumpsuit, red"
display_name = "Jumpsuit, red"
path = /obj/item/clothing/under/color/red
/datum/gear/uniform/suit/jumpsuitwhite
display_name = "jumpsuit, white"
display_name = "Jumpsuit, white"
path = /obj/item/clothing/under/color/white
/datum/gear/uniform/suit/jumpsuityellow
display_name = "jumpsuit, yellow"
display_name = "Jumpsuit, yellow"
path = /obj/item/clothing/under/color/yellow
/datum/gear/uniform/suit/jumpsuitlightblue
display_name = "jumpsuit, lightblue"
display_name = "Jumpsuit, lightblue"
path = /obj/item/clothing/under/color/lightblue
/datum/gear/uniform/suit/jumpsuitaqua
display_name = "jumpsuit, aqua"
display_name = "Jumpsuit, aqua"
path = /obj/item/clothing/under/color/aqua
/datum/gear/uniform/suit/jumpsuitpurple
display_name = "jumpsuit, purple"
display_name = "Jumpsuit, purple"
path = /obj/item/clothing/under/color/purple
/datum/gear/uniform/suit/jumpsuitlightpurple
display_name = "jumpsuit, lightpurple"
display_name = "Jumpsuit, lightpurple"
path = /obj/item/clothing/under/color/lightpurple
/datum/gear/uniform/suit/jumpsuitlightgreen
display_name = "jumpsuit, lightgreen"
display_name = "Jumpsuit, lightgreen"
path = /obj/item/clothing/under/color/lightgreen
/datum/gear/uniform/suit/jumpsuitlightblue
display_name = "jumpsuit, lightblue"
path = /obj/item/clothing/under/color/lightblue
/datum/gear/uniform/suit/jumpsuitlightbrown
display_name = "jumpsuit, lightbrown"
display_name = "Jumpsuit, lightbrown"
path = /obj/item/clothing/under/color/lightbrown
/datum/gear/uniform/suit/jumpsuitbrown
display_name = "jumpsuit, brown"
display_name = "Jumpsuit, brown"
path = /obj/item/clothing/under/color/brown
/datum/gear/uniform/suit/jumpsuityellowgreen
display_name = "jumpsuit, yellowgreen"
display_name = "Jumpsuit, yellowgreen"
path = /obj/item/clothing/under/color/yellowgreen
/datum/gear/uniform/suit/jumpsuitdarkblue
display_name = "jumpsuit, darkblue"
display_name = "Jumpsuit, darkblue"
path = /obj/item/clothing/under/color/darkblue
/datum/gear/uniform/suit/jumpsuitlightred
display_name = "jumpsuit, lightred"
display_name = "Jumpsuit, lightred"
path = /obj/item/clothing/under/color/lightred
/datum/gear/uniform/suit/jumpsuitdarkred
display_name = "jumpsuit, darkred"
display_name = "Jumpsuit, darkred"
path = /obj/item/clothing/under/color/darkred
/datum/gear/uniform/suit/soviet
@@ -98,229 +107,229 @@
path = /obj/item/clothing/under/soviet
/datum/gear/uniform/suit/kilt
display_name = "a kilt"
display_name = "Kilt"
path = /obj/item/clothing/under/kilt
/datum/gear/uniform/skirt
subtype_path = /datum/gear/uniform/skirt
main_typepath = /datum/gear/uniform/skirt
/datum/gear/uniform/skirt/blue
display_name = "plaid skirt, blue"
display_name = "Plaid skirt, blue"
path = /obj/item/clothing/under/dress/plaid_blue
/datum/gear/uniform/skirt/purple
display_name = "plaid skirt, purple"
display_name = "Plaid skirt, purple"
path = /obj/item/clothing/under/dress/plaid_purple
/datum/gear/uniform/skirt/red
display_name = "plaid skirt, red"
display_name = "Plaid skirt, red"
path = /obj/item/clothing/under/dress/plaid_red
/datum/gear/uniform/skirt/black
display_name = "skirt, black"
display_name = "Skirt, black"
path = /obj/item/clothing/under/blackskirt
/datum/gear/uniform/skirt/job
subtype_path = /datum/gear/uniform/skirt/job
subtype_cost_overlap = FALSE
main_typepath = /datum/gear/uniform/skirt/job
subtype_selection_cost = FALSE
/datum/gear/uniform/skirt/job/ce
display_name = "skirt, ce"
display_name = "Skirt, ce"
path = /obj/item/clothing/under/rank/chief_engineer/skirt
allowed_roles = list("Chief Engineer")
/datum/gear/uniform/skirt/job/atmos
display_name = "skirt, atmos"
display_name = "Skirt, atmos"
path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
allowed_roles = list("Chief Engineer","Life Support Specialist")
/datum/gear/uniform/skirt/job/eng
display_name = "skirt, engineer"
display_name = "Skirt, engineer"
path = /obj/item/clothing/under/rank/engineer/skirt
allowed_roles = list("Chief Engineer","Station Engineer")
/datum/gear/uniform/skirt/job/roboticist
display_name = "skirt, roboticist"
display_name = "Skirt, roboticist"
path = /obj/item/clothing/under/rank/roboticist/skirt
allowed_roles = list("Research Director","Roboticist")
/datum/gear/uniform/skirt/job/cmo
display_name = "skirt, cmo"
display_name = "Skirt, cmo"
path = /obj/item/clothing/under/rank/chief_medical_officer/skirt
allowed_roles = list("Chief Medical Officer")
/datum/gear/uniform/skirt/job/chem
display_name = "skirt, chemist"
display_name = "Skirt, chemist"
path = /obj/item/clothing/under/rank/chemist/skirt
allowed_roles = list("Chief Medical Officer","Chemist")
/datum/gear/uniform/skirt/job/viro
display_name = "skirt, virologist"
display_name = "Skirt, virologist"
path = /obj/item/clothing/under/rank/virologist/skirt
allowed_roles = list("Virologist")
/datum/gear/uniform/skirt/job/med
display_name = "skirt, medical"
display_name = "Skirt, medical"
path = /obj/item/clothing/under/rank/medical/skirt
allowed_roles = list("Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Coroner")
/datum/gear/uniform/skirt/job/phys
display_name = "skirt, physician"
display_name = "Skirt, physician"
path = /obj/item/clothing/under/rank/security/brigphys/skirt
allowed_roles = list("Brig Physician")
/datum/gear/uniform/skirt/job/sci
display_name = "skirt, scientist"
display_name = "Skirt, scientist"
path = /obj/item/clothing/under/rank/scientist/skirt
allowed_roles = list("Research Director","Scientist")
/datum/gear/uniform/skirt/job/cargo
display_name = "skirt, cargo"
display_name = "Skirt, cargo"
path = /obj/item/clothing/under/rank/cargotech/skirt
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/uniform/skirt/job/qm
display_name = "skirt, QM"
display_name = "Skirt, QM"
path = /obj/item/clothing/under/rank/cargo/skirt
allowed_roles = list("Quartermaster")
/datum/gear/uniform/skirt/job/warden
display_name = "skirt, warden"
display_name = "Skirt, warden"
path = /obj/item/clothing/under/rank/warden/skirt
allowed_roles = list("Head of Security", "Warden")
/datum/gear/uniform/skirt/job/security
display_name = "skirt, security"
display_name = "Skirt, security"
path = /obj/item/clothing/under/rank/security/skirt
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/uniform/skirt/job/head_of_security
display_name = "skirt, hos"
display_name = "Skirt, hos"
path = /obj/item/clothing/under/rank/head_of_security/skirt
allowed_roles = list("Head of Security")
/datum/gear/uniform/skirt/job/ntrep
display_name = "skirt, nt rep"
display_name = "Skirt, nt rep"
path = /obj/item/clothing/under/rank/ntrep/skirt
allowed_roles = list("Nanotrasen Representative")
/datum/gear/uniform/skirt/job/blueshield
display_name = "skirt, blueshield"
display_name = "Skirt, blueshield"
path = /obj/item/clothing/under/rank/blueshield/skirt
allowed_roles = list("Blueshield")
/datum/gear/uniform/medical
subtype_path = /datum/gear/uniform/medical
main_typepath = /datum/gear/uniform/medical
/datum/gear/uniform/medical/pscrubs
display_name = "medical scrubs, purple"
display_name = "Medical scrubs, purple"
path = /obj/item/clothing/under/rank/medical/purple
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
/datum/gear/uniform/medical/gscrubs
display_name = "medical scrubs, green"
display_name = "Medical scrubs, green"
path = /obj/item/clothing/under/rank/medical/green
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
/datum/gear/uniform/sec
subtype_path = /datum/gear/uniform/sec
main_typepath = /datum/gear/uniform/sec
/datum/gear/uniform/sec/formal
display_name = "security uniform, formal"
display_name = "Security uniform, formal"
path = /obj/item/clothing/under/rank/security/formal
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/uniform/sec/secorporate
display_name = "security uniform, corporate"
display_name = "Security uniform, corporate"
path = /obj/item/clothing/under/rank/security/corp
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Security Officer")
/datum/gear/uniform/sec/dispatch
display_name = "security uniform, dispatch"
display_name = "Security uniform, dispatch"
path = /obj/item/clothing/under/rank/dispatch
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Security Officer")
/datum/gear/uniform/sec/casual
display_name = "security uniform, casual"
display_name = "Security uniform, casual"
path = /obj/item/clothing/under/rank/security2
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective")
/datum/gear/uniform/shorts
subtype_path = /datum/gear/uniform/shorts
main_typepath = /datum/gear/uniform/shorts
/datum/gear/uniform/shorts/red
display_name = "shorts, red"
display_name = "Shorts, red"
path = /obj/item/clothing/under/shorts/red
/datum/gear/uniform/shorts/green
display_name = "shorts, green"
display_name = "Shorts, green"
path = /obj/item/clothing/under/shorts/green
/datum/gear/uniform/shorts/blue
display_name = "shorts, blue"
display_name = "Shorts, blue"
path = /obj/item/clothing/under/shorts/blue
/datum/gear/uniform/shorts/black
display_name = "shorts, black"
display_name = "Shorts, black"
path = /obj/item/clothing/under/shorts/black
/datum/gear/uniform/shorts/grey
display_name = "shorts, grey"
display_name = "Shorts, grey"
path = /obj/item/clothing/under/shorts/grey
/datum/gear/uniform/pants
subtype_path = /datum/gear/uniform/pants
main_typepath = /datum/gear/uniform/pants
/datum/gear/uniform/pants/jeans
display_name = "jeans, classic"
display_name = "Jeans, classic"
path = /obj/item/clothing/under/pants/classicjeans
/datum/gear/uniform/pants/mjeans
display_name = "jeans, mustang"
display_name = "Jeans, mustang"
path = /obj/item/clothing/under/pants/mustangjeans
/datum/gear/uniform/pants/bljeans
display_name = "jeans, black"
display_name = "Jeans, black"
path = /obj/item/clothing/under/pants/blackjeans
/datum/gear/uniform/pants/yfjeans
display_name = "jeans, Young Folks"
display_name = "Jeans, Young Folks"
path = /obj/item/clothing/under/pants/youngfolksjeans
/datum/gear/uniform/pants/whitepants
display_name = "pants, white"
display_name = "Pants, white"
path = /obj/item/clothing/under/pants/white
/datum/gear/uniform/pants/redpants
display_name = "pants, red"
display_name = "Pants, red"
path = /obj/item/clothing/under/pants/red
/datum/gear/uniform/pants/blackpants
display_name = "pants, black"
display_name = "Pants, black"
path = /obj/item/clothing/under/pants/black
/datum/gear/uniform/pants/tanpants
display_name = "pants, tan"
display_name = "Pants, tan"
path = /obj/item/clothing/under/pants/tan
/datum/gear/uniform/pants/bluepants
display_name = "pants, blue"
display_name = "Pants, blue"
path = /obj/item/clothing/under/pants/blue
/datum/gear/uniform/pants/trackpants
display_name = "trackpants"
display_name = "Trackpants"
path = /obj/item/clothing/under/pants/track
/datum/gear/uniform/pants/khakipants
display_name = "pants, khaki"
display_name = "Pants, khaki"
path = /obj/item/clothing/under/pants/khaki
/datum/gear/uniform/pants/caopants
display_name = "pants, camo"
display_name = "Pants, camo"
path = /obj/item/clothing/under/pants/camo
/datum/gear/uniform/suit/tacticool
display_name = "tacticool turtleneck"
display_name = "Tacticool turtleneck"
description = "A sleek black turtleneck paired with some khakis (WARNING DOES NOT HAVE SUIT SENSORS)"
path = /obj/item/clothing/under/syndicate/tacticool
+41 -15
View File
@@ -413,19 +413,9 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "</td></tr></table>"
if(TAB_GEAR)
var/total_cost = 0
var/list/type_blacklist = list()
if(length(active_character.loadout_gear))
for(var/i in 1 to length(active_character.loadout_gear))
var/datum/gear/G = GLOB.gear_datums[active_character.loadout_gear[i]]
if(G)
if(!G.subtype_cost_overlap)
if(G.subtype_path in type_blacklist)
continue
type_blacklist += G.subtype_path
total_cost += G.cost
var/total_cost = build_loadout()
var/fcolor = "#3366CC"
var/fcolor = "#3366CC"
if(total_cost < max_gear_slots)
fcolor = "#E67300"
dat += "<table align='center' width='100%'>"
@@ -450,11 +440,11 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "<tr><td colspan=4><hr></td></tr>"
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
var/ticked = (G.display_name in active_character.loadout_gear)
var/ticked = (G.type in active_character.loadout_gear)
if(G.donator_tier > user.client.donator_level)
dat += "<tr style='vertical-align:top;'><td width=15%><B>[G.display_name]</B></td>"
else
dat += "<tr style='vertical-align:top;'><td width=15%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?_src_=prefs;preference=gear;toggle_gear=[G.display_name]'>[G.display_name]</a></td>"
dat += "<tr style='vertical-align:top;'><td width=15%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?_src_=prefs;preference=gear;toggle_gear=[G.type]'>[G.display_name]</a></td>"
dat += "<td width = 5% style='vertical-align:top'>[G.cost]</td><td>"
if(G.allowed_roles)
dat += "<font size=2>Restrictions: "
@@ -465,7 +455,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
if(ticked)
. += "<tr><td colspan=4>"
for(var/datum/gear_tweak/tweak in G.gear_tweaks)
. += " <a href='?_src_=prefs;preference=gear;gear=[G.display_name];tweak=\ref[tweak]'>[tweak.get_contents(active_character.get_tweak_metadata(G, tweak))]</a>"
. += " <a href='?_src_=prefs;preference=gear;gear=[G.type];tweak=\ref[tweak]'>[tweak.get_contents(active_character.get_tweak_metadata(G, tweak))]</a>"
. += "</td></tr>"
dat += "</table>"
@@ -562,3 +552,39 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
active_character.SetChoices(user)
return 1
/**
* Rebuilds the `loadout_gear` list of the [active_character], and returns the total end cost.
*
* Caches and cuts the existing [/datum/character_save/var/loadout_gear] list and remakes it, checking the `subtype_selection_cost` and overall cost validity of each item.
*
* If the item's [/datum/gear/var/subtype_selection_cost] is `FALSE`, any future items with the same [/datum/gear/var/main_typepath] will have their cost skipped.
* If adding the item will take the total cost over the maximum, it won't be added to the list.
*
* Arguments:
* * new_item - A new [/datum/gear] item to be added to the `loadout_gear` list.
*/
/datum/preferences/proc/build_loadout(datum/gear/new_item)
var/total_cost = 0
var/list/type_blacklist = list()
var/list/loadout_cache = active_character.loadout_gear.Copy()
active_character.loadout_gear.Cut()
if(new_item)
loadout_cache += new_item.type
for(var/I in loadout_cache)
var/datum/gear/G = GLOB.gear_datums[text2path(I) || I]
if(!G)
continue
var/added_cost = G.cost
if(!G.subtype_selection_cost) // If listings of the same subtype shouldn't have their cost added.
if(G.main_typepath in type_blacklist)
added_cost = 0
else
type_blacklist += G.main_typepath
if((total_cost + added_cost) > max_gear_slots)
continue // If the final cost is too high, don't add the item.
active_character.loadout_gear += G.type
total_cost += added_cost
return total_cost
+1 -1
View File
@@ -789,7 +789,7 @@
"Vox" = 'icons/mob/clothing/species/vox/suit.dmi'
)
/obj/item/clothing/suit/jacket/pilot
/obj/item/clothing/suit/jacket/secbomber
name = "security bomber jacket"
desc = "A stylish and worn-in armoured black bomber jacket emblazoned with the NT Security crest on the left breast. Looks rugged."
w_class = WEIGHT_CLASS_NORMAL
@@ -64,10 +64,3 @@
name = "roboticist's jumpskirt"
icon_state = "roboticsf"
item_color = "roboticsf"
/obj/item/clothing/under/rank/mechanic
desc = "It's a pair of overalls worn by mechanics."
name = "mechanic's overalls"
icon_state = "mechanic"
item_state = "mechanic"
item_color = "mechanic"
@@ -183,11 +183,3 @@
item_state = "brig_physf"
item_color = "brig_physf"
permeability_coefficient = 0.50
//Pod Pilot
/obj/item/clothing/under/rank/security/pod_pilot
name = "pod pilot's jumpsuit"
desc = "Suit for your regular pod pilot."
icon_state = "pod_pilot"
item_state = "pod_pilot"
item_color = "pod_pilot"
-24
View File
@@ -1537,30 +1537,6 @@
icon_state = "ikelos_envirohelm" // New item needed because `initial(icon_state)` is used.
icon = 'icons/obj/custom_items.dmi'
/obj/item/fluff/decemviri_spacepod_kit //Decemviri: Sylus Cain
name = "Spacepod mod kit"
desc = "a kit on tools and a blueprint detailing how to reconfigure a spacepod"
icon_state = "modkit"
/obj/item/fluff/decemviri_spacepod_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
if(!istype(target, /obj/spacepod))
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
return
to_chat(user, "<span class='notice'>You modify the appearance of [target] based on the kit blueprints.</span>")
var/obj/spacepod/pod = target
pod.icon = 'icons/48x48/custom_pod.dmi'
pod.icon_state = "pod_dece"
pod.name = "sleek spacepod"
pod.desc = "A modified varient of a space pod."
pod.can_paint = FALSE
used = 1
qdel(src)
/obj/item/bikehorn/fluff/pinkbikehorn //Xerdies: Squiddle Toodle
name = "Honkinator5000"
desc = "This horn may look ridiculous but is the new hot item for clowns in the Clown Empire. It has a fine print on its side reading: Property of Prince Honktertong the IV"
+1 -2
View File
@@ -24,8 +24,7 @@
/area/engine/break_room,
/area/engine/equipmentstorage,
/area/engine/chiefs_office,
/area/engine/controlroom,
/area/engine/mechanic_workshop
/area/engine/controlroom
))
allowed_areas = typecacheof(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes
+9 -11
View File
@@ -271,19 +271,11 @@ GLOBAL_LIST_EMPTY(karma_spenders)
else
dat += "Nanotrasen Representative - <font color='green'>Unlocked</font><br>"
if(!("Blueshield" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=5'>Unlock Blueshield -- 30KP</a><br>"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=4'>Unlock Blueshield -- 30KP</a><br>"
else
dat += "Blueshield - <font color='green'>Unlocked</font><br>"
if(!("Security Pod Pilot" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=9'>Unlock Security Pod Pilot -- 30KP</a><br>"
else
dat += "Security Pod Pilot - <font color='green'>Unlocked</font><br>"
if(!("Mechanic" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=6'>Unlock Mechanic -- 30KP</a><br>"
else
dat += "Mechanic - <font color='green'>Unlocked</font><br>"
if(!("Magistrate" in joblist))
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=7'>Unlock Magistrate -- 45KP</a><br>"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaBuy=5'>Unlock Magistrate -- 45KP</a><br>"
else
dat+= "Magistrate - <font color='green'>Unlocked</font><br>"
@@ -350,6 +342,12 @@ GLOBAL_LIST_EMPTY(karma_spenders)
if("Nanotrasen Recruiter" in purchased)
refundable += "Nanotrasen Recruiter"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Nanotrasen Recruiter;KarmaRefundType=job;KarmaRefundCost=10'>Refund Nanotrasen Recruiter -- 10KP</a><br>"
if("Mechanic" in purchased)
refundable += "Mechanic"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Mechanic;KarmaRefundType=job;KarmaRefundCost=30'>Refund Mechanic -- 30KP</a><br>"
if("Security Pod Pilot" in purchased)
refundable += "Security Pod Pilot"
dat += "<a href='?src=[UID()];karmashop=shop;KarmaRefund=Security Pod Pilot;KarmaRefundType=job;KarmaRefundCost=30'>Refund Security Pod Pilot -- 30KP</a><br>"
if(!refundable.len)
dat += "You do not have any refundable karma purchases.<br>"
@@ -512,7 +510,7 @@ GLOBAL_LIST_EMPTY(karma_spenders)
/client/proc/karmarefund(type, name, cost)
switch(name)
if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador",
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer")
"Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer", "Mechanic", "Security Pod Pilot")
cost = 30
if("Nanotrasen Recruiter")
cost = 10
+1
View File
@@ -8,3 +8,4 @@
author = "Forces beyond your comprehension"
unique = TRUE
title = "The codex gigas"
has_drm = TRUE
@@ -31,7 +31,6 @@
"Science",
"Robotics",
"Research Director's Desk",
"Mechanic",
"Engineering" = list(MAT_METAL, MAT_GLASS, MAT_PLASMA),
"Chief Engineer's Desk" = list(MAT_METAL, MAT_GLASS, MAT_PLASMA),
"Atmospherics" = list(MAT_METAL, MAT_GLASS, MAT_PLASMA),
+10 -12
View File
@@ -389,23 +389,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!isobserver(usr))
to_chat(usr, "Not when you're not dead!")
return
var/target = input("Area to teleport to", "Teleport to a location") as null|anything in SSmapping.ghostteleportlocs
teleport(SSmapping.ghostteleportlocs[target])
var/datum/async_input/A = input_autocomplete_async(usr, "Area to jump to: ", SSmapping.ghostteleportlocs)
A.on_close(CALLBACK(src, .proc/teleport))
/mob/dead/observer/proc/teleport(area/thearea)
if(!thearea || !isobserver(usr))
/mob/dead/observer/proc/teleport(area/A)
if(!A || !isobserver(usr))
return
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea.type))
L += T
var/list/turfs = list()
for(var/turf/T in get_area_turfs(A.type))
turfs += T
if(!L || !L.len)
to_chat(usr, "<span class='warning'>No area available.</span>")
if(!length(turfs))
to_chat(src, "<span class='warning'>Nowhere to jump to!</span>")
return
forceMove(pick(L))
forceMove(pick(turfs))
update_parallax_contents()
/mob/dead/observer/verb/follow()
@@ -96,6 +96,7 @@
// Maybe later add encryption key support, but that's a pain in the neck atm
if(brainmob)
user.changeNext_move(CLICK_CD_MELEE)
O.attack(brainmob, user)//Oh noooeeeee
// Brainmobs can take damage, but they can't actually die. Maybe should fix.
return
@@ -211,11 +211,6 @@
stat("Total Blood", "[mind.vampire.bloodtotal]")
stat("Usable Blood", "[mind.vampire.bloodusable]")
if(istype(loc, /obj/spacepod)) // Spacdpods!
var/obj/spacepod/S = loc
stat("Spacepod Charge", "[istype(S.battery) ? "[(S.battery.charge / S.battery.maxcharge) * 100]" : "No cell detected"]")
stat("Spacepod Integrity", "[!S.health ? "0" : "[(S.health / initial(S.health)) * 100]"]%")
/mob/living/carbon/human/ex_act(severity)
if(status_flags & GODMODE)
return FALSE
@@ -69,7 +69,7 @@
if("Chef")
O = new /datum/outfit/plasmaman/chef
if("Security Officer", "Security Pod Pilot", "Special Operations Officer")
if("Security Officer", "Special Operations Officer")
O = new /datum/outfit/plasmaman/security
if("Detective")
@@ -111,7 +111,7 @@
if("Research Director")
O = new /datum/outfit/plasmaman/rd
if("Station Engineer", "Mechanic")
if("Station Engineer")
O = new /datum/outfit/plasmaman/engineering
if("Chief Engineer")
-4
View File
@@ -847,10 +847,6 @@
var/obj/mecha/M = loc
loc_temp = M.return_temperature()
else if(istype(loc, /obj/spacepod))
var/obj/spacepod/S = loc
loc_temp = S.return_temperature()
else if(istype(loc, /obj/structure/transit_tube_pod))
loc_temp = environment.temperature
@@ -1,60 +1,65 @@
/*
name
key
description
role
comments
ready = 0
*/
/datum/pai_save
/// Client that owns the pAI
var/client/owner
/// pAI's name
var/pai_name
/// pAI's description
var/description
/// pAI's role
var/role
/// pAI's OOC comments
var/ooc_comments
/datum/paiCandidate/proc/savefile_path(mob/user)
return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/pai.sav"
/datum/pai_save/New(client/C)
..()
owner = C
/datum/paiCandidate/proc/savefile_save(mob/user)
if(IsGuestKey(user.key))
return 0
/datum/pai_save/Destroy(force, ...)
owner = null
GLOB.paiController.pai_candidates -= src
return ..()
var/savefile/F = new /savefile(src.savefile_path(user))
// This proc seems useless but its used by client data loading
/datum/pai_save/proc/get_query()
var/datum/db_query/query = SSdbcore.NewQuery("SELECT pai_name, description, preferred_role, ooc_comments FROM pai_saves WHERE ckey=:ckey", list(
"ckey" = owner.ckey
))
return query
// Loads our data up
/datum/pai_save/proc/load_data(datum/db_query/Q)
while(Q.NextRow())
pai_name = Q.item[1]
description = Q.item[2]
role = Q.item[3]
ooc_comments = Q.item[4]
F["name"] << src.name
F["description"] << src.description
F["role"] << src.role
F["comments"] << src.comments
// Reload save from DB if the user edits it
/datum/pai_save/proc/reload_save()
var/datum/db_query/Q = get_query()
if(!Q.warn_execute())
qdel(Q)
return
load_data(Q)
qdel(Q)
F["version"] << 1
// Save their save to the DB
/datum/pai_save/proc/save_to_db()
var/datum/db_query/query = SSdbcore.NewQuery({"
INSERT INTO pai_saves (ckey, pai_name, description, preferred_role, ooc_comments)
VALUES (:ckey, :pai_name, :description, :preferred_role, :ooc_comments)
ON DUPLICATE KEY UPDATE pai_name=:pai_name2, description=:description2, preferred_role=:preferred_role2, ooc_comments=:ooc_comments2
"}, list(
"ckey" = owner.ckey,
"pai_name" = pai_name,
"description" = description,
"preferred_role" = role,
"ooc_comments" = ooc_comments,
"pai_name2" = pai_name,
"description2" = description,
"preferred_role2" = role,
"ooc_comments2" = ooc_comments
))
return 1
// loads the savefile corresponding to the mob's ckey
// if silent=true, report incompatible savefiles
// returns 1 if loaded (or file was incompatible)
// returns 0 if savefile did not exist
/datum/paiCandidate/proc/savefile_load(mob/user, silent = 1)
if(IsGuestKey(user.key))
return 0
var/path = savefile_path(user)
if(!fexists(path))
return 0
var/savefile/F = new /savefile(path)
if(!F) return //Not everyone has a pai savefile.
var/version = null
F["version"] >> version
if(isnull(version) || version != 1)
fdel(path)
if(!silent)
alert(user, "Your savefile was incompatible with this version and was deleted.")
return 0
F["name"] >> src.name
F["description"] >> src.description
F["role"] >> src.role
F["comments"] >> src.comments
return 1
query.warn_execute()
qdel(query)
+36 -55
View File
@@ -2,14 +2,6 @@
GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler for pAI candidates
/datum/paiCandidate
var/name
var/key
var/description
var/role
var/comments
var/ready = 0
/datum/paiController
var/list/pai_candidates = list()
var/list/asked = list()
@@ -18,7 +10,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
/datum/paiController/Topic(href, href_list[])
var/datum/paiCandidate/candidate = locateUID(href_list["candidate"])
var/datum/pai_save/candidate = locateUID(href_list["candidate"])
if(candidate)
if(!istype(candidate))
@@ -32,14 +24,14 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
return
if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr))
return
if(istype(card, /obj/item/paicard) && istype(candidate, /datum/paiCandidate))
if(istype(card, /obj/item/paicard) && istype(candidate, /datum/pai_save))
var/mob/living/silicon/pai/pai = new(card)
if(!candidate.name)
if(!candidate.pai_name)
pai.name = pick(GLOB.ninja_names)
else
pai.name = candidate.name
pai.name = candidate.pai_name
pai.real_name = pai.name
pai.key = candidate.key
pai.key = candidate.owner.ckey
card.setPersonality(pai)
card.looking_for_personality = 0
@@ -64,7 +56,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
return
if(candidate)
if(candidate.key && usr.key && candidate.key != usr.key)
if(candidate.owner.ckey && usr.ckey && candidate.owner.ckey != usr.ckey)
message_admins("Warning: possible href exploit by [key_name_admin(usr)] (paiController/Topic, candidate and usr have different keys)")
log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr have different keys)")
return
@@ -75,9 +67,9 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
switch(option)
if("name")
t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text
t = input("Enter a name for your pAI", "pAI Name", candidate.pai_name) as text
if(t)
candidate.name = sanitize(copytext(t,1,MAX_NAME_LEN))
candidate.pai_name = sanitize(copytext(t,1,MAX_NAME_LEN))
if("desc")
t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message
if(t)
@@ -87,26 +79,26 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
if(t)
candidate.role = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
if("ooc")
t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message
t = input("Enter any OOC comments", "pAI OOC Comments", candidate.ooc_comments) as message
if(t)
candidate.comments = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
candidate.ooc_comments = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
if("save")
candidate.savefile_save(usr)
if("load")
candidate.savefile_load(usr)
candidate.save_to_db(usr)
if("reload")
candidate.reload_save(usr)
//In case people have saved unsanitized stuff.
if(candidate.name)
candidate.name = sanitize(copytext(candidate.name,1,MAX_NAME_LEN))
if(candidate.pai_name)
candidate.pai_name = sanitize(copytext(candidate.pai_name, 1, MAX_NAME_LEN))
if(candidate.description)
candidate.description = sanitize(copytext(candidate.description,1,MAX_MESSAGE_LEN))
candidate.description = sanitize(copytext(candidate.description, 1, MAX_MESSAGE_LEN))
if(candidate.role)
candidate.role = sanitize(copytext(candidate.role,1,MAX_MESSAGE_LEN))
if(candidate.comments)
candidate.comments = sanitize(copytext(candidate.comments,1,MAX_MESSAGE_LEN))
candidate.role = sanitize(copytext(candidate.role, 1, MAX_MESSAGE_LEN))
if(candidate.ooc_comments)
candidate.ooc_comments = sanitize(copytext(candidate.ooc_comments, 1, MAX_MESSAGE_LEN))
if("submit")
if(candidate)
candidate.ready = 1
GLOB.paiController.pai_candidates |= candidate
for(var/obj/item/paicard/p in world)
if(p.looking_for_personality == 1)
p.alertUpdate()
@@ -114,18 +106,8 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
return
recruitWindow(usr)
/datum/paiController/proc/recruitWindow(mob/M as mob)
var/datum/paiCandidate/candidate
for(var/datum/paiCandidate/c in pai_candidates)
if(!istype(c) || !istype(M))
break
if(c.key == M.key)
candidate = c
if(!candidate)
candidate = new /datum/paiCandidate()
candidate.key = M.key
pai_candidates.Add(candidate)
/datum/paiController/proc/recruitWindow(mob/M)
var/datum/pai_save/candidate = M.client.pai_save
var/dat = ""
dat += {"
@@ -194,7 +176,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
<table>
<tr class="d0">
<th rowspan="2"><a href='byond://?src=[UID()];option=name;new=1;candidate=[candidate.UID()]'>Name</a>:</th>
<td class="desc">[candidate.name]&nbsp;</td>
<td class="desc">[candidate.pai_name]&nbsp;</td>
</tr>
<tr class="d1">
<td>What you plan to call yourself. Suggestions: Any character name you would choose for a station character OR an AI.</td>
@@ -215,7 +197,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
</tr>
<tr class="d0">
<th rowspan="2"><a href='byond://?src=[UID()];option=ooc;new=1;candidate=[candidate.UID()]'>OOC Comments</a>:</th>
<td class="desc">[candidate.comments]&nbsp;</td>
<td class="desc">[candidate.ooc_comments]&nbsp;</td>
</tr>
<tr class="d1">
<td>Anything you'd like to address specifically to the player reading this in an OOC manner. \"I prefer more serious RP.\", \"I'm still learning the interface!\", etc. Feel free to leave this blank if you want.</td>
@@ -230,7 +212,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
</tr>
<tr>
<td class="button">
<a href='byond://?src=[UID()];option=load;new=1;candidate=[candidate.UID()]' class="button">Load Personality</a>
<a href='byond://?src=[UID()];option=reload;new=1;candidate=[candidate.UID()]' class="button">Reload Personality</a>
</td>
</tr>
</table><br>
@@ -246,14 +228,13 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
/datum/paiController/proc/findPAI(obj/item/paicard/p, mob/user)
requestRecruits(p, user)
var/list/available = list()
for(var/datum/paiCandidate/c in GLOB.paiController.pai_candidates)
if(c.ready)
var/found = 0
for(var/mob/o in GLOB.respawnable_list)
if(o.key == c.key)
found = 1
if(found)
available.Add(c)
for(var/datum/pai_save/c in GLOB.paiController.pai_candidates)
var/found = 0
for(var/mob/o in GLOB.respawnable_list)
if(o.ckey == c.owner.ckey)
found = 1
if(found)
available.Add(c)
var/dat = ""
dat += {"
@@ -325,12 +306,12 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
"}
dat += "<p>Displaying available AI personalities from central database... If there are no entries, or if a suitable entry is not listed, check again later as more personalities may be added.</p>"
for(var/datum/paiCandidate/c in available)
for(var/datum/pai_save/c in available)
dat += {"
<table class="desc">
<tr class="d0">
<th>Name:</th>
<td>[c.name]</td>
<td>[c.pai_name]</td>
</tr>
<tr class="d1">
<th>Description:</th>
@@ -342,11 +323,11 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
</tr>
<tr class="d1">
<th>OOC Comments:</th>
<td>[c.comments]</td>
<td>[c.ooc_comments]</td>
</tr>
</table>
<table class="download">
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=[c.UID()];device=\ref[p]' class="button"><b>Download [c.name]</b></a>
<td class="download"><a href='byond://?src=[UID()];download=1;candidate=[c.UID()];device=\ref[p]' class="button"><b>Download [c.pai_name]</b></a>
</td>
</table>
<br>
@@ -537,19 +537,16 @@ Pass a positive integer as an argument to override a bot's default speed.
bot_reset() //Reset a bot before setting it to call mode.
var/area/end_area = get_area(waypoint)
//For giving the bot temporary all-access.
var/obj/item/card/id/all_access = new /obj/item/card/id
var/datum/job/captain/All = new/datum/job/captain
all_access.access = All.get_access()
access_card.access = All.get_access() // Give the bot temporary all access
set_path(get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access))
set_path(get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id = access_card))
calling_ai = caller //Link the AI to the bot!
ai_waypoint = waypoint
if(path && path.len) //Ensures that a valid path is calculated!
if(!on)
turn_on() //Saves the AI the hassle of having to activate a bot manually.
access_card = all_access //Give the bot all-access while under the AI's command.
if(client)
reset_access_timer_id = addtimer(CALLBACK (src, .proc/bot_reset), 600, TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time
to_chat(src, "<span class='notice'><span class='big'>Priority waypoint set by [calling_ai] <b>[caller]</b>. Proceed to <b>[end_area.name]</b>.</span><br>[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.</span>")
@@ -562,6 +559,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(message)
to_chat(calling_ai, "<span class='danger'>Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.</span>")
calling_ai = null
access_card.access = prev_access // Don't forget to reset it
set_path(null)
/mob/living/simple_animal/bot/proc/call_mode() //Handles preparing a bot for a call, as well as calling the move proc.
@@ -131,21 +131,6 @@
spawn(0)
handle_automated_action()
break
for(var/obj/spacepod/P in view(7, src))
if((P.name == oldtarget_name) && (world.time < last_found + 100))
continue
if(!P.pilot)
continue
if("syndicate" in P.pilot.faction)
continue
if(P.pilot.stat == DEAD)
continue
target = P
oldtarget_name = P.name
mode = BOT_HUNT
spawn(0)
handle_automated_action()
break
/mob/living/simple_animal/bot/ed209/syndicate/shootAt(atom/target)
@@ -52,7 +52,8 @@
L.visible_message("<span class='danger'>\the [src] scares \the [L]!</span>")
/mob/living/simple_animal/hostile/scarybat/batswarm
//This mob is for the admin-only ancient vampire, DO NOT USE ELSEWHERE
/mob/living/simple_animal/hostile/scarybat/adminvampire
name = "bat swarm"
desc = "A swarm of vicious, angry-looking space bats."
speed = 1
@@ -131,7 +131,7 @@
if(!search_objects)
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod))
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha))
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
if(can_see(targets_from, HM, vision_range))
@@ -216,12 +216,6 @@
if(CanAttack(M.occupant))
return TRUE
if(isspacepod(the_target))
var/obj/spacepod/S = the_target
if(S.pilot)//Just so we don't attack empty pods
if(CanAttack(S.pilot))
return TRUE
if(istype(the_target, /obj/machinery/porta_turret))
var/obj/machinery/porta_turret/P = the_target
if(P.faction in faction)
@@ -557,7 +551,7 @@
toggle_ai(AI_ON)
/mob/living/simple_animal/hostile/proc/ListTargetsLazy(_Z)//Step 1, find out what we can see
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod))
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha))
. = list()
for(var/I in SSmobs.clients_by_zlevel[_Z])
var/mob/M = I
@@ -12,10 +12,6 @@
var/obj/mecha/M = A
if(M.occupant)
return A
else if(isspacepod(A))
var/obj/spacepod/S = A
if(S.pilot)
return A
/mob/living/simple_animal/hostile/retaliate/ListTargets()
if(!enemies.len)
@@ -39,11 +35,6 @@
if(M.occupant)
enemies |= M
enemies |= M.occupant
else if(isspacepod(A))
var/obj/spacepod/S = A
if(S.pilot)
enemies |= S
enemies |= S.pilot
for(var/mob/living/simple_animal/hostile/retaliate/H in around)
if(faction_check_mob(H) && !attack_same && !H.attack_same)
@@ -139,8 +139,6 @@
seen_enemy_name = target.name
if(istype(target, /obj/mecha))
depotarea.saw_mech(target)
if(istype(target, /obj/spacepod))
depotarea.saw_pod(target)
if(depotarea.list_includes(target, depotarea.dead_list))
seen_revived_enemy = TRUE
raise_alert("[name] reports intruder [target] has returned from death!")
@@ -68,8 +68,6 @@
targets2 += M
else
targets3 += M
for(var/obj/spacepod/S in view(src, vision_range))
targets3 += S
if(targets1.len)
return targets1
if(targets2.len)
@@ -188,11 +186,6 @@
if(M.occupant)
enemies |= M
enemies |= M.occupant
else if(istype(A, /obj/spacepod))
var/obj/spacepod/M = A
if(M.pilot)
enemies |= M
enemies |= M.pilot
for(var/mob/living/simple_animal/hostile/poison/terror_spider/H in ts_nearby)
var/retaliate_faction_check = 0
for(var/F in faction)
@@ -397,10 +397,6 @@
var/obj/mecha/M = the_target
if(M.occupant)
return FALSE
if(isspacepod(the_target))
var/obj/spacepod/S = the_target
if(S.pilot)
return FALSE
return TRUE
/mob/living/simple_animal/handle_fire()
@@ -73,9 +73,7 @@
/datum/job/judge,
/datum/job/blueshield,
/datum/job/nanotrasenrep,
/datum/job/pilot,
/datum/job/brigdoc,
/datum/job/mechanic,
/datum/job/barber,
/datum/job/chaplain,
/datum/job/ntnavyofficer,
@@ -36,7 +36,7 @@
. += "<span class='notice'>There is a [M.name] mod installed, using <b>[M.cost]%</b> capacity.</span>"
/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/borg/upgrade/modkit))
if(istype(I, /obj/item/borg/upgrade/modkit) && max_mod_capacity)
var/obj/item/borg/upgrade/modkit/MK = I
MK.install(src, user)
else
@@ -44,6 +44,8 @@
/obj/item/gun/energy/kinetic_accelerator/crowbar_act(mob/user, obj/item/I)
. = TRUE
if(!max_mod_capacity)
return
if(!modkits.len)
to_chat(user, "<span class='notice'>There are no modifications currently installed.</span>")
return
@@ -270,7 +272,11 @@
/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/gun/energy/kinetic_accelerator) && !issilicon(user))
install(A, user)
var/obj/item/gun/energy/kinetic_accelerator/KA = A
if(KA.max_mod_capacity)
install(A, user)
else
return ..()
else
return ..()
@@ -376,7 +376,7 @@
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
if(ishuman(M) && (M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate")))
if(ishuman(M) && (M.job in list("Security Officer", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate")))
update_flags |= M.adjustBruteLoss(-1, FALSE)
update_flags |= M.adjustFireLoss(-1, FALSE)
return ..() | update_flags
@@ -162,6 +162,16 @@
build_path = /obj/item/circuitboard/med_data
category = list("Computer Boards")
/datum/design/mining_shuttle
name = "Console Board (Mining Shuttle)"
desc = "Allows for the construction of circuit boards used to build a mining shuttle control console."
id = "mining_shuttle"
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000)
build_path = /obj/item/circuitboard/mining_shuttle
category = list("Computer Boards")
/datum/design/message_monitor
name = "Console Board (Messaging Monitor Console)"
desc = "Allows for the construction of circuit boards used to build a messaging monitor console."
@@ -282,16 +292,6 @@
build_path = /obj/item/circuitboard/sm_monitor
category = list("Computer Boards")
/datum/design/spacepodlocator
name = "Console Board (Spacepod Locator)"
desc = "Allows for the construction of circuit boards used to build a space-pod locating console"
id = "spacepodc"
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000)
build_path = /obj/item/circuitboard/pod_locater
category = list("Computer Boards")
/datum/design/ordercomp
name = "Console Board (Supply Ordering Console)"
desc = "Allows for the construction of circuit boards used to build a supply ordering console."
@@ -272,16 +272,6 @@
build_path = /obj/item/circuitboard/mechfab
category = list("Research Machinery")
/datum/design/podfab
name = "Machine Board (Spacepod Fabricator)"
desc = "The circuit board for an Spacepod Fabricator"
id = "podfab"
req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000)
build_path = /obj/item/circuitboard/podfab
category = list("Research Machinery")
/datum/design/mech_recharger
name = "Machine Board (Mech Bay Recharger)"
desc = "The circuit board for a Mech Bay Recharger."
@@ -7,7 +7,7 @@
desc = "A basic power cell that holds 1 kW of power."
id = "basic_cell"
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB | PODFAB
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list(MAT_METAL = 700, MAT_GLASS = 50)
construction_time=100
build_path = /obj/item/stock_parts/cell
@@ -18,7 +18,7 @@
desc = "A power cell that holds 10 kW of power."
id = "high_cell"
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB | PODFAB
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list(MAT_METAL = 700, MAT_GLASS = 60)
construction_time=100
build_path = /obj/item/stock_parts/cell/high
@@ -29,7 +29,7 @@
desc = "A power cell that holds 30 kW of power."
id = "hyper_cell"
req_tech = list("powerstorage" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB | PODFAB
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 700, MAT_GOLD = 150, MAT_SILVER = 150, MAT_GLASS = 70)
construction_time=100
build_path = /obj/item/stock_parts/cell/hyper
@@ -40,7 +40,7 @@
desc = "A power cell that holds 20 kW of power."
id = "super_cell"
req_tech = list("powerstorage" = 3, "materials" = 3)
build_type = PROTOLATHE | MECHFAB | PODFAB
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 700, MAT_GLASS = 70)
construction_time=100
build_path = /obj/item/stock_parts/cell/super
@@ -1,242 +0,0 @@
/datum/design/spacepod_main
construction_time = 100
name = "Circuit Design (Space Pod Mainboard)"
desc = "Allows for the construction of a Space Pod mainboard."
id = "spacepod_main"
req_tech = list("materials" = 1) //All parts required to build a basic pod have materials 1, so the mechanic can do his damn job.
build_type = PODFAB
materials = list(MAT_METAL=5000)
build_path = /obj/item/circuitboard/mecha/pod
category = list("Pod_Parts")
//////////////////////////////////////////////////
/////////SPACEPOD PARTS///////////////////////////
//////////////////////////////////////////////////
/datum/design/podframe_fp
construction_time = 200
name = "Fore port pod frame"
desc = "Allows for the construction of spacepod frames. This is the fore port component."
id = "podframefp"
build_type = PODFAB
req_tech = list("materials" = 1)
build_path = /obj/item/pod_parts/pod_frame/fore_port
category = list("Pod_Frame")
materials = list(MAT_METAL=15000,MAT_GLASS=5000)
/datum/design/podframe_ap
construction_time = 200
name = "Aft port pod frame"
desc = "Allows for the construction of spacepod frames. This is the aft port component."
id = "podframeap"
build_type = PODFAB
req_tech = list("materials" = 1)
build_path = /obj/item/pod_parts/pod_frame/aft_port
category = list("Pod_Frame")
materials = list(MAT_METAL=15000,MAT_GLASS=5000)
/datum/design/podframe_fs
construction_time = 200
name = "Fore starboard pod frame"
desc = "Allows for the construction of spacepod frames. This is the fore starboard component."
id = "podframefs"
build_type = PODFAB
req_tech = list("materials" = 1)
build_path = /obj/item/pod_parts/pod_frame/fore_starboard
category = list("Pod_Frame")
materials = list(MAT_METAL=15000,MAT_GLASS=5000)
/datum/design/podframe_as
construction_time = 200
name = "Aft starboard pod frame"
desc = "Allows for the construction of spacepod frames. This is the aft starboard component."
id = "podframeas"
build_type = PODFAB
req_tech = list("materials" = 1)
build_path = /obj/item/pod_parts/pod_frame/aft_starboard
category = list("Pod_Frame")
materials = list(MAT_METAL=15000,MAT_GLASS=5000)
//////////////////////////
////////POD CORE////////
//////////////////////////
/datum/design/pod_core
construction_time = 700 //Pod core should take a bit to process, after all, it's a big complicated engine and stuff.
name = "Spacepod Core"
desc = "Allows for the construction of a spacepod core system, made up of the engine and life support systems."
id = "podcore"
build_type = MECHFAB | PODFAB
req_tech = list("materials" = 1)
build_path = /obj/item/pod_parts/core
category = list("Pod_Parts")
materials = list(MAT_METAL=5000,MAT_URANIUM=1000,MAT_PLASMA=5000)
//////////////////////////////////////////
////////SPACEPOD ARMOR////////////////////
//////////////////////////////////////////
/datum/design/pod_armor_civ
construction_time = 400 //more time than frames, less than pod core
name = "Pod Armor (civilian)"
desc = "Allows for the construction of spacepod armor. This is the civilian version."
id = "podarmor_civ"
build_type = PODFAB
req_tech = list("materials" = 1)
build_path = /obj/item/pod_parts/armor
category = list("Pod_Armor")
materials = list(MAT_METAL=15000,MAT_GLASS=5000,MAT_PLASMA=10000)
//////////////////////////////////////////
//////SPACEPOD GUNS///////////////////////
//////////////////////////////////////////
/datum/design/pod_gun_taser
construction_time = 200
name = "Spacepod Equipment (Taser)"
desc = "Allows for the construction of a spacepod mounted taser."
id = "podgun_taser"
build_type = PODFAB
req_tech = list("materials" = 2, "combat" = 2)
build_path = /obj/item/spacepod_equipment/weaponry/taser
category = list("Pod_Weaponry")
materials = list(MAT_METAL = 15000)
locked = 1
/datum/design/pod_gun_btaser
construction_time = 200
name = "Spacepod Equipment (Burst Taser)"
desc = "Allows for the construction of a spacepod mounted taser. This is the burst-fire model."
id = "podgun_btaser"
build_type = PODFAB
req_tech = list("materials" = 3, "combat" = 3)
build_path = /obj/item/spacepod_equipment/weaponry/burst_taser
category = list("Pod_Weaponry")
materials = list(MAT_METAL = 15000,MAT_PLASMA=2000)
locked = 1
/datum/design/pod_gun_laser
construction_time = 200
name = "Spacepod Equipment (Laser)"
desc = "Allows for the construction of a spacepod mounted laser."
id = "podgun_laser"
build_type = PODFAB
req_tech = list("materials" = 3, "combat" = 3, "plasmatech" = 2)
build_path = /obj/item/spacepod_equipment/weaponry/laser
category = list("Pod_Weaponry")
materials = list(MAT_METAL=10000,MAT_GLASS=5000,MAT_GOLD=1000,MAT_SILVER=2000)
locked = 1
/datum/design/pod_mining_laser_basic
construction_time = 200
name = "Basic Mining Laser"
desc = "Allows for the construction of a weak mining laser"
id = "pod_mining_laser_basic"
req_tech = list("materials" = 3, "powerstorage" = 2, "engineering" = 2, "magnets" = 3, "combat" = 2)
build_type = PODFAB
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 2000, MAT_URANIUM = 2000)
build_path = /obj/item/spacepod_equipment/weaponry/mining_laser_basic
category = list("Pod_Weaponry")
/datum/design/pod_mining_laser
construction_time = 200
name = "Mining Laser"
desc = "Allows for the construction of a mining laser."
id = "pod_mining_laser"
req_tech = list("materials" = 6, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4)
build_type = PODFAB
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
build_path = /obj/item/spacepod_equipment/weaponry/mining_laser
category = list("Pod_Weaponry")
//////////////////////////////////////////
//////SPACEPOD MISC. ITEMS////////////////
//////////////////////////////////////////
/datum/design/pod_misc_tracker
construction_time = 100
name = "Spacepod Tracking Module"
desc = "Allows for the construction of a Space Pod Tracking Module."
id = "podmisc_tracker"
req_tech = list("materials" = 2) //Materials 2: easy to get, no trackers with 0 science progress
build_type = PODFAB
materials = list(MAT_METAL=5000)
build_path = /obj/item/spacepod_equipment/misc/tracker
category = list("Pod_Parts")
//////////////////////////////////////////
//////SPACEPOD CARGO ITEMS////////////////
//////////////////////////////////////////
/datum/design/pod_cargo_ore
construction_time = 100
name = "Spacepod Ore Storage Module"
desc = "Allows for the construction of a Space Pod Ore Storage Module."
id = "podcargo_ore"
req_tech = list("materials" = 3, "engineering" = 2)
build_type = PODFAB
materials = list(MAT_METAL=20000, MAT_GLASS=2000)
build_path = /obj/item/spacepod_equipment/cargo/ore
category = list("Pod_Cargo")
/datum/design/pod_cargo_crate
construction_time = 100
name = "Spacepod Crate Storage Module"
desc = "Allows the construction of a Space Pod Crate Storage Module."
id = "podcargo_crate"
req_tech = list("materials" = 4, "engineering" = 2) //hollowing out this much of the pod without compromising structural integrity is hard
build_type = PODFAB
materials = list(MAT_METAL=25000)
build_path = /obj/item/spacepod_equipment/cargo/crate
category = list("Pod_Cargo")
//////////////////////////////////////////
//////SPACEPOD SEC CARGO ITEMS////////////
//////////////////////////////////////////
/datum/design/passenger_seat
construction_time = 100
name = "Spacepod Passenger Seat"
desc = "Allows the construction of a Space Pod Passenger Seat Module."
id = "podcargo_sec_seat"
req_tech = list("materials" = 1) // Because rule number one of refactoring
build_type = PODFAB
materials = list(MAT_METAL=7500, MAT_GLASS=2500)
build_path = /obj/item/spacepod_equipment/sec_cargo/chair
category = list("Pod_Cargo")
/datum/design/loot_box
construction_time = 100
name = "Spacepod Loot Storage Module"
desc = "Allows the construction of a Space Pod Auxillary Cargo Module."
id = "podcargo_sec_lootbox"
req_tech = list("materials" = 1) //it's just a set of shelves, It's not that hard to make
build_type = PODFAB
materials = list(MAT_METAL=7500, MAT_GLASS=2500)
build_path = /obj/item/spacepod_equipment/sec_cargo/loot_box
category = list("Pod_Cargo")
//////////////////////////////////////////
//////SPACEPOD LOCK ITEMS////////////////
//////////////////////////////////////////
/datum/design/pod_lock_keyed
construction_time = 100
name = "Spacepod Tumbler Lock"
desc = "Allows for the construction of a tumbler style podlock."
id = "podlock_keyed"
req_tech = list("materials" = 1) //The most basic kind of locking system
build_type = PODFAB
materials = list(MAT_METAL=4500)
build_path = /obj/item/spacepod_equipment/lock/keyed
category = list("Pod_Parts")
/datum/design/pod_key
construction_time = 100
name = "Spacepod Tumbler Lock Key"
desc = "Allows for the construction of a blank key for a podlock."
id = "podkey"
req_tech = list("materials" = 1) //The most basic kind of locking system
build_type = PODFAB
materials = list(MAT_METAL=500)
build_path = /obj/item/spacepod_key
category = list("Pod_Parts")
-8
View File
@@ -868,7 +868,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(b_type & PROTOLATHE) lathe_types += "Protolathe"
if(b_type & AUTOLATHE) lathe_types += "Autolathe"
if(b_type & MECHFAB) lathe_types += "Mech Fabricator"
if(b_type & PODFAB) lathe_types += "Spacepod Fabricator"
if(b_type & BIOGENERATOR) lathe_types += "Biogenerator"
if(b_type & SMELTER) lathe_types += "Smelter"
var/list/materials = list()
@@ -955,13 +954,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
id = 3
circuit = /obj/item/circuitboard/rdconsole/experiment
/obj/machinery/computer/rdconsole/mechanics
name = "mechanics R&D console"
desc = "A console used to interface with R&D tools."
id = 4
req_access = list(ACCESS_MECHANIC)
circuit = /obj/item/circuitboard/rdconsole/mechanics
/obj/machinery/computer/rdconsole/public
name = "public R&D console"
desc = "A console used to interface with R&D tools."
+5 -12
View File
@@ -521,14 +521,6 @@
visible_message("<b>[src]</b>'s monitor flashes, \"[world.time - reqtime] seconds remaining until another requisition form may be printed.\"")
return
var/datum/supply_packs/P = locateUID(params["crate"])
if(!istype(P))
return
if(P.times_ordered >= P.order_limit && P.order_limit != -1) //If the crate has reached the limit, do not allow it to be ordered.
to_chat(usr, "<span class='warning'>[P.name] is out of stock, and can no longer be ordered.</span>")
return
var/amount = 1
if(params["multiple"] == "1") // 1 is a string here. DO NOT MAKE THIS A BOOLEAN YOU DORK
var/num_input = input(usr, "Amount", "How many crates? (20 Max)") as null|num
@@ -536,6 +528,10 @@
return
amount = clamp(round(num_input), 1, 20)
var/datum/supply_packs/P = locateUID(params["crate"])
if(!istype(P))
return
var/timeout = world.time + 600 // If you dont type the reason within a minute, theres bigger problems here
var/reason = input(usr, "Reason", "Why do you require this item?","") as null|text
if(world.time > timeout || !reason || (!is_public && !is_authorized(usr)) || ..())
@@ -576,13 +572,10 @@
if(SO.ordernum == ordernum)
O = SO
P = O.object
if(P.times_ordered >= P.order_limit && P.order_limit != -1) //If this order would put it over the limit, deny it
to_chat(usr, "<span class='warning'>[P.name] is out of stock, and can no longer be ordered.</span>")
else if(SSshuttle.points >= P.cost)
if(SSshuttle.points >= P.cost)
SSshuttle.requestlist.Cut(i,i+1)
SSshuttle.points -= P.cost
SSshuttle.shoppinglist += O
P.times_ordered += 1
investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [SSshuttle.points].", "cargo")
else
to_chat(usr, "<span class='warning'>There are insufficient supply points for this request.</span>")
-228
View File
@@ -1,228 +0,0 @@
/obj/structure/spacepod_frame
density = 1
opacity = 0
anchored = 1
layer = 3.9
icon = 'icons/goonstation/48x48/pod_construction.dmi'
icon_state = "pod_1"
var/datum/construction/construct
/obj/structure/spacepod_frame/Initialize(mapload)
. = ..()
bound_width = 64
bound_height = 64
construct = new /datum/construction/reversible2/pod(src)
dir = EAST
/obj/structure/spacepod_frame/Destroy()
QDEL_NULL(construct)
return ..()
/obj/structure/spacepod_frame/attackby(obj/item/W as obj, mob/user as mob, params)
if(!construct || !construct.action(W, user))
return ..()
/obj/structure/spacepod_frame/attack_hand()
return
/////////////////////////////////
// CONSTRUCTION STEPS
/////////////////////////////////
/datum/construction/reversible2/pod
result = /obj/spacepod/civilian
base_icon="pod"
//taskpath = /datum/job_objective/make_pod
steps = list(
// 1. Initial state
list(
"desc" = "An empty pod frame.",
state_next = list(
"key" = /obj/item/stack/cable_coil,
"vis_msg" = "{USER} wires the {HOLDER}.",
"self_msg" = "You wire the {HOLDER}."
)
),
// 2. Crudely Wired
list(
"desc" = "A crudely-wired pod frame.",
state_prev = list(
"key" = TOOL_WIRECUTTER,
"vis_msg" = "{USER} cuts out the {HOLDER}'s wiring.",
"self_msg" = "You remove the {HOLDER}'s wiring."
),
state_next = list(
"key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} adjusts the wiring.",
"self_msg" = "You adjust the {HOLDER}'s wiring."
)
),
// 3. Cleanly wired
list(
"desc" = "A wired pod frame.",
state_prev = list(
"key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} unclips {HOLDER}'s wiring harnesses.",
"self_msg" = "You unclip {HOLDER}'s wiring harnesses."
),
state_next = list(
"key" = /obj/item/circuitboard/mecha/pod,
"vis_msg" = "{USER} inserts the mainboard into the {HOLDER}.",
"self_msg" = "You insert the mainboard into the {HOLDER}.",
"delete" = 1
)
),
// 4. Circuit added
list(
"desc" = "A wired pod frame with a loose mainboard.",
state_prev = list(
"key" = TOOL_CROWBAR,
"vis_msg" = "{USER} pries out the mainboard.",
"self_msg" = "You pry out the mainboard.",
"spawn" = /obj/item/circuitboard/mecha/pod,
"amount" = 1
),
state_next = list(
"key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} secures the mainboard.",
"self_msg" = "You secure the mainboard."
)
),
// 5. Circuit secured
list(
"desc" = "A wired pod frame with a secured mainboard.",
state_prev = list(
"key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} unsecures the mainboard.",
"self_msg" = "You unscrew the mainboard from the {HOLDER}."
),
state_next = list(
"key" = /obj/item/pod_parts/core,
,
"vis_msg" = "{USER} inserts the core into the {HOLDER}.",
"self_msg" = "You carefully insert the core into the {HOLDER}.",
"delete" = 1
)
),
// 6. Core inserted
list(
"desc" = "A naked space pod with a loose core.",
state_prev = list(
"key" = TOOL_CROWBAR,
"vis_msg" = "{USER} delicately removes the core from the {HOLDER} with a crowbar.",
"self_msg" = "You delicately remove the core from the {HOLDER} with a crowbar.",
"spawn" = /obj/item/pod_parts/core,
"amount" = 1
),
state_next = list(
"key" = TOOL_WRENCH,
"vis_msg" = "{USER} secures the core's bolts.",
"self_msg" = "You secure the core's bolts."
)
),
// 7. Core secured
list(
"desc" = "A naked space pod with an exposed core. How lewd.",
state_prev = list(
"key" = TOOL_WRENCH,
"vis_msg" = "{USER} unsecures the {HOLDER}'s core.",
"self_msg" = "You unsecure the {HOLDER}'s core."
),
state_next = list(
"key" = /obj/item/stack/sheet/metal,
"amount" = 5,
"vis_msg" = "{USER} fabricates a pressure bulkhead for the {HOLDER}.",
"self_msg" = "You frabricate a pressure bulkhead for the {HOLDER}."
)
),
// 8. Bulkhead added
list(
"desc" = "A space pod with loose bulkhead panelling exposed.",
state_prev = list(
"key" = TOOL_CROWBAR,
"vis_msg" = "{USER} pops the {HOLDER}'s bulkhead panelling loose.",
"self_msg" = "You pop the {HOLDER}'s bulkhead panelling loose.",
"spawn" = /obj/item/stack/sheet/metal,
"amount" = 5,
),
state_next = list(
"key" = TOOL_WRENCH,
"vis_msg" = "{USER} secures the {HOLDER}'s bulkhead panelling.",
"self_msg" = "You secure the {HOLDER}'s bulkhead panelling."
)
),
// 9. Bulkhead secured with bolts
list(
"desc" = "A space pod with unwelded bulkhead panelling exposed.",
state_prev = list(
"key" = TOOL_WRENCH,
"vis_msg" = "{USER} unbolts the {HOLDER}'s bulkhead panelling.",
"self_msg" = "You unbolt the {HOLDER}'s bulkhead panelling."
),
state_next = list(
"key" = TOOL_WELDER,
"vis_msg" = "{USER} seals the {HOLDER}'s bulkhead panelling with a weld.",
"self_msg" = "You seal the {HOLDER}'s bulkhead panelling with a weld."
)
),
// 10. Welded bulkhead
list(
"desc" = "A space pod with sealed bulkhead panelling exposed.",
state_prev = list(
"key" = TOOL_WELDER,
"vis_msg" = "{USER} cuts the {HOLDER}'s bulkhead panelling loose.",
"self_msg" = "You cut the {HOLDER}'s bulkhead panelling loose."
),
state_next = list(
"key" = /obj/item/pod_parts/armor,
"vis_msg" = "{USER} installs the {HOLDER}'s armor plating.",
"self_msg" = "You install the {HOLDER}'s armor plating.",
"delete" = 1
)
),
// 11. Loose armor
list(
"desc" = "A space pod with unsecured armor.",
state_prev = list(
"key" = TOOL_CROWBAR,
"vis_msg" = "{USER} pries off {HOLDER}'s armor.",
"self_msg" = "You pry off {HOLDER}'s armor.",
"spawn" = /obj/item/pod_parts/armor,
"amount" = 1
),
state_next = list(
"key" = TOOL_WRENCH,
"vis_msg" = "{USER} bolts down the {HOLDER}'s armor.",
"self_msg" = "You bolt down the {HOLDER}'s armor."
)
),
// 12. Bolted-down armor
list(
"desc" = "A space pod with unsecured armor.",
state_prev = list(
"key" = TOOL_WRENCH,
"vis_msg" = "{USER} unsecures the {HOLDER}'s armor.",
"self_msg" = "You unsecure the {HOLDER}'s armor."
),
state_next = list(
"key" = TOOL_WELDER,
"vis_msg" = "{USER} welds the {HOLDER}'s armor.",
"self_msg" = "You weld the {HOLDER}'s armor."
)
)
// EOF
)
/datum/construction/reversible2/pod/spawn_result(mob/user as mob)
..()
SSblackbox.record_feedback("amount", "spacepod_created", 1)
return
-278
View File
@@ -1,278 +0,0 @@
/obj/item/spacepod_equipment/weaponry/proc/fire_weapons()
if(HAS_TRAIT(usr, TRAIT_PACIFISM) && harmful)
to_chat(usr, "<span class='warning'>You don't want to harm other living beings!</span>")
return
if(my_atom.next_firetime > world.time)
to_chat(usr, "<span class='warning'>Your weapons are recharging.</span>")
return
my_atom.next_firetime = world.time + fire_delay
var/turf/firstloc
var/turf/secondloc
if(!my_atom.equipment_system || !my_atom.equipment_system.weapon_system)
to_chat(usr, "<span class='warning'>Missing equipment or weapons.</span>")
my_atom.verbs -= text2path("[type]/proc/fire_weapons")
return
if(!my_atom.battery.use(shot_cost))
to_chat(usr, "<span class='warning'>Insufficient charge to fire the weapons</span>")
return
var/olddir
for(var/i = 0; i < shots_per; i++)
if(olddir != my_atom.dir)
switch(my_atom.dir)
if(NORTH)
firstloc = get_step(my_atom, NORTH)
secondloc = get_step(firstloc,EAST)
if(SOUTH)
firstloc = get_turf(my_atom)
secondloc = get_step(firstloc,EAST)
if(EAST)
firstloc = get_step(my_atom, EAST)
secondloc = get_step(firstloc,NORTH)
if(WEST)
firstloc = get_turf(my_atom)
secondloc = get_step(firstloc,NORTH)
olddir = dir
var/obj/item/projectile/projone = new projectile_type(firstloc)
var/obj/item/projectile/projtwo = new projectile_type(secondloc)
projone.starting = get_turf(my_atom)
projone.firer = usr
projone.def_zone = "chest"
projtwo.starting = get_turf(my_atom)
projtwo.firer = usr
projtwo.def_zone = "chest"
spawn()
playsound(src, fire_sound, 50, 1)
projone.dumbfire(my_atom.dir)
projtwo.dumbfire(my_atom.dir)
sleep(2)
/datum/spacepod/equipment
var/obj/spacepod/my_atom
var/list/obj/item/spacepod_equipment/installed_modules = list() // holds an easy to access list of installed modules
var/obj/item/spacepod_equipment/weaponry/weapon_system // weapons system
var/obj/item/spacepod_equipment/misc/misc_system // misc system
var/obj/item/spacepod_equipment/cargo/cargo_system // cargo system
var/obj/item/spacepod_equipment/cargo/sec_cargo_system // secondary cargo system
var/obj/item/spacepod_equipment/lock/lock_system // lock system
/datum/spacepod/equipment/New(obj/spacepod/SP)
..()
if(istype(SP))
my_atom = SP
/obj/item/spacepod_equipment
name = "equipment"
var/obj/spacepod/my_atom
var/occupant_mod = 0 // so any module can modify occupancy
var/list/storage_mod = list("slots" = 0, "w_class" = 0) // so any module can modify storage slots
/obj/item/spacepod_equipment/proc/removed(mob/user) // So that you can unload cargo when you remove the module
return
/*
///////////////////////////////////////
/////////Weapon System///////////////////
///////////////////////////////////////
*/
/obj/item/spacepod_equipment/weaponry
name = "pod weapon"
desc = "You shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "blank"
var/obj/item/projectile/projectile_type
var/shot_cost = 0
var/shots_per = 1
var/fire_sound
var/fire_delay = 15
var/harmful = TRUE
/obj/item/spacepod_equipment/weaponry/taser
name = "disabler system"
desc = "A weak taser system for space pods, fires disabler beams."
icon_state = "weapon_taser"
projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 400
fire_sound = 'sound/weapons/taser.ogg'
harmful = FALSE
/obj/item/spacepod_equipment/weaponry/burst_taser
name = "burst taser system"
desc = "A weak taser system for space pods, this one fires 3 at a time."
icon_state = "weapon_burst_taser"
projectile_type = /obj/item/projectile/beam/disabler
shot_cost = 1200
shots_per = 3
fire_sound = 'sound/weapons/taser.ogg'
fire_delay = 30
harmful = FALSE
/obj/item/spacepod_equipment/weaponry/laser
name = "laser system"
desc = "A weak laser system for space pods, fires concentrated bursts of energy."
icon_state = "weapon_laser"
projectile_type = /obj/item/projectile/beam
shot_cost = 600
fire_sound = 'sound/weapons/laser.ogg'
// MINING LASERS
/obj/item/spacepod_equipment/weaponry/mining_laser_basic
name = "weak mining laser system"
desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock."
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_taser"
projectile_type = /obj/item/projectile/kinetic/pod
shot_cost = 300
fire_delay = 14
fire_sound = 'sound/weapons/kenetic_accel.ogg'
/obj/item/spacepod_equipment/weaponry/mining_laser
name = "mining laser system"
desc = "A mining laser system for space pods, fires bursts of energy that cut through rock."
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "pod_m_laser"
projectile_type = /obj/item/projectile/kinetic/pod/regular
shot_cost = 250
fire_delay = 10
fire_sound = 'sound/weapons/kenetic_accel.ogg'
/*
///////////////////////////////////////
/////////Misc. System///////////////////
///////////////////////////////////////
*/
GLOBAL_LIST_EMPTY(pod_trackers)
/obj/item/spacepod_equipment/misc
name = "pod misc"
desc = "You shouldn't be seeing this"
icon = 'icons/goonstation/pods/ship.dmi'
icon_state = "blank"
/obj/item/spacepod_equipment/misc/tracker
name = "\improper spacepod tracking system"
desc = "A tracking device for spacepods."
icon_state = "pod_locator"
/obj/item/spacepod_equipment/misc/tracker/Initialize(mapload)
GLOB.pod_trackers |= src
return ..()
/obj/item/spacepod_equipment/misc/tracker/Destroy()
GLOB.pod_trackers -= src
return ..()
/*
///////////////////////////////////////
/////////Cargo System//////////////////
///////////////////////////////////////
*/
/obj/item/spacepod_equipment/cargo
name = "pod cargo"
desc = "You shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "cargo_blank"
var/obj/storage = null
/obj/item/spacepod_equipment/cargo/proc/passover(obj/item/I)
return
/obj/item/spacepod_equipment/cargo/proc/unload() // called by unload verb
if(storage)
storage.forceMove(get_turf(my_atom))
storage = null
/obj/item/spacepod_equipment/cargo/removed(mob/user) // called when system removed
. = ..()
unload()
// Ore System
/obj/item/spacepod_equipment/cargo/ore
name = "spacepod ore storage system"
desc = "An ore storage system for spacepods. Scoops up any ore you drive over."
icon_state = "cargo_ore"
/obj/item/spacepod_equipment/cargo/ore/passover(obj/item/I)
if(storage && istype(I,/obj/item/stack/ore))
I.forceMove(storage)
// Crate System
/obj/item/spacepod_equipment/cargo/crate
name = "spacepod crate storage system"
desc = "A heavy duty storage system for spacepods. Holds one crate."
icon_state = "cargo_crate"
/*
///////////////////////////////////////
/////////Secondary Cargo System////////
///////////////////////////////////////
*/
/obj/item/spacepod_equipment/sec_cargo
name = "secondary cargo"
desc = "you shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "blank"
// Passenger Seat
/obj/item/spacepod_equipment/sec_cargo/chair
name = "passenger seat"
desc = "A passenger seat for a spacepod."
icon_state = "sec_cargo_chair"
occupant_mod = 1
// Loot Box
/obj/item/spacepod_equipment/sec_cargo/loot_box
name = "loot box"
desc = "A small compartment to store valuables."
icon_state = "sec_cargo_loot"
storage_mod = list("slots" = 7, "w_class" = 14)
/*
///////////////////////////////////////
/////////Lock System///////////////////
///////////////////////////////////////
*/
/obj/item/spacepod_equipment/lock
name = "pod lock"
desc = "You shouldn't be seeing this"
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "blank"
var/mode = 0
var/id = null
// Key and Tumbler System
/obj/item/spacepod_equipment/lock/keyed
name = "spacepod tumbler lock"
desc = "A locking system to stop podjacking. This version uses a standalone key."
icon_state = "lock_tumbler"
var/static/id_source = 0
/obj/item/spacepod_equipment/lock/keyed/Initialize(mapload)
. = ..()
id = ++id_source
// The key
/obj/item/spacepod_key
name = "spacepod key"
desc = "A key for a spacepod lock."
icon = 'icons/vehicles/spacepod.dmi'
icon_state = "podkey"
w_class = WEIGHT_CLASS_TINY
var/id = 0
// Key - Lock Interactions
/obj/item/spacepod_equipment/lock/keyed/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/spacepod_key))
var/obj/item/spacepod_key/key = I
if(!key.id)
key.id = id
to_chat(user, "<span class='notice'>You grind the blank key to fit the lock.</span>")
else
to_chat(user, "<span class='warning'>This key is already ground!</span>")
else
return ..()
-14
View File
@@ -1,14 +0,0 @@
/obj/item/lock_buster
name = "pod lock buster"
desc = "Destroys a podlock in mere seconds once applied. Waranty void if used."
icon = 'icons/obj/device.dmi'
icon_state = "lock_buster_off"
var/on = 0
/obj/item/lock_buster/attack_self(mob/user as mob)
on = !on
if(on)
icon_state = "lock_buster_on"
else
icon_state = "lock_buster_off"
to_chat(usr, "<span class='notice'>You turn [src] [on ? "on" : "off"].</span>")
-126
View File
@@ -1,126 +0,0 @@
/obj/item/pod_parts
parent_type = /obj/item/mecha_parts
icon = 'icons/goonstation/pods/pod_parts.dmi'
/obj/item/pod_parts/core
name="Space Pod Core"
icon_state = "core"
flags = CONDUCT
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
/obj/item/pod_parts/pod_frame
name = "Space Pod Frame"
icon_state = ""
flags = CONDUCT
density = 0
anchored = 0
var/link_to = null
var/link_angle = 0
/obj/item/pod_parts/pod_frame/proc/find_square()
/*
each part, in essence, stores the relative position of another part
you can find where this part should be by looking at the current direction of the current part and applying the link_angle
the link_angle is the angle between the part's direction and its following part, which is the current part's link_to
the code works by going in a loop - each part is capable of starting a loop by checking for the part after it, and that part checking, and so on
this 4-part loop, starting from any part of the frame, can determine if all the parts are properly in place and aligned
it also checks that each part is unique, and that all the parts are there for the spacepod itself
*/
var/neededparts = list(/obj/item/pod_parts/pod_frame/aft_port, /obj/item/pod_parts/pod_frame/aft_starboard, /obj/item/pod_parts/pod_frame/fore_port, /obj/item/pod_parts/pod_frame/fore_starboard)
var/turf/T
var/obj/item/pod_parts/pod_frame/linked
var/obj/item/pod_parts/pod_frame/pointer
var/list/connectedparts = list()
neededparts -= src
//log_admin("Starting with [src]")
linked = src
for(var/i = 1; i <= 4; i++)
T = get_turf(get_step(linked, turn(linked.dir, -linked.link_angle))) //get the next place that we want to look at
if(locate(linked.link_to) in T)
pointer = locate(linked.link_to) in T
//log_admin("Looking at [pointer.type]")
if(istype(pointer, linked.link_to) && pointer.dir == linked.dir && pointer.anchored)
if(!(pointer in connectedparts))
connectedparts += pointer
linked = pointer
pointer = null
if(connectedparts.len < 4)
return 0
for(var/i = 1; i <=4; i++)
var/obj/item/pod_parts/pod_frame/F = connectedparts[i]
if(F.type in neededparts) //if one of the items can be founded in neededparts
neededparts -= F.type
log_admin("Found [F.type]")
else //because neededparts has 4 distinct items, this must be called if theyre not all in place and wrenched
return 0
return connectedparts
/obj/item/pod_parts/pod_frame/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/stack/rods))
var/obj/item/stack/rods/R = O
var/list/linkedparts = find_square()
if(!linkedparts)
to_chat(user, "<span class='rose'>You cannot assemble a pod frame because you do not have the necessary assembly.</span>")
return
var/obj/structure/spacepod_frame/pod = new /obj/structure/spacepod_frame(src.loc)
pod.dir = src.dir
to_chat(user, "<span class='notice'>You strut the pod frame together.</span>")
R.use(10)
for(var/obj/item/pod_parts/pod_frame/F in linkedparts)
if(1 == turn(F.dir, -F.link_angle)) //if the part links north during construction, as the bottom left part always does
//log_admin("Repositioning")
pod.loc = F.loc
qdel(F)
playsound(get_turf(src), O.usesound, 50, 1)
if(istype(O, /obj/item/wrench))
to_chat(user, "<span class='notice'>You [!anchored ? "secure \the [src] in place." : "remove the securing bolts."]</span>")
anchored = !anchored
density = anchored
playsound(get_turf(src), O.usesound, 50, 1)
/obj/item/pod_parts/pod_frame/verb/rotate()
set name = "Rotate Frame"
set category = "Object"
set src in oview(1)
if(anchored)
to_chat(usr, "\The [src] is securely bolted!")
return 0
src.dir = turn(src.dir, -90)
return 1
/obj/item/pod_parts/pod_frame/attack_hand()
src.rotate()
/obj/item/pod_parts/pod_frame/fore_port
name = "fore port pod frame"
icon_state = "pod_fp"
desc = "A space pod frame component. This is the fore port component."
link_to = /obj/item/pod_parts/pod_frame/fore_starboard
link_angle = 90
/obj/item/pod_parts/pod_frame/fore_starboard
name = "fore starboard pod frame"
icon_state = "pod_fs"
desc = "A space pod frame component. This is the fore starboard component."
link_to = /obj/item/pod_parts/pod_frame/aft_starboard
link_angle = 180
/obj/item/pod_parts/pod_frame/aft_port
name = "aft port pod frame"
icon_state = "pod_ap"
desc = "A space pod frame component. This is the aft port component."
link_to = /obj/item/pod_parts/pod_frame/fore_port
link_angle = 0
/obj/item/pod_parts/pod_frame/aft_starboard
name = "aft starboard pod frame"
icon_state = "pod_as"
desc = "A space pod frame component. This is the aft starboard component."
link_to = /obj/item/pod_parts/pod_frame/aft_port
link_angle = 270
/obj/item/pod_parts/armor
name = "civilian pod armor"
icon = 'icons/goonstation/pods/pod_parts.dmi'
icon_state = "pod_armor_civ"
desc = "Spacepod armor. This is the civilian version. It looks rather flimsy."
File diff suppressed because it is too large Load Diff
@@ -161,7 +161,7 @@
emp_proof = TRUE
/obj/item/organ/internal/cyberimp/brain/anti_sleep
name = "Nerual Jumpstarter implant"
name = "Neural Jumpstarter implant"
desc = "This implant will automatically attempt to jolt you awake when it detects you have fallen unconscious. Has a short cooldown, incompatible with the CNS Rebooter."
implant_color = "#0356fc"
slot = "brain_antistun" //one or the other not both.
@@ -16,7 +16,7 @@
var/obj/item/held_item
/obj/item/organ/internal/headpocket/Destroy()
QDEL_NULL(held_item)
empty_contents()
return ..()
/obj/item/organ/internal/headpocket/on_life()
@@ -16,7 +16,7 @@
/obj/item/organ/external/leg/unbreakable
cannot_break = TRUE
convertable_children = list(/obj/item/organ/external/foot/right/unbreakable)
convertable_children = list(/obj/item/organ/external/foot/unbreakable)
/obj/item/organ/external/leg/right/unbreakable
cannot_break = TRUE
@@ -41,21 +41,26 @@
// Cannot dismember or break
/obj/item/organ/external/chest/unbreakable/sturdy
cannot_amputate = TRUE
convertable_children = list(/obj/item/organ/external/groin/unbreakable/sturdy)
/obj/item/organ/external/groin/unbreakable/sturdy
cannot_amputate = TRUE
/obj/item/organ/external/arm/unbreakable/sturdy
cannot_amputate = TRUE
convertable_children = list(/obj/item/organ/external/hand/unbreakable/sturdy)
/obj/item/organ/external/arm/right/unbreakable/sturdy
cannot_amputate = TRUE
convertable_children = list(/obj/item/organ/external/hand/right/unbreakable/sturdy)
/obj/item/organ/external/leg/unbreakable/sturdy
cannot_amputate = TRUE
convertable_children = list(/obj/item/organ/external/foot/unbreakable/sturdy)
/obj/item/organ/external/leg/right/unbreakable/sturdy
cannot_amputate = TRUE
convertable_children = list(/obj/item/organ/external/foot/right/unbreakable/sturdy)
/obj/item/organ/external/foot/unbreakable/sturdy
cannot_amputate = TRUE