mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-17 10:03:50 +01:00
Merge remote-tracking branch 'ParadiseSS13/master' into multi-instance-support
This commit is contained in:
+78
-32
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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] </td>
|
||||
<td class="desc">[candidate.pai_name] </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] </td>
|
||||
<td class="desc">[candidate.ooc_comments] </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")
|
||||
@@ -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."
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
@@ -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 ..()
|
||||
@@ -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>")
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user