Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 12/16/2015_newwizard

This commit is contained in:
Neerti
2016-06-26 20:14:29 -04:00
1107 changed files with 40450 additions and 27263 deletions
+29 -18
View File
@@ -16,7 +16,7 @@ var/global/floorIsLava = 0
var/rendered = "<span class=\"log_message\"><span class=\"prefix\">ATTACK:</span> <span class=\"message\">[text]</span></span>"
for(var/client/C in admins)
if((R_ADMIN|R_MOD) & C.holder.rights)
if(C.prefs.toggles & CHAT_ATTACKLOGS)
if(C.is_preference_enabled(/datum/client_preference/mod/show_attack_logs))
var/msg = rendered
C << msg
@@ -594,26 +594,33 @@ proc/admin_notice(var/message, var/rights)
usr << browse(dat, "window=admin2;size=210x280")
return
/datum/admins/proc/Secrets()
/datum/admins/proc/Secrets(var/datum/admin_secret_category/active_category = null)
if(!check_rights(0)) return
// Print the header with category selection buttons.
var/dat = "<B>The first rule of adminbuse is: you don't talk about the adminbuse.</B><HR>"
for(var/datum/admin_secret_category/category in admin_secrets.categories)
if(!category.can_view(usr))
continue
dat += "<B>[category.name]</B><br>"
if(category.desc)
dat += "<I>[category.desc]</I><BR>"
for(var/datum/admin_secret_item/item in category.items)
dat += "<A href='?src=\ref[src];admin_secrets_panel=\ref[category]'>[category.name]</A> "
dat += "<HR>"
// If a category is selected, print its description and then options
if(istype(active_category) && active_category.can_view(usr))
dat += "<B>[active_category.name]</B><BR>"
if(active_category.desc)
dat += "<I>[active_category.desc]</I><BR>"
for(var/datum/admin_secret_item/item in active_category.items)
if(!item.can_view(usr))
continue
dat += "<A href='?src=\ref[src];admin_secrets=\ref[item]'>[item.name()]</A><BR>"
dat += "<BR>"
usr << browse(dat, "window=secrets")
var/datum/browser/popup = new(usr, "secrets", "Secrets", 500, 500)
popup.set_content(dat)
popup.open()
return
/////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge
//i.e. buttons/verbs
@@ -895,22 +902,26 @@ proc/admin_notice(var/message, var/rights)
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
/proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode
/proc/is_special_character(var/character) // returns 1 for special characters and 2 for heroes of gamemode
if(!ticker || !ticker.mode)
return 0
if (!istype(M))
return 0
var/datum/mind/M
if (ismob(character))
var/mob/C = character
M = C.mind
else if(istype(character, /datum/mind))
M = character
if(M.mind)
if(M)
if(ticker.mode.antag_templates && ticker.mode.antag_templates.len)
for(var/datum/antagonist/antag in ticker.mode.antag_templates)
if(antag.is_antagonist(M.mind))
if(antag.is_antagonist(M))
return 2
else if(M.mind.special_role)
if(M.special_role)
return 1
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(isrobot(character))
var/mob/living/silicon/robot/R = character
if(R.emagged)
return 1
@@ -1251,7 +1262,7 @@ proc/admin_notice(var/message, var/rights)
//Returns 1 to let the dragdrop code know we are trapping this event
//Returns 0 if we don't plan to trap the event
/datum/admins/proc/cmd_ghost_drag(var/mob/dead/observer/frommob, var/mob/living/tomob)
/datum/admins/proc/cmd_ghost_drag(var/mob/observer/dead/frommob, var/mob/living/tomob)
if(!istype(frommob))
return //Extra sanity check to make sure only observers are shoved into things
+2 -2
View File
@@ -14,7 +14,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
if(!length(line)) continue
if(copytext(line,1,2) == "#") continue
var/list/List = text2list(line,"+")
var/list/List = splittext(line,"+")
if(!List.len) continue
var/rank = ckeyEx(List[1])
@@ -77,7 +77,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
if(copytext(line,1,2) == "#") continue
//Split the line at every "-"
var/list/List = text2list(line, "-")
var/list/List = splittext(line, "-")
if(!List.len) continue
//ckey is before the first "-"
+7
View File
@@ -22,6 +22,9 @@ var/datum/admin_secrets/admin_secrets = new()
dd_insertObjectList(category.items, item)
items += item
//
// Secret Item Category - Each subtype is a category for organizing secret commands.
//
/datum/admin_secret_category
var/name = ""
var/desc = ""
@@ -37,6 +40,10 @@ var/datum/admin_secrets/admin_secrets = new()
return 1
return 0
//
// Secret Item Datum - Each subtype is a command on the secrets panel.
// Override execute() with the implementation of the command.
//
/datum/admin_secret_item
var/name = ""
var/category = null
+86 -107
View File
@@ -1,102 +1,101 @@
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
var/list/admin_verbs_default = list(
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags,
/client/proc/player_panel,
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
// /client/proc/check_antagonists, /*shows all antags*/
/client/proc/deadmin_self, //destroys our own admin datum so we can play as a regular player,
/client/proc/hide_verbs, //hides all our adminverbs,
/client/proc/hide_most_verbs, //hides all our hideable adminverbs,
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify,
// /client/proc/check_antagonists, //shows all antags,
// /client/proc/cmd_mod_say,
/client/proc/cmd_mentor_check_new_players
// /client/proc/deadchat /*toggles deadchat on/off*/
/client/proc/cmd_mentor_check_new_players,
// /client/proc/deadchat //toggles deadchat on/off,
// /client/proc/toggle_ahelp_sound,
)
var/list/admin_verbs_admin = list(
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/player_panel_new, //shows an interface for all players, with links to various panels,
/datum/admins/proc/set_tcrystals,
/datum/admins/proc/add_tcrystals,
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
/datum/admins/proc/show_game_mode, /*Configuration window for the current game mode.*/
/datum/admins/proc/force_mode_latespawn, /*Force the mode to try a latespawn proc*/
/datum/admins/proc/force_antag_latespawn, /*Force a specific template to try a latespawn proc*/
/datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
/datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/
/datum/admins/proc/announce, /*priority announce something to all clients.*/
/client/proc/colorooc, /*allows us to set a custom colour for everythign we say in ooc*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/toggle_view_range, /*changes how far we can see*/
/datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
/datum/admins/proc/view_atk_log, /*shows the server combat-log, doesn't do anything presently*/
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/
/datum/admins/proc/access_news_network, /*allows access of newscasters*/
/client/proc/giveruntimelog, /*allows us to give access to runtime logs to somebody*/
/client/proc/getserverlog, /*allows us to fetch server logs (diary) for other days*/
/client/proc/jumptocoord, /*we ghost and jump to a coordinate*/
/client/proc/Getmob, /*teleports a mob to our location*/
/client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/
// /client/proc/sendmob, /*sends a mob somewhere*/ -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage
/client/proc/invisimin, //allows our mob to go invisible/visible,
// /datum/admins/proc/show_traitor_panel, //interface which shows a mob's mind -Removed due to rare practical use. Moved to debug verbs ~Errorage,
/datum/admins/proc/show_game_mode, //Configuration window for the current game mode.,
/datum/admins/proc/force_mode_latespawn, //Force the mode to try a latespawn proc,
/datum/admins/proc/force_antag_latespawn, //Force a specific template to try a latespawn proc,
/datum/admins/proc/toggleenter, //toggles whether people can join the current game,
/datum/admins/proc/toggleguests, //toggles whether guests can join the current game,
/datum/admins/proc/announce, //priority announce something to all clients.,
/client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc,
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
/client/proc/toggle_view_range, //changes how far we can see,
/datum/admins/proc/view_txt_log, //shows the server log (diary) for today,
/datum/admins/proc/view_atk_log, //shows the server combat-log, doesn't do anything presently,
/client/proc/cmd_admin_pm_context, //right-click adminPM interface,
/client/proc/cmd_admin_pm_panel, //admin-pm list,
/client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head',
/client/proc/cmd_admin_delete, //delete an instance/object/mob/etc,
/client/proc/cmd_admin_check_contents, //displays the contents of an instance,
/datum/admins/proc/access_news_network, //allows access of newscasters,
/client/proc/giveruntimelog, //allows us to give access to runtime logs to somebody,
/client/proc/getserverlog, //allows us to fetch server logs (diary) for other days,
/client/proc/jumptocoord, //we ghost and jump to a coordinate,
/client/proc/Getmob, //teleports a mob to our location,
/client/proc/Getkey, //teleports a mob with a certain ckey to our location,
// /client/proc/sendmob, //sends a mob somewhere, -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage,
/client/proc/Jump,
/client/proc/jumptokey, /*allows us to jump to the location of a mob with a certain ckey*/
/client/proc/jumptomob, /*allows us to jump to a specific mob*/
/client/proc/jumptoturf, /*allows us to jump to a specific turf*/
/client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/
/client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcomm*/
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
/client/proc/jumptokey, //allows us to jump to the location of a mob with a certain ckey,
/client/proc/jumptomob, //allows us to jump to a specific mob,
/client/proc/jumptoturf, //allows us to jump to a specific turf,
/client/proc/admin_call_shuttle, //allows us to call the emergency shuttle,
/client/proc/admin_cancel_shuttle, //allows us to cancel the emergency shuttle, sending it back to centcomm,
/client/proc/cmd_admin_direct_narrate, //send text directly to a player with no padding. Useful for narratives and fluff-text,
/client/proc/cmd_admin_world_narrate, //sends text to all players with no padding,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/check_words, /*displays cult-words*/
/client/proc/check_ai_laws, /*shows AI and borg laws*/
/client/proc/rename_silicon, /*properly renames silicons*/
/client/proc/manage_silicon_laws, /* Allows viewing and editing silicon laws. */
/client/proc/check_words, //displays cult-words,
/client/proc/check_ai_laws, //shows AI and borg laws,
/client/proc/rename_silicon, //properly renames silicons,
/client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. ,
/client/proc/check_antagonists,
/client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/toggleprayers, /*toggles prayers on/off*/
// /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
/client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others,
/client/proc/dsay, //talk in deadchat using our ckey/fakekey,
// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat,
/client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log,
/client/proc/secrets,
/datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/
/datum/admins/proc/togglelooc, /*toggles looc on/off for everyone*/
/datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/
/datum/admins/proc/togglehubvisibility, /*toggles visibility on the BYOND Hub.*/
/datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/
/client/proc/game_panel, /*game panel, allows to change game-mode etc*/
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
/datum/admins/proc/toggleooc, //toggles ooc on/off for everyone,
/datum/admins/proc/togglelooc, //toggles looc on/off for everyone,
/datum/admins/proc/toggleoocdead, //toggles ooc on/off for everyone who is dead,
/datum/admins/proc/togglehubvisibility, //toggles visibility on the BYOND Hub.,
/datum/admins/proc/toggledsay, //toggles dsay on/off for everyone,
/client/proc/game_panel, //game panel, allows to change game-mode etc,
/client/proc/cmd_admin_say, //admin-only ooc chat,
/datum/admins/proc/PlayerNotes,
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
/client/proc/free_slot, /*frees slot for chosen job*/
/client/proc/free_slot, //frees slot for chosen job,
/client/proc/cmd_admin_change_custom_event,
/client/proc/cmd_admin_rejuvenate,
/client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/client/proc/toggleghostwriters,
/client/proc/toggledrones,
/datum/admins/proc/show_skills,
/client/proc/check_customitem_activity,
/client/proc/man_up,
/client/proc/global_man_up,
/client/proc/response_team, // Response Teams admin verb
/client/proc/response_team, // Response Teams admin verb,
/client/proc/toggle_antagHUD_use,
/client/proc/toggle_antagHUD_restrictions,
/client/proc/allow_character_respawn, /* Allows a ghost to respawn */
/client/proc/allow_character_respawn, // Allows a ghost to respawn ,
/client/proc/event_manager_panel,
/client/proc/empty_ai_core_toggle_latejoin,
/client/proc/empty_ai_core_toggle_latejoin,
/client/proc/aooc,
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */
/client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs ,
/client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance ,
/client/proc/change_security_level,
/client/proc/view_chemical_reaction_logs,
/client/proc/makePAI,
/datum/admins/proc/paralyze_mob
/client/proc/toggle_debug_logs,
/client/proc/toggle_attack_logs,
/datum/admins/proc/paralyze_mob,
/client/proc/fixatmos
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -131,7 +130,7 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_custom_item,
/datum/admins/proc/check_custom_items,
/datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
/datum/admins/proc/spawn_atom, //allows us to spawn instances,
/client/proc/respawn_character,
/client/proc/virus2_editor,
/client/proc/spawn_chemdisp_cartridge
@@ -149,7 +148,7 @@ var/list/admin_verbs_server = list(
/datum/admins/proc/immreboot,
/client/proc/everyone_random,
/datum/admins/proc/toggleAI,
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_admin_delete, //delete an instance/object/mob/etc,
/client/proc/cmd_debug_del_all,
/datum/admins/proc/adrev,
/datum/admins/proc/adspawn,
@@ -161,7 +160,7 @@ var/list/admin_verbs_server = list(
/client/proc/nanomapgen_DumpImage
)
var/list/admin_verbs_debug = list(
/client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/
/client/proc/getruntimelog, //allows us to access runtime logs to somebody,
/client/proc/cmd_admin_list_open_jobs,
/client/proc/Debug2,
/client/proc/kill_air,
@@ -184,17 +183,18 @@ var/list/admin_verbs_debug = list(
/client/proc/overlay_random_map,
/client/proc/delete_random_map,
/client/proc/show_plant_genes,
/client/proc/show_xenobio_genes,
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/callproc_target,
/client/proc/toggledebuglogs,
/client/proc/SDQL_query,
/client/proc/SDQL2_query,
/client/proc/Jump,
/client/proc/jumptomob,
/client/proc/jumptocoord,
/client/proc/dsay,
/client/proc/admin_ghost /*allows us to ghost/reenter body at will*/
/client/proc/toggle_debug_logs,
/client/proc/admin_ghost //allows us to ghost/reenter body at will,
)
var/list/admin_verbs_paranoid_debug = list(
@@ -218,8 +218,6 @@ var/list/admin_verbs_rejuv = list(
var/list/admin_verbs_hideable = list(
/client/proc/deadmin_self,
// /client/proc/deadchat,
/client/proc/toggleprayers,
/client/proc/toggle_hear_radio,
/datum/admins/proc/show_traitor_panel,
/datum/admins/proc/toggleenter,
/datum/admins/proc/toggleguests,
@@ -288,14 +286,12 @@ var/list/admin_verbs_hideable = list(
/datum/admins/proc/set_tcrystals
)
var/list/admin_verbs_mod = list(
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
/client/proc/toggledebuglogs,
/client/proc/cmd_admin_pm_context, //right-click adminPM interface,
/client/proc/cmd_admin_pm_panel, //admin-pm list,
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game.,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
/client/proc/cmd_mod_say,
/client/proc/toggleattacklogs,
/datum/admins/proc/show_player_info,
/client/proc/player_panel_new,
/client/proc/dsay,
@@ -304,10 +300,11 @@ var/list/admin_verbs_mod = list(
/client/proc/check_antagonists,
/client/proc/aooc,
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/client/proc/toggle_attack_logs,
/client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head',
/datum/admins/proc/paralyze_mob,
/client/proc/cmd_admin_direct_narrate,
/client/proc/allow_character_respawn /* Allows a ghost to respawn */
/client/proc/allow_character_respawn // Allows a ghost to respawn ,
)
var/list/admin_verbs_mentor = list(
@@ -400,9 +397,9 @@ var/list/admin_verbs_mentor = list(
set category = "Admin"
set name = "Aghost"
if(!holder) return
if(istype(mob,/mob/dead/observer))
if(istype(mob,/mob/observer/dead))
//re-enter
var/mob/dead/observer/ghost = mob
var/mob/observer/dead/ghost = mob
if(!is_mentor(usr.client))
ghost.can_reenter_corpse = 1
if(ghost.can_reenter_corpse)
@@ -418,7 +415,7 @@ var/list/admin_verbs_mentor = list(
else
//ghostize
var/mob/body = mob
var/mob/dead/observer/ghost = body.ghostize(1)
var/mob/observer/dead/ghost = body.ghostize(1)
ghost.admin_ghosted = 1
if(body)
body.teleop = ghost
@@ -525,12 +522,16 @@ var/list/admin_verbs_mentor = list(
if(holder)
if(holder.fakekey)
holder.fakekey = null
if(istype(src.mob, /mob/new_player))
mob.name = capitalize(ckey)
else
var/new_key = ckeyEx(input("Enter your desired display name.", "Fake Key", key) as text|null)
if(!new_key) return
if(length(new_key) >= 26)
new_key = copytext(new_key, 1, 26)
holder.fakekey = new_key
if(istype(mob, /mob/new_player))
mob.name = new_key
log_admin("[key_name(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]")
message_admins("[key_name_admin(usr)] has turned stealth mode [holder.fakekey ? "ON" : "OFF"]", 1)
feedback_add_details("admin_verb","SM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -903,17 +904,6 @@ var/list/admin_verbs_mentor = list(
message_admins("A job slot for [job] has been opened by [key_name_admin(usr)]")
return
/client/proc/toggleattacklogs()
set name = "Toggle Attack Log Messages"
set category = "Preferences"
prefs.toggles ^= CHAT_ATTACKLOGS
if (prefs.toggles & CHAT_ATTACKLOGS)
usr << "You now will get attack log messages"
else
usr << "You now won't get attack log messages"
/client/proc/toggleghostwriters()
set name = "Toggle ghost writers"
set category = "Server"
@@ -942,17 +932,6 @@ var/list/admin_verbs_mentor = list(
src << "<b>Enabled maint drones.</b>"
message_admins("Admin [key_name_admin(usr)] has enabled maint drones.", 1)
/client/proc/toggledebuglogs()
set name = "Toggle Debug Log Messages"
set category = "Preferences"
prefs.toggles ^= CHAT_DEBUGLOGS
if (prefs.toggles & CHAT_DEBUGLOGS)
usr << "You now will get debug log messages"
else
usr << "You now won't get debug log messages"
/client/proc/man_up(mob/T as mob in mob_list)
set category = "Fun"
set name = "Man Up"
+1 -1
View File
@@ -2,7 +2,7 @@
/datum/admins/proc/create_mob(var/mob/user)
if (!create_mob_html)
var/mobjs = null
mobjs = list2text(typesof(/mob), ";")
mobjs = jointext(typesof(/mob), ";")
create_mob_html = file2text('html/create_object.html')
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
+2 -2
View File
@@ -3,7 +3,7 @@
/datum/admins/proc/create_object(var/mob/user)
if (!create_object_html)
var/objectjs = null
objectjs = list2text(typesof(/obj), ";")
objectjs = jointext(typesof(/obj), ";")
create_object_html = file2text('html/create_object.html')
create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
@@ -22,7 +22,7 @@
if (!quick_create_object_html)
var/objectjs = null
objectjs = list2text(typesof(path), ";")
objectjs = jointext(typesof(path), ";")
quick_create_object_html = file2text('html/create_object.html')
quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
+1 -1
View File
@@ -2,7 +2,7 @@
/datum/admins/proc/create_turf(var/mob/user)
if (!create_turf_html)
var/turfjs = null
turfjs = list2text(typesof(/turf), ";")
turfjs = jointext(typesof(/turf), ";")
create_turf_html = file2text('html/create_object.html')
create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"")
+1 -1
View File
@@ -392,7 +392,7 @@
if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
var/dat = "<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>"
dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>"
dat += "Round Duration: <B>[round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]</B><BR>"
dat += "Round Duration: <B>[round_duration_as_text()]</B><BR>"
dat += "<B>Emergency shuttle</B><BR>"
if (!emergency_shuttle.online())
dat += "<a href='?src=\ref[src];call_shuttle=1'>Call Shuttle</a><br>"
+9 -5
View File
@@ -262,7 +262,7 @@
message_admins("\blue [key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1)
switch(href_list["simplemake"])
if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob )
if("observer") M.change_mob_type( /mob/observer/dead , null, null, delmob )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
if("nymph") M.change_mob_type( /mob/living/carbon/alien/diona , null, null, delmob )
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob, href_list["species"])
@@ -769,7 +769,7 @@
message_admins("\blue [key_name_admin(usr)] removed [t]", 1)
jobban_remove(t)
href_list["ban"] = 1 // lets it fall through and refresh
var/t_split = text2list(t, " - ")
var/t_split = splittext(t, " - ")
var/key = t_split[1]
var/job = t_split[2]
DB_ban_unban(ckey(key), BANTYPE_JOB_PERMA, job)
@@ -1574,9 +1574,9 @@
alert("Select fewer object types, (max 5)")
return
else if(length(removed_paths))
alert("Removed:\n" + list2text(removed_paths, "\n"))
alert("Removed:\n" + jointext(removed_paths, "\n"))
var/list/offset = text2list(href_list["offset"],",")
var/list/offset = splittext(href_list["offset"],",")
var/number = dd_range(1, 100, text2num(href_list["object_count"]))
var/X = offset.len > 0 ? text2num(offset[1]) : 0
var/Y = offset.len > 1 ? text2num(offset[2]) : 0
@@ -1644,6 +1644,10 @@
log_and_message_admins("created [number] [english_list(paths)]")
return
else if(href_list["admin_secrets_panel"])
var/datum/admin_secret_category/AC = locate(href_list["admin_secrets_panel"]) in admin_secrets.categories
src.Secrets(AC)
else if(href_list["admin_secrets"])
var/datum/admin_secret_item/item = locate(href_list["admin_secrets"]) in admin_secrets.items
item.execute(usr)
@@ -1917,7 +1921,7 @@ mob/living/silicon/ai/can_centcom_reply()
if(client && eyeobj)
return "|<A HREF='?[source];adminplayerobservejump=\ref[eyeobj]'>EYE</A>"
/mob/dead/observer/extra_admin_link(var/source)
/mob/observer/dead/extra_admin_link(var/source)
if(mind && mind.current)
return "|<A HREF='?[source];adminplayerobservejump=\ref[mind.current]'>BDY</A>"
+3 -6
View File
@@ -17,9 +17,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
adminhelped = 1 //Determines if they get the message to reply by clicking the name.
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
//clean the input msg
if(!msg)
return
@@ -29,7 +26,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
var/original_msg = msg
//explode the input msg into a list
var/list/msglist = text2list(msg, " ")
var/list/msglist = splittext(msg, " ")
//generate keywords lookup
var/list/surnames = list()
@@ -40,7 +37,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(M.mind) indexing += M.mind.name
for(var/string in indexing)
var/list/L = text2list(string, " ")
var/list/L = splittext(string, " ")
var/surname_found = 0
//surnames
for(var/i=L.len, i>=1, i--)
@@ -100,7 +97,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if((R_ADMIN|R_MOD|R_MENTOR|R_SERVER) & X.holder.rights)
if(X.is_afk())
admin_number_afk++
if(X.prefs.toggles & SOUND_ADMINHELP)
if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
X << 'sound/effects/adminhelp.ogg'
if(X.holder.rights == R_MENTOR)
X << mentor_msg // Mentors won't see coloring of names on people with special_roles (Antags, etc.)
+1 -1
View File
@@ -1,7 +1,7 @@
/mob/proc/on_mob_jump()
return
/mob/dead/observer/on_mob_jump()
/mob/observer/dead/on_mob_jump()
following = null
/client/proc/Jump(var/area/A in return_sorted_areas())
+2 -5
View File
@@ -21,7 +21,7 @@
if(T.mob)
if(istype(T.mob, /mob/new_player))
targets["(New Player) - [T]"] = T
else if(istype(T.mob, /mob/dead/observer))
else if(istype(T.mob, /mob/observer/dead))
targets["[T.mob.name](Ghost) - [T]"] = T
else
targets["[T.mob.real_name](as [T.mob.name]) - [T]"] = T
@@ -56,9 +56,6 @@
else src << "<font color='red'>Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!</font>"
return
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
//clean the message if it's not sent by a high-rank admin
//todo: sanitize for all???
if(!check_rights(R_SERVER|R_DEBUG,0))
@@ -104,7 +101,7 @@
//play the recieving admin the adminhelp sound (if they have them enabled)
//non-admins shouldn't be able to disable this
if(C.prefs && C.prefs.toggles & SOUND_ADMINHELP)
if(C.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
C << 'sound/effects/adminhelp.ogg'
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
+278 -89
View File
@@ -71,38 +71,61 @@
screen_loc = "NORTH,WEST+1"
Click()
switch(master.cl.buildmode)
if(1)
usr << "\blue ***********************************************************"
usr << "\blue Left Mouse Button = Construct / Upgrade"
usr << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade"
usr << "\blue Left Mouse Button + ctrl = R-Window"
usr << "\blue Left Mouse Button + alt = Airlock"
if(1) // Basic Build
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Left Mouse Button = Construct / Upgrade</span>"
usr << "<span class='notice'>Right Mouse Button = Deconstruct / Delete / Downgrade</span>"
usr << "<span class='notice'>Left Mouse Button + ctrl = R-Window</span>"
usr << "<span class='notice'>Left Mouse Button + alt = Airlock</span>"
usr << ""
usr << "\blue Use the button in the upper left corner to"
usr << "\blue change the direction of built objects."
usr << "\blue ***********************************************************"
if(2)
usr << "\blue ***********************************************************"
usr << "\blue Right Mouse Button on buildmode button = Set object type"
usr << "\blue Middle Mouse Button on buildmode button= On/Off object type saying"
usr << "\blue Middle Mouse Button on turf/obj = Capture object type"
usr << "\blue Left Mouse Button on turf/obj = Place objects"
usr << "\blue Right Mouse Button = Delete objects"
usr << "<span class='notice'>Use the button in the upper left corner to</span>"
usr << "<span class='notice'>change the direction of built objects.</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(2) // Adv. Build
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Right Mouse Button on buildmode button = Set object type</span>"
usr << "<span class='notice'>Middle Mouse Button on buildmode button= On/Off object type saying</span>"
usr << "<span class='notice'>Middle Mouse Button on turf/obj = Capture object type</span>"
usr << "<span class='notice'>Left Mouse Button on turf/obj = Place objects</span>"
usr << "<span class='notice'>Right Mouse Button = Delete objects</span>"
usr << "<span class='notice'>Mouse Button + ctrl = Copy object type</span>"
usr << ""
usr << "\blue Use the button in the upper left corner to"
usr << "\blue change the direction of built objects."
usr << "\blue ***********************************************************"
if(3)
usr << "\blue ***********************************************************"
usr << "\blue Right Mouse Button on buildmode button = Select var(type) & value"
usr << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value"
usr << "\blue Right Mouse Button on turf/obj/mob = Reset var's value"
usr << "\blue ***********************************************************"
if(4)
usr << "\blue ***********************************************************"
usr << "\blue Left Mouse Button on turf/obj/mob = Select"
usr << "\blue Right Mouse Button on turf/obj/mob = Throw"
usr << "\blue ***********************************************************"
usr << "<span class='notice'>Use the button in the upper left corner to</span>"
usr << "<span class='notice'>change the direction of built objects.</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(3) // Edit
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Right Mouse Button on buildmode button = Select var(type) & value</span>"
usr << "<span class='notice'>Left Mouse Button on turf/obj/mob = Set var(type) & value</span>"
usr << "<span class='notice'>Right Mouse Button on turf/obj/mob = Reset var's value</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(4) // Throw
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Left Mouse Button on turf/obj/mob = Select</span>"
usr << "<span class='notice'>Right Mouse Button on turf/obj/mob = Throw</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(5) // Room Build
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Left Mouse Button on turf = Select as point A</span>"
usr << "<span class='notice'>Right Mouse Button on turf = Select as point B</span>"
usr << "<span class='notice'>Right Mouse Button on buildmode button = Change floor/wall type</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(6) // Make Ladders
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Left Mouse Button on turf = Set as upper ladder loc</span>"
usr << "<span class='notice'>Right Mouse Button on turf = Set as lower ladder loc</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(7) // Move Into Contents
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Left Mouse Button on turf/obj/mob = Select</span>"
usr << "<span class='notice'>Right Mouse Button on turf/obj/mob = Move into selection</span>"
usr << "<span class='notice'>***********************************************************</span>"
if(8) // Make Lights
usr << "<span class='notice'>***********************************************************</span>"
usr << "<span class='notice'>Left Mouse Button on turf/obj/mob = Make it glow</span>"
usr << "<span class='notice'>Right Mouse Button on turf/obj/mob = Reset glowing</span>"
usr << "<span class='notice'>Right Mouse Button on buildmode button = Change glow properties</span>"
usr << "<span class='notice'>***********************************************************</span>"
return 1
/obj/effect/bmode/buildquit
@@ -144,62 +167,100 @@
var/objholder = /obj/structure/closet
var/objsay = 1
Click(location, control, params)
var/list/pa = params2list(params)
var/wall_holder = /turf/simulated/wall
var/floor_holder = /turf/simulated/floor/plating
var/turf/coordA = null
var/turf/coordB = null
if(pa.Find("middle"))
switch(master.cl.buildmode)
if(2)
objsay=!objsay
var/new_light_color = "#FFFFFF"
var/new_light_range = 3
var/new_light_intensity = 3
/obj/effect/bmode/buildmode/Click(location, control, params)
var/list/pa = params2list(params)
if(pa.Find("middle"))
switch(master.cl.buildmode)
if(2)
objsay=!objsay
if(pa.Find("left"))
switch(master.cl.buildmode)
if(1)
master.cl.buildmode = 2
src.icon_state = "buildmode2"
if(2)
master.cl.buildmode = 3
src.icon_state = "buildmode3"
if(3)
master.cl.buildmode = 4
src.icon_state = "buildmode4"
if(4)
master.cl.buildmode = 1
src.icon_state = "buildmode1"
if(pa.Find("left"))
switch(master.cl.buildmode)
if(1)
master.cl.buildmode = 2
src.icon_state = "buildmode2"
if(2)
master.cl.buildmode = 3
src.icon_state = "buildmode3"
if(3)
master.cl.buildmode = 4
src.icon_state = "buildmode4"
if(4)
master.cl.buildmode = 5
src.icon_state = "buildmode5"
if(5)
master.cl.buildmode = 6
src.icon_state = "buildmode6"
if(6)
master.cl.buildmode = 7
src.icon_state = "buildmode7"
if(7)
master.cl.buildmode = 8
src.icon_state = "buildmode8"
if(8)
master.cl.buildmode = 1
src.icon_state = "buildmode1"
else if(pa.Find("right"))
switch(master.cl.buildmode)
if(1)
else if(pa.Find("right"))
switch(master.cl.buildmode)
if(1) // Basic Build
return 1
if(2) // Adv. Build
objholder = get_path_from_partial_text(/obj/structure/closet)
if(3) // Edit
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0))
return 1
if(2)
objholder = text2path(input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet"))
if(!ispath(objholder))
objholder = /obj/structure/closet
alert("That path is not allowed.")
else
if(ispath(objholder,/mob) && !check_rights(R_DEBUG,0))
objholder = /obj/structure/closet
if(3)
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = input(usr,"Enter variable name:" ,"Name", "name")
if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0))
return 1
var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference")
if(!thetype) return 1
switch(thetype)
if("text")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text
if("number")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num
if("mob-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in mob_list
if("obj-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world
if("turf-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world
return 1
var/thetype = input(usr,"Select variable type:" ,"Type") in list("text","number","mob-reference","obj-reference","turf-reference")
if(!thetype) return 1
switch(thetype)
if("text")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", "value") as text
if("number")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num
if("mob-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in mob_list
if("obj-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world
if("turf-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as turf in world
if(5) // Room build
var/choice = alert("Would you like to change the floor or wall holders?","Room Builder", "Floor", "Wall")
switch(choice)
if("Floor")
floor_holder = get_path_from_partial_text(/turf/simulated/floor/plating)
if("Wall")
wall_holder = get_path_from_partial_text(/turf/simulated/wall)
if(8) // Lights
var/choice = alert("Change the new light range, power, or color?", "Light Maker", "Range", "Power", "Color")
switch(choice)
if("Range")
var/input = input("New light range.","Light Maker",3) as null|num
if(input)
new_light_range = input
if("Power")
var/input = input("New light power.","Light Maker",3) as null|num
if(input)
new_light_intensity = input
if("Color")
var/input = input("New light color.","Light Maker",3) as null|color
if(input)
new_light_color = input
return 1
/proc/build_click(var/mob/user, buildmode, params, var/obj/object)
var/obj/effect/bmode/buildholder/holder = null
@@ -211,7 +272,7 @@
var/list/pa = params2list(params)
switch(buildmode)
if(1)
if(1) // Basic Build
if(istype(object,/turf) && pa.Find("left") && !pa.Find("alt") && !pa.Find("ctrl") )
if(istype(object,/turf/space))
var/turf/T = object
@@ -260,8 +321,8 @@
if(NORTHWEST)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.set_dir(NORTHWEST)
if(2)
if(pa.Find("left"))
if(2) // Adv. Build
if(pa.Find("left") && !pa.Find("ctrl"))
if(ispath(holder.buildmode.objholder,/turf))
var/turf/T = get_turf(object)
T.ChangeTurf(holder.buildmode.objholder)
@@ -269,27 +330,31 @@
var/obj/A = new holder.buildmode.objholder (get_turf(object))
A.set_dir(holder.builddir.dir)
else if(pa.Find("right"))
if(isobj(object)) qdel(object)
if(isobj(object))
qdel(object)
else if(pa.Find("ctrl"))
holder.buildmode.objholder = object.type
user << "<span class='notice'>[object]([object.type]) copied to buildmode.</span>"
if(pa.Find("middle"))
holder.buildmode.objholder = text2path("[object.type]")
if(holder.buildmode.objsay) usr << "[object.type]"
if(3)
if(3) // Edit
if(pa.Find("left")) //I cant believe this shit actually compiles.
if(object.vars.Find(holder.buildmode.varholder))
log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
object.vars[holder.buildmode.varholder] = holder.buildmode.valueholder
else
usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'"
user << "<span class='danger'>[initial(object.name)] does not have a var called '[holder.buildmode.varholder]'</span>"
if(pa.Find("right"))
if(object.vars.Find(holder.buildmode.varholder))
log_admin("[key_name(usr)] modified [object.name]'s [holder.buildmode.varholder] to [holder.buildmode.valueholder]")
object.vars[holder.buildmode.varholder] = initial(object.vars[holder.buildmode.varholder])
else
usr << "\red [initial(object.name)] does not have a var called '[holder.buildmode.varholder]'"
user << "<span class='danger'>[initial(object.name)] does not have a var called '[holder.buildmode.varholder]'</span>"
if(4)
if(4) // Throw
if(pa.Find("left"))
if(istype(object, /atom/movable))
holder.throw_atom = object
@@ -297,3 +362,127 @@
if(holder.throw_atom)
holder.throw_atom.throw_at(object, 10, 1)
log_admin("[key_name(usr)] threw [holder.throw_atom] at [object]")
if(5) // Room build
if(pa.Find("left"))
holder.buildmode.coordA = get_turf(object)
user << "<span class='notice'>Defined [object] ([object.type]) as point A.</span>"
if(pa.Find("right"))
holder.buildmode.coordB = get_turf(object)
user << "<span class='notice'>Defined [object] ([object.type]) as point B.</span>"
if(holder.buildmode.coordA && holder.buildmode.coordB)
user << "<span class='notice'>A and B set, creating rectangle.</span>"
holder.buildmode.make_rectangle(
holder.buildmode.coordA,
holder.buildmode.coordB,
holder.buildmode.wall_holder,
holder.buildmode.floor_holder
)
holder.buildmode.coordA = null
holder.buildmode.coordB = null
if(6) // Ladders
if(pa.Find("left"))
holder.buildmode.coordA = get_turf(object)
user << "<span class='notice'>Defined [object] ([object.type]) as upper ladder location.</span>"
if(pa.Find("right"))
holder.buildmode.coordB = get_turf(object)
user << "<span class='notice'>Defined [object] ([object.type]) as lower ladder location.</span>"
if(holder.buildmode.coordA && holder.buildmode.coordB)
user << "<span class='notice'>Ladder locations set, building ladders.</span>"
var/obj/structure/ladder/A = new /obj/structure/ladder(holder.buildmode.coordA)
var/obj/structure/ladder/B = new /obj/structure/ladder(holder.buildmode.coordB)
A.target = B
B.target = A
B.icon_state = "ladderup"
holder.buildmode.coordA = null
holder.buildmode.coordB = null
if(7) // Move into contents
if(pa.Find("left"))
if(istype(object, /atom))
holder.throw_atom = object
if(pa.Find("right"))
if(holder.throw_atom && istype(object, /atom/movable))
object.forceMove(holder.throw_atom)
log_admin("[key_name(usr)] moved [object] into [holder.throw_atom].")
if(8) // Lights
if(pa.Find("left"))
if(object)
object.set_light(holder.buildmode.new_light_range, holder.buildmode.new_light_intensity, holder.buildmode.new_light_color)
if(pa.Find("right"))
if(object)
object.set_light(0, 0, "#FFFFFF")
/obj/effect/bmode/buildmode/proc/get_path_from_partial_text(default_path)
var/desired_path = input("Enter full or partial typepath.","Typepath","[default_path]")
var/list/types = typesof(/atom)
var/list/matches = list()
for(var/path in types)
if(findtext("[path]", desired_path))
matches += path
if(matches.len==0)
alert("No results found. Sorry.")
return
var/result = null
if(matches.len==1)
result = matches[1]
else
result = input("Select an atom type", "Spawn Atom", matches[1]) as null|anything in matches
if(!objholder)
result = default_path
return result
/obj/effect/bmode/buildmode/proc/make_rectangle(var/turf/A, var/turf/B, var/turf/wall_type, var/turf/floor_type)
if(!A || !B) // No coords
return
if(A.z != B.z) // Not same z-level
return
var/height = A.y - B.y
var/width = A.x - B.x
var/z_level = A.z
var/turf/lower_left_corner = null
// First, try to find the lowest part
var/desired_y = 0
if(A.y <= B.y)
desired_y = A.y
else
desired_y = B.y
//Now for the left-most part.
var/desired_x = 0
if(A.x <= B.x)
desired_x = A.x
else
desired_x = B.x
lower_left_corner = locate(desired_x, desired_y, z_level)
// Now we can begin building the actual room. This defines the boundries for the room.
var/low_bound_x = lower_left_corner.x
var/low_bound_y = lower_left_corner.y
var/high_bound_x = lower_left_corner.x + abs(width)
var/high_bound_y = lower_left_corner.y + abs(height)
for(var/i = low_bound_x, i <= high_bound_x, i++)
for(var/j = low_bound_y, j <= high_bound_y, j++)
var/turf/T = locate(i, j, z_level)
if(i == low_bound_x || i == high_bound_x || j == low_bound_y || j == high_bound_y)
if(isturf(wall_type))
T.ChangeTurf(wall_type)
else
new wall_type(T)
else
if(isturf(floor_type))
T.ChangeTurf(floor_type)
else
new floor_type(T)
@@ -37,11 +37,11 @@ var/inactive_keys = "None<br>"
var/list/ckeys_with_customitems = list()
var/file = file2text("config/custom_items.txt")
var/lines = text2list(file, "\n")
var/lines = splittext(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = text2list(line, ":")
var/list/Entry = splittext(line, ":")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
+3 -6
View File
@@ -8,14 +8,11 @@
if(!src.mob)
return
if(prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot send DSAY messages (muted)."
src << "<span class='warning'>You cannot send DSAY messages (muted).</span>"
return
if(!(prefs.toggles & CHAT_DEAD))
src << "\red You have deadchat muted."
return
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
if(!is_preference_enabled(/datum/client_preference/show_dsay))
src << "<span class='warning'>You have deadchat muted.</span>"
return
var/stafftype = uppertext(holder.rank)
+12 -12
View File
@@ -85,7 +85,7 @@
var/mob/choice = input("Choose a player to play the pAI", "Spawn pAI") in available
if(!choice)
return 0
if(!istype(choice, /mob/dead/observer))
if(!istype(choice, /mob/observer/dead))
var/confirm = input("[choice.key] isn't ghosting right now. Are you sure you want to yank them out of them out of their body and place them in this pAI?", "Spawn pAI Confirmation", "No") in list("Yes", "No")
if(confirm != "Yes")
return 0
@@ -214,7 +214,7 @@
set name = "Del-All"
// to prevent REALLY stupid deletions
var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/dead, /mob/dead/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai)
var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/observer/dead, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai)
var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in typesof(/obj) + typesof(/mob) - blocked
if(hsbitem)
for(var/atom/O in world)
@@ -282,7 +282,7 @@
if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes")
return
else
var/mob/dead/observer/ghost = new/mob/dead/observer(M,1)
var/mob/observer/dead/ghost = new/mob/observer/dead(M,1)
ghost.ckey = M.ckey
message_admins("\blue [key_name_admin(usr)] assumed direct control of [M].", 1)
log_admin("[key_name(usr)] assumed direct control of [M].")
@@ -732,7 +732,7 @@
M.equip_to_slot_or_del(W, slot_wear_id)
if("blue wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
@@ -744,7 +744,7 @@
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("red wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
@@ -756,7 +756,7 @@
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
if("marisa wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
@@ -932,17 +932,17 @@
switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs", "Clients"))
if("Players")
usr << list2text(player_list,",")
usr << jointext(player_list,",")
if("Admins")
usr << list2text(admins,",")
usr << jointext(admins,",")
if("Mobs")
usr << list2text(mob_list,",")
usr << jointext(mob_list,",")
if("Living Mobs")
usr << list2text(living_mob_list,",")
usr << jointext(living_mob_list,",")
if("Dead Mobs")
usr << list2text(dead_mob_list,",")
usr << jointext(dead_mob_list,",")
if("Clients")
usr << list2text(clients,",")
usr << jointext(clients,",")
// DNA2 - Admin Hax
/client/proc/cmd_admin_toggle_block(var/mob/M,var/block)
+54
View File
@@ -0,0 +1,54 @@
/client/proc/fixatmos()
set category = "Admin"
set name = "Fix Atmospherics Grief"
if(!check_rights(R_ADMIN|R_DEBUG)) return
if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the station is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No")
return
feedback_add_details("admin_verb","FA")
log_and_message_admins("Full atmosphere reset initiated by [usr].")
world << "<span class = 'danger'>Initiating restart of atmosphere. The server may lag a bit.</span>"
sleep(10)
var/current_time = world.timeofday
// Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes.
for(var/obj/machinery/power/supermatter/S in machines)
S.power = 0
usr << "\[1/5\] - Supermatter depowered"
// Remove all gases from all pipenets
for(var/datum/pipe_network/PN in pipe_networks)
for(var/datum/gas_mixture/G in PN.gases)
G.gas = list()
G.update_values()
usr << "\[2/5\] - All pipenets purged of gas."
// Delete all zones.
for(var/zone/Z in world)
Z.c_invalidate()
usr << "\[3/5\] - All ZAS Zones removed."
var/list/unsorted_overlays = list()
for(var/id in gas_data.tile_overlay)
unsorted_overlays |= gas_data.tile_overlay[id]
for(var/turf/simulated/T in world)
T.air = null
T.overlays.Remove(unsorted_overlays)
T.zone = null
usr << "\[4/5\] - All turfs reset to roundstart values."
qdel(air_master)
air_master = new
air_master.Setup()
spawn air_master.Start()
usr << "\[5/5\] - ZAS Rebooted"
world << "<span class = 'danger'>Atmosphere restart completed in <b>[(world.timeofday - current_time)/10]</b> seconds.</span>"
+3 -3
View File
@@ -1,7 +1,7 @@
var/list/forbidden_varedit_object_types = list(
/datum/admins, //Admins editing their own admin-power object? Yup, sounds like a good idea.
/obj/machinery/blackbox_recorder, //Prevents people messing with feedback gathering
/datum/feedback_variable //Prevents people messing with feedback gathering
/datum/admins, //Admins editing their own admin-power object? Yup, sounds like a good idea,
/obj/machinery/blackbox_recorder, //Prevents people messing with feedback gathering,
/datum/feedback_variable //Prevents people messing with feedback gathering,
)
var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "bound_x", "bound_y", "step_x", "step_y", "force_ending")
+1 -1
View File
@@ -16,7 +16,7 @@ var/list/sounds_cache = list()
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]", 1)
for(var/mob/M in player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
if(M.is_preference_enabled(/datum/client_preference/play_admin_midis))
M << uploaded_sound
feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+4 -3
View File
@@ -13,16 +13,15 @@
if(usr.client.prefs.muted & MUTE_PRAY)
usr << "\red You cannot pray (muted)."
return
if(src.client.handle_spam_prevention(msg,MUTE_PRAY))
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
msg = "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
if(C.prefs.toggles & CHAT_PRAYER)
if(C.is_preference_enabled(/datum/client_preference/admin/show_chat_prayers))
C << msg
C << 'sound/effects/ding.ogg'
usr << "Your prayers have been received by the gods."
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -33,9 +32,11 @@
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
C << 'sound/machines/signal.ogg'
/proc/Syndicate_announce(var/msg, var/mob/Sender)
msg = "\blue <b><font color=crimson>ILLEGAL:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
C << 'sound/machines/signal.ogg'
+16 -16
View File
@@ -189,7 +189,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
M.client.prefs.muted |= mute_type
log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]")
message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].", 1)
M << "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin."
M << "<span class='alert'>You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.</span>"
feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -202,7 +202,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]")
message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(M)] from [mute_string].", 1)
M << "You have been [muteunmute] from [mute_string]."
M << "<span class = 'alert'>You have been [muteunmute] from [mute_string].</span>"
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_add_random_ai_law()
@@ -235,8 +235,8 @@ Ccomp's first proc.
var/list/mobs = list()
var/list/ghosts = list()
var/list/sortmob = sortAtom(mob_list) // get the mob list.
/var/any=0
for(var/mob/dead/observer/M in sortmob)
var/any=0
for(var/mob/observer/dead/M in sortmob)
mobs.Add(M) //filter it where it's only ghosts
any = 1 //if no ghosts show up, any will just be 0
if(!any)
@@ -266,7 +266,7 @@ Ccomp's first proc.
src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.
return
var/mob/dead/observer/G = ghosts[target]
var/mob/observer/dead/G = ghosts[target]
if(G.has_enabled_antagHUD && config.antag_hud_restricted)
var/response = alert(src, "Are you sure you wish to allow this individual to play?","Ghost has used AntagHUD","Yes","No")
if(response == "No") return
@@ -291,9 +291,9 @@ Ccomp's first proc.
src << "Only administrators may use this command."
var/action=""
if(config.antag_hud_allowed)
for(var/mob/dead/observer/g in get_ghosts())
for(var/mob/observer/dead/g in get_ghosts())
if(!g.client.holder) //Remove the verb from non-admin ghosts
g.verbs -= /mob/dead/observer/verb/toggle_antagHUD
g.verbs -= /mob/observer/dead/verb/toggle_antagHUD
if(g.antagHUD)
g.antagHUD = 0 // Disable it on those that have it enabled
g.has_enabled_antagHUD = 2 // We'll allow them to respawn
@@ -302,9 +302,9 @@ Ccomp's first proc.
src << "\red <B>AntagHUD usage has been disabled</B>"
action = "disabled"
else
for(var/mob/dead/observer/g in get_ghosts())
for(var/mob/observer/dead/g in get_ghosts())
if(!g.client.holder) // Add the verb back for all non-admin ghosts
g.verbs += /mob/dead/observer/verb/toggle_antagHUD
g.verbs += /mob/observer/dead/verb/toggle_antagHUD
g << "\blue <B>The Administrator has enabled AntagHUD </B>" // Notify all observers they can now use AntagHUD
config.antag_hud_allowed = 1
action = "enabled"
@@ -324,13 +324,13 @@ Ccomp's first proc.
src << "Only administrators may use this command."
var/action=""
if(config.antag_hud_restricted)
for(var/mob/dead/observer/g in get_ghosts())
for(var/mob/observer/dead/g in get_ghosts())
g << "\blue <B>The administrator has lifted restrictions on joining the round if you use AntagHUD</B>"
action = "lifted restrictions"
config.antag_hud_restricted = 0
src << "\blue <B>AntagHUD restrictions have been lifted</B>"
else
for(var/mob/dead/observer/g in get_ghosts())
for(var/mob/observer/dead/g in get_ghosts())
g << "\red <B>The administrator has placed restrictions on joining the round if you use AntagHUD</B>"
g << "\red <B>Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions </B>"
g.antagHUD = 0
@@ -358,8 +358,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!input)
return
var/mob/dead/observer/G_found
for(var/mob/dead/observer/G in player_list)
var/mob/observer/dead/G_found
for(var/mob/observer/dead/G in player_list)
if(G.ckey == input)
G_found = G
break
@@ -388,7 +388,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
A.randomize_appearance_for(new_character)
A.randomize_appearance_and_body_for(new_character)
new_character.real_name = G_found.real_name
if(!new_character.real_name)
@@ -627,7 +627,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] has gibbed [key_name(M)]")
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
if(istype(M, /mob/dead/observer))
if(istype(M, /mob/observer/dead))
gibs(M.loc)
return
@@ -640,7 +640,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm == "Yes")
if (istype(mob, /mob/dead/observer)) // so they don't spam gibs everywhere
if (istype(mob, /mob/observer/dead)) // so they don't spam gibs everywhere
return
else
mob.gib()
+2 -2
View File
@@ -76,9 +76,9 @@
/datum/alarm/proc/cameras()
// reset camera cache
if(camera_cache_id != cache_id)
if(camera_repository.camera_cache_id != cache_id)
cameras = null
cache_id = camera_cache_id
cache_id = camera_repository.camera_cache_id
// If the alarm origin has changed area, for example a borg containing an alarming camera, reset the list of cameras
else if(cameras && (last_camera_area != alarm_area()))
cameras = null
+2 -2
View File
@@ -86,10 +86,10 @@
/turf/get_alarm_origin()
return get_area(src)
/datum/alarm_handler/proc/register(var/object, var/procName)
/datum/alarm_handler/proc/register_alarm(var/object, var/procName)
listeners[object] = procName
/datum/alarm_handler/proc/unregister(var/object)
/datum/alarm_handler/proc/unregister_alarm(var/object)
listeners -= object
/datum/alarm_handler/proc/notify_listeners(var/alarm, var/was_raised)
+1 -1
View File
@@ -94,7 +94,7 @@
..()
on_found(mob/finder as mob)
on_found(mob/living/finder as mob)
if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking their fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
+2 -1
View File
@@ -30,7 +30,6 @@
////////////
//SECURITY//
////////////
var/next_allowed_topic_time = 10
// comment out the line below when debugging locally to enable the options & messages menu
//control_freak = 1
@@ -47,3 +46,5 @@
var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
preload_rsc = 0 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server.
var/global/obj/screen/click_catcher/void
+15 -20
View File
@@ -1,10 +1,12 @@
////////////
//SECURITY//
////////////
#define TOPIC_SPAM_DELAY 2 //2 ticks is about 2/10ths of a second; it was 4 ticks, but that caused too many clicks to be lost due to lag
#define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 10MB //Boosted this thing. What's the worst that can happen?
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
//I would just like the code ready should it ever need to be used.
//#define TOPIC_DEBUGGING 1
/*
When somebody clicks a link in game, this Topic is called first.
It does the stuff in this proc and then is redirected to the Topic() proc for the src=[0xWhatever]
@@ -24,10 +26,13 @@
if(!usr || usr != mob) //stops us calling Topic for somebody else's client. Also helps prevent usr=null
return
//Reduces spamming of links by dropping calls that happen during the delay period
if(next_allowed_topic_time > world.time)
return
next_allowed_topic_time = world.time + TOPIC_SPAM_DELAY
#if defined(TOPIC_DEBUGGING)
world << "[src]'s Topic: [href] destined for [hsrc]."
if(href_list["nano_err"]) //nano throwing errors
world << "## NanoUI, Subject [src]: " + html_decode(href_list["nano_err"]) //NANO DEBUG HOOK
#endif
//search the href for script injection
if( findtext(href,"<script",1,0) )
@@ -69,21 +74,6 @@
..() //redirect to hsrc.Topic()
/client/proc/handle_spam_prevention(var/message, var/mute_type)
if(config.automute_on && !holder && src.last_message == message)
src.last_message_count++
if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE)
src << "\red You have exceeded the spam filter limit for identical messages. An auto-mute was applied."
cmd_admin_mute(src.mob, mute_type, 1)
return 1
if(src.last_message_count >= SPAM_TRIGGER_WARNING)
src << "\red You are nearing the spam filter limit for identical messages."
return 0
else
last_message = message
src.last_message_count = 0
return 0
//This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc.
/client/AllowUpload(filename, filelength)
if(filelength > UPLOAD_LIMIT)
@@ -166,6 +156,11 @@
send_resources()
nanomanager.send_resources(src)
if(!void)
void = new()
void.MakeGreed()
screen += void
if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates.
src << "<span class='info'>You have unread updates in the changelog.</span>"
winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold")
@@ -15,6 +15,10 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
/datum/category_item/player_setup_item/antagonism/basic/sanitize_character()
pref.uplinklocation = sanitize_inlist(pref.uplinklocation, uplink_locations, initial(pref.uplinklocation))
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/antagonism/basic/copy_to_mob(var/mob/living/carbon/human/character)
character.exploit_record = pref.exploit_record
/datum/category_item/player_setup_item/antagonism/basic/content(var/mob/user)
. +="<b>Uplink Type : <a href='?src=\ref[src];antagtask=1'>[pref.uplinklocation]</a></b>"
. +="<br>"
@@ -10,7 +10,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"alien candidate" = 1, //always show // 6
"positronic brain" = 1, // 7
"cultist" = IS_MODE_COMPILED("cult"), // 8
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
"renegade" = 1, // 9
"ninja" = "true", // 10
"raider" = IS_MODE_COMPILED("heist"), // 11
"diona" = 1, // 12
@@ -1,12 +1,20 @@
datum/preferences
var/biological_gender = MALE
var/identifying_gender = MALE
datum/preferences/proc/set_biological_gender(var/gender)
biological_gender = gender
identifying_gender = gender
/datum/category_item/player_setup_item/general/basic
name = "Basic"
sort_order = 1
var/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL)
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name
S["name_is_always_random"] >> pref.be_random_name
S["gender"] >> pref.gender
S["gender"] >> pref.biological_gender
S["id_gender"] >> pref.identifying_gender
S["age"] >> pref.age
S["spawnpoint"] >> pref.spawnpoint
S["OOC_Notes"] >> pref.metadata
@@ -14,35 +22,60 @@
/datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S)
S["real_name"] << pref.real_name
S["name_is_always_random"] << pref.be_random_name
S["gender"] << pref.gender
S["gender"] << pref.biological_gender
S["id_gender"] << pref.identifying_gender
S["age"] << pref.age
S["spawnpoint"] << pref.spawnpoint
S["OOC_Notes"] << pref.metadata
/datum/category_item/player_setup_item/general/basic/sanitize_character()
if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[pref.species]
pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age))
pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
pref.real_name = sanitize_name(pref.real_name, pref.species)
var/datum/species/S = all_species[pref.species ? pref.species : "Human"]
pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age))
pref.biological_gender = sanitize_inlist(pref.biological_gender, get_genders(), pick(get_genders()))
pref.identifying_gender = (pref.identifying_gender in all_genders_define_list) ? pref.identifying_gender : pref.biological_gender
pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name)
pref.real_name = random_name(pref.gender, pref.species)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
pref.real_name = random_name(pref.identifying_gender, pref.species)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/basic/copy_to_mob(var/mob/living/carbon/human/character)
if(config.humans_need_surnames)
var/firstspace = findtext(pref.real_name, " ")
var/name_length = length(pref.real_name)
if(!firstspace) //we need a surname
pref.real_name += " [pick(last_names)]"
else if(firstspace == name_length)
pref.real_name += "[pick(last_names)]"
character.real_name = pref.real_name
character.name = character.real_name
if(character.dna)
character.dna.real_name = character.real_name
character.gender = pref.biological_gender
character.identifying_gender = pref.identifying_gender
character.age = pref.age
/datum/category_item/player_setup_item/general/basic/content()
. = "<b>Name:</b> "
. = list()
. += "<b>Name:</b> "
. += "<a href='?src=\ref[src];rename=1'><b>[pref.real_name]</b></a><br>"
. += "(<a href='?src=\ref[src];random_name=1'>Random Name</A>) "
. += "(<a href='?src=\ref[src];always_random_name=1'>Always Random Name: [pref.be_random_name ? "Yes" : "No"]</a>)"
. += "<a href='?src=\ref[src];random_name=1'>Randomize Name</A><br>"
. += "<a href='?src=\ref[src];always_random_name=1'>Always Random Name: [pref.be_random_name ? "Yes" : "No"]</a>"
. += "<br>"
. += "<b>Gender:</b> <a href='?src=\ref[src];gender=1'><b>[capitalize(lowertext(pref.gender))]</b></a><br>"
. += "<b>Biological Gender:</b> <a href='?src=\ref[src];bio_gender=1'><b>[gender2text(pref.biological_gender)]</b></a><br>"
. += "<b>Gender Identity:</b> <a href='?src=\ref[src];id_gender=1'><b>[gender2text(pref.identifying_gender)]</b></a><br>"
. += "<b>Age:</b> <a href='?src=\ref[src];age=1'>[pref.age]</a><br>"
. += "<b>Spawn Point</b>: <a href='?src=\ref[src];spawnpoint=1'>[pref.spawnpoint]</a><br>"
if(config.allow_Metadata)
. += "<b>OOC Notes:</b> <a href='?src=\ref[src];metadata=1'> Edit </a><br>"
. = jointext(.,null)
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
var/datum/species/S = all_species[pref.species]
if(href_list["rename"])
var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null
if (!isnull(raw_name) && CanUseTopic(user))
@@ -55,20 +88,27 @@
return TOPIC_NOACTION
else if(href_list["random_name"])
pref.real_name = random_name(pref.gender, pref.species)
pref.real_name = random_name(pref.identifying_gender, pref.species)
return TOPIC_REFRESH
else if(href_list["always_random_name"])
pref.be_random_name = !pref.be_random_name
return TOPIC_REFRESH
else if(href_list["gender"])
pref.gender = next_in_list(pref.gender, valid_player_genders)
else if(href_list["bio_gender"])
var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
if(new_gender && CanUseTopic(user))
pref.set_biological_gender(new_gender)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["id_gender"])
var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
if(new_gender && CanUseTopic(user))
pref.identifying_gender = new_gender
return TOPIC_REFRESH
else if(href_list["age"])
if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[pref.species]
var/new_age = input(user, "Choose your character's age:\n([S.min_age]-[S.max_age])", "Character Preference", pref.age) as num|null
if(new_age && CanUseTopic(user))
pref.age = max(min(round(text2num(new_age)), S.max_age), S.min_age)
@@ -76,8 +116,8 @@
else if(href_list["spawnpoint"])
var/list/spawnkeys = list()
for(var/S in spawntypes)
spawnkeys += S
for(var/spawntype in spawntypes)
spawnkeys += spawntype
var/choice = input(user, "Where would you like to spawn when late-joining?") as null|anything in spawnkeys
if(!choice || !spawntypes[choice] || !CanUseTopic(user)) return TOPIC_NOACTION
pref.spawnpoint = choice
@@ -86,7 +126,16 @@
else if(href_list["metadata"])
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata)) as message|null
if(new_metadata && CanUseTopic(user))
pref.metadata = sanitize(new_metadata)
pref.metadata = new_metadata
return TOPIC_REFRESH
return ..()
/datum/category_item/player_setup_item/general/basic/proc/get_genders()
var/datum/species/S = all_species[pref.species]
var/list/possible_genders = S.genders
if(!pref.organ_data || pref.organ_data[BP_TORSO] != "cyborg")
return possible_genders
possible_genders = possible_genders.Copy()
possible_genders |= NEUTER
return possible_genders
@@ -1,5 +1,8 @@
var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-")
/datum/preferences
var/dress_mob = TRUE
/datum/category_item/player_setup_item/general/body
name = "Body"
sort_order = 3
@@ -25,6 +28,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["disabilities"] >> pref.disabilities
S["organ_data"] >> pref.organ_data
S["rlimb_data"] >> pref.rlimb_data
pref.preview_icon = null
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
S["species"] << pref.species
@@ -72,11 +76,58 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(!pref.organ_data) pref.organ_data = list()
if(!pref.rlimb_data) pref.rlimb_data = list()
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character)
// Copy basic values
character.r_eyes = pref.r_eyes
character.g_eyes = pref.g_eyes
character.b_eyes = pref.b_eyes
character.h_style = pref.h_style
character.r_hair = pref.r_hair
character.g_hair = pref.g_hair
character.b_hair = pref.b_hair
character.f_style = pref.f_style
character.r_facial = pref.r_facial
character.g_facial = pref.g_facial
character.b_facial = pref.b_facial
character.r_skin = pref.r_skin
character.g_skin = pref.g_skin
character.b_skin = pref.b_skin
character.s_tone = pref.s_tone
character.h_style = pref.h_style
character.f_style = pref.f_style
character.b_type = pref.b_type
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/status = pref.organ_data[name]
var/obj/item/organ/external/O = character.organs_by_name[name]
if(O)
if(status == "amputated")
O.remove_rejuv()
else if(status == "cyborg")
if(pref.rlimb_data[name])
O.robotize(pref.rlimb_data[name])
else
O.robotize()
for(var/name in list(O_HEART,O_EYES,O_BRAIN))
var/status = pref.organ_data[name]
if(!status)
continue
var/obj/item/organ/I = character.internal_organs_by_name[name]
if(I)
if(status == "assisted")
I.mechassist()
else if(status == "mechanical")
I.robotize()
return
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
pref.update_preview_icon()
if(pref.preview_icon_front && pref.preview_icon_side)
user << browse_rsc(pref.preview_icon_front, "preview_icon.png")
user << browse_rsc(pref.preview_icon_side, "preview_icon2.png")
. = list()
if(!pref.preview_icon)
pref.update_preview_icon()
user << browse_rsc(pref.preview_icon, "previewicon.png")
var/mob_species = all_species[pref.species]
. += "<table><tr style='vertical-align:top'><td><b>Body</b> "
@@ -166,7 +217,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else
. += "<br><br>"
. += "</td><td><b>Preview</b><br><img src=preview_icon.png height=64 width=64><img src=preview_icon2.png height=64 width=64>"
. += "</td><td><b>Preview</b><br>"
. += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>"
. += "<br><a href='?src=\ref[src];toggle_clothing=1'>[pref.dress_mob ? "Hide equipment" : "Show equipment"]</a>"
. += "</td></tr></table>"
. += "<b>Hair</b><br>"
@@ -186,16 +240,17 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(has_flag(mob_species, HAS_SKIN_COLOR))
. += "<br><b>Body Color</b><br>"
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin)]'><tr><td>__</td></tr></table></font><br>"
. = jointext(.,null)
/datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag)
return mob_species && (mob_species.appearance_flags & flag)
/datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user)
var/mob_species = all_species[pref.species]
var/datum/species/mob_species = all_species[pref.species]
if(href_list["random"])
pref.randomize_appearance_for()
return TOPIC_REFRESH
pref.randomize_appearance_and_body_for()
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["blood_type"])
var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in valid_bloodtypes
@@ -220,13 +275,17 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/prev_species = pref.species
pref.species = href_list["set_species"]
if(prev_species != pref.species)
if(!(pref.biological_gender in mob_species.genders))
pref.set_biological_gender(mob_species.genders[1])
//grab one of the valid hair styles for the newly chosen species
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
if(pref.gender == MALE && S.gender == FEMALE)
if(pref.biological_gender == MALE && S.gender == FEMALE)
continue
if(pref.gender == FEMALE && S.gender == MALE)
if(pref.biological_gender == FEMALE && S.gender == MALE)
continue
if(!(pref.species in S.species_allowed))
continue
@@ -242,9 +301,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
if(pref.gender == MALE && S.gender == FEMALE)
if(pref.biological_gender == MALE && S.gender == FEMALE)
continue
if(pref.gender == FEMALE && S.gender == MALE)
if(pref.biological_gender == FEMALE && S.gender == MALE)
continue
if(!(pref.species in S.species_allowed))
continue
@@ -268,7 +327,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/datum/species/S = all_species[pref.species]
pref.age = max(min(pref.age, S.max_age), S.min_age)
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_color"])
if(!has_flag(mob_species, HAS_HAIR_COLOR))
@@ -278,7 +337,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_hair = hex2num(copytext(new_hair, 2, 4))
pref.g_hair = hex2num(copytext(new_hair, 4, 6))
pref.b_hair = hex2num(copytext(new_hair, 6, 8))
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style"])
var/list/valid_hairstyles = list()
@@ -292,7 +351,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", pref.h_style) as null|anything in valid_hairstyles
if(new_h_style && CanUseTopic(user))
pref.h_style = new_h_style
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_color"])
if(!has_flag(mob_species, HAS_HAIR_COLOR))
@@ -302,7 +361,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_facial = hex2num(copytext(new_facial, 2, 4))
pref.g_facial = hex2num(copytext(new_facial, 4, 6))
pref.b_facial = hex2num(copytext(new_facial, 6, 8))
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["eye_color"])
if(!has_flag(mob_species, HAS_EYE_COLOR))
@@ -312,7 +371,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_eyes = hex2num(copytext(new_eyes, 2, 4))
pref.g_eyes = hex2num(copytext(new_eyes, 4, 6))
pref.b_eyes = hex2num(copytext(new_eyes, 6, 8))
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["skin_tone"])
if(!has_flag(mob_species, HAS_SKIN_TONE))
@@ -320,7 +379,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null
if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user))
pref.s_tone = 35 - max(min( round(new_s_tone), 220),1)
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["skin_color"])
if(!has_flag(mob_species, HAS_SKIN_COLOR))
@@ -330,15 +389,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_skin = hex2num(copytext(new_skin, 2, 4))
pref.g_skin = hex2num(copytext(new_skin, 4, 6))
pref.b_skin = hex2num(copytext(new_skin, 6, 8))
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_style"])
var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
if(pref.gender == MALE && S.gender == FEMALE)
if(pref.biological_gender == MALE && S.gender == FEMALE)
continue
if(pref.gender == FEMALE && S.gender == MALE)
if(pref.biological_gender == FEMALE && S.gender == MALE)
continue
if(!(pref.species in S.species_allowed))
continue
@@ -348,11 +407,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", pref.f_style) as null|anything in valid_facialhairstyles
if(new_f_style && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user))
pref.f_style = new_f_style
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["reset_limbs"])
reset_limbs()
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["limbs"])
@@ -367,7 +426,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/organ_tag = input(user, "Which limb do you want to change?") as null|anything in limb_selection_list
if(!organ_tag && !CanUseTopic(user)) return TOPIC_NOACTION
if(!organ_tag || !CanUseTopic(user)) return TOPIC_NOACTION
var/limb = null
var/second_limb = null // if you try to change the arm, the hand should also change
@@ -409,11 +468,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
choice_options = list("Normal","Prosthesis")
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in choice_options
if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION
if(!new_state || !CanUseTopic(user)) return TOPIC_NOACTION
switch(new_state)
if("Normal")
if(limb == BP_TORSO)
for(var/other_limb in BP_ALL - BP_TORSO)
pref.organ_data[other_limb] = null
@@ -438,6 +496,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/usable_manufacturers = list()
for(var/company in chargen_robolimbs)
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(limb in M.parts))
continue
if(tmp_species in M.species_cannot_use)
continue
usable_manufacturers[company] = M
@@ -467,7 +527,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
for(var/internal_organ in list(O_HEART,O_EYES))
pref.organ_data[internal_organ] = "mechanical"
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["organs"])
@@ -505,7 +565,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else if(href_list["disabilities"])
var/disability_flag = text2num(href_list["disabilities"])
pref.disabilities ^= disability_flag
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["toggle_clothing"])
pref.dress_mob = !pref.dress_mob
return TOPIC_REFRESH_UPDATE_PREVIEW
return ..()
@@ -536,9 +600,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
dat += "<img src='species_preview_[current_species.name].png' width='64px' height='64px'><br/><br/>"
dat += "<b>Language:</b> [current_species.language]<br/>"
dat += "<small>"
if(current_species.spawn_flags & CAN_JOIN)
if(current_species.spawn_flags & SPECIES_CAN_JOIN)
dat += "</br><b>Often present on human stations.</b>"
if(current_species.spawn_flags & IS_WHITELISTED)
if(current_species.spawn_flags & SPECIES_IS_WHITELISTED)
dat += "</br><b>Whitelist restricted.</b>"
if(!current_species.has_organ[O_HEART])
dat += "</br><b>Does not have a circulatory system.</b>"
@@ -566,9 +630,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/restricted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
if(!(current_species.spawn_flags & CAN_JOIN))
if(!(current_species.spawn_flags & SPECIES_CAN_JOIN))
restricted = 2
else if((current_species.spawn_flags & IS_WHITELISTED) && !is_alien_whitelisted(preference_mob(),current_species))
else if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(preference_mob(),current_species))
restricted = 1
if(restricted)
@@ -1,90 +1,143 @@
/datum/preferences
var/list/all_underwear
var/list/all_underwear_metadata
/datum/category_item/player_setup_item/general/equipment
name = "Clothing"
sort_order = 4
/datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S)
S["underwear_top"] >> pref.underwear_top
S["underwear_bottom"] >> pref.underwear_bottom
S["undershirt"] >> pref.undershirt
S["socks"] >> pref.socks
S["all_underwear"] >> pref.all_underwear
S["all_underwear_metadata"] >> pref.all_underwear_metadata
S["backbag"] >> pref.backbag
S["pdachoice"] >> pref.pdachoice
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["underwear_top"] << pref.underwear_top
S["underwear_bottom"] << pref.underwear_bottom
S["undershirt"] << pref.undershirt
S["socks"] << pref.socks
S["all_underwear"] << pref.all_underwear
S["all_underwear_metadata"] << pref.all_underwear_metadata
S["backbag"] << pref.backbag
S["pdachoice"] << pref.pdachoice
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/equipment/copy_to_mob(var/mob/living/carbon/human/character)
character.all_underwear.Cut()
character.all_underwear_metadata.Cut()
for(var/underwear_category_name in pref.all_underwear)
var/datum/category_group/underwear/underwear_category = global_underwear.categories_by_name[underwear_category_name]
if(underwear_category)
var/underwear_item_name = pref.all_underwear[underwear_category_name]
character.all_underwear[underwear_category_name] = underwear_category.items_by_name[underwear_item_name]
if(pref.all_underwear_metadata[underwear_category_name])
character.all_underwear_metadata[underwear_category_name] = pref.all_underwear_metadata[underwear_category_name]
else
pref.all_underwear -= underwear_category_name
// TODO - Looks like this is duplicating the work of sanitize_character() if so, remove
if(pref.backbag > 4 || pref.backbag < 1)
pref.backbag = 1 //Same as above
character.backbag = pref.backbag
if(pref.pdachoice > 3 || pref.pdachoice < 1)
pref.pdachoice = 1
character.pdachoice = pref.pdachoice
/datum/category_item/player_setup_item/general/equipment/sanitize_character()
if(!islist(pref.gear)) pref.gear = list()
if(!istype(pref.all_underwear))
pref.all_underwear = list()
for(var/datum/category_group/underwear/WRC in global_underwear.categories)
for(var/datum/category_item/underwear/WRI in WRC.items)
if(WRI.is_default(pref.identifying_gender ? pref.identifying_gender : MALE))
pref.all_underwear[WRC.name] = WRI.name
break
if(!istype(pref.all_underwear_metadata))
pref.all_underwear_metadata = list()
for(var/underwear_category in pref.all_underwear)
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[underwear_category]
if(!UWC)
pref.all_underwear -= underwear_category
else
var/datum/category_item/underwear/UWI = UWC.items_by_name[pref.all_underwear[underwear_category]]
if(!UWI)
pref.all_underwear -= underwear_category
for(var/underwear_metadata in pref.all_underwear_metadata)
if(!(underwear_metadata in pref.all_underwear))
pref.all_underwear_metadata -= underwear_metadata
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice))
if(!islist(pref.gear)) pref.gear = list()
var/undies_top = get_undies_top()
var/undies_bottom = get_undies_bottom()
if(!get_key_by_value(undies_top, pref.underwear_top))
pref.underwear_top = undies_top[1]
if(!get_key_by_value(undies_bottom, pref.underwear_bottom))
pref.underwear_bottom = undies_bottom[1]
if(!get_key_by_value(undershirt_t, pref.undershirt))
pref.undershirt = undershirt_t[1]
if(!get_key_by_value(socks_t, pref.socks))
pref.socks = socks_t[1]
/datum/category_item/player_setup_item/general/equipment/content()
. = list()
. += "<b>Equipment:</b><br>"
. += "Underwear Top: <a href='?src=\ref[src];change_underwear_top=1'><b>[get_key_by_value(get_undies_top(),pref.underwear_top)]</b></a><br>"
. += "Underwear Bottom: <a href='?src=\ref[src];change_underwear_bottom=1'><b>[get_key_by_value(get_undies_bottom(),pref.underwear_bottom)]</b></a><br>"
. += "Undershirt: <a href='?src=\ref[src];change_undershirt=1'><b>[get_key_by_value(undershirt_t,pref.undershirt)]</b></a><br>"
. += "Socks: <a href='?src=\ref[src];change_socks=1'><b>[get_key_by_value(socks_t,pref.socks)]</b></a><br>"
for(var/datum/category_group/underwear/UWC in global_underwear.categories)
var/item_name = pref.all_underwear[UWC.name] ? pref.all_underwear[UWC.name] : "None"
. += "[UWC.name]: <a href='?src=\ref[src];change_underwear=[UWC.name]'><b>[item_name]</b></a>"
var/datum/category_item/underwear/UWI = UWC.items_by_name[item_name]
if(UWI)
for(var/datum/gear_tweak/gt in UWI.tweaks)
. += " <a href='?src=\ref[src];underwear=[UWC.name];tweak=\ref[gt]'>[gt.get_contents(get_metadata(UWC.name, gt))]</a>"
. += "<br>"
. += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>"
. += "PDA Type: <a href='?src=\ref[src];change_pda=1'><b>[pdachoicelist[pref.pdachoice]]</b></a><br>"
/datum/category_item/player_setup_item/general/equipment/proc/get_undies_top()
return underwear_top_t
/datum/category_item/player_setup_item/general/equipment/proc/get_undies_bottom()
return underwear_bottom_t
return jointext(.,null)
/datum/category_item/player_setup_item/general/equipment/proc/get_metadata(var/underwear_category, var/datum/gear_tweak/gt)
var/metadata = pref.all_underwear_metadata[underwear_category]
if(!metadata)
metadata = list()
pref.all_underwear_metadata[underwear_category] = metadata
var/tweak_data = metadata["[gt]"]
if(!tweak_data)
tweak_data = gt.get_default()
metadata["[gt]"] = tweak_data
return tweak_data
/datum/category_item/player_setup_item/general/equipment/proc/set_metadata(var/underwear_category, var/datum/gear_tweak/gt, var/new_metadata)
var/list/metadata = pref.all_underwear_metadata[underwear_category]
metadata["[gt]"] = new_metadata
/datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["change_underwear_top"])
var/underwear_top_options = get_undies_top()
var/new_underwear_top = input(user, "Choose your character's top underwear:", "Character Preference", get_key_by_value(get_undies_top(),pref.underwear_top)) as null|anything in underwear_top_options
if(!isnull(new_underwear_top) && CanUseTopic(user))
pref.underwear_top = underwear_top_options[new_underwear_top]
return TOPIC_REFRESH
else if(href_list["change_underwear_bottom"])
var/underwear_bottom_options = get_undies_bottom()
var/new_underwear_bottom = input(user, "Choose your character's bottom underwear:", "Character Preference", get_key_by_value(get_undies_bottom(),pref.underwear_bottom)) as null|anything in underwear_bottom_options
if(!isnull(new_underwear_bottom) && CanUseTopic(user))
pref.underwear_bottom = underwear_bottom_options[new_underwear_bottom]
return TOPIC_REFRESH
else if(href_list["change_undershirt"])
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference", get_key_by_value(undershirt_t,pref.undershirt)) as null|anything in undershirt_t
if(!isnull(new_undershirt) && CanUseTopic(user))
pref.undershirt = undershirt_t[new_undershirt]
return TOPIC_REFRESH
else if(href_list["change_socks"])
var/new_socks = input(user, "Choose your character's socks:", "Character Preference", get_key_by_value(socks_t,pref.socks)) as null|anything in socks_t
if(!isnull(new_socks) && CanUseTopic(user))
pref.socks = socks_t[new_socks]
return TOPIC_REFRESH
else if(href_list["change_backpack"])
if(href_list["change_backpack"])
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference", backbaglist[pref.backbag]) as null|anything in backbaglist
if(!isnull(new_backbag) && CanUseTopic(user))
pref.backbag = backbaglist.Find(new_backbag)
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["change_pda"])
var/new_pdachoice = input(user, "Choose your character's style of PDA:", "Character Preference", pdachoicelist[pref.pdachoice]) as null|anything in pdachoicelist
if(!isnull(new_pdachoice) && CanUseTopic(user))
pref.pdachoice = pdachoicelist.Find(new_pdachoice)
return TOPIC_REFRESH
return ..()
else if(href_list["change_underwear"])
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]]
if(!UWC)
return
var/datum/category_item/underwear/selected_underwear = input(user, "Choose underwear:", "Character Preference", pref.all_underwear[UWC.name]) as null|anything in UWC.items
if(selected_underwear && CanUseTopic(user))
pref.all_underwear[UWC.name] = selected_underwear.name
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["underwear"] && href_list["tweak"])
var/underwear = href_list["underwear"]
if(!(underwear in pref.all_underwear))
return TOPIC_NOACTION
var/datum/gear_tweak/gt = locate(href_list["tweak"])
if(!gt)
return TOPIC_NOACTION
var/new_metadata = gt.get_metadata(usr, get_metadata(underwear, gt))
if(new_metadata)
set_metadata(underwear, gt, new_metadata)
return TOPIC_REFRESH_UPDATE_PREVIEW
return ..()
@@ -30,6 +30,16 @@
pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation))
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/background/copy_to_mob(var/mob/living/carbon/human/character)
character.med_record = pref.med_record
character.sec_record = pref.sec_record
character.gen_record = pref.gen_record
character.home_system = pref.home_system
character.citizenship = pref.citizenship
character.personal_faction = pref.faction
character.religion = pref.religion
/datum/category_item/player_setup_item/general/background/content(var/mob/user)
. += "<b>Background Information</b><br>"
. += "[company_name] Relation: <a href='?src=\ref[src];nt_relation=1'>[pref.nanotrasen_relation]</a><br/>"
@@ -36,6 +36,18 @@
/datum/category_item/player_setup_item/general/flavor/sanitize_character()
return
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/general/flavor/copy_to_mob(var/mob/living/carbon/human/character)
character.flavor_texts["general"] = pref.flavor_texts["general"]
character.flavor_texts["head"] = pref.flavor_texts["head"]
character.flavor_texts["face"] = pref.flavor_texts["face"]
character.flavor_texts["eyes"] = pref.flavor_texts["eyes"]
character.flavor_texts["torso"] = pref.flavor_texts["torso"]
character.flavor_texts["arms"] = pref.flavor_texts["arms"]
character.flavor_texts["hands"] = pref.flavor_texts["hands"]
character.flavor_texts["legs"] = pref.flavor_texts["legs"]
character.flavor_texts["feet"] = pref.flavor_texts["feet"]
/datum/category_item/player_setup_item/general/flavor/content(var/mob/user)
. += "<b>Flavor:</b><br>"
. += "<a href='?src=\ref[src];flavor_text=open'>Set Flavor Text</a><br/>"
@@ -1,38 +1,130 @@
/datum/preferences
var/preferences_enabled = null
var/preferences_disabled = null
/datum/category_item/player_setup_item/player_global/settings
name = "Settings"
sort_order = 2
/datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S)
S["lastchangelog"] >> pref.lastchangelog
S["default_slot"] >> pref.default_slot
S["toggles"] >> pref.toggles
S["lastchangelog"] >> pref.lastchangelog
S["default_slot"] >> pref.default_slot
S["preferences"] >> pref.preferences_enabled
S["preferences_disabled"] >> pref.preferences_disabled
/datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S)
S["lastchangelog"] << pref.lastchangelog
S["default_slot"] << pref.default_slot
S["toggles"] << pref.toggles
S["lastchangelog"] << pref.lastchangelog
S["default_slot"] << pref.default_slot
S["preferences"] << pref.preferences_enabled
S["preferences_disabled"] << pref.preferences_disabled
/datum/category_item/player_setup_item/player_global/settings/sanitize_preferences()
// Ensure our preferences are lists.
if(!istype(pref.preferences_enabled, /list))
pref.preferences_enabled = list()
if(!istype(pref.preferences_disabled, /list))
pref.preferences_disabled = list()
// Arrange preferences that have never been enabled/disabled.
var/list/client_preference_keys = list()
for(var/cp in get_client_preferences())
var/datum/client_preference/client_pref = cp
client_preference_keys += client_pref.key
if((client_pref.key in pref.preferences_enabled) || (client_pref.key in pref.preferences_disabled))
continue
if(client_pref.enabled_by_default)
pref.preferences_enabled += client_pref.key
else
pref.preferences_disabled += client_pref.key
// Clean out preferences that no longer exist.
for(var/key in pref.preferences_enabled)
if(!(key in client_preference_keys))
pref.preferences_enabled -= key
for(var/key in pref.preferences_disabled)
if(!(key in client_preference_keys))
pref.preferences_disabled -= key
pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog))
pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot))
pref.toggles = sanitize_integer(pref.toggles, 0, 65535, initial(pref.toggles))
/datum/category_item/player_setup_item/player_global/settings/content(var/mob/user)
. += "<b>Play admin midis:</b> <a href='?src=\ref[src];toggle=[SOUND_MIDI]'><b>[(pref.toggles & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
. += "<b>Play lobby music:</b> <a href='?src=\ref[src];toggle=[SOUND_LOBBY]'><b>[(pref.toggles & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
. += "<b>Ghost ears:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTEARS]'><b>[(pref.toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
. += "<b>Ghost sight:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTSIGHT]'><b>[(pref.toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
. += "<b>Ghost radio:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTRADIO]'><b>[(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
. = list()
. += "<b>Preferences</b><br>"
. += "<table>"
var/mob/pref_mob = preference_mob()
for(var/cp in get_client_preferences())
var/datum/client_preference/client_pref = cp
if(!client_pref.may_toggle(pref_mob))
continue
. += "<tr><td>[client_pref.description]: </td>"
if(pref_mob.is_preference_enabled(client_pref.key))
. += "<td><span class='linkOn'><b>[client_pref.enabled_description]</b></span></td> <td><a href='?src=\ref[src];toggle_off=[client_pref.key]'>[client_pref.disabled_description]</a></td>"
else
. += "<td><a href='?src=\ref[src];toggle_on=[client_pref.key]'>[client_pref.enabled_description]</a></td> <td><span class='linkOn'><b>[client_pref.disabled_description]</b></span></td>"
. += "</tr>"
. += "</table>"
return jointext(., "")
/datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["toggle"])
var/toggle_flag = text2num(href_list["toggle"])
pref.toggles ^= toggle_flag
if(toggle_flag == SOUND_LOBBY && isnewplayer(user))
if(pref.toggles & SOUND_LOBBY)
user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
else
user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
var/mob/pref_mob = preference_mob()
if(href_list["toggle_on"])
. = pref_mob.set_preference(href_list["toggle_on"], TRUE)
else if(href_list["toggle_off"])
. = pref_mob.set_preference(href_list["toggle_off"], FALSE)
if(.)
return TOPIC_REFRESH
return ..()
/client/proc/is_preference_enabled(var/preference)
var/datum/client_preference/cp = get_client_preference(preference)
return cp && (cp.key in prefs.preferences_enabled)
/client/proc/set_preference(var/preference, var/set_preference)
var/datum/client_preference/cp = get_client_preference(preference)
if(!cp)
return FALSE
preference = cp.key
if(set_preference && !(preference in prefs.preferences_enabled))
return toggle_preference(cp)
else if(!set_preference && (preference in prefs.preferences_enabled))
return toggle_preference(cp)
/client/proc/toggle_preference(var/preference, var/set_preference)
var/datum/client_preference/cp = get_client_preference(preference)
if(!cp)
return FALSE
preference = cp.key
var/enabled
if(preference in prefs.preferences_disabled)
prefs.preferences_enabled |= preference
prefs.preferences_disabled -= preference
enabled = TRUE
. = TRUE
else if(preference in prefs.preferences_enabled)
prefs.preferences_enabled -= preference
prefs.preferences_disabled |= preference
enabled = FALSE
. = TRUE
if(.)
cp.toggled(mob, enabled)
/mob/proc/is_preference_enabled(var/preference)
if(!client)
return FALSE
return client.is_preference_enabled(preference)
/mob/proc/set_preference(var/preference, var/set_preference)
if(!client)
return FALSE
if(!client.prefs)
log_debug("Client prefs found to be null for mob [src] and client [ckey], this should be investigated.")
return FALSE
return client.set_preference(preference, set_preference)
@@ -0,0 +1,42 @@
/datum/category_item/player_setup_item/player_global/ooc
name = "OOC"
sort_order = 5
/datum/category_item/player_setup_item/player_global/ooc/load_preferences(var/savefile/S)
S["ignored_players"] >> pref.ignored_players
/datum/category_item/player_setup_item/player_global/ooc/save_preferences(var/savefile/S)
S["ignored_players"] << pref.ignored_players
/*
/datum/category_item/player_setup_item/player_global/ooc/sanitize_preferences()
if(isnull(pref.ignored_players))
pref.ignored_players = list()
/datum/category_item/player_setup_item/player_global/ooc/content(var/mob/user)
. += "<b>OOC:</b><br>"
. += "Ignored Players<br>"
for(var/ignored_player in pref.ignored_players)
. += "[ignored_player] (<a href='?src=\ref[src];unignore_player=[ignored_player]'>Unignore</a>)<br>"
. += "(<a href='?src=\ref[src];ignore_player=1'>Ignore Player</a>)"
/datum/category_item/player_setup_item/player_global/ooc/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["unignore_player"])
if(CanUseTopic(user))
pref.ignored_players -= href_list["unignore_player"]
return TOPIC_REFRESH
if(href_list["ignore_player"])
if(CanUseTopic(user))
var/player_to_ignore = input(user, "Who do you want to ignore?","Ignore") as null|text
if(player_to_ignore)
player_to_ignore = sanitize(ckey(player_to_ignore))
if(player_to_ignore == user.ckey)
user <<"<span class='notice'>You can't ignore yourself.</span>"
return TOPIC_REFRESH
pref.ignored_players |= player_to_ignore
return TOPIC_REFRESH
return ..()
*/
@@ -0,0 +1,198 @@
var/list/_client_preferences
var/list/_client_preferences_by_key
var/list/_client_preferences_by_type
/proc/get_client_preferences()
if(!_client_preferences)
_client_preferences = list()
for(var/ct in subtypesof(/datum/client_preference))
var/datum/client_preference/client_type = ct
if(initial(client_type.description))
_client_preferences += new client_type()
return _client_preferences
/proc/get_client_preference(var/datum/client_preference/preference)
if(istype(preference))
return preference
if(ispath(preference))
return get_client_preference_by_type(preference)
return get_client_preference_by_key(preference)
/proc/get_client_preference_by_key(var/preference)
if(!_client_preferences_by_key)
_client_preferences_by_key = list()
for(var/ct in get_client_preferences())
var/datum/client_preference/client_pref = ct
_client_preferences_by_key[client_pref.key] = client_pref
return _client_preferences_by_key[preference]
/proc/get_client_preference_by_type(var/preference)
if(!_client_preferences_by_type)
_client_preferences_by_type = list()
for(var/ct in get_client_preferences())
var/datum/client_preference/client_pref = ct
_client_preferences_by_type[client_pref.type] = client_pref
return _client_preferences_by_type[preference]
/datum/client_preference
var/description
var/key
var/enabled_by_default = TRUE
var/enabled_description = "Yes"
var/disabled_description = "No"
/datum/client_preference/proc/may_toggle(var/mob/preference_mob)
return TRUE
/datum/client_preference/proc/toggled(var/mob/preference_mob, var/enabled)
return
/*********************
* Player Preferences *
*********************/
/datum/client_preference/play_admin_midis
description ="Play admin midis"
key = "SOUND_MIDI"
/datum/client_preference/play_lobby_music
description ="Play lobby music"
key = "SOUND_LOBBY"
/datum/client_preference/play_lobby_music/toggled(var/mob/preference_mob, var/enabled)
if(enabled)
preference_mob << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
else
preference_mob << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
/datum/client_preference/play_ambiance
description ="Play ambience"
key = "SOUND_AMBIENCE"
/datum/client_preference/play_ambiance/toggled(var/mob/preference_mob, var/enabled)
if(!enabled)
preference_mob << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
preference_mob << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
/datum/client_preference/ghost_ears
description ="Ghost ears"
key = "CHAT_GHOSTEARS"
enabled_description = "All Speech"
disabled_description = "Nearby"
/datum/client_preference/ghost_sight
description ="Ghost sight"
key = "CHAT_GHOSTSIGHT"
enabled_description = "All Emotes"
disabled_description = "Nearby"
/datum/client_preference/ghost_radio
description ="Ghost radio"
key = "CHAT_GHOSTRADIO"
enabled_description = "All Chatter"
disabled_description = "Nearby"
/datum/client_preference/chat_tags
description ="Chat tags"
key = "CHAT_SHOWICONS"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/show_typing_indicator
description ="Typing indicator"
key = "SHOW_TYPING"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/show_typing_indicator/toggled(var/mob/preference_mob, var/enabled)
if(!enabled)
preference_mob.set_typing_indicator(0)
/datum/client_preference/show_ooc
description ="OOC chat"
key = "CHAT_OOC"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/show_looc
description ="LOOC chat"
key = "CHAT_LOOC"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/show_dsay
description ="Dead chat"
key = "CHAT_DEAD"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/show_progress_bar
description ="Progress Bar"
key = "SHOW_PROGRESS"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/safefiring
description = "Gun Firing Intent Requirement"
key = "SAFE_FIRING"
enabled_description = "Safe"
disabled_description = "Dangerous"
/datum/client_preference/browser_style
description = "Fake NanoUI Browser Style"
key = "BROWSER_STYLED"
enabled_description = "Fancy"
disabled_description = "Plain"
/********************
* Staff Preferences *
********************/
/datum/client_preference/admin/may_toggle(var/mob/preference_mob)
return check_rights(R_ADMIN, 0, preference_mob)
/datum/client_preference/mod/may_toggle(var/mob/preference_mob)
return check_rights(R_MOD|R_ADMIN, 0, preference_mob)
/datum/client_preference/debug/may_toggle(var/mob/preference_mob)
return check_rights(R_DEBUG|R_ADMIN, 0, preference_mob)
/datum/client_preference/mod/show_attack_logs
description = "Attack Log Messages"
key = "CHAT_ATTACKLOGS"
enabled_description = "Show"
disabled_description = "Hide"
enabled_by_default = FALSE
/datum/client_preference/debug/show_debug_logs
description = "Debug Log Messages"
key = "CHAT_DEBUGLOGS"
enabled_description = "Show"
disabled_description = "Hide"
enabled_by_default = FALSE
/datum/client_preference/admin/show_chat_prayers
description = "Chat Prayers"
key = "CHAT_PRAYER"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/holder/may_toggle(var/mob/preference_mob)
return preference_mob && preference_mob.client && preference_mob.client.holder
/datum/client_preference/holder/play_adminhelp_ping
description = "Adminhelps"
key = "SOUND_ADMINHELP"
enabled_description = "Hear"
disabled_description = "Silent"
/datum/client_preference/holder/hear_radio
description = "Radio chatter"
key = "CHAT_RADIO"
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/holder/show_rlooc
description ="Remote LOOC chat"
key = "CHAT_RLOOC"
enabled_description = "Show"
disabled_description = "Hide"
@@ -0,0 +1,142 @@
/datum/gear_tweak/proc/get_contents(var/metadata)
return
/datum/gear_tweak/proc/get_metadata(var/user, var/metadata)
return
/datum/gear_tweak/proc/get_default()
return
/datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data)
return
/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata)
return
/*
* Color adjustment
*/
/datum/gear_tweak/color
var/list/valid_colors
/datum/gear_tweak/color/New(var/list/valid_colors)
src.valid_colors = valid_colors
..()
/datum/gear_tweak/color/get_contents(var/metadata)
return "Color: <font color='[metadata]'>&#9899;</font>"
/datum/gear_tweak/color/get_default()
return valid_colors ? valid_colors[1] : COLOR_GRAY
/datum/gear_tweak/color/get_metadata(var/user, var/metadata, var/title = "Character Preference")
if(valid_colors)
return input(user, "Choose a color.", title, metadata) as null|anything in valid_colors
return input(user, "Choose a color.", title, metadata) as color|null
/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata)
if(valid_colors && !(metadata in valid_colors))
return
I.color = metadata
/*
* Path adjustment
*/
/datum/gear_tweak/path
var/list/valid_paths
/datum/gear_tweak/path/New(var/list/valid_paths)
src.valid_paths = valid_paths
..()
/datum/gear_tweak/path/get_contents(var/metadata)
return "Type: [metadata]"
/datum/gear_tweak/path/get_default()
return valid_paths[1]
/datum/gear_tweak/path/get_metadata(var/user, var/metadata)
return input(user, "Choose a type.", "Character Preference", metadata) as null|anything in valid_paths
/datum/gear_tweak/path/tweak_gear_data(var/metadata, var/datum/gear_data/gear_data)
if(!(metadata in valid_paths))
return
gear_data.path = valid_paths[metadata]
/*
* Content adjustment
*/
/datum/gear_tweak/contents
var/list/valid_contents
/datum/gear_tweak/contents/New()
valid_contents = args.Copy()
..()
/datum/gear_tweak/contents/get_contents(var/metadata)
return "Contents: [english_list(metadata, and_text = ", ")]"
/datum/gear_tweak/contents/get_default()
. = list()
for(var/i = 1 to valid_contents.len)
. += "Random"
/datum/gear_tweak/contents/get_metadata(var/user, var/list/metadata)
. = list()
for(var/i = metadata.len to valid_contents.len)
metadata += "Random"
for(var/i = 1 to valid_contents.len)
var/entry = input(user, "Choose an entry.", "Character Preference", metadata[i]) as null|anything in (valid_contents[i] + list("Random", "None"))
if(entry)
. += entry
else
return metadata
/datum/gear_tweak/contents/tweak_item(var/obj/item/I, var/list/metadata)
if(metadata.len != valid_contents.len)
return
for(var/i = 1 to valid_contents.len)
var/path
var/list/contents = valid_contents[i]
if(metadata[i] == "Random")
path = pick(contents)
path = contents[path]
else if(metadata[i] == "None")
continue
else
path = contents[metadata[i]]
new path(I)
/*
* Ragent adjustment
*/
/datum/gear_tweak/reagents
var/list/valid_reagents
/datum/gear_tweak/reagents/New(var/list/reagents)
valid_reagents = reagents.Copy()
..()
/datum/gear_tweak/reagents/get_contents(var/metadata)
return "Reagents: [metadata]"
/datum/gear_tweak/reagents/get_default()
return "Random"
/datum/gear_tweak/reagents/get_metadata(var/user, var/list/metadata)
. = input(user, "Choose an entry.", "Character Preference", metadata) as null|anything in (valid_reagents + list("Random", "None"))
if(!.)
return metadata
/datum/gear_tweak/reagents/tweak_item(var/obj/item/I, var/list/metadata)
if(metadata == "None")
return
if(metadata == "Random")
. = valid_reagents[pick(valid_reagents)]
else
. = valid_reagents[metadata]
I.reagents.add_reagent(., I.reagents.get_free_space())
@@ -63,6 +63,8 @@ var/list/gear_datums = list()
return valid_gear_choices
/datum/category_item/player_setup_item/loadout/sanitize_character()
if(!islist(pref.gear))
pref.gear = list()
for(var/gear_name in pref.gear)
if(!(gear_name in gear_datums))
@@ -82,6 +84,7 @@ var/list/gear_datums = list()
total_cost += G.cost
/datum/category_item/player_setup_item/loadout/content()
. = list()
var/total_cost = 0
if(pref.gear && pref.gear.len)
for(var/i = 1; i <= pref.gear.len; i++)
@@ -92,7 +95,8 @@ var/list/gear_datums = list()
var/fcolor = "#3366CC"
if(total_cost < MAX_GEAR_COST)
fcolor = "#E67300"
. += "<table align = 'center' width = 500px>"
. += "<table align = 'center' width = 100%>"
. += "<tr><td colspan=3><center><b><font color = '[fcolor]'>[total_cost]/[MAX_GEAR_COST]</font> loadout points spent.</b> \[<a href='?src=\ref[src];clear_loadout=1'>Clear Loadout</a>\]</center></td></tr>"
. += "<tr><td colspan=3><center><b>"
@@ -103,16 +107,21 @@ var/list/gear_datums = list()
firstcat = 0
else
. += " |"
var/datum/loadout_category/LC = loadout_categories[category]
var/category_cost = 0
for(var/gear in LC.gear)
if(gear in pref.gear)
var/datum/gear/G = LC.gear[gear]
category_cost += G.cost
if(category == current_tab)
. += " [category] "
. += " <span class='linkOn'>[category] - [category_cost]</span> "
else
var/datum/loadout_category/LC = loadout_categories[category]
var/tcolor = "#3366CC"
for(var/thing in LC.gear)
if(thing in pref.gear)
tcolor = "#E67300"
break
. += " <a href='?src=\ref[src];select_category=[category]'><font color = '[tcolor]'>[category]</font></a> "
if(category_cost)
. += " <a href='?src=\ref[src];select_category=[category]'><font color = '#E67300'>[category] - [category_cost]</font></a> "
else
. += " <a href='?src=\ref[src];select_category=[category]'>[category] - 0</a> "
. += "</b></center></td></tr>"
var/datum/loadout_category/LC = loadout_categories[current_tab]
@@ -122,11 +131,33 @@ var/list/gear_datums = list()
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
var/ticked = (G.display_name in pref.gear)
var/obj/item/temp = G.path
. += "<tr><td width=25%><a href='?src=\ref[src];toggle_gear=[G.display_name]'><font color='[ticked ? "#E67300" : "#3366CC"]'>[G.display_name]</font></a></td>"
. += "<td width = 10%>[G.cost]</td>"
. += "<td><font size=2><i>[initial(temp.desc)]</i></font></td></tr>"
. += "<tr style='vertical-align:top;'><td width=25%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?src=\ref[src];toggle_gear=[html_encode(G.display_name)]'>[G.display_name]</a></td>"
. += "<td width = 10% style='vertical-align:top'>[G.cost]</td>"
. += "<td><font size=2><i>[G.description]</i></font></td></tr>"
if(ticked)
. += "<tr><td colspan=3>"
for(var/datum/gear_tweak/tweak in G.gear_tweaks)
. += " <a href='?src=\ref[src];gear=[G.display_name];tweak=\ref[tweak]'>[tweak.get_contents(get_tweak_metadata(G, tweak))]</a>"
. += "</td></tr>"
. += "</table>"
. = jointext(., null)
/datum/category_item/player_setup_item/loadout/proc/get_gear_metadata(var/datum/gear/G)
. = pref.gear[G.display_name]
if(!.)
. = list()
pref.gear[G.display_name] = .
/datum/category_item/player_setup_item/loadout/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak)
var/list/metadata = get_gear_metadata(G)
. = metadata["[tweak]"]
if(!.)
. = tweak.get_default()
metadata["[tweak]"] = .
/datum/category_item/player_setup_item/loadout/proc/set_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak, var/new_metadata)
var/list/metadata = get_gear_metadata(G)
metadata["[tweak]"] = new_metadata
/datum/category_item/player_setup_item/loadout/OnTopic(href, href_list, user)
if(href_list["toggle_gear"])
@@ -140,22 +171,55 @@ var/list/gear_datums = list()
if(istype(G)) total_cost += G.cost
if((total_cost+TG.cost) <= MAX_GEAR_COST)
pref.gear += TG.display_name
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
if(href_list["gear"] && href_list["tweak"])
var/datum/gear/gear = gear_datums[href_list["gear"]]
var/datum/gear_tweak/tweak = locate(href_list["tweak"])
if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
return TOPIC_NOACTION
var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak))
if(!metadata || !CanUseTopic(user))
return TOPIC_NOACTION
set_tweak_metadata(gear, tweak, metadata)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["select_category"])
current_tab = href_list["select_category"]
return TOPIC_REFRESH
else if(href_list["clear_loadout"])
pref.gear.Cut()
return TOPIC_REFRESH
return TOPIC_REFRESH_UPDATE_PREVIEW
return ..()
/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..
var/sort_category = "General"
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
/datum/gear/New()
..()
if(!description)
var/obj/O = path
description = initial(O.desc)
/datum/gear_data
var/path
var/location
/datum/gear_data/New(var/path, var/location)
src.path = path
src.location = location
/datum/gear/proc/spawn_item(var/location, var/metadata)
var/datum/gear_data/gd = new(path, location)
for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_gear_data(metadata["[gt]"], gd)
var/item = new gd.path(gd.location)
for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_item(item, metadata["[gt]"])
return item
@@ -28,6 +28,14 @@
display_name = "armband, science"
path = /obj/item/clothing/accessory/armband/science
/datum/gear/accessory/wallet
display_name = "wallet, orange"
path = /obj/item/weapon/storage/wallet/random
/datum/gear/accessory/wallet_poly
display_name = "wallet, polychromic"
path = /obj/item/weapon/storage/wallet/poly
/datum/gear/accessory/holster
display_name = "holster, armpit"
path = /obj/item/clothing/accessory/holster/armpit
@@ -49,10 +57,34 @@
display_name = "tie, blue"
path = /obj/item/clothing/accessory/blue
/datum/gear/accessory/tie/blue_clip
display_name = "tie, blue with clip"
path = /obj/item/clothing/accessory/blue_clip
/datum/gear/accessory/tie/blue_long
display_name = "tie, blue long"
path = /obj/item/clothing/accessory/blue_long
/datum/gear/accessory/tie/red
display_name = "tie, red"
path = /obj/item/clothing/accessory/red
/datum/gear/accessory/tie/red_clip
display_name = "tie, red with clip"
path = /obj/item/clothing/accessory/red_clip
/datum/gear/accessory/tie/red_long
display_name = "tie, red long"
path = /obj/item/clothing/accessory/red_long
/datum/gear/accessory/tie/yellow
display_name = "tie, yellow"
path = /obj/item/clothing/accessory/yellow
/datum/gear/accessory/tie/navy
display_name = "tie, navy blue"
path = /obj/item/clothing/accessory/navy
/datum/gear/accessory/tie/horrible
display_name = "tie, socially disgraceful"
path = /obj/item/clothing/accessory/horrible
@@ -117,15 +149,59 @@
display_name = "scarf, striped blue"
path = /obj/item/clothing/accessory/stripedbluescarf
/datum/gear/accessory/suitjacket
display_name = "suit jacket, tan"
path = /obj/item/clothing/accessory/tan_jacket
/datum/gear/accessory/suitjacket/charcoal
display_name = "suit jacket, charcoal"
path = /obj/item/clothing/accessory/charcoal_jacket
/datum/gear/accessory/suitjacket/navy
display_name = "suit jacket, navy blue"
path = /obj/item/clothing/accessory/navy_jacket
/datum/gear/accessory/suitjacket/burgundy
display_name = "suit jacket, burgundy"
path = /obj/item/clothing/accessory/burgundy_jacket
/datum/gear/accessory/suitjacket/checkered
display_name = "suit jacket, checkered"
path = /obj/item/clothing/accessory/checkered_jacket
/datum/gear/accessory/suitvest
display_name = "suit vest"
path = /obj/item/clothing/accessory/vest
/datum/gear/accessory/brown_vest
display_name = "webbing, engineering"
path = /obj/item/clothing/accessory/storage/brown_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/black_vest
display_name = "webbing, security"
path = /obj/item/clothing/accessory/storage/black_vest
allowed_roles = list("Security Officer","Head of Security","Warden")
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/white_vest
display_name = "webbing, medical"
path = /obj/item/clothing/accessory/storage/white_vest
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/brown_drop_pouches
display_name = "drop pouches, engineering"
path = /obj/item/clothing/accessory/storage/brown_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/black_drop_pouches
display_name = "drop pouches, security"
path = /obj/item/clothing/accessory/storage/black_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/white_drop_pouches
display_name = "drop pouches, medical"
path = /obj/item/clothing/accessory/storage/white_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor")
/datum/gear/accessory/webbing
display_name = "webbing, simple"
@@ -30,10 +30,52 @@
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
/datum/gear/flask/New()
..()
gear_tweaks += new/datum/gear_tweak/reagents(lunchables_ethanol_reagents())
/datum/gear/vacflask
display_name = "vacuum-flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask
/datum/gear/vacflask/New()
..()
gear_tweaks += new/datum/gear_tweak/reagents(lunchables_drink_reagents())
/datum/gear/comb
display_name = "purple comb"
path = /obj/item/weapon/haircomb
path = /obj/item/weapon/haircomb
/datum/gear/lunchbox
display_name = "lunchbox"
description = "A little lunchbox."
cost = 2
path = /obj/item/weapon/storage/toolbox/lunchbox
/datum/gear/lunchbox/New()
..()
var/list/lunchboxes = list()
for(var/lunchbox_type in typesof(/obj/item/weapon/storage/toolbox/lunchbox))
var/obj/item/weapon/storage/toolbox/lunchbox/lunchbox = lunchbox_type
if(!initial(lunchbox.filled))
lunchboxes[initial(lunchbox.name)] = lunchbox_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(lunchboxes))
gear_tweaks += new/datum/gear_tweak/contents(lunchables_lunches(), lunchables_snacks(), lunchables_drinks())
/datum/gear/towel
display_name = "towel"
path = /obj/item/weapon/towel
/datum/gear/towel/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/cahwhite
display_name = "Cards Against The Galaxy (white deck)"
path = /obj/item/weapon/deck/cah
description = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the white deck."
/datum/gear/cahblack
display_name = "Cards Against The Galaxy (black deck)"
path = /obj/item/weapon/deck/cah/black
description = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the black deck."
@@ -187,253 +187,25 @@
whitelisted = "Tajara"
/datum/gear/head/hijab
display_name = "hijab, black"
display_name = "hijab"
path = /obj/item/clothing/head/hijab
/datum/gear/head/hijab/white
display_name = "hijab, white"
path = /obj/item/clothing/head/hijab/white
/datum/gear/head/hijab/aqua
display_name = "hijab, aqua"
path = /obj/item/clothing/head/hijab/aqua
/datum/gear/head/hijab/blue
display_name = "hijab, blue"
path = /obj/item/clothing/head/hijab/blue
/datum/gear/head/hijab/brown
display_name = "hijab, brown"
path = /obj/item/clothing/head/hijab/brown
/datum/gear/head/hijab/darkblue
display_name = "hijab, dark blue"
path = /obj/item/clothing/head/hijab/darkblue
/datum/gear/head/hijab/darkred
display_name = "hijab, dark red"
path = /obj/item/clothing/head/hijab/darkred
/datum/gear/head/hijab/green
display_name = "hijab, green"
path = /obj/item/clothing/head/hijab/green
/datum/gear/head/hijab/grey
display_name = "hijab, grey"
path = /obj/item/clothing/head/hijab/grey
/datum/gear/head/hijab/lightblue
display_name = "hijab, light blue"
path = /obj/item/clothing/head/hijab/lightblue
/datum/gear/head/hijab/lightbrown
display_name = "hijab, light brown"
path = /obj/item/clothing/head/hijab/lightbrown
/datum/gear/head/hijab/lightgreen
display_name = "hijab, light green"
path = /obj/item/clothing/head/hijab/lightgreen
/datum/gear/head/hijab/lightpurple
display_name = "hijab, light purple"
path = /obj/item/clothing/head/hijab/lightpurple
/datum/gear/head/hijab/lightred
display_name = "hijab, light red"
path = /obj/item/clothing/head/hijab/lightred
/datum/gear/head/hijab/maroon
display_name = "hijab, maroon"
path = /obj/item/clothing/head/hijab/maroon
/datum/gear/head/hijab/orange
display_name = "hijab, orange"
path = /obj/item/clothing/head/hijab/orange
/datum/gear/head/hijab/pink
display_name = "hijab, pink"
path = /obj/item/clothing/head/hijab/pink
/datum/gear/head/hijab/purple
display_name = "hijab, purple"
path = /obj/item/clothing/head/hijab/purple
/datum/gear/head/hijab/red
display_name = "hijab, red"
path = /obj/item/clothing/head/hijab/red
/datum/gear/head/hijab/yellowgreen
display_name = "hijab, yellow green"
path = /obj/item/clothing/head/hijab/yellowgreen
/datum/gear/head/hijab/yellow
display_name = "hijab, yellow"
path = /obj/item/clothing/head/hijab/yellow
/datum/gear/head/hijab/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/head/kippa
display_name = "kippa, black"
display_name = "kippa"
path = /obj/item/clothing/head/kippa
/datum/gear/head/kippa/white
display_name = "kippa, white"
path = /obj/item/clothing/head/kippa/white
/datum/gear/head/kippa/aqua
display_name = "kippa, aqua"
path = /obj/item/clothing/head/kippa/aqua
/datum/gear/head/kippa/blue
display_name = "kippa, blue"
path = /obj/item/clothing/head/kippa/blue
/datum/gear/head/kippa/brown
display_name = "kippa, brown"
path = /obj/item/clothing/head/kippa/brown
/datum/gear/head/kippa/darkblue
display_name = "kippa, dark blue"
path = /obj/item/clothing/head/kippa/darkblue
/datum/gear/head/kippa/darkred
display_name = "kippa, dark red"
path = /obj/item/clothing/head/kippa/darkred
/datum/gear/head/kippa/green
display_name = "kippa, green"
path = /obj/item/clothing/head/kippa/green
/datum/gear/head/kippa/grey
display_name = "kippa, grey"
path = /obj/item/clothing/head/kippa/grey
/datum/gear/head/kippa/lightblue
display_name = "kippa, light blue"
path = /obj/item/clothing/head/kippa/lightblue
/datum/gear/head/kippa/lightbrown
display_name = "kippa, light brown"
path = /obj/item/clothing/head/kippa/lightbrown
/datum/gear/head/kippa/lightgreen
display_name = "kippa, light green"
path = /obj/item/clothing/head/kippa/lightgreen
/datum/gear/head/kippa/lightpurple
display_name = "kippa, light purple"
path = /obj/item/clothing/head/kippa/lightpurple
/datum/gear/head/kippa/lightred
display_name = "kippa, light red"
path = /obj/item/clothing/head/kippa/lightred
/datum/gear/head/kippa/maroon
display_name = "kippa, maroon"
path = /obj/item/clothing/head/kippa/maroon
/datum/gear/head/kippa/orange
display_name = "kippa, orange"
path = /obj/item/clothing/head/kippa/orange
/datum/gear/head/kippa/pink
display_name = "kippa, pink"
path = /obj/item/clothing/head/kippa/pink
/datum/gear/head/kippa/purple
display_name = "kippa, purple"
path = /obj/item/clothing/head/kippa/purple
/datum/gear/head/kippa/red
display_name = "kippa, red"
path = /obj/item/clothing/head/kippa/red
/datum/gear/head/kippa/yellowgreen
display_name = "kippa, yellow green"
path = /obj/item/clothing/head/kippa/yellowgreen
/datum/gear/head/kippa/yellow
display_name = "kippa, yellow"
path = /obj/item/clothing/head/kippa/yellow
/datum/gear/head/kippa/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/head/turban
display_name = "turban, black"
display_name = "turban"
path = /obj/item/clothing/head/turban
/datum/gear/head/turban/white
display_name = "turban, white"
path = /obj/item/clothing/head/turban/white
/datum/gear/head/turban/aqua
display_name = "turban, aqua"
path = /obj/item/clothing/head/turban/aqua
/datum/gear/head/turban/blue
display_name = "turban, blue"
path = /obj/item/clothing/head/turban/blue
/datum/gear/head/turban/brown
display_name = "turban, brown"
path = /obj/item/clothing/head/turban/brown
/datum/gear/head/turban/darkblue
display_name = "turban, dark blue"
path = /obj/item/clothing/head/turban/darkblue
/datum/gear/head/turban/darkred
display_name = "turban, dark red"
path = /obj/item/clothing/head/turban/darkred
/datum/gear/head/turban/green
display_name = "turban, green"
path = /obj/item/clothing/head/turban/green
/datum/gear/head/turban/grey
display_name = "turban, grey"
path = /obj/item/clothing/head/turban/grey
/datum/gear/head/turban/lightblue
display_name = "turban, light blue"
path = /obj/item/clothing/head/turban/lightblue
/datum/gear/head/turban/lightbrown
display_name = "turban, light brown"
path = /obj/item/clothing/head/turban/lightbrown
/datum/gear/head/turban/lightgreen
display_name = "turban, light green"
path = /obj/item/clothing/head/turban/lightgreen
/datum/gear/head/turban/lightpurple
display_name = "turban, light purple"
path = /obj/item/clothing/head/turban/lightpurple
/datum/gear/head/turban/lightred
display_name = "turban, light red"
path = /obj/item/clothing/head/turban/lightred
/datum/gear/head/turban/maroon
display_name = "turban, maroon"
path = /obj/item/clothing/head/turban/maroon
/datum/gear/head/turban/orange
display_name = "turban, orange"
path = /obj/item/clothing/head/turban/orange
/datum/gear/head/turban/pink
display_name = "turban, pink"
path = /obj/item/clothing/head/turban/pink
/datum/gear/head/turban/purple
display_name = "turban, purple"
path = /obj/item/clothing/head/turban/purple
/datum/gear/head/turban/red
display_name = "turban, red"
path = /obj/item/clothing/head/turban/red
/datum/gear/head/turban/yellowgreen
display_name = "turban, yellow green"
path = /obj/item/clothing/head/turban/yellowgreen
/datum/gear/head/turban/yellow
display_name = "turban, yellow"
path = /obj/item/clothing/head/turban/yellow
/datum/gear/head/turban/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -7,7 +7,7 @@
/datum/gear/shoes/toeless
display_name = "toe-less jackboots"
path = /obj/item/clothing/shoes/jackboots/unathi
path = /obj/item/clothing/shoes/jackboots/toeless
/datum/gear/shoes/workboots
display_name = "workboots"
@@ -17,3 +17,19 @@
/datum/gear/ashtray
display_name = "ashtray, plastic"
path = /obj/item/weapon/material/ashtray/plastic
/datum/gear/cigar
display_name = "cigar"
path = /obj/item/clothing/mask/smokable/cigarette/cigar
/datum/gear/cigarettes
display_name = "cigarette selection"
path = /obj/item/weapon/storage/fancy/cigarettes
/datum/gear/cigarettes/New()
..()
var/list/cigarettes = list()
for(var/cigarette in (typesof(/obj/item/weapon/storage/fancy/cigarettes) - typesof(/obj/item/weapon/storage/fancy/cigarettes/killthroat)))
var/obj/item/weapon/storage/fancy/cigarettes/cigarette_brand = cigarette
cigarettes[initial(cigarette_brand.name)] = cigarette_brand
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cigarettes))
@@ -59,48 +59,16 @@
path = /obj/item/clothing/suit/storage/hazardvest
/datum/gear/suit/hoodie
display_name = "hoodie, grey"
display_name = "hoodie selection"
path = /obj/item/clothing/suit/storage/toggle/hoodie
/datum/gear/suit/hoodie/red
display_name = "hoodie, red"
path = /obj/item/clothing/suit/storage/toggle/hoodie/red
/datum/gear/suit/hoodie/blue
display_name = "hoodie, blue"
path = /obj/item/clothing/suit/storage/toggle/hoodie/blue
/datum/gear/suit/hoodie/yellow
display_name = "hoodie, yellow"
path = /obj/item/clothing/suit/storage/toggle/hoodie/yellow
/datum/gear/suit/hoodie/green
display_name = "hoodie, green"
path = /obj/item/clothing/suit/storage/toggle/hoodie/green
/datum/gear/suit/hoodie/orange
display_name = "hoodie, orange"
path = /obj/item/clothing/suit/storage/toggle/hoodie/orange
/datum/gear/suit/hoodie/black
display_name = "hoodie, black"
path = /obj/item/clothing/suit/storage/toggle/hoodie/black
/datum/gear/suit/hoodie/cti
display_name = "hoodie, CTI"
path = /obj/item/clothing/suit/storage/toggle/hoodie/cti
/datum/gear/suit/hoodie/mu
display_name = "hoodie, MU"
path = /obj/item/clothing/suit/storage/toggle/hoodie/mu
/datum/gear/suit/hoodie/nt
display_name = "hoodie, NT"
path = /obj/item/clothing/suit/storage/toggle/hoodie/nt
/datum/gear/suit/hoodie/smw
display_name = "hoodie, Space Mountain Wind"
path = /obj/item/clothing/suit/storage/toggle/hoodie/smw
/datum/gear/suit/hoodie/New()
..()
var/list/hoodies = list()
for(var/hoodie_style in typesof(/obj/item/clothing/suit/storage/toggle/hoodie))
var/obj/item/clothing/suit/storage/toggle/hoodie/hoodie = hoodie_style
hoodies[initial(hoodie.name)] = hoodie
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hoodies))
/datum/gear/suit/labcoat
display_name = "labcoat"
@@ -145,25 +113,42 @@
cost = 1
/datum/gear/suit/poncho
display_name = "poncho, tan"
display_name = "poncho selection"
path = /obj/item/clothing/suit/poncho
cost = 1
/datum/gear/suit/poncho/blue
display_name = "poncho, blue"
path = /obj/item/clothing/suit/poncho/blue
/datum/gear/suit/poncho/New()
..()
var/list/ponchos = list()
for(var/poncho_style in (typesof(/obj/item/clothing/suit/poncho) - typesof(/obj/item/clothing/suit/poncho/roles)))
var/obj/item/clothing/suit/storage/toggle/hoodie/poncho = poncho_style
ponchos[initial(poncho.name)] = poncho
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos))
/datum/gear/suit/poncho/green
display_name = "poncho, green"
path = /obj/item/clothing/suit/poncho/green
/datum/gear/suit/roles/poncho/security
display_name = "poncho, security"
path = /obj/item/clothing/suit/poncho/roles/security
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/suit/poncho/purple
display_name = "poncho, purple"
path = /obj/item/clothing/suit/poncho/purple
/datum/gear/suit/roles/poncho/medical
display_name = "poncho, medical"
path = /obj/item/clothing/suit/poncho/roles/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
/datum/gear/suit/poncho/red
display_name = "poncho, red"
path = /obj/item/clothing/suit/poncho/red
/datum/gear/suit/roles/poncho/engineering
display_name = "poncho, engineering"
path = /obj/item/clothing/suit/poncho/roles/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
/datum/gear/suit/roles/poncho/science
display_name = "poncho, science"
path = /obj/item/clothing/suit/poncho/roles/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
/datum/gear/suit/roles/poncho/cargo
display_name = "poncho, cargo"
path = /obj/item/clothing/suit/poncho/roles/cargo
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
@@ -209,4 +194,77 @@
/datum/gear/suit/forensics/red/short
display_name = "forensics, red"
path = /obj/item/clothing/suit/storage/forensics/red
allowed_roles = list("Detective")
allowed_roles = list("Detective")
/datum/gear/suit/wintercoat
display_name = "winter coat"
path = /obj/item/clothing/suit/storage/hooded/wintercoat
/datum/gear/suit/wintercoat/captain
display_name = "winter coat, captain"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain
allowed_roles = list("Captain")
/datum/gear/suit/wintercoat/security
display_name = "winter coat, security"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/security
allowed_roles = list("Security Officer, Head of Security, Warden, Detective")
/datum/gear/suit/wintercoat/medical
display_name = "winter coat, medical"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
/datum/gear/suit/wintercoat/science
display_name = "winter coat, science"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
/datum/gear/suit/wintercoat/engineering
display_name = "winter coat, engineering"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
/datum/gear/suit/wintercoat/atmos
display_name = "winter coat, atmospherics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
allowed_roles = list("Chief Engineer", "Atmospheric Technician")
/datum/gear/suit/wintercoat/hydro
display_name = "winter coat, hydroponics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/hydro
allowed_roles = list("Botanist", "Xenobiologist")
/datum/gear/suit/wintercoat/cargo
display_name = "winter coat, cargo"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/suit/wintercoat/miner
display_name = "winter coat, mining"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/miner
allowed_roles = list("Shaft Miner")
/datum/gear/suit/varsity
display_name = "varsity jacket selection"
path = /obj/item/clothing/suit/varsity
/datum/gear/suit/varsity/New()
..()
var/list/varsities = list()
for(var/varsity_style in typesof(/obj/item/clothing/suit/varsity))
var/obj/item/clothing/suit/varsity/varsity = varsity_style
varsities[initial(varsity.name)] = varsity
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(varsities))
/datum/gear/suit/track
display_name = "track jacket selection"
path = /obj/item/clothing/suit/storage/toggle/track
/datum/gear/suit/track/New()
..()
var/list/tracks = list()
for(var/track_style in typesof(/obj/item/clothing/suit/storage/toggle/track))
var/obj/item/clothing/suit/storage/toggle/track/track = track_style
tracks[initial(track.name)] = track
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(tracks))
@@ -6,8 +6,15 @@
sort_category = "Uniforms and Casual Dress"
/datum/gear/uniform/cheongsam
display_name = "cheongsam, white"
path = /obj/item/clothing/under/cheongsam
display_name = "cheongsam selection"
/datum/gear/uniform/cheongsam/New()
..()
var/list/cheongasms = list()
for(var/cheongasm in typesof(/obj/item/clothing/under/cheongsam))
var/obj/item/clothing/under/cheongsam/cheongasm_type = cheongasm
cheongasms[initial(cheongasm_type.name)] = cheongasm_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cheongasms))
/datum/gear/uniform/kilt
display_name = "kilt"
@@ -33,165 +40,124 @@
display_name = "cut top, red"
path = /obj/item/clothing/under/cuttop/red
/datum/gear/uniform/jumpskirt
display_name = "jumpskirt, black"
path = /obj/item/clothing/under/blackjumpskirt
/datum/gear/uniform/jumpsuit
display_name = "jumpsuit, rainbow"
path = /obj/item/clothing/under/rainbow
/datum/gear/uniform/jumpsuit/black
display_name = "jumpsuit, black"
path = /obj/item/clothing/under/color/black
/datum/gear/uniform/jumpsuit/blackfemale
display_name = "jumpsuit, female-black"
path = /obj/item/clothing/under/color/blackf
/datum/gear/uniform/jumpsuit/blue
display_name = "jumpsuit, blue"
path = /obj/item/clothing/under/color/blue
/datum/gear/uniform/jumpsuit/green
display_name = "jumpsuit, green"
path = /obj/item/clothing/under/color/green
/datum/gear/uniform/jumpsuit/grey
display_name = "jumpsuit, grey"
display_name = "jumpclothes selection"
path = /obj/item/clothing/under/color/grey
/datum/gear/uniform/jumpsuit/pink
display_name = "jumpsuit, pink"
path = /obj/item/clothing/under/color/pink
/datum/gear/uniform/jumpsuit/white
display_name = "jumpsuit, white"
path = /obj/item/clothing/under/color/white
/datum/gear/uniform/jumpsuit/yellow
display_name = "jumpsuit, yellow"
path = /obj/item/clothing/under/color/yellow
/datum/gear/uniform/jumpsuit/lightblue
display_name = "jumpsuit, lightblue"
path = /obj/item/clothing/under/lightblue
/datum/gear/uniform/jumpsuit/red
display_name = "jumpsuit, red"
path = /obj/item/clothing/under/color/red
/datum/gear/uniform/jumpsuit/aqua
display_name = "jumpsuit, aqua"
path = /obj/item/clothing/under/aqua
/datum/gear/uniform/jumpsuit/purple
display_name = "jumpsuit, purple"
path = /obj/item/clothing/under/purple
/datum/gear/uniform/jumpsuit/lightpurple
display_name = "jumpsuit, lightpurple"
path = /obj/item/clothing/under/lightpurple
/datum/gear/uniform/jumpsuit/lightgreen
display_name = "jumpsuit, lightgreen"
path = /obj/item/clothing/under/lightgreen
/datum/gear/uniform/jumpsuit/lightbrown
display_name = "jumpsuit, lightbrown"
path = /obj/item/clothing/under/lightbrown
/datum/gear/uniform/jumpsuit/brown
display_name = "jumpsuit, brown"
path = /obj/item/clothing/under/brown
/datum/gear/uniform/jumpsuit/yellowgreen
display_name = "jumpsuit, yellowgreen"
path = /obj/item/clothing/under/yellowgreen
/datum/gear/uniform/jumpsuit/darkblue
display_name = "jumpsuit, darkblue"
path = /obj/item/clothing/under/darkblue
/datum/gear/uniform/jumpsuit/lightred
display_name = "jumpsuit, lightred"
path = /obj/item/clothing/under/lightred
/datum/gear/uniform/jumpsuit/darkred
display_name = "jumpsuit, darkred"
path = /obj/item/clothing/under/darkred
/datum/gear/uniform/jumpsuit/New()
..()
var/list/jumpclothes = list()
for(var/jump in typesof(/obj/item/clothing/under/color))
var/obj/item/clothing/under/color/jumps = jump
jumpclothes[initial(jumps.name)] = jumps
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jumpclothes))
/datum/gear/uniform/skirt
display_name = "plaid skirt, blue"
path = /obj/item/clothing/under/dress/plaid_blue
display_name = "skirt selection"
path = /obj/item/clothing/under/skirt
/datum/gear/uniform/skirt/purple
display_name = "plaid skirt, purple"
path = /obj/item/clothing/under/dress/plaid_purple
/datum/gear/uniform/skirt/New()
..()
var/list/skirts = list()
for(var/skirt in (typesof(/obj/item/clothing/under/skirt)))
var/obj/item/clothing/under/skirt/skirt_type = skirt
skirts[initial(skirt_type.name)] = skirt_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(skirts))
/datum/gear/uniform/skirt/red
display_name = "plaid skirt, red"
path = /obj/item/clothing/under/dress/plaid_red
/datum/gear/uniform/pants
display_name = "pants selection"
path = /obj/item/clothing/under/pants/white
/datum/gear/uniform/skirt/black
display_name = "skirt, black"
path = /obj/item/clothing/under/blackskirt
/datum/gear/uniform/pants/New()
..()
var/list/pants = list()
for(var/pant in typesof(/obj/item/clothing/under/pants))
var/obj/item/clothing/under/pants/pant_type = pant
pants[initial(pant_type.name)] = pant_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pants))
/datum/gear/uniform/skirt/ce
/datum/gear/uniform/shorts
display_name = "shorts selection"
path = /obj/item/clothing/under/shorts/jeans
/datum/gear/uniform/shorts/New()
..()
var/list/shorts = list()
for(var/short in typesof(/obj/item/clothing/under/shorts))
var/obj/item/clothing/under/pants/short_type = short
shorts[initial(short_type.name)] = short_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(shorts))
/datum/gear/uniform/job_skirt/ce
display_name = "skirt, ce"
path = /obj/item/clothing/under/rank/chief_engineer/skirt
path = /obj/item/clothing/under/rank/engineer/chief_engineer/skirt
allowed_roles = list("Chief Engineer")
/datum/gear/uniform/skirt/atmos
/datum/gear/uniform/job_skirt/atmos
display_name = "skirt, atmos"
path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
path = /obj/item/clothing/under/rank/engineer/atmospheric_technician/skirt
allowed_roles = list("Chief Engineer","Atmospheric Technician")
/datum/gear/uniform/skirt/eng
/datum/gear/uniform/job_skirt/eng
display_name = "skirt, engineer"
path = /obj/item/clothing/under/rank/engineer/skirt
allowed_roles = list("Chief Engineer","Station Engineer")
/datum/gear/uniform/skirt/roboticist
/datum/gear/uniform/job_skirt/roboticist
display_name = "skirt, roboticist"
path = /obj/item/clothing/under/rank/roboticist/skirt
allowed_roles = list("Research Director","Roboticist")
/datum/gear/uniform/skirt/cmo
/datum/gear/uniform/job_skirt/cmo
display_name = "skirt, cmo"
path = /obj/item/clothing/under/rank/chief_medical_officer
path = /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt
allowed_roles = list("Chief Medical Officer")
/datum/gear/uniform/skirt/chem
/datum/gear/uniform/job_skirt/chem
display_name = "skirt, chemist"
path = /obj/item/clothing/under/rank/chemist/skirt
path = /obj/item/clothing/under/rank/medical/chemist/skirt
allowed_roles = list("Chief Medical Officer","Chemist")
/datum/gear/uniform/skirt/viro
/datum/gear/uniform/job_skirt/viro
display_name = "skirt, virologist"
path = /obj/item/clothing/under/rank/virologist/skirt
path = /obj/item/clothing/under/rank/medical/virologist/skirt
allowed_roles = list("Chief Medical Officer","Medical Doctor")
/datum/gear/uniform/skirt/med
/datum/gear/uniform/job_skirt/med
display_name = "skirt, medical"
path = /obj/item/clothing/under/rank/medical/skirt
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
/datum/gear/uniform/skirt/sci
/datum/gear/uniform/job_skirt/sci
display_name = "skirt, scientist"
path = /obj/item/clothing/under/rank/scientist/skirt
allowed_roles = list("Research Director","Scientist")
allowed_roles = list("Research Director","Scientist", "Xenobiologist")
/datum/gear/uniform/skirt/cargo
/datum/gear/uniform/job_skirt/cargo
display_name = "skirt, cargo"
path = /obj/item/clothing/under/rank/cargotech/skirt
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/uniform/skirt/qm
/datum/gear/uniform/job_skirt/qm
display_name = "skirt, QM"
path = /obj/item/clothing/under/rank/cargo/skirt
allowed_roles = list("Quartermaster")
/datum/gear/uniform/job_skirt/warden
display_name = "skirt, warden"
path = /obj/item/clothing/under/rank/security/warden/skirt
allowed_roles = list("Head of Security", "Warden")
/datum/gear/uniform/job_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/job_skirt/head_of_security
display_name = "skirt, hos"
path = /obj/item/clothing/under/rank/security/head_of_security/skirt
allowed_roles = list("Head of Security")
/datum/gear/uniform/jeans_qm
display_name = "jeans, QM"
path = /obj/item/clothing/under/rank/cargo/jeans
@@ -212,102 +178,6 @@
path = /obj/item/clothing/under/rank/cargotech/jeans/female
allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/uniform/pants
display_name = "pants, white"
path = /obj/item/clothing/under/pants/white
/datum/gear/uniform/pants/red
display_name = "pants, red"
path = /obj/item/clothing/under/pants/red
/datum/gear/uniform/pants/black
display_name = "pants, black"
path = /obj/item/clothing/under/pants/black
/datum/gear/uniform/pants/tan
display_name = "pants, tan"
path = /obj/item/clothing/under/pants/tan
/datum/gear/uniform/pants/track
display_name = "pants, track"
path = /obj/item/clothing/under/pants/track
/datum/gear/uniform/pants/khaki
display_name = "pants, khaki"
path = /obj/item/clothing/under/pants/khaki
/datum/gear/uniform/pants/camo
display_name = "pants, camo"
path = /obj/item/clothing/under/pants/camo
/datum/gear/uniform/pants/jeans
display_name = "pants, jeans"
path = /obj/item/clothing/under/pants/jeans
/datum/gear/uniform/pants/jeans/classic
display_name = "pants, classic jeans"
path = /obj/item/clothing/under/pants/classicjeans
/datum/gear/uniform/pants/jeans/mustang
display_name = "pants, mustang jeans"
path = /obj/item/clothing/under/pants/mustangjeans
/datum/gear/uniform/pants/jeans/black
display_name = "pants, black jeans"
path = /obj/item/clothing/under/pants/blackjeans
/datum/gear/uniform/pants/jeans/youngfolks
display_name = "pants, young folks jeans"
path = /obj/item/clothing/under/pants/youngfolksjeans
/datum/gear/uniform/jeans
display_name = "shorts, jeans"
path = /obj/item/clothing/under/shorts/jeans
/datum/gear/uniform/jeans/classic
display_name = "shorts, classic jeans"
path = /obj/item/clothing/under/shorts/jeans/classic
/datum/gear/uniform/jeans/mustang
display_name = "shorts, mustang jeans"
path = /obj/item/clothing/under/shorts/jeans/mustang
/datum/gear/uniform/jeans/youngfolks
display_name = "shorts, young folks jeans"
path = /obj/item/clothing/under/shorts/jeans/youngfolks
/datum/gear/uniform/jeans/black
display_name = "shorts, black jeans"
path = /obj/item/clothing/under/shorts/jeans/black
/datum/gear/uniform/jeans/female
display_name = "shorts, female, jeans"
path = /obj/item/clothing/under/shorts/jeans/female
/datum/gear/uniform/jeans/classic/female
display_name = "shorts, female, classic jeans"
path = /obj/item/clothing/under/shorts/jeans/classic/female
/datum/gear/uniform/jeans/mustang/female
display_name = "shorts, female, mustang jeans"
path = /obj/item/clothing/under/shorts/jeans/mustang/female
/datum/gear/uniform/jeans/youngfolks/female
display_name = "shorts, female, young folks jeans"
path = /obj/item/clothing/under/shorts/jeans/youngfolks/female
/datum/gear/uniform/jeans/black/female
display_name = "shorts, female, black jeans"
path = /obj/item/clothing/under/shorts/jeans/black/female
/datum/gear/uniform/khaki
display_name = "shorts, khaki"
path = /obj/item/clothing/under/shorts/khaki
/datum/gear/uniform/khaki/female
display_name = "shorts, female, khaki"
path = /obj/item/clothing/under/shorts/khaki/female
/datum/gear/uniform/suit //amish
display_name = "suit, amish"
path = /obj/item/clothing/under/sl_suit
@@ -383,7 +253,7 @@
/datum/gear/uniform/scrubs
display_name = "scrubs, black"
path = /obj/item/clothing/under/rank/medical/black
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Roboticist")
/datum/gear/uniform/scrubs/blue
display_name = "scrubs, blue"
@@ -397,6 +267,10 @@
display_name = "scrubs, green"
path = /obj/item/clothing/under/rank/medical/green
/datum/gear/uniform/scrubs/navyblue
display_name = "scrubs, navy blue"
path = /obj/item/clothing/under/rank/medical/navyblue
/datum/gear/uniform/sundress
display_name = "sundress"
path = /obj/item/clothing/under/sundress
@@ -424,6 +298,16 @@
path = /obj/item/clothing/under/rank/security/corp
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/uniform/corpwarsuit
display_name = "uniform, corporate (Warden)"
path = /obj/item/clothing/under/rank/warden/corp
allowed_roles = list("Head of Security","Warden")
/datum/gear/uniform/corphossuit
display_name = "uniform, corporate (Head of Security)"
path = /obj/item/clothing/under/rank/head_of_security/corp
allowed_roles = list("Head of Security")
/datum/gear/uniform/uniform_hop
display_name = "uniform, HoP's dress"
path = /obj/item/clothing/under/dress/dress_hop
@@ -436,6 +320,48 @@
allowed_roles = list("Head of Personnel")
/datum/gear/uniform/navysecsuit
display_name = "uniform, navyblue (Security)"
display_name = "uniform, navy blue (Security)"
path = /obj/item/clothing/under/rank/security/navyblue
allowed_roles = list("Security Officer","Head of Security","Warden")
allowed_roles = list("Security Officer","Head of Security","Warden")
/datum/gear/uniform/navywarsuit
display_name = "uniform, navy blue (Wardem)"
path = /obj/item/clothing/under/rank/warden/navyblue
allowed_roles = list("Head of Security","Warden")
/datum/gear/uniform/navyhossuit
display_name = "uniform, navy blue (Head of Security)"
path = /obj/item/clothing/under/rank/head_of_security/navyblue
allowed_roles = list("Head of Security")
/datum/gear/uniform/shortplaindress
display_name = "plain dress"
path = /obj/item/clothing/under/dress/white3
/datum/gear/uniform/shortplaindress/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/uniform/longdress
display_name = "long dress"
path = /obj/item/clothing/under/dress/white2
/datum/gear/uniform/longdress/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/uniform/longwidedress
display_name = "long wide dress"
path = /obj/item/clothing/under/dress/white4
/datum/gear/uniform/longwidedress/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/uniform/reddress
display_name = "red dress with belt"
path = /obj/item/clothing/under/dress/darkred
/datum/gear/uniform/whitewedding
display_name= "white wedding dress"
path = /obj/item/clothing/under/dress/white
@@ -12,79 +12,105 @@
whitelisted = "Unathi"
sort_category = "Xenowear"
/datum/gear/ears/skrell
display_name = "headtail-wear, female, chain (Skrell)"
/datum/gear/ears/skrell/chains //Chains
display_name = "headtail chain selection (Skrell)"
path = /obj/item/clothing/ears/skrell/chain
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/plate
display_name = "headtail-wear, male, bands (Skrell)"
/datum/gear/ears/skrell/chains/New()
..()
var/list/chaintypes = list()
for(var/chain_style in typesof(/obj/item/clothing/ears/skrell/chain))
var/obj/item/clothing/ears/skrell/chain/chain = chain_style
chaintypes[initial(chain.name)] = chain
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(chaintypes))
/datum/gear/ears/skrell/bands
display_name = "headtail band selection (Skrell)"
path = /obj/item/clothing/ears/skrell/band
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth //male/red
display_name = "headtail-wear, male, red, cloth (Skrell)"
/datum/gear/ears/skrell/bands/New()
..()
var/list/bandtypes = list()
for(var/band_style in typesof(/obj/item/clothing/ears/skrell/band))
var/obj/item/clothing/ears/skrell/band/band = band_style
bandtypes[initial(band.name)] = band
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes))
/datum/gear/ears/skrell/cloth/male
display_name = "male headtail cloth selection (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth/male //black
display_name = "headtail-wear, male, black, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/black
/datum/gear/ears/skrell/cloth/male/blue
display_name = "headtail-wear, male, blue, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/blue
/datum/gear/ears/skrell/cloth/male/green
display_name = "headtail-wear, male, green, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/green
/datum/gear/ears/skrell/cloth/male/pink
display_name = "headtail-wear, male, pink, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_male/pink
/datum/gear/ears/skrell/cloth/male/New()
..()
var/list/clothtypes = list()
for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_male))
var/obj/item/clothing/ears/skrell/cloth_male/cloth = cloth_style
clothtypes[initial(cloth.name)] = cloth
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes))
/datum/gear/ears/skrell/cloth/female
display_name = "headtail-wear, female, red, cloth (Skrell)"
display_name = "female headtail cloth selection (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/cloth/female/black
display_name = "headtail-wear, female, black, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/black
/datum/gear/ears/skrell/cloth/female/New()
..()
var/list/clothtypes = list()
for(var/cloth_style in typesof(/obj/item/clothing/ears/skrell/cloth_female))
var/obj/item/clothing/ears/skrell/cloth_female/cloth = cloth_style
clothtypes[initial(cloth.name)] = cloth
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(clothtypes))
/datum/gear/ears/skrell/cloth/female/blue
display_name = "headtail-wear, female, blue, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/blue
/datum/gear/ears/skrell/colored/band
display_name = "Colored bands (Skrell)"
path = /obj/item/clothing/ears/skrell/colored/band
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/colored/band/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/ears/skrell/colored/chain
display_name = "Colored chain (Skrell)"
path = /obj/item/clothing/ears/skrell/colored/chain
sort_category = "Xenowear"
whitelisted = "Skrell"
/datum/gear/ears/skrell/colored/chain/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/ears/skrell/cloth/female/green
display_name = "headtail-wear, female, green, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/green
/datum/gear/ears/skrell/cloth/female/pink
display_name = "headtail-wear, female, pink, cloth (Skrell)"
path = /obj/item/clothing/ears/skrell/cloth_female/pink
/datum/gear/uniform/jumpsuit/teshari
/datum/gear/uniform/teshari
display_name = "smock, grey (Teshari)"
path = /obj/item/clothing/under/seromi
whitelisted = "Teshari"
sort_category = "Xenowear"
/datum/gear/uniform/jumpsuit/teshari/yellow
/datum/gear/uniform/teshari/jumpsuit
display_name = "smock, yellow (Teshari)"
path = /obj/item/clothing/under/seromi/yellow
/datum/gear/uniform/jumpsuit/teshari/red
/datum/gear/uniform/teshari/jumpsuit/red
display_name = "smock, red (Teshari)"
path = /obj/item/clothing/under/seromi/red
/datum/gear/uniform/jumpsuit/teshari/white
/datum/gear/uniform/teshari/jumpsuit/white
display_name = "smock, white (Teshari)"
path = /obj/item/clothing/under/seromi/white
/datum/gear/uniform/jumpsuit/teshari/medical
/datum/gear/uniform/teshari/jumpsuit/medical
display_name = "smock, Medical (Teshari)"
path = /obj/item/clothing/under/seromi/medical
/datum/gear/uniform/jumpsuit/teshari/rainbow
/datum/gear/uniform/teshari/jumpsuit/rainbow
display_name = "smock, rainbow (Teshari)"
path = /obj/item/clothing/under/seromi/rainbow
@@ -44,7 +44,7 @@
pref.job_engsec_high = sanitize_integer(pref.job_engsec_high, 0, 65535, initial(pref.job_engsec_high))
pref.job_engsec_med = sanitize_integer(pref.job_engsec_med, 0, 65535, initial(pref.job_engsec_med))
pref.job_engsec_low = sanitize_integer(pref.job_engsec_low, 0, 65535, initial(pref.job_engsec_low))
if(!pref.player_alt_titles) pref.player_alt_titles = new()
if(!(pref.player_alt_titles)) pref.player_alt_titles = new()
if(!job_master)
return
@@ -58,9 +58,10 @@
if(!job_master)
return
. = list()
. += "<tt><center>"
. += "<b>Choose occupation chances</b><br>Unavailable occupations are crossed out.<br>"
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more colomns.
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more columns.
. += "<table width='100%' cellpadding='1' cellspacing='0'>"
var/index = -1
@@ -93,7 +94,7 @@
. += "<del>[rank]</del></td><td> \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]</td></tr>"
continue
if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant"))
. += "<font color=orange>[rank]</font></td><td></td></tr>"
. += "<font color=grey>[rank]</font></td><td></td></tr>"
continue
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
. += "<b>[rank]</b>"
@@ -106,40 +107,39 @@
if(rank == "Assistant")//Assistant is special
if(pref.job_civilian_low & ASSISTANT)
. += " <font color=green>\[Yes]</font>"
. += " <font color=55cc55>\[Yes]</font>"
else
. += " <font color=red>\[No]</font>"
. += " <font color=black>\[No]</font>"
if(job.alt_titles) //Blatantly cloned from a few lines down.
. += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'>&nbsp</td><td><a href='?src=\ref[src];select_alt_title=\ref[job]'>\[[pref.GetPlayerAltTitle(job)]\]</a></td></tr>"
. += "</a></td></tr>"
continue
if(pref.GetJobDepartment(job, 1) & job.flag)
. += " <font color=blue>\[High]</font>"
. += " <font color=55cc55>\[High]</font>"
else if(pref.GetJobDepartment(job, 2) & job.flag)
. += " <font color=green>\[Medium]</font>"
. += " <font color=eecc22>\[Medium]</font>"
else if(pref.GetJobDepartment(job, 3) & job.flag)
. += " <font color=orange>\[Low]</font>"
. += " <font color=cc5555>\[Low]</font>"
else
. += " <font color=red>\[NEVER]</font>"
. += " <font color=black>\[NEVER]</font>"
if(job.alt_titles)
. += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'>&nbsp</td><td><a href='?src=\ref[src];select_alt_title=\ref[job]'>\[[pref.GetPlayerAltTitle(job)]\]</a></td></tr>"
. += "</a></td></tr>"
. += "</td'></tr></table>"
. += "</center></table>"
. += "</center></table><center>"
switch(pref.alternate_option)
if(GET_RANDOM_JOB)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=green>Get random job if preferences unavailable</font></a></u></center><br>"
. += "<u><a href='?src=\ref[src];job_alternative=1'>Get random job if preferences unavailable</a></u>"
if(BE_ASSISTANT)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>"
. += "<u><a href='?src=\ref[src];job_alternative=1'>Be assistant if preference unavailable</a></u>"
if(RETURN_TO_LOBBY)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=purple>Return to lobby if preference unavailable</font></a></u></center><br>"
. += "<u><a href='?src=\ref[src];job_alternative=1'>Return to lobby if preference unavailable</a></u>"
. += "<center><a href='?src=\ref[src];reset_jobs=1'>\[Reset\]</a></center>"
. += "<a href='?src=\ref[src];reset_jobs=1'>\[Reset\]</a></center>"
. += "</tt>"
. = jointext(.,null)
/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user)
if(href_list["reset_jobs"])
@@ -160,10 +160,10 @@
var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null
if(choice && CanUseTopic(user))
SetPlayerAltTitle(job, choice)
return TOPIC_REFRESH
return (pref.dress_mob ? TOPIC_REFRESH_UPDATE_PREVIEW : TOPIC_REFRESH)
else if(href_list["set_job"])
if(SetJob(user, href_list["set_job"])) return TOPIC_REFRESH
if(SetJob(user, href_list["set_job"])) return (pref.dress_mob ? TOPIC_REFRESH_UPDATE_PREVIEW : TOPIC_REFRESH)
return ..()
@@ -1,7 +1,8 @@
// These are not flags, binary operations not intended
#define TOPIC_NOACTION 0
#define TOPIC_HANDLED 1
#define TOPIC_REFRESH 2
#define TOPIC_UPDATE_PREVIEW 4
#define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_REFRESH|TOPIC_UPDATE_PREVIEW)
/datum/category_group/player_setup_category/general_preferences
name = "General"
@@ -71,6 +72,10 @@
for(var/datum/category_group/player_setup_category/PS in categories)
PS.save_preferences(S)
/datum/category_collection/player_setup_collection/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.copy_to_mob(C)
/datum/category_collection/player_setup_collection/proc/header()
var/dat = ""
for(var/datum/category_group/player_setup_category/PS in categories)
@@ -142,6 +147,10 @@
for(var/datum/category_item/player_setup_item/PI in items)
PI.save_preferences(S)
/datum/category_group/player_setup_category/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_item/player_setup_item/PI in items)
PI.copy_to_mob(C)
/datum/category_group/player_setup_category/proc/content(var/mob/user)
. = "<table style='width:100%'><tr style='vertical-align:top'><td style='width:50%'>"
var/current = 0
@@ -200,6 +209,12 @@
/datum/category_item/player_setup_item/proc/save_preferences(var/savefile/S)
return
/*
* Called when the item is asked to apply its per character settings to a new mob.
*/
/datum/category_item/player_setup_item/proc/copy_to_mob(var/mob/living/carbon/human/C)
return
/datum/category_item/player_setup_item/proc/content()
return
@@ -212,13 +227,15 @@
/datum/category_item/player_setup_item/Topic(var/href,var/list/href_list)
if(..())
return 1
var/mob/user = usr
if(!user.client)
var/mob/pref_mob = preference_mob()
if(!pref_mob || !pref_mob.client)
return 1
. = OnTopic(href, href_list, user)
if(. == TOPIC_REFRESH)
user.client.prefs.ShowChoices(user)
. = OnTopic(href, href_list, usr)
if(. & TOPIC_UPDATE_PREVIEW)
pref_mob.client.prefs.preview_icon = null
if(. & TOPIC_REFRESH)
pref_mob.client.prefs.ShowChoices(usr)
/datum/category_item/player_setup_item/CanUseTopic(var/mob/user)
return 1
@@ -227,5 +244,11 @@
return TOPIC_NOACTION
/datum/category_item/player_setup_item/proc/preference_mob()
if(pref && pref.client && pref.client.mob)
if(!pref.client)
for(var/client/C)
if(C.ckey == pref.client_ckey)
pref.client = C
break
if(pref.client)
return pref.client.mob
@@ -18,7 +18,13 @@
if(!pref.skills.len) pref.ZeroSkills()
if(pref.used_skillpoints < 0) pref.used_skillpoints = 0
// Moved from /datum/preferences/proc/copy_to()
/datum/category_item/player_setup_item/skills/copy_to_mob(var/mob/living/carbon/human/character)
character.skills = pref.skills
character.used_skillpoints = pref.used_skillpoints
/datum/category_item/player_setup_item/skills/content()
. = list()
. += "<b>Select your Skills</b><br>"
. += "Current skill level: <b>[pref.GetSkillClass(pref.used_skillpoints)]</b> ([pref.used_skillpoints])<br>"
. += "<a href='?src=\ref[src];preconfigured=1'>Use preconfigured skillset</a><br>"
@@ -30,16 +36,22 @@
var/level = pref.skills[S.ID]
. += "<tr style='text-align:left;'>"
. += "<th><a href='?src=\ref[src];skillinfo=\ref[S]'>[S.name]</a></th>"
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_NONE]'><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Untrained\]</font></a></th>"
. += skill_to_button(S, "Untrained", level, SKILL_NONE)
// secondary skills don't have an amateur level
if(S.secondary)
. += "<th></th>"
else
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_BASIC]'><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Amateur\]</font></a></th>"
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_ADEPT]'><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Trained\]</font></a></th>"
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_EXPERT]'><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Professional\]</font></a></th>"
. += skill_to_button(S, "Amateur", level, SKILL_BASIC)
. += skill_to_button(S, "Trained", level, SKILL_ADEPT)
. += skill_to_button(S, "Professional", level, SKILL_EXPERT)
. += "</tr>"
. += "</table>"
. = jointext(.,null)
/datum/category_item/player_setup_item/proc/skill_to_button(var/skill, var/level_name, var/current_level, var/selection_level)
if(current_level == selection_level)
return "<th><span class='linkOn'>[level_name]</span></th>"
return "<th><a href='?src=\ref[src];setskill=\ref[skill];newvalue=[selection_level]'>[level_name]</a></th>"
/datum/category_item/player_setup_item/skills/OnTopic(href, href_list, user)
if(href_list["skillinfo"])
@@ -57,7 +69,7 @@
else if(href_list["preconfigured"])
var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE
if(!selected && !CanUseTopic(user)) return
if(!selected || !CanUseTopic(user)) return
pref.ZeroSkills(1)
for(var/V in SKILL_PRE[selected])
+40 -116
View File
@@ -19,21 +19,15 @@ datum/preferences
var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color
var/be_special = 0 //Special role selection
var/UI_style = "Midnight"
var/toggles = TOGGLES_DEFAULT
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
//character preferences
var/real_name //our character's name
var/be_random_name = 0 //whether we are a random name every round
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
var/b_type = "A+" //blood type (not-chooseable)
var/underwear_top
var/underwear_bottom
var/undershirt //undershirt type
var/socks //socks type
var/backbag = 2 //backpack type
var/pdachoice = 1 //PDA type
var/h_style = "Bald" //Hair type
@@ -65,8 +59,6 @@ datum/preferences
//Mob preview
var/icon/preview_icon = null
var/icon/preview_icon_front = null
var/icon/preview_icon_side = null
//Jobs, uses bitflags
var/job_civilian_high = 0
@@ -109,24 +101,28 @@ datum/preferences
// OOC Metadata:
var/metadata = ""
var/list/ignored_players = list()
var/client/client = null
var/client_ckey = null
// Communicator identity data
var/communicator_visibility = 0
var/client/client = null
var/datum/category_collection/player_setup_collection/player_setup
var/datum/browser/panel
/datum/preferences/New(client/C)
player_setup = new(src)
gender = pick(MALE, FEMALE)
real_name = random_name(gender,species)
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
set_biological_gender(pick(MALE, FEMALE))
real_name = random_name(identifying_gender,species)
b_type = RANDOM_BLOOD_TYPE
gear = list()
if(istype(C))
client = C
client_ckey = C.ckey
if(!IsGuestKey(C.key))
load_path(C.ckey)
if(load_preferences())
@@ -187,6 +183,12 @@ datum/preferences
/datum/preferences/proc/ShowChoices(mob/user)
if(!user || !user.client) return
if(!get_mob_by_key(client_ckey))
user << "<span class='danger'>No mob exists for the given client!</span>"
close_load_dialog(user)
return
var/dat = "<html><body><center>"
if(path)
@@ -204,7 +206,10 @@ datum/preferences
dat += player_setup.content(user)
dat += "</html></body>"
user << browse(dat, "window=preferences;size=625x736")
//user << browse(dat, "window=preferences;size=635x736")
var/datum/browser/popup = new(user, "Character Setup","Character Setup", 800, 800, src)
popup.set_content(dat)
popup.open()
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(!user) return
@@ -243,111 +248,26 @@ datum/preferences
ShowChoices(usr)
return 1
/datum/preferences/proc/copy_to(mob/living/carbon/human/character, safety = 0)
/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1)
// Sanitizing rather than saving as someone might still be editing when copy_to occurs.
player_setup.sanitize_setup()
// This needs to happen before anything else becuase it sets some variables.
character.set_species(species)
// Special Case: This references variables owned by two different datums, so do it here.
if(be_random_name)
real_name = random_name(gender,species)
real_name = random_name(identifying_gender,species)
if(config.humans_need_surnames)
var/firstspace = findtext(real_name, " ")
var/name_length = length(real_name)
if(!firstspace) //we need a surname
real_name += " [pick(last_names)]"
else if(firstspace == name_length)
real_name += "[pick(last_names)]"
// Ask the preferences datums to apply their own settings to the new mob
player_setup.copy_to_mob(character)
character.real_name = real_name
character.name = character.real_name
if(character.dna)
character.dna.real_name = character.real_name
character.flavor_texts["general"] = flavor_texts["general"]
character.flavor_texts["head"] = flavor_texts["head"]
character.flavor_texts["face"] = flavor_texts["face"]
character.flavor_texts["eyes"] = flavor_texts["eyes"]
character.flavor_texts["torso"] = flavor_texts["torso"]
character.flavor_texts["arms"] = flavor_texts["arms"]
character.flavor_texts["hands"] = flavor_texts["hands"]
character.flavor_texts["legs"] = flavor_texts["legs"]
character.flavor_texts["feet"] = flavor_texts["feet"]
character.med_record = med_record
character.sec_record = sec_record
character.gen_record = gen_record
character.exploit_record = exploit_record
character.gender = gender
character.age = age
character.b_type = b_type
character.r_eyes = r_eyes
character.g_eyes = g_eyes
character.b_eyes = b_eyes
character.r_hair = r_hair
character.g_hair = g_hair
character.b_hair = b_hair
character.r_facial = r_facial
character.g_facial = g_facial
character.b_facial = b_facial
character.r_skin = r_skin
character.g_skin = g_skin
character.b_skin = b_skin
character.s_tone = s_tone
character.h_style = h_style
character.f_style = f_style
character.home_system = home_system
character.citizenship = citizenship
character.personal_faction = faction
character.religion = religion
character.skills = skills
character.used_skillpoints = used_skillpoints
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
var/status = organ_data[name]
var/obj/item/organ/external/O = character.organs_by_name[name]
if(O)
if(status == "amputated")
O.remove_rejuv()
else if(status == "cyborg")
if(rlimb_data[name])
O.robotize(rlimb_data[name])
else
O.robotize()
for(var/name in list(O_HEART,O_EYES,O_BRAIN))
var/status = organ_data[name]
if(!status)
continue
var/obj/item/organ/I = character.internal_organs_by_name[name]
if(I)
if(status == "assisted")
I.mechassist()
else if(status == "mechanical")
I.robotize()
character.underwear_bottom = underwear_bottom
character.underwear_top = underwear_top
character.undershirt = undershirt
character.socks = socks
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
if(pdachoice > 3 || pdachoice < 1)
pdachoice = 1
character.pdachoice = pdachoice
character.update_body()
if(icon_updates)
character.force_update_limbs()
character.update_mutations(0)
character.update_body(0)
character.update_underwear(0)
character.update_hair(0)
character.update_icons()
/datum/preferences/proc/open_load_dialog(mob/user)
var/dat = "<body>"
@@ -367,7 +287,11 @@ datum/preferences
dat += "<hr>"
dat += "</center></tt>"
user << browse(dat, "window=saves;size=300x390")
//user << browse(dat, "window=saves;size=300x390")
panel = new(user, "Character Slots", "Character Slots", 300, 390, src)
panel.set_content(dat)
panel.open()
/datum/preferences/proc/close_load_dialog(mob/user)
user << browse(null, "window=saves")
//user << browse(null, "window=saves")
panel.close()
+1 -1
View File
@@ -22,7 +22,7 @@ var/global/list/citizenship_choices = list(
var/global/list/home_system_choices = list(
"Sol",
"Vir",
starsys_name,
"Nyx",
"Tau Ceti",
"Epsilon Ursae Minoris",
@@ -0,0 +1,225 @@
//Toggles for preferences, normal clients
/client/verb/toggle_ghost_ears()
set name = "Show/Hide Ghost Ears"
set category = "Preferences"
set desc = "Toggles between seeing all mob speech and nearby mob speech."
var/pref_path = /datum/client_preference/ghost_ears
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear all mob speech as a ghost."
prefs.save_preferences()
feedback_add_details("admin_verb","TGEars") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ghost_vision()
set name = "Show/Hide Ghost Vision"
set category = "Preferences"
set desc = "Toggles between seeing all mob emotes and nearby mob emotes."
var/pref_path = /datum/client_preference/ghost_sight
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] see all emotes as a ghost."
prefs.save_preferences()
feedback_add_details("admin_verb","TGVision") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ghost_radio()
set name = "Show/Hide Radio Chatter"
set category = "Preferences"
set desc = "Toggles between seeing all radio chat and nearby radio chatter."
var/pref_path = /datum/client_preference/ghost_radio
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear all radios as a ghost."
prefs.save_preferences()
feedback_add_details("admin_verb","TGRadio") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_deadchat()
set name = "Show/Hide Deadchat"
set category = "Preferences"
set desc = "Toggles the dead chat channel."
var/pref_path = /datum/client_preference/show_dsay
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear dead chat as a ghost."
prefs.save_preferences()
feedback_add_details("admin_verb","TDeadChat") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ooc()
set name = "Show/Hide OOC"
set category = "Preferences"
set desc = "Toggles global out of character chat."
var/pref_path = /datum/client_preference/show_ooc
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(/datum/client_preference/show_ooc)) ? "now" : "no longer"] hear global out of character chat."
prefs.save_preferences()
feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_looc()
set name = "Show/Hide LOOC"
set category = "Preferences"
set desc = "Toggles local out of character chat."
var/pref_path = /datum/client_preference/show_looc
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear local out of character chat."
prefs.save_preferences()
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_typing()
set name = "Show/Hide Typing Indicator"
set category = "Preferences"
set desc = "Toggles the speech bubble typing indicator."
var/pref_path = /datum/client_preference/show_typing_indicator
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] see the speech indicator."
prefs.save_preferences()
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ahelp_sound()
set name = "Toggle Admin Help Sound"
set category = "Preferences"
set desc = "Toggles the ability to hear a noise broadcasted when you get an admin message."
var/pref_path = /datum/client_preference/holder/play_adminhelp_ping
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive noise from admin messages."
prefs.save_preferences()
feedback_add_details("admin_verb","TAHelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_lobby_music()
set name = "Toggle Lobby Music"
set category = "Preferences"
set desc = "Toggles the music in the lobby."
var/pref_path = /datum/client_preference/play_lobby_music
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear music in the lobby."
prefs.save_preferences()
feedback_add_details("admin_verb","TLobMusic") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_admin_midis()
set name = "Toggle Admin MIDIs"
set category = "Preferences"
set desc = "Toggles the music in the lobby."
var/pref_path = /datum/client_preference/play_admin_midis
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear MIDIs from admins."
prefs.save_preferences()
feedback_add_details("admin_verb","TAMidis") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ambience()
set name = "Toggle Ambience"
set category = "Preferences"
set desc = "Toggles the playing of ambience."
var/pref_path = /datum/client_preference/play_ambiance
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : " no longer"] hear ambient noise."
prefs.save_preferences()
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_be_special(role in be_special_flags)
set name = "Toggle SpecialRole Candidacy"
set category = "Preferences"
set desc = "Toggles which special roles you would like to be a candidate for, during events."
var/role_flag = be_special_flags[role]
if(!role_flag) return
prefs.be_special ^= role_flag
prefs.save_preferences()
src << "You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible)."
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_safe_firing()
set name = "Toggle Gun Firing Intent Requirement"
set category = "Preferences"
set desc = "Toggles between safe and dangerous firing. Safe requires a non-help intent to fire, dangerous can be fired on help intent."
var/pref_path = /datum/client_preference/safefiring
toggle_preference(pref_path)
prefs.save_preferences()
src << "You will now use [(is_preference_enabled(/datum/client_preference/safefiring)) ? "safe" : "dangerous"] firearms firing."
feedback_add_details("admin_verb","TFiringMode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//Toggles for Staff
//Developers
/client/proc/toggle_debug_logs()
set name = "Toggle Debug Logs"
set category = "Preferences"
set desc = "Toggles debug logs."
var/pref_path = /datum/client_preference/debug/show_debug_logs
if(check_rights(R_ADMIN|R_DEBUG))
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive debug logs."
prefs.save_preferences()
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//Mods
/client/proc/toggle_attack_logs()
set name = "Toggle Attack Logs"
set category = "Preferences"
set desc = "Toggles attack logs."
var/pref_path = /datum/client_preference/mod/show_attack_logs
if(check_rights(R_ADMIN|R_MOD))
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] receive attack logs."
prefs.save_preferences()
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-159
View File
@@ -1,159 +0,0 @@
//toggles
/client/verb/toggle_ghost_ears()
set name = "Show/Hide GhostEars"
set category = "Preferences"
set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs"
prefs.toggles ^= CHAT_GHOSTEARS
src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"]."
prefs.save_preferences()
feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ghost_sight()
set name = "Show/Hide GhostSight"
set category = "Preferences"
set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs"
prefs.toggles ^= CHAT_GHOSTSIGHT
src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"]."
prefs.save_preferences()
feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_ghost_radio()
set name = "Enable/Disable GhostRadio"
set category = "Preferences"
set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers"
prefs.toggles ^= CHAT_GHOSTRADIO
src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"]."
prefs.save_preferences()
feedback_add_details("admin_verb","TGR")
/client/proc/toggle_hear_radio()
set name = "Show/Hide RadioChatter"
set category = "Preferences"
set desc = "Toggle seeing radiochatter from radios and speakers"
if(!holder) return
prefs.toggles ^= CHAT_RADIO
prefs.save_preferences()
usr << "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers"
feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggleadminhelpsound()
set name = "Hear/Silence Adminhelps"
set category = "Preferences"
set desc = "Toggle hearing a notification when admin PMs are recieved"
if(!holder) return
prefs.toggles ^= SOUND_ADMINHELP
prefs.save_preferences()
usr << "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive."
feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/deadchat() // Deadchat toggle is usable by anyone.
set name = "Show/Hide Deadchat"
set category = "Preferences"
set desc ="Toggles seeing deadchat"
prefs.toggles ^= CHAT_DEAD
prefs.save_preferences()
if(src.holder)
src << "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat."
else
src << "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat."
feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggleprayers()
set name = "Show/Hide Prayers"
set category = "Preferences"
set desc = "Toggles seeing prayers"
prefs.toggles ^= CHAT_PRAYER
prefs.save_preferences()
src << "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat."
feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggletitlemusic()
set name = "Hear/Silence LobbyMusic"
set category = "Preferences"
set desc = "Toggles hearing the GameLobby music"
prefs.toggles ^= SOUND_LOBBY
prefs.save_preferences()
if(prefs.toggles & SOUND_LOBBY)
src << "You will now hear music in the game lobby."
if(istype(mob, /mob/new_player))
playtitlemusic()
else
src << "You will no longer hear music in the game lobby."
if(istype(mob, /mob/new_player))
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz
feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/togglemidis()
set name = "Hear/Silence Midis"
set category = "Preferences"
set desc = "Toggles hearing sounds uploaded by admins"
prefs.toggles ^= SOUND_MIDI
prefs.save_preferences()
if(prefs.toggles & SOUND_MIDI)
src << "You will now hear any sounds uploaded by admins."
var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
break_sound.priority = 250
src << break_sound //breaks the client's sound output on channel 777
else
src << "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled."
feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/listen_ooc()
set name = "Show/Hide OOC"
set category = "Preferences"
set desc = "Toggles seeing OutOfCharacter chat"
prefs.toggles ^= CHAT_OOC
prefs.save_preferences()
src << "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel."
feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/listen_looc()
set name = "Show/Hide LOOC"
set category = "Preferences"
set desc = "Toggles seeing Local OutOfCharacter chat"
prefs.toggles ^= CHAT_LOOC
prefs.save_preferences()
src << "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel."
feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_chattags()
set name = "Show/Hide Chat Tags"
set category = "Preferences"
set desc = "Toggles seeing chat tags/icons"
prefs.toggles ^= CHAT_NOICONS
prefs.save_preferences()
src << "You will [!(prefs.toggles & CHAT_NOICONS) ? "now" : "no longer"] see chat tag icons."
feedback_add_details("admin_verb","TCTAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
set name = "Hear/Silence Ambience"
set category = "Preferences"
set desc = "Toggles hearing ambient sound effects"
prefs.toggles ^= SOUND_AMBIENCE
prefs.save_preferences()
if(prefs.toggles & SOUND_AMBIENCE)
src << "You will now hear ambient sounds."
else
src << "You will no longer hear ambient sounds."
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//be special
/client/verb/toggle_be_special(role in be_special_flags)
set name = "Toggle SpecialRole Candidacy"
set category = "Preferences"
set desc = "Toggles which special roles you would like to be a candidate for, during events."
var/role_flag = be_special_flags[role]
if(!role_flag) return
prefs.be_special ^= role_flag
prefs.save_preferences()
src << "You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible)."
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+16 -3
View File
@@ -5,7 +5,17 @@
"Orange" = 'icons/mob/screen/orange.dmi',
"old" = 'icons/mob/screen/old.dmi',
"White" = 'icons/mob/screen/white.dmi',
"old-noborder" = 'icons/mob/screen/old-noborder.dmi'
"old-noborder" = 'icons/mob/screen/old-noborder.dmi',
"minimalist" = 'icons/mob/screen/minimalist.dmi'
)
/var/all_ui_styles_robot = list(
"Midnight" = 'icons/mob/screen1_robot.dmi',
"Orange" = 'icons/mob/screen1_robot.dmi',
"old" = 'icons/mob/screen1_robot.dmi',
"White" = 'icons/mob/screen1_robot.dmi',
"old-noborder" = 'icons/mob/screen1_robot.dmi',
"minimalist" = 'icons/mob/screen1_robot_minimalist.dmi'
)
/proc/ui_style2icon(ui_style)
@@ -20,8 +30,9 @@
set desc = "Configure your user interface"
if(!ishuman(usr))
usr << "<span class='warning'>You must be human to use this verb.</span>"
return
if(!isrobot(usr))
usr << "<span class='warning'>You must be a human or a robot to use this verb.</span>"
return
var/UI_style_new = input(usr, "Select a style. White is recommended for customization") as null|anything in all_ui_styles
if(!UI_style_new) return
@@ -41,6 +52,8 @@
icons.Add(usr.radio_use_icon)
var/icon/ic = all_ui_styles[UI_style_new]
if(isrobot(usr))
ic = all_ui_styles_robot[UI_style_new]
for(var/obj/screen/I in icons)
if(I.name in list(I_HELP, I_HURT, I_DISARM, I_GRAB)) continue
+40 -123
View File
@@ -4,6 +4,11 @@
var/list/species_restricted = null //Only these species can wear this kit.
var/gunshot_residue //Used by forensics.
var/list/accessories = list()
var/list/valid_accessory_slots
var/list/restricted_accessory_slots
var/list/starting_accessories
/*
Sprites used when the clothing item is refit. This is done by setting icon_override.
For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary.
@@ -22,6 +27,13 @@
..()
gunshot_residue = null
/obj/item/clothing/New()
..()
if(starting_accessories)
for(var/T in starting_accessories)
var/obj/item/clothing/accessory/tie = new T(src)
src.attach_accessory(null, tie)
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
@@ -204,7 +216,7 @@
body_parts_covered = HANDS
slot_flags = SLOT_GLOVES
attack_verb = list("challenged")
species_restricted = list("exclude","Unathi","Tajara")
species_restricted = null
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/gloves.dmi',
)
@@ -226,7 +238,7 @@
/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity)
return 0 // return 1 to cancel attack_hand()
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user)
/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
if (clipped)
user << "<span class='notice'>The [src] have already been clipped!</span>"
@@ -243,7 +255,7 @@
species_restricted -= "Unathi"
species_restricted -= "Tajara"
return
*/
///////////////////////////////////////////////////////////////////////
//Head
/obj/item/clothing/head
@@ -337,11 +349,11 @@
overlays |= light_overlay_cache["[light_overlay]_icon"]
// Generate and cache the on-mob icon, which is used in update_inv_head().
var/cache_key = "[light_overlay][H ? "_[H.species.get_bodytype()]" : ""]"
var/cache_key = "[light_overlay][H ? "_[H.species.get_bodytype(H)]" : ""]"
if(!light_overlay_cache[cache_key])
var/use_icon = 'icons/mob/light_overlays.dmi'
if(H && sprite_sheets[H.species.get_bodytype()])
use_icon = sprite_sheets[H.species.get_bodytype()]
if(H && sprite_sheets[H.species.get_bodytype(H)])
use_icon = sprite_sheets[H.species.get_bodytype(H)]
light_overlay_cache[cache_key] = image("icon" = use_icon, "icon_state" = "[light_overlay]")
if(H)
@@ -394,7 +406,7 @@
slowdown = SHOES_SLOWDOWN
force = 2
var/overshoes = 0
species_restricted = list("exclude","Teshari", "Unathi","Tajara")
species_restricted = list("exclude","Teshari")
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/shoes.dmi',
)
@@ -501,7 +513,6 @@
2 = Report detailed damages
3 = Report location
*/
var/list/accessories = list()
var/displays_id = 1
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
@@ -512,6 +523,16 @@
//convenience var for defining the icon state for the overlay used when the clothing is worn.
//Also used by rolling/unrolling.
var/worn_state = null
valid_accessory_slots = list("utility","armband","decor")
restricted_accessory_slots = list("utility", "armband")
/obj/item/clothing/under/attack_hand(var/mob/user)
if(accessories && accessories.len)
..()
if ((ishuman(usr) || issmall(usr)) && src.loc == user)
return
..()
/obj/item/clothing/under/New()
..()
@@ -535,8 +556,8 @@
var/icon/under_icon
if(icon_override)
under_icon = icon_override
else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype()])
under_icon = sprite_sheets[H.species.get_bodytype()]
else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)])
under_icon = sprite_sheets[H.species.get_bodytype(H)]
else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = item_icons[slot_w_uniform_str]
else
@@ -558,8 +579,8 @@
var/icon/under_icon
if(icon_override)
under_icon = icon_override
else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype()])
under_icon = sprite_sheets[H.species.get_bodytype()]
else if(H && sprite_sheets && sprite_sheets[H.species.get_bodytype(H)])
under_icon = sprite_sheets[H.species.get_bodytype(H)]
else if(item_icons && item_icons[slot_w_uniform_str])
under_icon = item_icons[slot_w_uniform_str]
else
@@ -578,69 +599,6 @@
var/mob/M = src.loc
M.update_inv_w_uniform()
/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A)
if(istype(A))
.=1
else
return 0
if(accessories.len && (A.slot in list("utility","armband")))
for(var/obj/item/clothing/accessory/AC in accessories)
if (AC.slot == A.slot)
return 0
/obj/item/clothing/under/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/clothing/accessory))
var/obj/item/clothing/accessory/A = I
if(can_attach_accessory(A))
user.drop_item()
accessories += A
A.on_attached(src, user)
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
return
else
user << "<span class='notice'>You cannot attach more accessories of this type to [src].</span>"
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
A.attackby(I, user)
return
..()
/obj/item/clothing/under/attack_hand(mob/user as mob)
//only forward to the attached accessory if the clothing is equipped (not in a storage)
if(accessories.len && src.loc == user)
for(var/obj/item/clothing/accessory/A in accessories)
A.attack_hand(user)
return
if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself
return
..()
/obj/item/clothing/under/MouseDrop(obj/over_object as obj)
if (ishuman(usr) || issmall(usr))
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
if (!(src.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if (!usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.put_in_r_hand(src)
if("l_hand")
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/clothing/under/examine(mob/user)
..(user)
@@ -653,13 +611,10 @@
user << "Its vital tracker appears to be enabled."
if(3)
user << "Its vital tracker and tracking beacon appear to be enabled."
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
user << "\A [A] is attached to it."
/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
var/mob/M = usr
if (istype(M, /mob/dead/)) return
if (istype(M, /mob/observer)) return
if (usr.stat || usr.restrained()) return
if(has_sensor >= 2)
usr << "The controls are locked."
@@ -678,27 +633,16 @@
if (src.loc == usr)
switch(sensor_mode)
if(0)
usr << "You disable your suit's remote sensing equipment."
usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.")
if(1)
usr << "Your suit will now report whether you are live or dead."
usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.")
if(2)
usr << "Your suit will now report your vital lifesigns."
usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.")
if(3)
usr << "Your suit will now report your vital lifesigns as well as your coordinate position."
usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.")
else if (istype(src.loc, /mob))
switch(sensor_mode)
if(0)
for(var/mob/V in viewers(usr, 1))
V.show_message("\red [usr] disables [src.loc]'s remote sensing equipment.", 1)
if(1)
for(var/mob/V in viewers(usr, 1))
V.show_message("[usr] turns [src.loc]'s remote sensors to binary.", 1)
if(2)
for(var/mob/V in viewers(usr, 1))
V.show_message("[usr] sets [src.loc]'s sensors to track vitals.", 1)
if(3)
for(var/mob/V in viewers(usr, 1))
V.show_message("[usr] sets [src.loc]'s sensors to maximum.", 1)
usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.")
/obj/item/clothing/under/verb/toggle()
set name = "Toggle Suit Sensors"
@@ -759,34 +703,7 @@
usr << "<span class='notice'>You roll down your [src]'s sleeves.</span>"
update_clothing_icon()
/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
if(!(A in accessories))
return
A.on_removed(user)
accessories -= A
update_clothing_icon()
/obj/item/clothing/under/verb/removetie()
set name = "Remove Accessory"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
if(!accessories.len) return
var/obj/item/clothing/accessory/A
if(accessories.len > 1)
A = input("Select an accessory to remove from [src]") as null|anything in accessories
else
A = accessories[1]
src.remove_accessory(usr,A)
/obj/item/clothing/under/rank/New()
sensor_mode = pick(0,1,2,3)
..()
/obj/item/clothing/under/emp_act(severity)
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
A.emp_act(severity)
..()
@@ -0,0 +1,107 @@
/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots))
.=1
else
return 0
if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
for(var/obj/item/clothing/accessory/AC in accessories)
if (AC.slot == A.slot)
return 0
/obj/item/clothing/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/clothing/accessory))
if(!valid_accessory_slots || !valid_accessory_slots.len)
usr << "<span class='warning'>You cannot attach accessories of any kind to \the [src].</span>"
return
var/obj/item/clothing/accessory/A = I
if(can_attach_accessory(A))
user.drop_item()
attach_accessory(user, A)
return
else
user << "<span class='warning'>You cannot attach more accessories of this type to [src].</span>"
return
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
A.attackby(I, user)
return
..()
/obj/item/clothing/attack_hand(var/mob/user)
//only forward to the attached accessory if the clothing is equipped (not in a storage)
if(accessories.len && src.loc == user)
for(var/obj/item/clothing/accessory/A in accessories)
A.attack_hand(user)
return
return ..()
/obj/item/clothing/MouseDrop(var/obj/over_object)
if (ishuman(usr) || issmall(usr))
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
if (!(src.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
return
if (!usr.unEquip(src))
return
switch(over_object.name)
if("r_hand")
usr.put_in_r_hand(src)
if("l_hand")
usr.put_in_l_hand(src)
src.add_fingerprint(usr)
/obj/item/clothing/examine(var/mob/user)
..(user)
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
user << "\A [A] is attached to it."
/**
* Attach accessory A to src
*
* user is the user doing the attaching. Can be null, such as when attaching
* items on spawn
*/
/obj/item/clothing/proc/attach_accessory(mob/user, obj/item/clothing/accessory/A)
accessories += A
A.on_attached(src, user)
src.verbs |= /obj/item/clothing/proc/removetie_verb
update_clothing_icon()
/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
if(!(A in accessories))
return
A.on_removed(user)
accessories -= A
update_clothing_icon()
/obj/item/clothing/proc/removetie_verb()
set name = "Remove Accessory"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
if(!accessories.len) return
var/obj/item/clothing/accessory/A
if(accessories.len > 1)
A = input("Select an accessory to remove from [src]") as null|anything in accessories
else
A = accessories[1]
src.remove_accessory(usr,A)
if(!accessories.len)
src.verbs -= /obj/item/clothing/proc/removetie_verb
/obj/item/clothing/emp_act(severity)
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
A.emp_act(severity)
..()
+84 -22
View File
@@ -11,73 +11,135 @@
species_restricted = list("Skrell")
/obj/item/clothing/ears/skrell/chain
name = "skrell headtail chains"
name = "Gold headtail chains"
desc = "A delicate golden chain worn by female skrell to decorate their head tails."
icon_state = "skrell_chain"
item_state = "skrell_chain"
/obj/item/clothing/ears/skrell/chain/silver
name = "Silver headtail chains"
desc = "A delicate silver chain worn by female skrell to decorate their head tails."
icon_state = "skrell_chain_sil"
item_state = "skrell_chain_sil"
/obj/item/clothing/ears/skrell/chain/bluejewels
name = "Blue jeweled golden headtail chains"
desc = "A delicate golden chain adorned with blue jewels worn by female skrell to decorate their head tails."
icon_state = "skrell_chain_bjewel"
item_state = "skrell_chain_bjewel"
/obj/item/clothing/ears/skrell/chain/redjewels
name = "Red jeweled golden headtail chains"
desc = "A delicate golden chain adorned with red jewels worn by female skrell to decorate their head tails."
icon_state = "skrell_chain_rjewel"
item_state = "skrell_chain_rjewel"
/obj/item/clothing/ears/skrell/chain/ebony
name = "Ebony headtail chains"
desc = "A delicate ebony chain worn by female skrell to decorate their head tails."
icon_state = "skrell_chain_ebony"
item_state = "skrell_chain_ebony"
/obj/item/clothing/ears/skrell/band
name = "skrell headtail bands"
name = "Gold headtail bands"
desc = "Golden metallic bands worn by male skrell to adorn their head tails."
icon_state = "skrell_band"
item_state = "skrell_band"
/obj/item/clothing/ears/skrell/band/silver
name = "Silver headtail bands"
desc = "Silver metallic bands worn by male skrell to adorn their head tails."
icon_state = "skrell_band_sil"
item_state = "skrell_band_sil"
/obj/item/clothing/ears/skrell/band/bluejewels
name = "Blue jeweled golden headtail bands"
desc = "Golden metallic bands adorned with blue jewels worn by male skrell to adorn their head tails."
icon_state = "skrell_band_bjewel"
item_state = "skrell_band_bjewel"
/obj/item/clothing/ears/skrell/band/redjewels
name = "Red jeweled golden headtail bands"
desc = "Golden metallic bands adorned with red jewels worn by male skrell to adorn their head tails."
icon_state = "skrell_band_rjewel"
item_state = "skrell_band_rjewel"
/obj/item/clothing/ears/skrell/band/ebony
name = "Ebony headtail bands"
desc = "Ebony bands worn by male skrell to adorn their head tails."
icon_state = "skrell_band_ebony"
item_state = "skrell_band_ebony"
/obj/item/clothing/ears/skrell/colored/band
name = "Colored headtail bands"
desc = "Metallic bands worn by male skrell to adorn their head tails."
icon_state = "skrell_band_sil"
item_state = "skrell_band_sil"
/obj/item/clothing/ears/skrell/colored/chain
name = "Colored headtail chains"
desc = "A delicate chain worn by female skrell to decorate their head tails."
icon_state = "skrell_chain_sil"
item_state = "skrell_chain_sil"
/obj/item/clothing/ears/skrell/cloth_female
name = "skrell headtail cloth"
name = "red headtail cloth"
desc = "A cloth shawl worn by female skrell draped around their head tails."
icon_state = "skrell_cloth_female"
item_state = "skrell_cloth_female"
/obj/item/clothing/ears/skrell/cloth_female/black
name = "skrell headtail cloth"
desc = "A cloth shawl worn by female skrell draped around their head tails."
name = "black headtail cloth"
icon_state = "skrell_cloth_black_female"
item_state = "skrell_cloth_black_female"
/obj/item/clothing/ears/skrell/cloth_female/blue
name = "skrell headtail cloth"
desc = "A cloth shawl worn by female skrell draped around their head tails."
name = "blue headtail cloth"
icon_state = "skrell_cloth_blue_female"
item_state = "skrell_cloth_blue_female"
/obj/item/clothing/ears/skrell/cloth_female/green
name = "skrell headtail cloth"
desc = "A cloth shawl worn by female skrell draped around their head tails."
name = "green headtail cloth"
icon_state = "skrell_cloth_green_female"
item_state = "skrell_cloth_green_female"
/obj/item/clothing/ears/skrell/cloth_female/pink
name = "skrell headtail cloth"
desc = "A cloth shawl worn by female skrell draped around their head tails."
name = "pink headtail cloth"
icon_state = "skrell_cloth_pink_female"
item_state = "skrell_cloth_pink_female"
/obj/item/clothing/ears/skrell/cloth_female/lightblue
name = "light blue headtail cloth"
icon_state = "skrell_cloth_lblue_female"
item_state = "skrell_cloth_lblue_female"
/obj/item/clothing/ears/skrell/cloth_male
name = "skrell headtail cloth"
name = "red headtail cloth"
desc = "A cloth band worn by male skrell around their head tails."
icon_state = "skrell_cloth_male"
item_state = "skrell_cloth_male"
/obj/item/clothing/ears/skrell/cloth_male/black
name = "skrell headtail cloth"
desc = "A cloth band worn by male skrell around their head tails."
name = "black headtail cloth"
icon_state = "skrell_cloth_black_male"
item_state = "skrell_cloth_black_male"
/obj/item/clothing/ears/skrell/cloth_male/blue
name = "skrell headtail cloth"
desc = "A cloth band worn by male skrell around their head tails."
name = "blue headtail cloth"
icon_state = "skrell_cloth_blue_male"
item_state = "skrell_cloth_blue_male"
/obj/item/clothing/ears/skrell/cloth_male/green
name = "skrell headtail cloth"
desc = "A cloth band worn by male skrell around their head tails."
name = "green headtail cloth"
icon_state = "skrell_cloth_green_male"
item_state = "skrell_cloth_green_male"
/obj/item/clothing/ears/skrell/cloth_male/pink
name = "skrell headtail cloth"
desc = "A cloth band worn by male skrell around their head tails."
name = "pink headtail cloth"
icon_state = "skrell_cloth_pink_male"
item_state = "skrell_cloth_pink_male"
item_state = "skrell_cloth_pink_male"
/obj/item/clothing/ears/skrell/cloth_male/lightblue
name = "light blue headtail cloth"
icon_state = "skrell_cloth_lblue_male"
item_state = "skrell_cloth_lblue_male"
+5 -12
View File
@@ -25,21 +25,14 @@
flags_inv = HIDEEARS
siemens_coefficient = 0.7
action_button_name = "Toggle Visor"
var/flipped = 0 //Piggybacked from cap flipping.
/obj/item/clothing/head/helmet/riot/dropped()
src.icon_state = initial(icon_state)
src.flipped=0
..()
/obj/item/clothing/head/helmet/riot/attack_self(mob/user)
src.flipped = !src.flipped
if(src.flipped)
icon_state = "[icon_state]up"
user << "You flip the visor up."
/obj/item/clothing/head/helmet/riot/attack_self(mob/user as mob)
if(src.icon_state == initial(icon_state))
src.icon_state = "[icon_state]up"
user << "You raise the visor on the riot helmet."
else
src.icon_state = initial(icon_state)
user << "You flip the visor down."
user << "You lower the visor on the riot helmet."
update_clothing_icon() //so our mob-overlays update
/obj/item/clothing/head/helmet/laserproof
+9 -5
View File
@@ -67,7 +67,7 @@
icon_state = "beret_navy_officer"
/obj/item/clothing/head/beret/sec/navy/hos
name = "officer beret"
desc = "A navy blue beret with a commander's rank emblem. For officers that are more inclined towards style than safety."
desc = "A navy blue beret with a head of security's rank emblem. For officers that are more inclined towards style than safety."
icon_state = "beret_navy_hos"
/obj/item/clothing/head/beret/sec/navy/warden
name = "warden beret"
@@ -79,7 +79,7 @@
icon_state = "beret_corporate_officer"
/obj/item/clothing/head/beret/sec/corporate/hos
name = "officer beret"
desc = "A corporate black beret with a commander's rank emblem. For officers that are more inclined towards style than safety."
desc = "A corporate black beret with a head of security's rank emblem. For officers that are more inclined towards style than safety."
icon_state = "beret_corporate_hos"
/obj/item/clothing/head/beret/sec/corporate/warden
name = "warden beret"
@@ -95,11 +95,11 @@
icon_state = "beret_purple"
/obj/item/clothing/head/beret/centcom/officer
name = "officers beret"
desc = "A black beret adorned with the shield - a silver kite shield with an engraved sword - of the corporate security forces."
desc = "A dark blue beret adorned with a silver patch. Worn by NanoTrasen Officials."
icon_state = "beret_centcom_officer"
/obj/item/clothing/head/beret/centcom/captain
name = "captains beret"
desc = "A white beret adorned with the shield - a silver kite shield with an engraved sword - of the corporate security forces."
desc = "A white beret adorned with a blue patch. Worn by NanoTrasen command staff."
icon_state = "beret_centcom_captain"
//Medical
@@ -123,4 +123,8 @@
/obj/item/clothing/head/surgery/black
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is black."
icon_state = "surgcap_black"
icon_state = "surgcap_black"
/obj/item/clothing/head/surgery/navyblue
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is navy blue."
icon_state = "surgcap_navyblue"
+9 -316
View File
@@ -273,329 +273,22 @@
icon_state = "orange_bandana"
body_parts_covered = 0
//Hijabs
/obj/item/clothing/head/hijab
name = "black hijab"
desc = "A black veil that is wrapped to cover the head and chest"
icon_state = "hijab_black"
name = "hijab"
desc = "A veil that is wrapped to cover the head and chest"
icon_state = "hijab"
body_parts_covered = 0
flags_inv = BLOCKHAIR
/obj/item/clothing/head/hijab/white
name = "white hijab"
desc = "A white veil that is wrapped to cover the head and chest"
icon_state = "hijab_white"
/obj/item/clothing/head/hijab/aqua
name = "aqua hijab"
desc = "An aqua veil that is wrapped to cover the head and chest"
icon_state = "hijab_aqua"
/obj/item/clothing/head/hijab/blue
name = "blue hijab"
desc = "A blue veil that is wrapped to cover the head and chest"
icon_state = "hijab_blue"
/obj/item/clothing/head/hijab/brown
name = "brown hijab"
desc = "A brown veil that is wrapped to cover the head and chest"
icon_state = "hijab_brown"
/obj/item/clothing/head/hijab/darkblue
name = "bark blue hijab"
desc = "A dark blue veil that is wrapped to cover the head and chest"
icon_state = "hijab_darkblue"
/obj/item/clothing/head/hijab/darkred
name = "dark red hijab"
desc = "A dark red veil that is wrapped to cover the head and chest"
icon_state = "hijab_darkred"
/obj/item/clothing/head/hijab/green
name = "green hijab"
desc = "A green veil that is wrapped to cover the head and chest"
icon_state = "hijab_green"
/obj/item/clothing/head/hijab/grey
name = "grey hijab"
desc = "A grey veil that is wrapped to cover the head and chest"
icon_state = "hijab_grey"
/obj/item/clothing/head/hijab/lightblue
name = "light blue hijab"
desc = "A light blue veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightblue"
/obj/item/clothing/head/hijab/lightbrown
name = "light brown hijab"
desc = "A light brown veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightbrown"
/obj/item/clothing/head/hijab/lightgreen
name = "light green hijab"
desc = "A light green veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightgreen"
/obj/item/clothing/head/hijab/lightpurple
name = "light purple hijab"
desc = "A light purple veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightpurple"
/obj/item/clothing/head/hijab/lightred
name = "light red hijab"
desc = "A light red veil that is wrapped to cover the head and chest"
icon_state = "hijab_lightred"
/obj/item/clothing/head/hijab/maroon
name = "maroon hijab"
desc = "A maroon veil that is wrapped to cover the head and chest"
icon_state = "hijab_maroon"
/obj/item/clothing/head/hijab/orange
name = "orange hijab"
desc = "An orange veil that is wrapped to cover the head and chest"
icon_state = "hijab_orange"
/obj/item/clothing/head/hijab/pink
name = "pink hijab"
desc = "A pink veil that is wrapped to cover the head and chest"
icon_state = "hijab_pink"
/obj/item/clothing/head/hijab/purple
name = "purple hijab"
desc = "A purple veil that is wrapped to cover the head and chest"
icon_state = "hijab_purple"
/obj/item/clothing/head/hijab/red
name = "red hijab"
desc = "A red veil that is wrapped to cover the head and chest"
icon_state = "hijab_red"
/obj/item/clothing/head/hijab/yellowgreen
name = "yellow green hijab"
desc = "A yellow green veil that is wrapped to cover the head and chest"
icon_state = "hijab_yellowgreen"
/obj/item/clothing/head/hijab/yellow
name = "yellow hijab"
desc = "A yellow veil that is wrapped to cover the head and chest"
icon_state = "hijab_yellow"
//Kippot
/obj/item/clothing/head/kippa
name = "black kippa"
desc = "A small, brimless cap. It is black."
icon_state = "kippa_black"
name = "kippa"
desc = "A small, brimless cap."
icon_state = "kippa"
body_parts_covered = 0
/obj/item/clothing/head/kippa/aqua
name = "aqua kippa"
desc = "A small, brimless cap. It is aqua."
icon_state = "kippa_aqua"
/obj/item/clothing/head/kippa/blue
name = "blue kippa"
desc = "A small, brimless cap. It is blue."
icon_state = "kippa_blue"
/obj/item/clothing/head/kippa/brown
name = "brown kippa"
desc = "A small, brimless cap. It is blue."
icon_state = "kippa_brown"
/obj/item/clothing/head/kippa/darkblue
name = "dark blue kippa"
desc = "A small, brimless cap. It is dark blue."
icon_state = "kippa_darkblue"
/obj/item/clothing/head/kippa/darkred
name = "dark red kippa"
desc = "A small, brimless cap. It is dark red."
icon_state = "kippa_darkred"
/obj/item/clothing/head/kippa/green
name = "green kippa"
desc = "A small, brimless cap. It is green."
icon_state = "kippa_green"
/obj/item/clothing/head/kippa/grey
name = "grey kippa"
desc = "A small, brimless cap. It is grey."
icon_state = "kippa_grey"
/obj/item/clothing/head/kippa/lightblue
name = "light blue kippa"
desc = "A small, brimless cap. It is light blue."
icon_state = "kippa_lightblue"
/obj/item/clothing/head/kippa/lightbrown
name = "light brown kippa"
desc = "A small, brimless cap. It is light brown."
icon_state = "kippa_lightbrown"
/obj/item/clothing/head/kippa/lightgreen
name = "light green kippa"
desc = "A small, brimless cap. It is light green."
icon_state = "kippa_lightgreen"
/obj/item/clothing/head/kippa/lightpurple
name = "light purple kippa"
desc = "A small, brimless cap. It is light purple."
icon_state = "kippa_lightpurple"
/obj/item/clothing/head/kippa/lightred
name = "light red kippa"
desc = "A small, brimless cap. It is light red."
icon_state = "kippa_lightred"
/obj/item/clothing/head/kippa/maroon
name = "maroon kippa"
desc = "A small, brimless cap. It is maroon."
icon_state = "kippa_maroon"
/obj/item/clothing/head/kippa/orange
name = "orange kippa"
desc = "A small, brimless cap. It is orange."
icon_state = "kippa_orange"
/obj/item/clothing/head/kippa/pink
name = "pink kippa"
desc = "A small, brimless cap. It is pink."
icon_state = "kippa_pink"
/obj/item/clothing/head/kippa/purple
name = "purple kippa"
desc = "A small, brimless cap. It is purple."
icon_state = "kippa_purple"
/obj/item/clothing/head/kippa/red
name = "red kippa"
desc = "A small, brimless cap. It is red."
icon_state = "kippa_red"
/obj/item/clothing/head/kippa/white
name = "white kippa"
desc = "A small, brimless cap. It is white."
icon_state = "kippa_white"
/obj/item/clothing/head/kippa/yellowgreen
name = "yellow green kippa"
desc = "A small, brimless cap. It is yellow green."
icon_state = "kippa_yellowgreen"
/obj/item/clothing/head/kippa/yellow
name = "yellow kippa"
desc = "A small, brimless cap. It is yellow."
icon_state = "kippa_yellow"
//Turbans
/obj/item/clothing/head/turban
name = "black turban"
desc = "A black cloth used to wind around the head"
icon_state = "turban_black"
name = "turban"
desc = "A cloth used to wind around the head"
icon_state = "turban"
body_parts_covered = 0
flags_inv = BLOCKHAIR
/obj/item/clothing/head/turban/aqua
name = "aqua turban"
desc = "An aqua cloth used to wind around the head."
icon_state = "turban_aqua"
/obj/item/clothing/head/turban/blue
name = "blue turban"
desc = "A blue cloth used to wind around the head."
icon_state = "turban_blue"
/obj/item/clothing/head/turban/brown
name = "brown turban"
desc = "A brown cloth used to wind around the head."
icon_state = "turban_brown"
/obj/item/clothing/head/turban/darkblue
name = "dark blue turban"
desc = "A dark blue cloth used to wind around the head."
icon_state = "turban_darkblue"
/obj/item/clothing/head/turban/darkred
name = "dark red turban"
desc = "A dark red cloth used to wind around the head."
icon_state = "turban_darkred"
/obj/item/clothing/head/turban/green
name = "green turban"
desc = "A green cloth used to wind around the head."
icon_state = "turban_green"
/obj/item/clothing/head/turban/grey
name = "grey turban"
desc = "A grey cloth used to wind around the head."
icon_state = "turban_grey"
/obj/item/clothing/head/turban/lightblue
name = "light blue turban"
desc = "A light blue cloth used to wind around the head."
icon_state = "turban_lightblue"
/obj/item/clothing/head/turban/lightbrown
name = "light brown turban"
desc = "A light brown cloth used to wind around the head."
icon_state = "turban_lightbrown"
/obj/item/clothing/head/turban/lightgreen
name = "light green turban"
desc = "A light green cloth used to wind around the head."
icon_state = "turban_lightgreen"
/obj/item/clothing/head/turban/lightpurple
name = "light purple turban"
desc = "A light purple cloth used to wind around the head."
icon_state = "turban_lightpurple"
/obj/item/clothing/head/turban/lightred
name = "light red turban"
desc = "A light red cloth used to wind around the head."
icon_state = "turban_lightred"
/obj/item/clothing/head/turban/maroon
name = "maroon turban"
desc = "A maroon cloth used to wind around the head."
icon_state = "turban_maroon"
/obj/item/clothing/head/turban/orange
name = "orange turban"
desc = "An orange cloth used to wind around the head."
icon_state = "turban_orange"
/obj/item/clothing/head/turban/pink
name = "pink turban"
desc = "A pink cloth used to wind around the head."
icon_state = "turban_pink"
/obj/item/clothing/head/turban/purple
name = "purple turban"
desc = "A purple cloth used to wind around the head."
icon_state = "turban_purple"
/obj/item/clothing/head/turban/red
name = "red turban"
desc = "A red cloth used to wind around the head."
icon_state = "turban_red"
/obj/item/clothing/head/turban/white
name = "white turban"
desc = "A white cloth used to wind around the head."
icon_state = "turban_white"
/obj/item/clothing/head/turban/yellowgreen
name = "yellow green turban"
desc = "A yellow green cloth used to wind around the head."
icon_state = "turban_yellowgreen"
/obj/item/clothing/head/turban/yellow
name = "yellow turban"
desc = "A yellow cloth used to wind around the head."
icon_state = "turban_yellow"
+1 -1
View File
@@ -76,7 +76,7 @@
var/turf/location = src.loc
if(istype(location, /mob/))
var/mob/living/carbon/human/M = location
if(M.l_hand == src || M.r_hand == src || M.head == src)
if(M.item_is_in_hands(src) || M.head == src)
location = M.loc
if (istype(location, /turf))
+2 -2
View File
@@ -22,7 +22,7 @@
say_verbs = list("mumbles", "says")
// Clumsy folks can't take the mask off themselves.
/obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob)
/obj/item/clothing/mask/muzzle/attack_hand(mob/living/user as mob)
if(user.wear_mask == src && !user.IsAdvancedToolUser())
return 0
..()
@@ -129,7 +129,7 @@
item_state = "s-ninja"
flags_inv = HIDEFACE
body_parts_covered = 0
var/mob/eye/aiEye/eye
var/mob/observer/eye/aiEye/eye
/obj/item/clothing/mask/ai/New()
eye = new(src)
+11 -23
View File
@@ -9,28 +9,10 @@
icon = 'icons/mob/monitor_icons.dmi'
icon_override = 'icons/mob/monitor_icons.dmi'
icon_state = "ipc_blank"
item_state = null
icon_state = "monitor"
var/monitor_state_index = "blank"
var/global/list/monitor_states = list(
"blank" = "ipc_blank",
"pink" = "ipc_pink",
"red" = "ipc_red",
"green" = "ipc_green",
"blue" = "ipc_blue",
"breakout" = "ipc_breakout",
"eight" = "ipc_eight",
"goggles" = "ipc_goggles",
"heart" = "ipc_heart",
"monoeye" = "ipc_monoeye",
"nature" = "ipc_nature",
"orange" = "ipc_orange",
"purple" = "ipc_purple",
"shower" = "ipc_shower",
"static" = "ipc_static",
"yellow" = "ipc_yellow"
)
var/global/list/monitor_states = list()
/obj/item/clothing/mask/monitor/set_dir()
dir = SOUTH
@@ -40,8 +22,13 @@
..()
var/mob/living/carbon/human/H = loc
if(istype(H) && H.wear_mask == src)
var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD]
var/datum/robolimb/robohead = all_robolimbs[E.model]
canremove = 0
H << "<span class='notice'>\The [src] connects to your display output.</span>"
if(robohead.monitor_styles)
monitor_states = params2list(robohead.monitor_styles)
icon_state = monitor_states[monitor_state_index]
H << "<span class='notice'>\The [src] connects to your display output.</span>"
/obj/item/clothing/mask/monitor/dropped()
canremove = 1
@@ -52,9 +39,10 @@
return 0
if(istype(user))
var/obj/item/organ/external/E = user.organs_by_name[BP_HEAD]
if(istype(E) && (E.status & ORGAN_ROBOT))
var/datum/robolimb/robohead = all_robolimbs[E.model]
if(istype(E) && (E.robotic >= ORGAN_ROBOT) && robohead.monitor_styles)
return 1
user << "<span class='warning'>You must have a robotic head to install this upgrade.</span>"
user << "<span class='warning'>You must have a compatible robotic head to install this upgrade.</span>"
return 0
/obj/item/clothing/mask/monitor/verb/set_monitor_state()
+1 -1
View File
@@ -17,7 +17,7 @@
siemens_coefficient = 0.7
can_hold_knife = 1
/obj/item/clothing/shoes/jackboots/unathi
/obj/item/clothing/shoes/jackboots/toeless
name = "toe-less jackboots"
desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws."
item_state = "digiboots"
+3 -2
View File
@@ -3,6 +3,7 @@
desc = "These will protect your legs and feet."
body_parts_covered = LEGS|FEET
slowdown = 0 //Shoes have a slowdown of -1, so this needs to be 0 in order for it to effectively be 1 slowdown.
species_restricted = null //Unathi and Taj can wear leg armor now
w_class = 3
/obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
@@ -25,14 +26,14 @@
desc = "These will protect your legs and feet from ballistic weapons."
icon_state = "leg_guards_bullet"
siemens_coefficient = 0.7
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 10, bullet = 80, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/shoes/leg_guard/riot
name = "riot leg guards"
desc = "These will protect your legs and feet from close combat weapons."
icon_state = "leg_guards_riot"
siemens_coefficient = 0.5
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/shoes/leg_guard/combat
name = "combat leg guards"
+1 -1
View File
@@ -15,7 +15,7 @@
desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!"
icon_state = "caparmor"
item_state = "capspacesuit"
w_class = 4
w_class = 5
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
item_flags = STOPPRESSUREDAMAGE
@@ -449,8 +449,9 @@
drain_complete(H)
return
// Attempts to drain up to 40kW, determines this value from remaining cell capacity to ensure we don't drain too much..
var/to_drain = min(40000, ((holder.cell.maxcharge - holder.cell.charge) / CELLRATE))
// Attempts to drain up to 12.5*cell-capacity kW, determines this value from remaining cell capacity to ensure we don't drain too much.
// 1Ws/(12.5*CELLRATE) = 40s to charge
var/to_drain = min(12.5*holder.cell.maxcharge, ((holder.cell.maxcharge - holder.cell.charge) / CELLRATE))
var/target_drained = interfaced_with.drain_power(0,0,to_drain)
if(target_drained <= 0)
H << "<span class = 'danger'>Your power sink flashes a red light; there is no power left in [interfaced_with].</span>"
@@ -460,14 +461,14 @@
holder.cell.give(target_drained * CELLRATE)
total_power_drained += target_drained
return 1
return
/obj/item/rig_module/power_sink/proc/drain_complete(var/mob/living/M)
if(!interfaced_with)
if(M) M << "<font color='blue'><b>Total power drained:</b> [round(total_power_drained/1000)]kJ.</font>"
if(M) M << "<font color='blue'><b>Total power drained:</b> [round(total_power_drained*CELLRATE)] cell units.</font>"
else
if(M) M << "<font color='blue'><b>Total power drained from [interfaced_with]:</b> [round(total_power_drained/1000)]kJ.</font>"
if(M) M << "<font color='blue'><b>Total power drained from [interfaced_with]:</b> [round(total_power_drained*CELLRATE)] cell units.</font>"
interfaced_with.drain_power(0,1,0) // Damage the victim.
drain_loc = null
@@ -67,7 +67,7 @@
name = "teleportation module"
desc = "A complex, sleek-looking, hardsuit-integrated teleportation module."
icon_state = "teleporter"
use_power_cost = 40
use_power_cost = 200
redundant = 1
usable = 1
selectable = 1
@@ -97,8 +97,6 @@
/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai)
if(!..()) return 0
var/mob/living/carbon/human/H = holder.wearer
if(!istype(H.loc, /turf))
@@ -109,9 +107,13 @@
if(target)
T = get_turf(target)
else
T = get_teleport_loc(get_turf(H), H, rand(5, 9))
T = get_teleport_loc(get_turf(H), H, 6, 1, 1, 1)
if(!T || T.density)
if(!T)
H << "<span class='warning'>No valid teleport target found.</span>"
return 0
if(T.density)
H << "<span class='warning'>You cannot teleport into solid walls.</span>"
return 0
@@ -127,6 +129,8 @@
H << "<span class='warning'>You cannot teleport to such a distant object.</span>"
return 0
if(!..()) return 0
phase_out(H,get_turf(H))
H.forceMove(T)
phase_in(H,get_turf(H))
@@ -139,7 +139,7 @@
list("dexalin plus", "dexalinp", 0, 80),
list("antibiotics", "spaceacillin", 0, 80),
list("antitoxins", "anti_toxin", 0, 80),
list("nutrients", "nutriment", 0, 80),
list("nutrients", "glucose", 0, 80),
list("hyronalin", "hyronalin", 0, 80),
list("radium", "radium", 0, 80)
)
@@ -156,7 +156,7 @@
list("dexalin plus", "dexalinp", 0, 20),
list("antibiotics", "spaceacillin", 0, 20),
list("antitoxins", "anti_toxin", 0, 20),
list("nutrients", "nutriment", 0, 80),
list("nutrients", "glucose", 0, 80),
list("hyronalin", "hyronalin", 0, 20),
list("radium", "radium", 0, 20)
)
@@ -245,7 +245,7 @@
list("synaptizine", "synaptizine", 0, 30),
list("hyperzine", "hyperzine", 0, 30),
list("oxycodone", "oxycodone", 0, 30),
list("nutrients", "nutriment", 0, 80),
list("nutrients", "glucose", 0, 80),
)
interface_name = "combat chem dispenser"
@@ -50,6 +50,7 @@
usable = 1
toggleable = 1
disruptive = 0
module_cooldown = 0
engage_string = "Cycle Visor Mode"
activate_string = "Enable Visor"
+7 -6
View File
@@ -14,7 +14,7 @@
slot_flags = SLOT_BACK
req_one_access = list()
req_access = list()
w_class = 4
w_class = 5
// These values are passed on to all component pieces.
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
@@ -133,7 +133,6 @@
chest = new chest_type(src)
if(allowed)
chest.allowed = allowed
chest.slowdown = offline_slowdown
verbs |= /obj/item/weapon/rig/proc/toggle_chest
for(var/obj/item/piece in list(gloves,helmet,boots,chest))
@@ -332,14 +331,14 @@
offline = 0
if(istype(wearer) && !wearer.wearing_rig)
wearer.wearing_rig = src
chest.slowdown = initial(slowdown)
slowdown = initial(slowdown)
if(offline)
if(offline == 1)
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
offline = 2
chest.slowdown = offline_slowdown
slowdown = offline_slowdown
return
if(cell && cell.charge > 0 && electrified > 0)
@@ -472,8 +471,8 @@
var/species_icon = 'icons/mob/rig_back.dmi'
// Since setting mob_icon will override the species checks in
// update_inv_wear_suit(), handle species checks here.
if(wearer && sprite_sheets && sprite_sheets[wearer.species.get_bodytype()])
species_icon = sprite_sheets[wearer.species.get_bodytype()]
if(wearer && sprite_sheets && sprite_sheets[wearer.species.get_bodytype(wearer)])
species_icon = sprite_sheets[wearer.species.get_bodytype(wearer)]
mob_icon = image("icon" = species_icon, "icon_state" = "[icon_state]")
if(installed_modules.len)
@@ -495,6 +494,8 @@
return 1
if(istype(user))
if(!canremove)
return 1
if(malfunction_check(user))
return 0
if(user.back != src)
@@ -1,6 +1,6 @@
/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/user as mob)
/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/living/user as mob)
if(!istype(user,/mob/living)) return 0
if(!istype(user)) return 0
if(electrified != 0)
if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.
@@ -1,7 +1,7 @@
/obj/item/weapon/rig/unathi
name = "NT breacher chassis control module"
/obj/item/weapon/rig/breacher
name = "\improper NT breacher chassis control module"
desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
suit_type = "NT breacher"
suit_type = "\improper NT breacher"
icon_state = "breacher_rig_cheap"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50)
emp_protection = -20
@@ -9,12 +9,12 @@
offline_slowdown = 10
vision_restriction = 1
offline_vision_restriction = 2
chest_type = /obj/item/clothing/suit/space/rig
helm_type = /obj/item/clothing/head/helmet/space/rig/unathi
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
/obj/item/weapon/rig/unathi/fancy
chest_type = /obj/item/clothing/suit/space/rig/breacher
helm_type = /obj/item/clothing/head/helmet/space/rig/breacher
boot_type = /obj/item/clothing/shoes/magboots/rig/breacher
/obj/item/weapon/rig/breacher/fancy
name = "breacher chassis control module"
desc = "An authentic Unathi breacher chassis. Huge, bulky and absurdly heavy. It must be like wearing a tank."
suit_type = "breacher chassis"
@@ -22,11 +22,12 @@
armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow.
vision_restriction = 0
/obj/item/clothing/head/helmet/space/rig/unathi
/obj/item/clothing/head/helmet/space/rig/breacher
species_restricted = list("Unathi")
force = 5
/obj/item/clothing/suit/space/rig/breacher
species_restricted = list("Unathi")
/obj/item/clothing/suit/space/rig/unathi
species_restricted = list("Unathi")
/obj/item/clothing/shoes/magboots/rig/unathi
/obj/item/clothing/shoes/magboots/rig/breacher
species_restricted = list("Unathi")
@@ -82,6 +82,7 @@
chest_type = /obj/item/clothing/suit/space/rig/light/ninja
glove_type = /obj/item/clothing/gloves/rig/light/ninja
cell_type = /obj/item/weapon/cell/hyper
req_access = list(access_syndicate)
@@ -48,10 +48,10 @@
/obj/item/clothing/suit/space
name = "Space suit"
desc = "A suit that protects against low pressure environments. \"NORTHERN STAR\" is written in large block letters on the back."
desc = "A suit that protects against low pressure environments. \""+station_short+"\" is written in large block letters on the back."
icon_state = "space"
item_state = "s_suit"
w_class = 4//bulky item
w_class = 5 // So you can't fit this in your bag and be prepared at all times.
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL
+10 -3
View File
@@ -15,12 +15,14 @@
sprite_sheets_refit = list(
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
"Skrell" = 'icons/mob/species/skrell/helmet.dmi'
//Teshari have a general sprite sheet defined in modules/clothing/clothing.dm
)
sprite_sheets_obj = list(
"Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi',
"Tajara" = 'icons/obj/clothing/species/tajaran/hats.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
"Teshari" = 'icons/obj/clothing/species/seromi/hats.dmi'
)
light_overlay = "helmet_light"
@@ -40,12 +42,14 @@
sprite_sheets_refit = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajara" = 'icons/mob/species/tajaran/suit.dmi',
"Skrell" = 'icons/mob/species/skrell/suit.dmi',
"Skrell" = 'icons/mob/species/skrell/suit.dmi'
//Teshari have a general sprite sheet defined in modules/clothing/clothing.dm
)
sprite_sheets_obj = list(
"Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi',
"Tajara" = 'icons/obj/clothing/species/tajaran/suits.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi',
"Teshari" = 'icons/obj/clothing/species/seromi/suits.dmi'
)
//Breach thresholds, should ideally be inherited by most (if not all) voidsuits.
@@ -206,8 +210,11 @@
if(!istype(user,/mob/living)) return
if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/weapon/hand_labeler))
return ..()
if(istype(src.loc,/mob/living))
user << "<span class='danger'>How do you propose to modify a voidsuit while it is being worn?</span>"
user << "<span class='warning'>You cannot modify \the [src] while it is being worn.</span>"
return
if(istype(W,/obj/item/weapon/screwdriver))
+7 -6
View File
@@ -1,6 +1,6 @@
/obj/item/clothing/suit/armor
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
item_flags = THICKMATERIAL
@@ -46,14 +46,14 @@
desc = "An armoured jacket with silver rank pips and livery."
icon_state = "warden_jacket"
item_state = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
/obj/item/clothing/suit/armor/vest/warden/alt
name = "Warden's jacket"
desc = "An armoured jacket with silver rank pips and livery."
icon_state = "warden_alt"
item_state = "warden_alt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
/obj/item/clothing/suit/armor/riot
@@ -143,6 +143,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1
w_class = 5
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 100)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
@@ -263,7 +264,7 @@
icon_state = "kvest"
item_state = "kvest"
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
item_flags = THICKMATERIAL
@@ -291,7 +292,7 @@
icon_nobadge = "wardenvest_nobadge"
/obj/item/clothing/suit/storage/vest/hos
name = "commander armor vest"
name = "head of security armor vest"
desc = "A simple kevlar plate carrier. This one has a gold badge clipped to the chest."
icon_state = "hosvest_nobadge"
item_state = "hosvest_nobadge"
@@ -339,7 +340,7 @@
icon_nobadge = "wardenwebvest_nobadge"
/obj/item/clothing/suit/storage/vest/heavy/hos
name = "commander heavy armor vest"
name = "head of security heavy armor vest"
desc = "A heavy kevlar plate carrier with webbing attached. This one has a gold badge clipped to the chest."
icon_state = "hoswebvest_nobadge"
item_state = "hoswebvest_nobadge"
+3 -3
View File
@@ -10,7 +10,7 @@
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = 0
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/fertilizer,/obj/item/weapon/material/minihoe)
allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/material/minihoe)
//Captain
/obj/item/clothing/suit/captunic
@@ -96,7 +96,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder)
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/uv_light)
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/storage/det_trench/grey
@@ -109,7 +109,7 @@
desc = "A forensics technician jacket."
item_state = "det_suit"
body_parts_covered = UPPER_TORSO|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/taperecorder)
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/taperecorder,/obj/item/device/uv_light)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/storage/forensics/red
+98 -4
View File
@@ -343,6 +343,36 @@
icon_state = "blueponcho"
item_state = "blueponcho"
/obj/item/clothing/suit/poncho/roles/security
name = "security poncho"
desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors."
icon_state = "secponcho"
item_state = "secponcho"
/obj/item/clothing/suit/poncho/roles/medical
name = "medical poncho"
desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors."
icon_state = "medponcho"
item_state = "medponcho"
/obj/item/clothing/suit/poncho/roles/engineering
name = "engineering poncho"
desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors."
icon_state = "engiponcho"
item_state = "engiponcho"
/obj/item/clothing/suit/poncho/roles/science
name = "science poncho"
desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors."
icon_state = "sciponcho"
item_state = "sciponcho"
/obj/item/clothing/suit/poncho/roles/cargo
name = "cargo poncho"
desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo."
icon_state = "cargoponcho"
item_state = "cargoponcho"
/obj/item/clothing/suit/jacket/puffer
name = "puffer jacket"
desc = "A thick jacket with a rubbery, water-resistant shell."
@@ -480,15 +510,15 @@
/obj/item/clothing/suit/storage/toggle/hoodie/cti
name = "CTI hoodie"
desc = "A warm, black sweatshirt. It bears the letters CTI on the back, a lettering to the prestigious university in Tau Ceti, Ceti Technical Institute. There is a blue supernova embroidered on the front, the emblem of CTI."
desc = "A warm, black sweatshirt. It bears the letters ‘CTI’ on the back, a lettering to the prestigious university in Tau Ceti, Ceti Technical Institute. There is a blue supernova embroidered on the front, the emblem of CTI."
icon_state = "cti_hoodie"
item_state = "cti_hoodie"
icon_open = "cti_hoodie_open"
icon_closed = "cti_hoodie"
/obj/item/clothing/suit/storage/toggle/hoodie/mu
name = "mars university hoodie"
desc = "A warm, gray sweatshirt. It bears the letters MU on the front, a lettering to the well-known public college, Mars University."
name = "mojave university hoodie"
desc = "A warm, gray sweatshirt. It bears the letters ‘MU’ on the front, a lettering to the well-known public college, Mojave University."
icon_state = "mu_hoodie"
item_state = "mu_hoodie"
icon_open = "mu_hoodie_open"
@@ -625,4 +655,68 @@
/obj/item/clothing/suit/storage/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/varsity
name = "black varsity jacket"
desc = "A favorite of jocks everywhere from Sol to Nyx."
icon_state = "varsity"
item_state = "leather_jacket"
/obj/item/clothing/suit/varsity/red
name = "red varsity jacket"
icon_state = "varsity_red"
/obj/item/clothing/suit/varsity/purple
name = "purple varsity jacket"
icon_state = "varsity_purple"
/obj/item/clothing/suit/varsity/green
name = "green varsity jacket"
icon_state = "varsity_green"
/obj/item/clothing/suit/varsity/blue
name = "blue varsity jacket"
icon_state = "varsity_blue"
/obj/item/clothing/suit/varsity/brown
name = "brown varsity jacket"
icon_state = "varsity_brown"
//Track Jackets
/obj/item/clothing/suit/storage/toggle/track
name = "track jacket"
desc = "a track jacket, for the athletic."
icon_state = "trackjacket"
item_state = "trackjacket"
icon_open = "trackjacket_open"
icon_closed = "trackjacket"
/obj/item/clothing/suit/storage/toggle/track/blue
name = "blue track jacket"
icon_state = "trackjacketblue"
item_state = "trackjacketblue"
icon_open = "trackjacketblue_open"
icon_closed = "trackjacketblue"
/obj/item/clothing/suit/storage/toggle/track/green
name = "green track jacket"
icon_state = "trackjacketgreen"
item_state = "trackjacketgreen"
icon_open = "trackjacketgreen_open"
icon_closed = "trackjacketgreen"
/obj/item/clothing/suit/storage/toggle/track/red
name = "red track jacket"
icon_state = "trackjacketred"
item_state = "trackjacketred"
icon_open = "trackjacketred_open"
icon_closed = "trackjacketred"
/obj/item/clothing/suit/storage/toggle/track/white
name = "white track jacket"
icon_state = "trackjacketwhite"
item_state = "trackjacketwhite"
icon_open = "trackjacketwhite_open"
icon_closed = "trackjacketwhite"
-2
View File
@@ -4,7 +4,6 @@
/obj/item/clothing/suit/storage/New()
..()
pockets = new/obj/item/weapon/storage/internal(src)
pockets.storage_slots = 2 //two slots
pockets.max_w_class = 2 //fit only pocket sized items
pockets.max_storage_space = 4
@@ -77,7 +76,6 @@
/obj/item/clothing/suit/storage/vest/heavy/New()
..()
pockets = new/obj/item/weapon/storage/internal(src)
pockets.storage_slots = 4
pockets.max_w_class = 2
pockets.max_storage_space = 8
@@ -7,11 +7,15 @@
slot_flags = SLOT_TIE
w_class = 2.0
var/slot = "decor"
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
var/obj/item/clothing/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
var/image/mob_overlay = null
var/overlay_state = null
/obj/item/clothing/accessory/Destroy()
on_removed()
return ..()
/obj/item/clothing/accessory/proc/get_inv_overlay()
if(!inv_overlay)
if(!mob_overlay)
@@ -36,23 +40,27 @@
return mob_overlay
//when user attached an accessory to S
/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob)
/obj/item/clothing/accessory/proc/on_attached(var/obj/item/clothing/S, var/mob/user)
if(!istype(S))
return
has_suit = S
loc = has_suit
has_suit.overlays += get_inv_overlay()
user << "<span class='notice'>You attach [src] to [has_suit].</span>"
src.add_fingerprint(user)
if(user)
user << "<span class='notice'>You attach \the [src] to \the [has_suit].</span>"
src.add_fingerprint(user)
/obj/item/clothing/accessory/proc/on_removed(mob/user as mob)
/obj/item/clothing/accessory/proc/on_removed(var/mob/user)
if(!has_suit)
return
has_suit.overlays -= get_inv_overlay()
has_suit = null
usr.put_in_hands(src)
src.add_fingerprint(user)
if(user)
usr.put_in_hands(src)
src.add_fingerprint(user)
else
src.forceMove(get_turf(src))
//default attackby behaviour
/obj/item/clothing/accessory/attackby(obj/item/I, mob/user)
@@ -72,10 +80,34 @@
name = "red tie"
icon_state = "redtie"
/obj/item/clothing/accessory/blue_clip
name = "blue tie with a clip"
icon_state = "bluecliptie"
/obj/item/clothing/accessory/blue_long
name = "blue long tie"
icon_state = "bluelongtie"
/obj/item/clothing/accessory/red_clip
name = "red tie with a clip"
icon_state = "redcliptie"
/obj/item/clothing/accessory/red_long
name = "red long tie"
icon_state = "redlongtie"
/obj/item/clothing/accessory/black
name = "black tie"
icon_state = "blacktie"
/obj/item/clothing/accessory/yellow
name = "yellow tie"
icon_state = "yellowtie"
/obj/item/clothing/accessory/navy
name = "navy tie"
icon_state = "navytie"
/obj/item/clothing/accessory/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
@@ -100,7 +132,7 @@
var/sound_strength = "cannot hear"
var/heartbeat = 0
var/obj/item/organ/internal/heart/heart = M.internal_organs_by_name[O_HEART]
if(heart && !(heart.status & ORGAN_ROBOT))
if(heart && !(heart.robotic >= ORGAN_ROBOT))
heartbeat = 1
if(M.stat == DEAD || (M.status_flags&FAKEDEATH))
sound_strength = "cannot hear"
@@ -38,6 +38,8 @@
/obj/item/clothing/accessory/badge/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, thrusting [src] into their face insistently.</span>","<span class='danger'>You invade [M]'s personal space, thrusting [src] into their face insistently.</span>")
user.do_attack_animation(M)
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
//.Holobadges.
/obj/item/clothing/accessory/badge/holo
@@ -127,4 +129,4 @@
new /obj/item/clothing/accessory/badge/holo/hos(src)
new /obj/item/clothing/accessory/badge/holo/cord(src)
..()
return
return
@@ -0,0 +1,29 @@
/obj/item/clothing/accessory/vest
name = "black vest"
desc = "Slick black suit vest."
icon_state = "det_vest"
/obj/item/clothing/accessory/tan_jacket
name = "tan suit jacket"
desc = "Cozy suit jacket."
icon_state = "tan_jacket"
/obj/item/clothing/accessory/charcoal_jacket
name = "charcoal suit jacket"
desc = "Strict suit jacket."
icon_state = "charcoal_jacket"
/obj/item/clothing/accessory/navy_jacket
name = "navy suit jacket"
desc = "Official suit jacket."
icon_state = "navy_jacket"
/obj/item/clothing/accessory/burgundy_jacket
name = "burgundy suit jacket"
desc = "Expensive suit jacket."
icon_state = "burgundy_jacket"
/obj/item/clothing/accessory/checkered_jacket
name = "checkered suit jacket"
desc = "Lucky suit jacket."
icon_state = "checkered_jacket"
@@ -12,7 +12,8 @@
/obj/item/clothing/accessory/storage/New()
..()
hold = new/obj/item/weapon/storage/internal(src)
hold.storage_slots = slots
hold.max_storage_space = slots * 2
hold.max_w_class = 2
/obj/item/clothing/accessory/storage/attack_hand(mob/user as mob)
if (has_suit) //if we are part of a suit
@@ -61,6 +62,33 @@
icon_state = "vest_brown"
slots = 5
/obj/item/clothing/accessory/storage/white_vest
name = "white webbing vest"
desc = "Durable white synthcotton vest with lots of pockets to carry essentials."
icon_state = "vest_white"
slots = 5
/obj/item/clothing/accessory/storage/black_drop_pouches
name = "black drop pouches"
gender = PLURAL
desc = "Robust black synthcotton bags to hold whatever you need, but cannot hold in hands."
icon_state = "thigh_black"
slots = 5
/obj/item/clothing/accessory/storage/brown_drop_pouches
name = "brown drop pouches"
gender = PLURAL
desc = "Worn brownish synthcotton bags to hold whatever you need, but cannot hold in hands."
icon_state = "thigh_brown"
slots = 5
/obj/item/clothing/accessory/storage/white_drop_pouches
name = "white drop pouches"
gender = PLURAL
desc = "Durable white synthcotton bags to hold whatever you need, but cannot hold in hands."
icon_state = "thigh_white"
slots = 5
/obj/item/clothing/accessory/storage/knifeharness
name = "decorated harness"
desc = "A heavily decorated harness of sinew and leather with two knife-loops."
+29 -22
View File
@@ -12,6 +12,13 @@
item_state = "bl_suit"
worn_state = "blackf"
/obj/item/clothing/under/color/blackjumpskirt
name = "black jumpskirt"
desc = "A slimming black jumpskirt."
icon_state = "blackjumpskirt"
item_state = "bl_suit"
worn_state = "blackjumpskirt"
/obj/item/clothing/under/color/blue
name = "blue jumpsuit"
icon_state = "blue"
@@ -78,89 +85,89 @@
item_state = "psyche"
worn_state = "psyche"
/obj/item/clothing/under/lightblue
/obj/item/clothing/under/color/lightblue
name = "lightblue jumpsuit"
desc = "lightblue"
desc = "A light blue jumpsuit."
icon_state = "lightblue"
item_state = "b_suit"
worn_state = "lightblue"
rolled_sleeves = 0
/obj/item/clothing/under/aqua
/obj/item/clothing/under/color/aqua
name = "aqua jumpsuit"
desc = "aqua"
desc = "An aqua jumpsuit."
icon_state = "aqua"
item_state = "b_suit"
worn_state = "aqua"
rolled_sleeves = 0
/obj/item/clothing/under/purple
/obj/item/clothing/under/color
name = "purple jumpsuit"
desc = "purple"
desc = "The latest in space fashion."
icon_state = "purple"
item_state = "p_suit"
worn_state = "purple"
rolled_sleeves = 0
/obj/item/clothing/under/lightpurple
/obj/item/clothing/under/color/lightpurple
name = "lightpurple jumpsuit"
desc = "lightpurple"
desc = "A light purple jumpsuit."
icon_state = "lightpurple"
item_state = "p_suit"
worn_state = "lightpurple"
rolled_sleeves = 0
/obj/item/clothing/under/lightgreen
/obj/item/clothing/under/color/lightgreen
name = "lightgreen jumpsuit"
desc = "lightgreen"
desc = "A light green jumpsuit."
icon_state = "lightgreen"
item_state = "g_suit"
worn_state = "lightgreen"
rolled_sleeves = 0
/obj/item/clothing/under/lightbrown
/obj/item/clothing/under/color/lightbrown
name = "lightbrown jumpsuit"
desc = "lightbrown"
desc = "A light brown jumpsuit."
icon_state = "lightbrown"
item_state = "lb_suit"
worn_state = "lightbrown"
rolled_sleeves = 0
/obj/item/clothing/under/brown
/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
desc = "brown"
desc = "A brown jumpsuit."
icon_state = "brown"
item_state = "lb_suit"
worn_state = "brown"
rolled_sleeves = 0
/obj/item/clothing/under/yellowgreen
/obj/item/clothing/under/color/yellowgreen
name = "yellowgreen jumpsuit"
desc = "yellowgreen"
desc = "A... yellow green jumpsuit?"
icon_state = "yellowgreen"
item_state = "y_suit"
worn_state = "yellowgreen"
rolled_sleeves = 0
/obj/item/clothing/under/darkblue
/obj/item/clothing/under/color/darkblue
name = "darkblue jumpsuit"
desc = "darkblue"
desc = "A dark blue jumpsuit."
icon_state = "darkblue"
item_state = "b_suit"
worn_state = "darkblue"
rolled_sleeves = 0
/obj/item/clothing/under/lightred
/obj/item/clothing/under/color/lightred
name = "lightred jumpsuit"
desc = "lightred"
desc = "A light red jumpsuit."
icon_state = "lightred"
item_state = "r_suit"
worn_state = "lightred"
rolled_sleeves = 0
/obj/item/clothing/under/darkred
/obj/item/clothing/under/color/darkred
name = "darkred jumpsuit"
desc = "darkred"
desc = "A dark red jumpsuit."
icon_state = "darkred"
item_state = "r_suit"
worn_state = "darkred"
+3 -33
View File
@@ -8,7 +8,6 @@
worn_state = "ba_suit"
rolled_sleeves = 0
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
name = "captain's jumpsuit"
@@ -17,7 +16,6 @@
worn_state = "captain"
rolled_sleeves = 0
/obj/item/clothing/under/rank/cargo
name = "quartermaster's jumpsuit"
desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
@@ -26,14 +24,6 @@
worn_state = "qm"
rolled_sleeves = 0
/obj/item/clothing/under/rank/cargo/skirt
name = "quartermaster's jumpskirt"
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
icon_state = "qmf"
worn_state = "qmf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/cargo/jeans
name = "quartermaster's jumpjeans"
desc = "Jeeeaaans! They're comfy!"
@@ -56,13 +46,6 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = 0
/obj/item/clothing/under/rank/cargotech/skirt
name = "cargo technician's jumpskirt"
desc = "Skirrrrrts! They're comfy and easy to wear!"
icon_state = "cargof"
worn_state = "cargof"
rolled_sleeves = -1
/obj/item/clothing/under/rank/cargotech/jeans
name = "cargo technician's jumpjeans"
desc = "Jeeeaaans! They're comfy!"
@@ -76,7 +59,6 @@
icon_state = "cargojf"
worn_state = "cargojf"
/obj/item/clothing/under/rank/chaplain
desc = "It's a black jumpsuit, often worn by religious folk."
name = "chaplain's jumpsuit"
@@ -85,7 +67,6 @@
worn_state = "chapblack"
rolled_sleeves = 0
/obj/item/clothing/under/rank/chef
desc = "It's an apron which is given only to the most <b>hardcore</b> chefs in space."
name = "chef's uniform"
@@ -94,7 +75,6 @@
worn_state = "chef"
rolled_sleeves = 0
/obj/item/clothing/under/rank/clown
name = "clown suit"
desc = "<i>'HONK!'</i>"
@@ -103,7 +83,6 @@
worn_state = "clown"
rolled_sleeves = -1
/obj/item/clothing/under/rank/head_of_personnel
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
name = "head of personnel's jumpsuit"
@@ -120,7 +99,6 @@
worn_state = "hopwhimsy"
rolled_sleeves = -1
/obj/item/clothing/under/rank/hydroponics
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
name = "botanist's jumpsuit"
@@ -130,7 +108,6 @@
permeability_coefficient = 0.50
rolled_sleeves = 0
/obj/item/clothing/under/rank/internalaffairs
desc = "The plain, professional attire of an Internal Affairs Agent. The collar is <i>immaculately</i> starched."
name = "Internal Affairs uniform"
@@ -138,7 +115,7 @@
item_state = "ba_suit"
worn_state = "internalaffairs"
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/black)
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
@@ -149,47 +126,41 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/lawyer
desc = "Slick threads."
name = "Lawyer suit"
/obj/item/clothing/under/lawyer/black
name = "black Lawyer suit"
icon_state = "lawyer_black"
item_state = "lawyer_black"
worn_state = "lawyer_black"
/obj/item/clothing/under/lawyer/female
name = "black Lawyer suit"
icon_state = "black_suit_fem"
item_state = "lawyer_black"
worn_state = "black_suit_fem"
/obj/item/clothing/under/lawyer/red
name = "red Lawyer suit"
icon_state = "lawyer_red"
item_state = "lawyer_red"
worn_state = "lawyer_red"
/obj/item/clothing/under/lawyer/blue
name = "blue Lawyer suit"
icon_state = "lawyer_blue"
item_state = "lawyer_blue"
worn_state = "lawyer_blue"
/obj/item/clothing/under/lawyer/bluesuit
name = "Blue Suit"
desc = "A classy suit and tie"
desc = "A classy suit."
icon_state = "bluesuit"
item_state = "ba_suit"
worn_state = "bluesuit"
starting_accessories = list(/obj/item/clothing/accessory/red)
/obj/item/clothing/under/lawyer/purpsuit
name = "Purple Suit"
@@ -204,7 +175,6 @@
item_state = "johnny"
worn_state = "oldman"
/obj/item/clothing/under/librarian
name = "sensible suit"
desc = "It's very... sensible."
@@ -8,14 +8,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chief_engineer/skirt
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
name = "chief engineer's jumpskirt"
icon_state = "chieff"
worn_state = "chieff"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
name = "atmospheric technician's jumpsuit"
@@ -24,14 +16,6 @@
worn_state = "atmos"
rolled_sleeves = 0
/obj/item/clothing/under/rank/atmospheric_technician/skirt
desc = "It's a jumpskirt worn by atmospheric technicians."
name = "atmospheric technician's jumpskirt"
icon_state = "atmosf"
worn_state = "atmosf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
name = "engineer's jumpsuit"
@@ -41,25 +25,10 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
rolled_sleeves = 0
/obj/item/clothing/under/rank/engineer/skirt
desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
name = "engineer's jumpskirt"
icon_state = "enginef"
worn_state = "enginef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black jumpsuit with reinforced seams; great for industrial work."
name = "roboticist's jumpsuit"
icon_state = "robotics"
item_state = "bl_suit"
worn_state = "robotics"
rolled_sleeves = 0
/obj/item/clothing/under/rank/roboticist/skirt
desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
name = "roboticist's jumpskirt"
icon_state = "roboticsf"
worn_state = "roboticsf"
rolled_sleeves = -1
rolled_sleeves = 0
+8 -43
View File
@@ -36,13 +36,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/scientist/skirt
name = "scientist's jumpskirt"
icon_state = "sciencewhitef"
worn_state = "sciencewhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
name = "chemist's jumpsuit"
@@ -53,13 +46,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chemist/skirt
name = "chemist's jumpskirt"
icon_state = "chemistrywhitef"
worn_state = "chemistrywhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/*
* Medical
*/
@@ -73,14 +59,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/chief_medical_officer/skirt
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
name = "chief medical officer's jumpskirt"
icon_state = "cmof"
worn_state = "cmof"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
name = "geneticist's jumpsuit"
@@ -91,13 +69,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/geneticist/skirt
name = "geneticist's jumpskirt"
icon_state = "geneticswhitef"
worn_state = "geneticswhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
name = "virologist's jumpsuit"
@@ -108,13 +79,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/virologist/skirt
name = "virologist's jumpskirt"
icon_state = "virologywhitef"
worn_state = "virologywhitef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
name = "nurse's suit"
@@ -157,13 +121,6 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
rolled_sleeves = 0
/obj/item/clothing/under/rank/medical/skirt
name = "medical doctor's jumpskirt"
icon_state = "medicalf"
worn_state = "medicalf"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/paramedic
name = "short sleeve medical jumpsuit"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one has a cross on the chest denoting that the wearer is trained medical personnel."
@@ -204,6 +161,14 @@
worn_state = "scrubsblack"
rolled_sleeves = -1
/obj/item/clothing/under/rank/medical/navyblue
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in navy blue."
icon_state = "scrubsnavyblue"
item_state = "b_suit"
worn_state = "scrubsnavyblue"
rolled_sleeves = -1
/obj/item/clothing/under/rank/psych
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
name = "psychiatrist's jumpsuit"
+11 -9
View File
@@ -58,13 +58,13 @@
icon_state = "sec_corporate"
//item_state = "sec_corporate"
worn_state = "sec_corporate"
rolled_sleeves = -1
rolled_sleeves = 0
/obj/item/clothing/under/rank/warden/corp
icon_state = "warden_corporate"
//item_state = "warden_corporate"
worn_state = "warden_corporate"
rolled_sleeves = -1
rolled_sleeves = 0
/obj/item/clothing/under/tactical
name = "tactical jumpsuit"
@@ -81,13 +81,14 @@
*/
/obj/item/clothing/under/det
name = "detective's suit"
desc = "A rumpled white dress shirt paired with well-worn grey slacks, complete with a blue striped tie and a faux-gold tie clip."
desc = "A rumpled white dress shirt paired with well-worn grey slacks."
icon_state = "detective"
item_state = "det"
worn_state = "detective"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
rolled_sleeves = 0
starting_accessories = list(/obj/item/clothing/accessory/blue_clip)
/*
/obj/item/clothing/under/det/verb/rollup()
@@ -103,13 +104,15 @@
/obj/item/clothing/under/det/grey
icon_state = "detective2"
worn_state = "detective2"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie."
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks."
starting_accessories = list(/obj/item/clothing/accessory/red_long)
/obj/item/clothing/under/det/black
icon_state = "detective3"
worn_state = "detective3"
item_state = "sl_suit"
desc = "An immaculate white dress shirt, paired with a pair of dark grey dress pants, a red tie, and a charcoal vest."
starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/vest)
/obj/item/clothing/under/det/corporate
name = "detective's jumpsuit"
@@ -127,7 +130,7 @@
icon_state = "detective2_waistcoat"
worn_state = "detective2_waistcoat"
desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat."
/obj/item/clothing/head/det
name = "fedora"
@@ -164,7 +167,7 @@
icon_state = "hos_corporate"
//item_state = "hos_corporate"
worn_state = "hos_corporate"
rolled_sleeves = -1
rolled_sleeves = 0
/obj/item/clothing/head/helmet/HoS
name = "Head of Security Hat"
@@ -202,11 +205,10 @@
/obj/item/clothing/suit/armor/hos/jensen
name = "armored trenchcoat"
desc = "A trenchcoat augmented with a special alloy for some protection and style."
icon_state = "jensencoat"
item_state = "jensencoat"
icon_state = "hostrench"
item_state = "hostrench"
flags_inv = 0
siemens_coefficient = 0.6
body_parts_covered = UPPER_TORSO|ARMS
/*
* Navy uniforms
+69 -40
View File
@@ -140,9 +140,9 @@
worn_state = "johnny"
item_state = "johnny"
/obj/item/clothing/under/rainbow
name = "rainbow"
desc = "rainbow"
/obj/item/clothing/under/color/rainbow
name = "rainbow jumpsuit"
desc = "A multi-colored jumpsuit."
icon_state = "rainbow"
item_state = "rainbow"
worn_state = "rainbow"
@@ -211,14 +211,6 @@
item_state = "r_suit"
worn_state = "red_suit"
/obj/item/clothing/under/blackskirt
name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
item_state = "bl_suit"
worn_state = "blackskirt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/schoolgirl
name = "schoolgirl uniform"
desc = "It's just like one of my Japanese animes!"
@@ -401,26 +393,6 @@
worn_state = "huresource"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/dress/plaid_blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
icon_state = "plaid_blue"
worn_state = "plaid_blue"
/obj/item/clothing/under/dress/plaid_red
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
icon_state = "plaid_red"
item_state = "kilt"
worn_state = "plaid_red"
/obj/item/clothing/under/dress/plaid_purple
name = "blue purple skirt"
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"
item_state = "kilt"
worn_state = "plaid_purple"
//wedding stuff
/obj/item/clothing/under/wedding/
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
@@ -482,13 +454,6 @@
worn_state = "sundress_white"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/blackjumpskirt
name = "black jumpskirt"
desc = "A black jumpskirt, Sol size 0."
icon_state = "blackjumpskirt"
item_state = "bl_suit"
worn_state = "blackjumpskirt"
/obj/item/clothing/under/captainformal
name = "captain's formal uniform"
desc = "A captain's formal-wear, for special occasions."
@@ -523,6 +488,7 @@
icon_state = "charcoal_suit"
item_state = "bl_suit"
worn_state = "charcoal_suit"
starting_accessories = list(/obj/item/clothing/accessory/navy, /obj/item/clothing/accessory/charcoal_jacket)
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
@@ -530,6 +496,7 @@
icon_state = "navy_suit"
item_state = "bl_suit"
worn_state = "navy_suit"
starting_accessories = list(/obj/item/clothing/accessory/red, /obj/item/clothing/accessory/navy_jacket)
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
@@ -537,6 +504,7 @@
icon_state = "burgundy_suit"
item_state = "r_suit"
worn_state = "burgundy_suit"
starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/burgundy_jacket)
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
@@ -544,13 +512,15 @@
icon_state = "checkered_suit"
item_state = "gy_suit"
worn_state = "checkered_suit"
starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/checkered_jacket)
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
desc = "A tan suit. Smart, but casual."
icon_state = "tan_suit"
item_state = "lb_suit"
worn_state = "tan_suit"
starting_accessories = list(/obj/item/clothing/accessory/yellow, /obj/item/clothing/accessory/tan_jacket)
/obj/item/clothing/under/serviceoveralls
name = "workman outfit"
@@ -568,6 +538,27 @@
worn_state = "mai_yang"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/under/cheongsam/red
name = "red cheongsam"
desc = "It is a red cheongsam dress."
icon_state = "cheongsam-red"
item_state = "cheongsam-red"
worn_state = "cheongsam-red"
/obj/item/clothing/under/cheongsam/blue
name = "blue cheongsam"
desc = "It is a blue cheongsam dress."
icon_state = "cheongsam-blue"
item_state = "cheongsam-blue"
worn_state = "cheongsam-blue"
/obj/item/clothing/under/cheongsam/black
name = "black cheongsam"
desc = "It is a black cheongsam dress."
icon_state = "cheongsam-black"
item_state = "cheongsam-black"
worn_state = "cheongsam-black"
/obj/item/clothing/under/blazer
name = "blue blazer"
desc = "A bold but yet conservative outfit, red corduroys, navy blazer and a tie."
@@ -615,4 +606,42 @@
desc = "How... minimalist."
icon_state = "gear_harness"
worn_state = "gear_harness"
body_parts_covered = 0
body_parts_covered = 0
/obj/item/clothing/under/dress/white
name = "white wedding dress"
desc = "A fancy white dress with a blue underdress."
icon_state = "whitedress1"
item_state = "whitedress1"
worn_state = "whitedress1"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/white2
name = "long dress"
desc = "A long dress."
icon_state = "whitedress2"
item_state = "whitedress2"
worn_state = "whitedress2"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/white3
name = "short dress"
desc = "A short, plain dress."
icon_state = "whitedress3"
item_state = "whitedress3"
worn_state = "whitedress3"
/obj/item/clothing/under/dress/white4
name = "long flared dress"
desc = "A long white dress that flares out at the bottom."
icon_state = "whitedress4"
item_state = "whitedress4"
worn_state = "whitedress4"
flags_inv = HIDESHOES
/obj/item/clothing/under/dress/darkred
name = "fancy dark red dress"
desc = "A short, red dress with a black belt. Fancy."
icon_state = "darkreddress"
item_state = "darkreddress"
worn_state = "darkreddress"
+93 -7
View File
@@ -1,4 +1,7 @@
/obj/item/clothing/under/pants
name = "jeans"
desc = "A nondescript pair of tough blue jeans."
icon_state = "jeans"
gender = PLURAL
body_parts_covered = LOWER_TORSO|LEGS
@@ -8,7 +11,7 @@
icon_state = "jeansclassic"
/obj/item/clothing/under/pants/mustangjeans
name = "Must Hang jeans"
name = "must hang jeans"
desc = "Made in the finest space jeans factory this side of Alpha Centauri."
icon_state = "jeansmustang"
@@ -17,8 +20,13 @@
desc = "Only for those who can pull it off."
icon_state = "jeansblack"
/obj/item/clothing/under/pants/greyjeans
name = "grey jeans"
desc = "Only for those who can pull it off."
icon_state = "jeansgrey"
/obj/item/clothing/under/pants/youngfolksjeans
name = "Young Folks jeans"
name = "young folks jeans"
desc = "For those tired of boring old jeans. Relive the passion of your youth!"
icon_state = "jeansyoungfolks"
@@ -47,10 +55,21 @@
desc = "A pair of track pants, for the athletic."
icon_state = "trackpants"
/obj/item/clothing/under/pants/jeans
name = "jeans"
desc = "A nondescript pair of tough blue jeans."
icon_state = "jeans"
/obj/item/clothing/under/pants/track/blue
name = "blue track pants"
icon_state = "trackpantsblue"
/obj/item/clothing/under/pants/track/green
name = "green track pants"
icon_state = "trackpantsgreen"
/obj/item/clothing/under/pants/track/white
name = "white track pants"
icon_state = "trackpantswhite"
/obj/item/clothing/under/pants/track/red
name = "red track pants"
icon_state = "trackpantsred"
/obj/item/clothing/under/pants/khaki
name = "khaki pants"
@@ -60,4 +79,71 @@
/obj/item/clothing/under/pants/camo
name = "camo pants"
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
icon_state = "camopants"
icon_state = "camopants"
//Baggy Pants//
/obj/item/clothing/under/pants/baggy
name = "baggy jeans"
desc = "A nondescript pair of tough baggy blue jeans."
icon_state = "baggy_jeans"
/obj/item/clothing/under/pants/baggy/classicjeans
name = "baggy classic jeans"
desc = "You feel cooler already."
icon_state = "baggy_jeansclassic"
/obj/item/clothing/under/pants/baggy/mustangjeans
name = "maggy must hang jeans"
desc = "Made in the finest space jeans factory this side of Alpha Centauri."
icon_state = "baggy_jeansmustang"
/obj/item/clothing/under/pants/baggy/blackjeans
name = "baggy black jeans"
desc = "Only for those who can pull it off."
icon_state = "baggy_jeansblack"
/obj/item/clothing/under/pants/baggy/greyjeans
name = "baggy grey jeans"
desc = "Only for those who can pull it off."
icon_state = "baggy_jeansgrey"
/obj/item/clothing/under/pants/baggy/youngfolksjeans
name = "baggy young folks jeans"
desc = "For those tired of boring old jeans. Relive the passion of your youth!"
icon_state = "baggy_jeansyoungfolks"
/obj/item/clothing/under/pants/baggy/white
name = "baggy white pants"
desc = "Plain white pants. Boring."
icon_state = "baggy_whitepants"
/obj/item/clothing/under/pants/baggy/red
name = "baggy red pants"
desc = "Bright red pants. Overflowing with personality."
icon_state = "baggy_redpants"
/obj/item/clothing/under/pants/baggy/black
name = "baggy black pants"
desc = "These pants are dark, like your soul."
icon_state = "baggy_blackpants"
/obj/item/clothing/under/pants/baggy/tan
name = "baggy tan pants"
desc = "Some tan pants. You look like a white collar worker with these on."
icon_state = "baggy_tanpants"
/obj/item/clothing/under/pants/baggy/track
name = "baggy track pants"
desc = "A pair of track pants, for the athletic."
icon_state = "baggy_trackpants"
/obj/item/clothing/under/pants/baggy/khaki
name = "baggy khaki pants"
desc = "A pair of dust beige khaki pants."
icon_state = "baggy_khaki"
/obj/item/clothing/under/pants/baggy/camo
name = "baggy camo pants"
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
icon_state = "baggy_camopants"
+170
View File
@@ -36,6 +36,7 @@
worn_state = "jeans_shorts"
/obj/item/clothing/under/shorts/jeans/female
name = "jeans short shorts"
icon_state = "jeans_shorts_f"
worn_state = "jeans_shorts_f"
@@ -45,6 +46,7 @@
worn_state = "jeansclassic_shorts"
/obj/item/clothing/under/shorts/jeans/classic/female
name = "classic jeans short shorts"
icon_state = "jeansclassic_shorts_f"
worn_state = "jeansclassic_shorts_f"
@@ -54,6 +56,7 @@
worn_state = "jeansmustang_shorts"
/obj/item/clothing/under/shorts/jeans/mustang/female
name = "mustang jeans short shorts"
icon_state = "jeansmustang_shorts_f"
worn_state = "jeansmustang_shorts_f"
@@ -63,6 +66,7 @@
worn_state = "jeansyoungfolks_shorts"
/obj/item/clothing/under/shorts/jeans/youngfolks/female
name = "young folks jeans short shorts"
icon_state = "jeansyoungfolks_shorts_f"
worn_state = "jeansyoungfolks_shorts_f"
@@ -72,9 +76,20 @@
worn_state = "blackpants_shorts"
/obj/item/clothing/under/shorts/jeans/black/female
name = "black jeans short shorts"
icon_state = "black_shorts_f"
worn_state = "black_shorts_f"
/obj/item/clothing/under/shorts/jeans/grey
name = "grey jeans shorts"
icon_state = "greypants_shorts"
worn_state = "greypants_shorts"
/obj/item/clothing/under/shorts/jeans/grey/female
name = "grey jeans short shorts"
icon_state = "grey_shorts_f"
worn_state = "grey_shorts_f"
/obj/item/clothing/under/shorts/khaki
name = "khaki shorts"
desc = "For that island getaway. It's five o'clock somewhere, right?"
@@ -82,5 +97,160 @@
worn_state = "tanpants_shorts"
/obj/item/clothing/under/shorts/khaki/female
name = "khaki short shorts"
icon_state = "khaki_shorts_f"
worn_state = "khaki_shorts_f"
//Argh, skirts be below this line -> ------------------------------
/obj/item/clothing/under/skirt
name = "black skirt"
desc = "A black skirt, very fancy!"
icon_state = "blackskirt"
item_state = "bl_suit"
worn_state = "blackskirt"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
rolled_sleeves = -1
/obj/item/clothing/under/skirt/khaki
name = "khaki skirt"
desc = "A skirt that is a khaki color."
icon_state = "skirt_khaki"
worn_state = "skirt_khaki"
/obj/item/clothing/under/skirt/black
name = "short black skirt"
desc = "A skirt that is a shiny black."
icon_state = "skirt_short_black"
worn_state = "skirt_short_black"
/obj/item/clothing/under/skirt/blue
name = "short blue skirt"
desc = "A skirt that is a shiny blue."
icon_state = "skirt_short_blue"
worn_state = "skirt_short_blue"
/obj/item/clothing/under/skirt/red
name = "short red skirt"
desc = "A skirt that is a shiny red."
icon_state = "skirt_short_red"
worn_state = "skirt_short_red"
/obj/item/clothing/under/skirt/swept
name = "swept skirt"
desc = "A skirt that is swept to one side."
icon_state = "skirt_swept"
worn_state = "skirt_swept"
/obj/item/clothing/under/skirt/plaid_blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
icon_state = "plaid_blue"
worn_state = "plaid_blue"
/obj/item/clothing/under/skirt/plaid_red
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
icon_state = "plaid_red"
item_state = "kilt"
worn_state = "plaid_red"
/obj/item/clothing/under/skirt/plaid_purple
name = "blue purple skirt"
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"
item_state = "kilt"
worn_state = "plaid_purple"
/obj/item/clothing/under/rank/cargo/skirt
name = "quartermaster's jumpskirt"
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
icon_state = "qmf"
worn_state = "qmf"
/obj/item/clothing/under/rank/cargotech/skirt
name = "cargo technician's jumpskirt"
desc = "Skirrrrrts! They're comfy and easy to wear!"
icon_state = "cargof"
worn_state = "cargof"
/obj/item/clothing/under/rank/engineer/skirt
desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
name = "engineer's jumpskirt"
icon_state = "enginef"
worn_state = "enginef"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
/obj/item/clothing/under/rank/engineer/chief_engineer/skirt
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
name = "chief engineer's jumpskirt"
icon_state = "chieff"
worn_state = "chieff"
/obj/item/clothing/under/rank/engineer/atmospheric_technician/skirt
desc = "It's a jumpskirt worn by atmospheric technicians."
name = "atmospheric technician's jumpskirt"
icon_state = "atmosf"
worn_state = "atmosf"
/obj/item/clothing/under/rank/roboticist/skirt
desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
name = "roboticist's jumpskirt"
icon_state = "roboticsf"
worn_state = "roboticsf"
/obj/item/clothing/under/rank/scientist/skirt
name = "scientist's jumpskirt"
icon_state = "sciencewhitef"
worn_state = "sciencewhitef"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
/obj/item/clothing/under/rank/medical/skirt
name = "medical doctor's jumpskirt"
icon_state = "medicalf"
worn_state = "medicalf"
/obj/item/clothing/under/rank/medical/chemist/skirt
name = "chemist's jumpskirt"
icon_state = "chemistrywhitef"
worn_state = "chemistrywhitef"
/obj/item/clothing/under/rank/medical/chief_medical_officer/skirt
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
name = "chief medical officer's jumpskirt"
icon_state = "cmof"
worn_state = "cmof"
/obj/item/clothing/under/rank/medical/geneticist/skirt
name = "geneticist's jumpskirt"
icon_state = "geneticswhitef"
worn_state = "geneticswhitef"
/obj/item/clothing/under/rank/medical/virologist/skirt
name = "virologist's jumpskirt"
icon_state = "virologywhitef"
worn_state = "virologywhitef"
/obj/item/clothing/under/rank/security/skirt
name = "security officer's jumpskirt"
desc = "Standard feminine fashion for Security Officers. It's made of sturdier material than the standard jumpskirts."
icon_state = "secredf"
item_state = "r_suit"
worn_state = "secredf"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
/obj/item/clothing/under/rank/security/warden/skirt
desc = "Standard feminine fashion for a Warden. It is made of sturdier material than standard jumpskirts. It has the word \"Warden\" written on the shoulders."
name = "warden's jumpskirt"
icon_state = "wardenf"
item_state = "r_suit"
worn_state = "wardenf"
/obj/item/clothing/under/rank/security/head_of_security/skirt
desc = "It's a fashionable jumpskirt worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer."
name = "head of security's jumpskirt"
icon_state = "hosredf"
item_state = "r_suit"
worn_state = "hosredf"
+2 -2
View File
@@ -11,9 +11,9 @@
/obj/item/clothing/under/syndicate/combat //ERT tactleneck
name = "combat turtleneck"
desc = "It's some non-descript, slightly suspicious looking, civilian clothing."
icon_state = "syndicate"
icon_state = "combat"
item_state = "bl_suit"
worn_state = "syndicate"
worn_state = "combat"
has_sensor = 1
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
+3 -3
View File
@@ -75,7 +75,7 @@
K.new_icon_file = CUSTOM_ITEM_OBJ
if(istype(item, /obj/item/device/kit/paint))
var/obj/item/device/kit/paint/kit = item
kit.allowed_types = text2list(additional_data, ", ")
kit.allowed_types = splittext(additional_data, ", ")
else if(istype(item, /obj/item/device/kit/suit))
var/obj/item/device/kit/suit/kit = item
kit.new_light_overlay = additional_data
@@ -130,7 +130,7 @@
/hook/startup/proc/load_custom_items()
var/datum/custom_item/current_data
for(var/line in text2list(file2text("config/custom_items.txt"), "\n"))
for(var/line in splittext(file2text("config/custom_items.txt"), "\n"))
line = trim(line)
if(line == "" || !line || findtext(line, "#", 1, 2))
@@ -173,7 +173,7 @@
if("req_access")
current_data.req_access = text2num(field_data)
if("req_titles")
current_data.req_titles = text2list(field_data,", ")
current_data.req_titles = splittext(field_data,", ")
if("kit_name")
current_data.kit_name = field_data
if("kit_desc")
@@ -6,6 +6,7 @@
icon_state = "dnaopen"
anchored = 1
density = 1
circuit = /obj/item/weapon/circuitboard/dna_analyzer
var/obj/item/weapon/forensics/swab/bloodsamp = null
var/closed = 0
@@ -15,6 +16,16 @@
var/last_process_worldtime = 0
var/report_num = 0
/obj/machinery/dnaforensics/New()
circuit = new circuit(src)
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
RefreshParts()
..()
/obj/machinery/dnaforensics/attackby(var/obj/item/W, mob/user as mob)
if(bloodsamp)
@@ -22,7 +33,13 @@
return
if(closed)
user << "<span class='warning'>Open the cover before inserting the sample.</span>"
if(!scanning)
if(default_deconstruction_screwdriver(user, W))
return
if(default_deconstruction_crowbar(user, W))
return
else
user << "<span class='warning'>Open the cover before inserting the sample.</span>"
return
var/obj/item/weapon/forensics/swab/swab = W
@@ -15,7 +15,7 @@
var/mob/living/carbon/human/user = usr
if (!(user.l_hand == src || user.r_hand == src))
if(!user.item_is_in_hands(src))
return //bag must be in your hands to use
if (isturf(I.loc))
@@ -31,10 +31,8 @@
var/obj/item/weapon/storage/U = I.loc
user.client.screen -= I
U.contents.Remove(I)
else if(user.l_hand == I) //in a hand
user.drop_l_hand()
else if(user.r_hand == I) //in a hand
user.drop_r_hand()
else if(user.item_is_in_hands(I))
user.drop_from_inventory(I)
else
return
+14 -5
View File
@@ -49,7 +49,7 @@
if(!on_fire && istype(W, /obj/item/weapon/flame))
var/obj/item/weapon/flame/F = W
if(F.lit)
ignite()
src.ignite()
if(on_fire)
visible_message("<span class='warning'>\The [user] lights [src] with [W].</span>")
else
@@ -151,15 +151,21 @@
/obj/item/weapon/reagent_containers/glass/rag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature >= 50 + T0C)
ignite()
src.ignite()
if(exposed_temperature >= 900 + T0C)
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
//rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel.
//maybe generalize flammable reagents someday
//rag must have a minimum of 2 units welder fuel or ehtanol based reagents and at least 80% of the reagents must so.
/obj/item/weapon/reagent_containers/glass/rag/proc/can_ignite()
var/fuel = reagents.get_reagent_amount("fuel")
var/fuel
if(reagents.get_reagent_amount("fuel"))
fuel += reagents.get_reagent_amount("fuel")
else
for(var/datum/reagent/ethanol/R in reagents.reagent_list)
fuel += reagents.get_reagent_amount(R.id)
return (fuel >= 2 && fuel >= reagents.total_volume*0.8)
/obj/item/weapon/reagent_containers/glass/rag/proc/ignite()
@@ -217,5 +223,8 @@
return
reagents.remove_reagent("fuel", reagents.maximum_volume/25)
for(var/datum/reagent/ethanol/R in reagents.reagent_list)
if(istype(R, /datum/reagent/ethanol))
reagents.remove_reagent(R.id, reagents.maximum_volume/25)
update_name()
burn_time--
+5 -3
View File
@@ -8,16 +8,18 @@
/obj/item/weapon/storage/box/swabs/New()
..()
for(var/i=0;i<storage_slots,i++) // Fill 'er up.
for(var/i = 1 to storage_slots) // Fill 'er up.
new /obj/item/weapon/forensics/swab(src)
/obj/item/weapon/storage/box/evidence
name = "evidence bag box"
desc = "A box claiming to contain evidence bags."
storage_slots = 7
can_hold = list(/obj/item/weapon/evidencebag)
/obj/item/weapon/storage/box/evidence/New()
..()
for(var/i=0;i<storage_slots,i++)
for(var/i = 1 to storage_slots)
new /obj/item/weapon/evidencebag(src)
/obj/item/weapon/storage/box/fingerprints
@@ -30,5 +32,5 @@
/obj/item/weapon/storage/box/fingerprints/New()
..()
for(var/i=0;i<storage_slots,i++)
for(var/i = 1 to storage_slots)
new /obj/item/weapon/sample/print(src)
+20
View File
@@ -22,6 +22,7 @@ log transactions
anchored = 1
use_power = 1
idle_power_usage = 10
circuit = /obj/item/weapon/circuitboard/atm
var/datum/money_account/authenticated_account
var/number_incorrect_tries = 0
var/previous_account_number = 0
@@ -79,6 +80,25 @@ log transactions
return 1
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
user << "<span class='notice'>You start disconnecting the monitor.</span>"
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.frame_type = "atm"
A.pixel_x = pixel_x
A.pixel_y = pixel_y
A.circuit = M
A.anchored = 1
for (var/obj/C in src)
C.forceMove(loc)
user << "<span class='notice'>You disconnect the monitor.</span>"
A.state = 4
A.icon_state = "atm_4"
M.deconstruct(src)
qdel(src)
return
if(istype(I, /obj/item/weapon/card))
if(emagged > 0)
//prevent inserting id into an emagged ATM
+1 -1
View File
@@ -52,7 +52,7 @@
affected_dest.temp_price_change[good_type] = rand(1,100) / 100
/datum/event/economic_event/announce()
var/author = "The Vir Times"
var/author = "The "+starsys_name+" Times"
var/channel = author
//see if our location has custom event info for this event

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