mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-27 06:00:23 +01:00
Merge branch 'master' into upstream-merge-7788
This commit is contained in:
@@ -407,7 +407,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed story to Network.</B></FONT><HR><BR>"
|
||||
if(src.admincaster_feed_channel.channel_name=="")
|
||||
dat+="<FONT COLOR='maroon'>Invalid receiving channel name.</FONT><BR>"
|
||||
if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]")
|
||||
if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]" || admincaster_feed_message.title == "")
|
||||
dat+="<FONT COLOR='maroon'>Invalid message body.</FONT><BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[3]'>Return</A><BR>"
|
||||
if(7)
|
||||
@@ -436,11 +436,14 @@ proc/admin_notice(var/message, var/rights)
|
||||
var/i = 0
|
||||
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
|
||||
i++
|
||||
dat+="-[MESSAGE.body] <BR>"
|
||||
//dat+="-[MESSAGE.body] <BR>"
|
||||
var/pic_data
|
||||
if(MESSAGE.img)
|
||||
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
|
||||
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
|
||||
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
|
||||
pic_data+="<img src='tmp_photo[i].png' width = '180'><BR>"
|
||||
dat+= get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author,"#d4cec1", pic_data)
|
||||
dat+="<BR>"
|
||||
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author] - [MESSAGE.time_stamp]</FONT>\]</FONT><BR>"
|
||||
dat+={"
|
||||
<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
|
||||
<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>
|
||||
@@ -946,7 +949,7 @@ var/datum/announcement/minor/admin_min_announcer = new
|
||||
log_admin("[key_name(usr)] toggled persistence to [config.persistence_disabled ? "Off" : "On"].")
|
||||
world.update_status()
|
||||
feedback_add_details("admin_verb","TPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/datum/admins/proc/togglemaploadpersistence()
|
||||
set category = "Server"
|
||||
set desc="Whether mapload persistent data will be saved from now on."
|
||||
@@ -1424,6 +1427,11 @@ var/datum/announcement/minor/admin_min_announcer = new
|
||||
return 1
|
||||
if(tomob.client) //No need to ghostize if there is no client
|
||||
tomob.ghostize(0)
|
||||
if(frommob.mind && frommob.mind.current) //Preserve teleop for original body when adminghosting.
|
||||
var/mob/body = frommob.mind.current
|
||||
if(body)
|
||||
if(body.teleop)
|
||||
body.teleop = tomob
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].</span>")
|
||||
log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].")
|
||||
feedback_add_details("admin_verb","CGD")
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
if(!message) return
|
||||
var/F = investigate_subject2file(subject)
|
||||
if(!F) return
|
||||
to_chat(F, "<span class='filter_adminlog'><small>[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z])</small> || [src] [message]<br></span>")
|
||||
to_file(F, "<span class='filter_adminlog'><small>[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z])</small> || [src] [message]<br></span>")
|
||||
|
||||
//ADMINVERBS
|
||||
/client/proc/investigate_show( subject in list("hrefs","notes","singulo","telesci") )
|
||||
|
||||
@@ -57,9 +57,4 @@
|
||||
onclose(usr, "admin_dialogue_log")
|
||||
|
||||
|
||||
feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
// Used to get `atom/O as obj|mob|turf in view()` to match against strings containing apostrophes immediately after substrings that match to other objects. Somehow. - Ater
|
||||
/proc/admin_atom_validate(atom/A)
|
||||
return view()
|
||||
feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -60,6 +60,7 @@ var/list/admin_verbs_admin = list(
|
||||
/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/shuttle_panel, // Allows controlling all shuttles remotely.
|
||||
/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,
|
||||
@@ -104,7 +105,6 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/toggle_attack_logs,
|
||||
/datum/admins/proc/paralyze_mob,
|
||||
/client/proc/fixatmos,
|
||||
/datum/admins/proc/quick_nif, //VOREStation Add,
|
||||
/datum/admins/proc/sendFax,
|
||||
/client/proc/despawn_player,
|
||||
/datum/admins/proc/view_feedback
|
||||
@@ -139,7 +139,6 @@ var/list/admin_verbs_fun = list(
|
||||
/datum/admins/proc/call_supply_drop,
|
||||
/datum/admins/proc/call_drop_pod,
|
||||
/client/proc/smite,
|
||||
/client/proc/smite_vr, //VOREStation Add,
|
||||
/client/proc/admin_lightning_strike,
|
||||
)
|
||||
|
||||
@@ -150,7 +149,6 @@ var/list/admin_verbs_spawn = list(
|
||||
/datum/admins/proc/spawn_plant,
|
||||
/datum/admins/proc/spawn_atom, //allows us to spawn instances,
|
||||
/client/proc/respawn_character,
|
||||
/client/proc/spawn_character_mob, //VOREStation Add,
|
||||
/client/proc/virus2_editor,
|
||||
/client/proc/spawn_chemdisp_cartridge,
|
||||
/client/proc/map_template_load,
|
||||
@@ -181,6 +179,7 @@ var/list/admin_verbs_server = list(
|
||||
/datum/admins/proc/toggle_space_ninja,
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/check_customitem_activity,
|
||||
/client/proc/nanomapgen_DumpImage,
|
||||
/client/proc/modify_server_news,
|
||||
/client/proc/recipe_dump,
|
||||
/client/proc/panicbunker,
|
||||
@@ -228,7 +227,7 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/datum/admins/proc/view_runtimes,
|
||||
// /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet.
|
||||
/client/proc/show_gm_status,
|
||||
/datum/admins/proc/change_weather,
|
||||
/datum/admins/proc/change_time,
|
||||
/client/proc/admin_give_modifier,
|
||||
@@ -403,7 +402,7 @@ var/list/admin_verbs_event_manager = list(
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/debug_controller,
|
||||
// /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet.
|
||||
/client/proc/show_gm_status,
|
||||
/datum/admins/proc/change_weather,
|
||||
/datum/admins/proc/change_time,
|
||||
/client/proc/admin_give_modifier,
|
||||
@@ -446,6 +445,7 @@ var/list/admin_verbs_event_manager = list(
|
||||
/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/shuttle_panel, // Allows controlling all shuttles remotely.
|
||||
/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,
|
||||
|
||||
@@ -0,0 +1,575 @@
|
||||
//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, //VOREStation Remove,
|
||||
// /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Remove,
|
||||
// /client/proc/player_panel, //VOREStation Remove,
|
||||
/client/proc/deadmin_self, //destroys our own admin datum so we can play as a regular player,
|
||||
/client/proc/cmd_admin_say, //VOREStation Add,
|
||||
/client/proc/cmd_mod_say, //VOREStation Add,
|
||||
/client/proc/cmd_event_say, //VOREStation Add,
|
||||
// /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Remove,
|
||||
// /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Remove,
|
||||
// /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Remove,
|
||||
// /client/proc/mark_datum_mapview, //VOREStation Remove,
|
||||
// /client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Remove,
|
||||
// /client/proc/check_antagonists, //shows all antags,
|
||||
// /client/proc/cmd_mod_say,
|
||||
// /client/proc/deadchat //toggles deadchat on/off,
|
||||
// /client/proc/toggle_ahelp_sound,
|
||||
)
|
||||
|
||||
var/list/admin_verbs_admin = list(
|
||||
/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.,
|
||||
/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.,
|
||||
/datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement,
|
||||
/datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange,
|
||||
/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,
|
||||
/datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add,
|
||||
/client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add,
|
||||
/client/proc/player_panel, //VOREStation Add,
|
||||
/client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add,
|
||||
/client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add,
|
||||
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add,
|
||||
/client/proc/mark_datum_mapview, //VOREStation Add,
|
||||
/client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add,
|
||||
/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,
|
||||
/client/proc/cmd_admin_check_player_logs, //checks a player's attack logs,
|
||||
/client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs,
|
||||
/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 CentCom,
|
||||
/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_z_narrate, //VOREStation Add,
|
||||
/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_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/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,
|
||||
/client/proc/cmd_mod_say,
|
||||
/client/proc/cmd_event_say,
|
||||
/datum/admins/proc/PlayerNotes,
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/free_slot, //frees slot for chosen job,
|
||||
/client/proc/cmd_admin_change_custom_event,
|
||||
/client/proc/cmd_admin_rejuvenate,
|
||||
/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/trader_ship, // Trader ship admin verb,
|
||||
/client/proc/toggle_antagHUD_use,
|
||||
/client/proc/toggle_antagHUD_restrictions,
|
||||
/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_security_level,
|
||||
/client/proc/view_chemical_reaction_logs,
|
||||
/client/proc/makePAI,
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/toggle_attack_logs,
|
||||
/datum/admins/proc/paralyze_mob,
|
||||
/client/proc/fixatmos,
|
||||
/datum/admins/proc/quick_nif, //VOREStation Add,
|
||||
/datum/admins/proc/set_uplink, //VOREStation Add,
|
||||
/datum/admins/proc/sendFax,
|
||||
/client/proc/despawn_player,
|
||||
/datum/admins/proc/view_feedback
|
||||
)
|
||||
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
/client/proc/jobbans
|
||||
)
|
||||
|
||||
var/list/admin_verbs_sounds = list(
|
||||
/client/proc/play_local_sound,
|
||||
/client/proc/play_sound,
|
||||
/client/proc/play_server_sound
|
||||
)
|
||||
|
||||
var/list/admin_verbs_fun = list(
|
||||
/client/proc/object_talk,
|
||||
/datum/admins/proc/cmd_admin_dress,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
/client/proc/everyone_random,
|
||||
/client/proc/cinematic,
|
||||
/datum/admins/proc/toggle_aliens,
|
||||
/datum/admins/proc/toggle_space_ninja,
|
||||
/client/proc/cmd_admin_add_freeform_ai_law,
|
||||
/client/proc/cmd_admin_add_random_ai_law,
|
||||
/client/proc/make_sound,
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/editappear,
|
||||
/client/proc/roll_dices,
|
||||
/datum/admins/proc/call_supply_drop,
|
||||
/datum/admins/proc/call_drop_pod,
|
||||
/client/proc/smite,
|
||||
/client/proc/smite_vr, //VOREStation Add,
|
||||
/client/proc/admin_lightning_strike,
|
||||
)
|
||||
|
||||
var/list/admin_verbs_spawn = list(
|
||||
/datum/admins/proc/spawn_fruit,
|
||||
/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,
|
||||
/client/proc/respawn_character,
|
||||
/client/proc/spawn_character_mob, //VOREStation Add,
|
||||
/client/proc/virus2_editor,
|
||||
/client/proc/spawn_chemdisp_cartridge,
|
||||
/client/proc/map_template_load,
|
||||
/client/proc/map_template_upload,
|
||||
/client/proc/map_template_load_on_new_z
|
||||
)
|
||||
|
||||
var/list/admin_verbs_server = list(
|
||||
/datum/admins/proc/capture_map,
|
||||
/client/proc/Set_Holiday,
|
||||
/client/proc/ToRban,
|
||||
/datum/admins/proc/startnow,
|
||||
/datum/admins/proc/restart,
|
||||
/datum/admins/proc/delay,
|
||||
/datum/admins/proc/toggleaban,
|
||||
/datum/admins/proc/togglepersistence,
|
||||
/client/proc/cmd_mod_say,
|
||||
/client/proc/toggle_log_hrefs,
|
||||
/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_debug_del_all,
|
||||
/datum/admins/proc/adrev,
|
||||
/datum/admins/proc/adspawn,
|
||||
/datum/admins/proc/adjump,
|
||||
/datum/admins/proc/toggle_aliens,
|
||||
/datum/admins/proc/toggle_space_ninja,
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/check_customitem_activity,
|
||||
/client/proc/modify_server_news,
|
||||
/client/proc/recipe_dump,
|
||||
/client/proc/panicbunker,
|
||||
/client/proc/paranoia_logging,
|
||||
/client/proc/ip_reputation
|
||||
)
|
||||
|
||||
var/list/admin_verbs_debug = list(
|
||||
/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,
|
||||
/client/proc/ZASSettings,
|
||||
/client/proc/cmd_debug_make_powernets,
|
||||
/client/proc/kill_airgroup,
|
||||
/client/proc/debug_controller,
|
||||
/client/proc/debug_antagonist_template,
|
||||
/client/proc/cmd_debug_mob_lists,
|
||||
/client/proc/cmd_debug_using_map,
|
||||
/client/proc/cmd_admin_delete,
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/cmd_debug_tog_aliens,
|
||||
/client/proc/cmd_display_del_log,
|
||||
/client/proc/cmd_display_init_log,
|
||||
/client/proc/cmd_display_overlay_log,
|
||||
/client/proc/air_report,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/reload_eventMs,
|
||||
/client/proc/restart_controller,
|
||||
/datum/admins/proc/restart,
|
||||
/client/proc/print_random_map,
|
||||
/client/proc/create_random_map,
|
||||
/client/proc/apply_random_map,
|
||||
/client/proc/overlay_random_map,
|
||||
/client/proc/delete_random_map,
|
||||
/client/proc/show_plant_genes,
|
||||
/client/proc/enable_debug_verbs,
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/SDQL2_query,
|
||||
/client/proc/Jump,
|
||||
/client/proc/jumptomob,
|
||||
/client/proc/jumptocoord,
|
||||
/client/proc/dsay,
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add,
|
||||
/client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add,
|
||||
/client/proc/player_panel, //VOREStation Add,
|
||||
/client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add,
|
||||
/client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add,
|
||||
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add,
|
||||
/client/proc/mark_datum_mapview, //VOREStation Add,
|
||||
/client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add,
|
||||
/datum/admins/proc/view_runtimes,
|
||||
// /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet.
|
||||
/datum/admins/proc/set_uplink, //VOREStation Add,
|
||||
/datum/admins/proc/change_weather,
|
||||
/datum/admins/proc/change_time,
|
||||
/client/proc/admin_give_modifier,
|
||||
/client/proc/simple_DPS,
|
||||
/datum/admins/proc/view_feedback
|
||||
)
|
||||
|
||||
var/list/admin_verbs_paranoid_debug = list(
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/debug_controller
|
||||
)
|
||||
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
/proc/release
|
||||
)
|
||||
var/list/admin_verbs_permissions = list(
|
||||
/client/proc/edit_admin_permissions
|
||||
)
|
||||
var/list/admin_verbs_rejuv = list(
|
||||
/client/proc/respawn_character
|
||||
)
|
||||
|
||||
//verbs which can be hidden - needs work
|
||||
var/list/admin_verbs_hideable = list(
|
||||
/client/proc/deadmin_self,
|
||||
// /client/proc/deadchat,
|
||||
/datum/admins/proc/show_traitor_panel,
|
||||
/datum/admins/proc/toggleenter,
|
||||
/datum/admins/proc/toggleguests,
|
||||
/datum/admins/proc/announce,
|
||||
/client/proc/colorooc,
|
||||
/client/proc/admin_ghost,
|
||||
/client/proc/toggle_view_range,
|
||||
/datum/admins/proc/view_txt_log,
|
||||
/datum/admins/proc/view_atk_log,
|
||||
/client/proc/cmd_admin_subtle_message,
|
||||
/client/proc/cmd_admin_check_contents,
|
||||
/client/proc/cmd_admin_check_player_logs,
|
||||
/client/proc/cmd_admin_check_dialogue_logs,
|
||||
/datum/admins/proc/access_news_network,
|
||||
/client/proc/admin_call_shuttle,
|
||||
/client/proc/admin_cancel_shuttle,
|
||||
/client/proc/cmd_admin_direct_narrate,
|
||||
/client/proc/cmd_admin_world_narrate,
|
||||
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
|
||||
/client/proc/check_words,
|
||||
/client/proc/play_local_sound,
|
||||
/client/proc/play_sound,
|
||||
/client/proc/play_server_sound,
|
||||
/client/proc/object_talk,
|
||||
/datum/admins/proc/cmd_admin_dress,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
/client/proc/cinematic,
|
||||
/datum/admins/proc/toggle_aliens,
|
||||
/datum/admins/proc/toggle_space_ninja,
|
||||
/client/proc/cmd_admin_add_freeform_ai_law,
|
||||
/client/proc/cmd_admin_add_random_ai_law,
|
||||
/client/proc/cmd_admin_create_centcom_report,
|
||||
/client/proc/make_sound,
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/cmd_admin_add_random_ai_law,
|
||||
/client/proc/Set_Holiday,
|
||||
/client/proc/ToRban,
|
||||
/datum/admins/proc/startnow,
|
||||
/datum/admins/proc/restart,
|
||||
/datum/admins/proc/delay,
|
||||
/datum/admins/proc/toggleaban,
|
||||
/client/proc/toggle_log_hrefs,
|
||||
/datum/admins/proc/immreboot,
|
||||
/client/proc/everyone_random,
|
||||
/datum/admins/proc/toggleAI,
|
||||
/datum/admins/proc/adrev,
|
||||
/datum/admins/proc/adspawn,
|
||||
/datum/admins/proc/adjump,
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/Debug2,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/kill_air,
|
||||
/client/proc/cmd_debug_make_powernets,
|
||||
/client/proc/kill_airgroup,
|
||||
/client/proc/debug_controller,
|
||||
/client/proc/startSinglo,
|
||||
/client/proc/simple_DPS,
|
||||
/client/proc/cmd_debug_mob_lists,
|
||||
/client/proc/cmd_debug_using_map,
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/cmd_debug_tog_aliens,
|
||||
/client/proc/cmd_display_del_log,
|
||||
/client/proc/air_report,
|
||||
/client/proc/enable_debug_verbs,
|
||||
/client/proc/roll_dices,
|
||||
/proc/possess,
|
||||
/proc/release,
|
||||
/datum/admins/proc/set_uplink, //VOREStation Add,
|
||||
/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.,
|
||||
/datum/admins/proc/PlayerNotes,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add,
|
||||
/client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add,
|
||||
/client/proc/player_panel, //VOREStation Add,
|
||||
/client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add,
|
||||
/client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add,
|
||||
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add,
|
||||
/client/proc/mark_datum_mapview, //VOREStation Add,
|
||||
/client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add,
|
||||
/client/proc/cmd_mod_say,
|
||||
/client/proc/cmd_event_say,
|
||||
/datum/admins/proc/show_player_info,
|
||||
/datum/admins/proc/show_traitor_panel,
|
||||
/client/proc/colorooc,
|
||||
/client/proc/player_panel_new,
|
||||
/client/proc/dsay,
|
||||
/datum/admins/proc/show_skills,
|
||||
/datum/admins/proc/show_player_panel,
|
||||
/client/proc/check_antagonists,
|
||||
/client/proc/aooc,
|
||||
/client/proc/jobbans,
|
||||
/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/cmd_admin_z_narrate, //VOREStation Add,
|
||||
/client/proc/allow_character_respawn, // Allows a ghost to respawn ,
|
||||
/datum/admins/proc/sendFax,
|
||||
/client/proc/getserverlog, //allows us to fetch server logs (diary) for other days,
|
||||
/datum/admins/proc/view_persistent_data,
|
||||
/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,
|
||||
)
|
||||
|
||||
var/list/admin_verbs_event_manager = list(
|
||||
/client/proc/cmd_event_say,
|
||||
/client/proc/cmd_admin_pm_context,
|
||||
/client/proc/cmd_admin_pm_panel,
|
||||
/client/proc/admin_ghost,
|
||||
/datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add,
|
||||
/client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add,
|
||||
/client/proc/player_panel, //VOREStation Add,
|
||||
/client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add,
|
||||
/client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add,
|
||||
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add,
|
||||
/client/proc/mark_datum_mapview, //VOREStation Add,
|
||||
/client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add,
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/dsay,
|
||||
/client/proc/cmd_admin_subtle_message,
|
||||
/client/proc/debug_variables,
|
||||
/client/proc/check_antagonists,
|
||||
/client/proc/aooc,
|
||||
/datum/admins/proc/paralyze_mob,
|
||||
/client/proc/cmd_admin_direct_narrate,
|
||||
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
|
||||
/client/proc/allow_character_respawn,
|
||||
/datum/admins/proc/sendFax,
|
||||
/client/proc/respawn_character,
|
||||
/proc/possess,
|
||||
/proc/release,
|
||||
/datum/admins/proc/change_weather,
|
||||
/datum/admins/proc/change_time,
|
||||
/client/proc/admin_give_modifier,
|
||||
/client/proc/Jump,
|
||||
/client/proc/jumptomob,
|
||||
/client/proc/jumptocoord,
|
||||
/client/proc/cmd_admin_delete,
|
||||
/datum/admins/proc/delay,
|
||||
/client/proc/Set_Holiday,
|
||||
/client/proc/make_sound,
|
||||
/client/proc/toggle_random_events,
|
||||
/datum/admins/proc/cmd_admin_dress,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/client/proc/drop_bomb,
|
||||
/client/proc/cmd_admin_add_freeform_ai_law,
|
||||
/client/proc/cmd_admin_add_random_ai_law,
|
||||
/client/proc/make_sound,
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/editappear,
|
||||
/client/proc/roll_dices,
|
||||
/datum/admins/proc/call_supply_drop,
|
||||
/datum/admins/proc/call_drop_pod,
|
||||
/datum/admins/proc/PlayerNotes,
|
||||
/client/proc/callproc,
|
||||
/client/proc/callproc_datum,
|
||||
/client/proc/debug_controller,
|
||||
// /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet.
|
||||
/datum/admins/proc/change_weather,
|
||||
/datum/admins/proc/change_time,
|
||||
/client/proc/admin_give_modifier,
|
||||
/datum/admins/proc/cmd_admin_dress,
|
||||
/client/proc/cmd_admin_gib_self,
|
||||
/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.,
|
||||
/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/announce, //priority announce something to all clients.,
|
||||
/datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement,
|
||||
/datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange,
|
||||
/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,
|
||||
/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,
|
||||
/client/proc/cmd_admin_check_player_logs, //checks a player's attack logs,
|
||||
/client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs,
|
||||
/datum/admins/proc/access_news_network, //allows access of newscasters,
|
||||
/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/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 CentCom,
|
||||
/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_z_narrate, //VOREStation Add,
|
||||
/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_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/secrets,
|
||||
/client/proc/game_panel, //game panel, allows to change game-mode etc,
|
||||
/client/proc/cmd_mod_say,
|
||||
/client/proc/cmd_event_say,
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/free_slot, //frees slot for chosen job,
|
||||
/client/proc/cmd_admin_change_custom_event,
|
||||
/client/proc/cmd_admin_rejuvenate,
|
||||
/client/proc/toggleghostwriters,
|
||||
/datum/admins/proc/show_skills,
|
||||
/client/proc/man_up,
|
||||
/client/proc/global_man_up,
|
||||
/client/proc/response_team, // Response Teams admin verb,
|
||||
/client/proc/trader_ship, // Trader ship admin verb,
|
||||
/client/proc/allow_character_respawn, // Allows a ghost to respawn ,
|
||||
/client/proc/event_manager_panel,
|
||||
/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_security_level,
|
||||
/client/proc/makePAI,
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/toggle_attack_logs,
|
||||
/datum/admins/proc/paralyze_mob,
|
||||
/client/proc/fixatmos,
|
||||
/datum/admins/proc/sendFax,
|
||||
/client/proc/despawn_player,
|
||||
/datum/admins/proc/view_feedback,
|
||||
/datum/admins/proc/capture_map,
|
||||
/client/proc/Set_Holiday,
|
||||
/datum/admins/proc/startnow,
|
||||
/datum/admins/proc/restart,
|
||||
/datum/admins/proc/delay,
|
||||
/client/proc/cmd_mod_say,
|
||||
/datum/admins/proc/immreboot,
|
||||
/client/proc/everyone_random,
|
||||
/client/proc/cmd_admin_delete, //delete an instance/object/mob/etc,
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/modify_server_news
|
||||
|
||||
)
|
||||
|
||||
/client/proc/add_admin_verbs()
|
||||
if(holder)
|
||||
verbs += admin_verbs_default
|
||||
if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself
|
||||
if(holder.rights & R_ADMIN) verbs += admin_verbs_admin
|
||||
if(holder.rights & R_BAN) verbs += admin_verbs_ban
|
||||
if(holder.rights & R_FUN) verbs += admin_verbs_fun
|
||||
if(holder.rights & R_SERVER) verbs += admin_verbs_server
|
||||
if(holder.rights & R_DEBUG)
|
||||
verbs += admin_verbs_debug
|
||||
if(config.debugparanoid && !(holder.rights & R_ADMIN))
|
||||
verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on.
|
||||
if(holder.rights & R_POSSESS) verbs += admin_verbs_possess
|
||||
if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions
|
||||
if(holder.rights & R_STEALTH) verbs += /client/proc/stealth
|
||||
if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv
|
||||
if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds
|
||||
if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn
|
||||
if(holder.rights & R_MOD) verbs += admin_verbs_mod
|
||||
if(holder.rights & R_EVENT) verbs += admin_verbs_event_manager
|
||||
|
||||
/client/proc/remove_admin_verbs()
|
||||
verbs.Remove(
|
||||
admin_verbs_default,
|
||||
/client/proc/togglebuildmodeself,
|
||||
admin_verbs_admin,
|
||||
admin_verbs_ban,
|
||||
admin_verbs_fun,
|
||||
admin_verbs_server,
|
||||
admin_verbs_debug,
|
||||
admin_verbs_possess,
|
||||
admin_verbs_permissions,
|
||||
/client/proc/stealth,
|
||||
admin_verbs_rejuv,
|
||||
admin_verbs_sounds,
|
||||
admin_verbs_spawn,
|
||||
debug_verbs
|
||||
)
|
||||
@@ -437,6 +437,17 @@
|
||||
set_security_level(sec_level)
|
||||
log_admin("[key_name(usr)] changed the security level to code [sec_level].")
|
||||
|
||||
/client/proc/shuttle_panel()
|
||||
set name = "Shuttle Control Panel"
|
||||
set category = "Admin"
|
||||
|
||||
if(!check_rights(R_ADMIN | R_EVENT))
|
||||
return
|
||||
|
||||
var/datum/tgui_module/admin_shuttle_controller/A = new(src)
|
||||
A.tgui_interact(usr)
|
||||
log_and_message_admins("has opened the shuttle panel.")
|
||||
feedback_add_details("admin_verb","SHCP")
|
||||
|
||||
//---- bs12 verbs ----
|
||||
|
||||
@@ -525,4 +536,4 @@
|
||||
T.spell_list += new S
|
||||
feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].")
|
||||
message_admins("<font color='blue'>[key_name_admin(usr)] gave [key_name(T)] the spell [S].</font>", 1)
|
||||
message_admins("<font color='blue'>[key_name_admin(usr)] gave [key_name(T)] the spell [S].</font>", 1)
|
||||
@@ -0,0 +1,12 @@
|
||||
/datum/admins/proc/set_uplink(mob/living/carbon/human/H as mob)
|
||||
set category = "Debug"
|
||||
set name = "Set Uplink"
|
||||
set desc = "Allows admins to set up an uplink on a character. This will be required for a character to use telecrystals."
|
||||
set popup_menu = FALSE
|
||||
|
||||
if(check_rights(R_ADMIN|R_DEBUG))
|
||||
traitors.spawn_uplink(H)
|
||||
H.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
|
||||
H.mind.accept_tcrystals = 1
|
||||
else
|
||||
to_chat(usr, "You do not have access to this command.")
|
||||
@@ -1742,16 +1742,20 @@
|
||||
src.admincaster_feed_channel.channel_name = sanitizeSafe(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_set_new_title"])
|
||||
src.admincaster_feed_message.title = sanitize(input(usr, "Enter the Feed title", "Network Channel Handler", ""))
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_set_new_message"])
|
||||
src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", ""))
|
||||
src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message)
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["ac_submit_new_message"])
|
||||
if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" )
|
||||
if(src.admincaster_feed_message.body =="" || admincaster_feed_message.title == "" || admincaster_feed_message.body =="\[REDACTED\]" || admincaster_feed_channel.channel_name == "" )
|
||||
src.admincaster_screen = 6
|
||||
else
|
||||
feedback_inc("newscaster_stories",1)
|
||||
news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1)
|
||||
news_network.SubmitArticle(admincaster_feed_message.body, admincaster_signature, admincaster_feed_channel.channel_name, null, 1, "", admincaster_feed_message.title)
|
||||
src.admincaster_screen=4
|
||||
|
||||
log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!")
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
|
||||
log_adminsay(msg,src)
|
||||
|
||||
//VOREStation Edit Start - Adds R_EVENT
|
||||
//VOREStation Edit Start - Adds R_STEALTH
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(check_rights(R_ADMIN|R_EVENT))
|
||||
if(check_rights(R_ADMIN|R_STEALTH))
|
||||
to_chat(C, "<span class='admin_channel'>" + create_text_tag("admin", "ADMIN:", C) + " <span class='name'>[key_name(usr, 1)]</span>([admin_jump_link(mob, src)]): <span class='message'>[msg]</span></span>")
|
||||
//VOREStation Edit End
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
set name = "Msay"
|
||||
set hidden = 1
|
||||
|
||||
if(!check_rights(R_ADMIN|R_MOD|R_SERVER|R_EVENT)) //VOREStation Edit
|
||||
if(!check_rights(R_ADMIN|R_MOD|R_SERVER|R_STEALTH)) //VOREStation Edit
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
@@ -47,7 +47,7 @@
|
||||
set name = "Esay"
|
||||
set hidden = 1
|
||||
|
||||
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_EVENT))
|
||||
if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_STEALTH)) //VOREStation Edit
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
|
||||
@@ -92,15 +92,7 @@
|
||||
|
||||
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter")
|
||||
if (new_gender)
|
||||
if(new_gender == "Male")
|
||||
M.gender = MALE
|
||||
M.dna.SetUIState(DNA_UI_GENDER, FALSE)
|
||||
else if (new_gender == "Female")
|
||||
M.gender = FEMALE
|
||||
M.dna.SetUIState(DNA_UI_GENDER, TRUE)
|
||||
else
|
||||
M.gender = NEUTER
|
||||
M.dna.SetUIState(DNA_UI_GENDER, FALSE)
|
||||
M.set_gender(new_gender)
|
||||
|
||||
M.update_dna(M)
|
||||
M.update_hair(FALSE)
|
||||
|
||||
@@ -517,6 +517,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
new_character.mind.loaded_from_slot = picked_slot
|
||||
//VOREStation Add End
|
||||
|
||||
for(var/lang in picked_client.prefs.alternate_languages)
|
||||
var/datum/language/chosen_language = GLOB.all_languages[lang]
|
||||
if(chosen_language)
|
||||
if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
|
||||
new_character.add_language(lang)
|
||||
|
||||
//If desired, apply equipment.
|
||||
if(equipment)
|
||||
if(charjob)
|
||||
@@ -623,7 +629,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(src)] has created a command report", 1)
|
||||
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in admin_atom_validate(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater
|
||||
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in _validate_atom(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater
|
||||
set category = "Admin"
|
||||
set name = "Delete"
|
||||
|
||||
|
||||
@@ -71,4 +71,29 @@
|
||||
|
||||
feedback_add_details("admin_verb","SCAM") //heh
|
||||
|
||||
return new_mob
|
||||
return new_mob
|
||||
|
||||
/client/proc/cmd_admin_z_narrate() // Allows administrators to fluff events a little easier -- TLE
|
||||
set category = "Special Verbs"
|
||||
set name = "Z Narrate"
|
||||
set desc = "Narrates to your Z level."
|
||||
|
||||
if (!holder)
|
||||
return
|
||||
|
||||
var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text
|
||||
if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
|
||||
msg = sanitize(msg)
|
||||
|
||||
if (!msg)
|
||||
return
|
||||
|
||||
var/pos_z = get_z(src.mob)
|
||||
if (!pos_z)
|
||||
return
|
||||
for(var/mob/M in player_list)
|
||||
if(M.z == pos_z)
|
||||
to_chat(M, msg)
|
||||
log_admin("ZNarrate: [key_name(usr)] : [msg]")
|
||||
message_admins("<font color='blue'><B> ZNarrate: [key_name_admin(usr)] : [msg]<BR></B></font>", 1)
|
||||
feedback_add_details("admin_verb","GLNA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
// mob to stay still (e.g. delayed attacking). If you need the mob to be inactive for an extended period of time,
|
||||
// consider sleeping the AI instead.
|
||||
var/process_flags = 0 // Where we're processing, see flag defines.
|
||||
var/list/snapshot = null // A list used in mass-editing of AI datums, holding a snapshot of the 'before' state
|
||||
var/list/static/fastprocess_stances = list(
|
||||
STANCE_ALERT,
|
||||
STANCE_APPROACH,
|
||||
@@ -69,6 +70,143 @@
|
||||
hostile = TRUE
|
||||
retaliate = TRUE
|
||||
|
||||
/datum/ai_holder/vv_get_dropdown()
|
||||
. = ..()
|
||||
if(snapshot)
|
||||
VV_DROPDOWN_OPTION("mass_edit_finish", "End Mass Edit")
|
||||
else
|
||||
VV_DROPDOWN_OPTION("mass_edit_start", "Begin Mass Edit")
|
||||
|
||||
/datum/ai_holder/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
IF_VV_OPTION("mass_edit_start")
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
if(snapshot)
|
||||
to_chat(usr, "<span class='error'>Someone (or you) may have started a mass edit on this AI datum already. Refresh the VV window to get the option to end the mass edit instead.</span>")
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
return
|
||||
snapshot = vars.Copy() //'vars' appears to be special in that vars.Copy produces a flat list of keys with no values. It seems that 'vars[key]' is handled somewhere in the byond engine differently than normal lists.
|
||||
|
||||
// Remove things that may change without admin input during editing. If they aren't present in the snapshot, they aren't eligible for the diff.
|
||||
snapshot -= list(
|
||||
//other
|
||||
"datum_flags",
|
||||
"active_timers",
|
||||
//main
|
||||
"snapshot",
|
||||
"stance",
|
||||
"process_flags",
|
||||
//targeting
|
||||
"target",
|
||||
"preferred_target",
|
||||
"target_last_seen_turf",
|
||||
"attackers",
|
||||
"lose_target_time",
|
||||
//pathfinding
|
||||
"path",
|
||||
"obstacles",
|
||||
"failed_steps",
|
||||
//movement
|
||||
"destination",
|
||||
"failed_breakthroughs",
|
||||
"faction_friends",
|
||||
//communication
|
||||
"threatening",
|
||||
"last_conflict_time",
|
||||
"last_threaten_time",
|
||||
"last_target_time"
|
||||
)
|
||||
|
||||
for(var/key in snapshot)
|
||||
var/thing = vars[key]
|
||||
if(islist(thing)) // This is just too dangerous to do. Maybe in the future we can have a whitelist of lists that are fine to edit.
|
||||
thing = null
|
||||
snapshot[key] = thing
|
||||
|
||||
VARSET_IN(src, snapshot, null, 2 MINUTES) // Safety
|
||||
to_chat(usr, "<span class='notice'>Variable snapshot saved. Begin editing the datum, and end the mass edit from the dropdown menu within 2 minutes. Note that editing the contents of lists is not supported.</span>")
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
|
||||
IF_VV_OPTION("mass_edit_finish")
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/list/before = snapshot //This PROBABLY works, right?
|
||||
snapshot = null
|
||||
var/list/after = vars.Copy() //'vars' appears to be special in that vars.Copy produces a flat list of keys with no values. It seems that 'vars[key]' is handled somewhere in the byond engine differently than normal lists.
|
||||
after &= before //Ignore any dangerous keys. Not a big deal, because just 'before' being safe is enough to exclude the dangerous ones from the diff, but why not
|
||||
for(var/key in after)
|
||||
var/thing = vars[key]
|
||||
if(islist(thing)) // This is just too dangerous to do. Maybe in the future we can have a whitelist of lists that are fine to edit.
|
||||
thing = null
|
||||
after[key] = thing
|
||||
|
||||
var/list/diff = list()
|
||||
for(var/key in before)
|
||||
if(before[key] == after[key])
|
||||
continue
|
||||
diff += key
|
||||
|
||||
if(!diff.len)
|
||||
to_chat(usr, "<span class='warning'>You don't appear to have changed anything on the AI datum you were editing.</span>")
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
else
|
||||
var/message = "<span class='notice'>These differences were detected in your varedit. If you notice any that you didn't change, please redo your edit:<br>"
|
||||
for(var/key in diff)
|
||||
message += "<b>- [key]:</b> [before[key]] => [after[key]]<br>"
|
||||
message += "</span>"
|
||||
to_chat(usr,message)
|
||||
|
||||
var/original_type = holder.type
|
||||
var/list/levels_working = GetConnectedZlevels(holder.z)
|
||||
|
||||
var/list/types = list()
|
||||
var/list/split = splittext("[original_type]", "/")
|
||||
split -= "" // The first / creates an empty string at the start as it tries to split on [nothing]/mob/living etc
|
||||
var/typestring = "/"
|
||||
for(var/el in split)
|
||||
typestring += el
|
||||
|
||||
types += text2path(typestring)
|
||||
typestring += "/"
|
||||
|
||||
var/list/searching = living_mob_list // Started/seeded with this
|
||||
var/list/choices = list()
|
||||
for(var/typechoice in types)
|
||||
var/list/found = list()
|
||||
for(var/mob in searching) // Isnt't there a helper for this, maybe? I forget.
|
||||
var/atom/M = mob
|
||||
if(!(M.z in levels_working))
|
||||
continue
|
||||
if(!istype(mob,typechoice))
|
||||
continue
|
||||
found += M
|
||||
choices["[typechoice] ([found.len])"] = found // Prettified name for the user input below)
|
||||
searching = found // Now we only search the list we just made, because of the order of our types list, each subsequent list will be a subset of the one we just finished
|
||||
|
||||
var/choice = input(usr,"Based on your AI holder's mob location, we'll edit mobs on Z [levels_working.Join(",")]. What types do you want to alter?") as null|anything in choices
|
||||
if(!choice)
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
return
|
||||
var/list/selected = choices[choice]
|
||||
for(var/mob in selected)
|
||||
var/mob/living/L = mob
|
||||
if(!istype(L))
|
||||
to_chat(usr,"<span class='warning'>Skipping incompatible mob: [L] [ADMIN_COORDJMP(L)]</span>")
|
||||
continue
|
||||
if(!L.ai_holder)
|
||||
to_chat(usr,"<span class='warning'>Skipping due to no AI: [L] [ADMIN_COORDJMP(L)]</span>")
|
||||
continue
|
||||
for(var/newvar in diff)
|
||||
if(newvar in L.ai_holder.vars)
|
||||
L.ai_holder.vars[newvar] = after[newvar]
|
||||
else
|
||||
to_chat(usr,"<span class='warning'>Skipping unavailable var '[newvar]' on: [L] [ADMIN_COORDJMP(L)]</span>")
|
||||
|
||||
to_chat(usr,"<span class='notice'>Mass AI edit done.</span>")
|
||||
href_list["datumrefresh"] = "\ref[src]"
|
||||
|
||||
/datum/ai_holder/New(var/new_holder)
|
||||
ASSERT(new_holder)
|
||||
holder = new_holder
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Form - Inventory Requisition r10.7.1E"
|
||||
|
||||
/obj/item/weapon/paper/carbon/cursedform/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
info = {"<font face="Comic Sans MS" color=#DA0000><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"></span><BR>Department: <span class="paper_field"></span><BR>Departmental Rank: <span class="paper_field"></span><BR>Organization(If not Nanotrasen): <span class="paper_field"></span><BR>Date: <span class="paper_field"></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"></span><BR>Quantity: <span class="paper_field"></span><BR>Reason for request: <span class="paper_field"></span><BR>Is this replacement equipment?: <span class="paper_field"></span><BR>If `Yes`; above, specify equiment and reason for replacement: <span class="paper_field"></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"></span><BR>Authorizing Dept. Head: <span class="paper_field"></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"></span><BR>Delivery location or department: <span class="paper_field"></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR>Receiving Shipping Employee: <span class="paper_field"></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"></span><BR></b></font>"}
|
||||
info_links = {"<font face="Comic Sans MS" color=#FF9300><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=1'>write</A></font></span><BR>Department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=2'>write</A></font></span><BR>Departmental Rank: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=3'>write</A></font></span><BR>Organization(If not Nanotrasen): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=4'>write</A></font></span><BR>Date: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=5'>write</A></font></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=6'>write</A></font></span><BR>Quantity: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=7'>write</A></font></span><BR>Reason for request: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=8'>write</A></font></span><BR>Is this replacement equipment?: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=9'>write</A></font></span><BR>If `Yes` above, specify equiment and reason for replacement: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=10'>write</A></font></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=11'>write</A></font></span><BR>Authorizing Dept. Head: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=12'>write</A></font></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=13'>write</A></font></span><BR>Delivery location or department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=14'>write</A></font></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=15'>write</A></font></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=16'>write</A></font></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=17'>write</A></font></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=18'>write</A></font></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=19'>write</A></font></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=20'>write</A></font></span><BR>Receiving Shipping Employee: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=21'>write</A></font></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=22'>write</A></font></span><BR></b></font><font face="Verdana"><A href='?src=[0x2057e0c];write=end'>write</A></font>"}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "A small electronic device able to ignite combustable substances."
|
||||
icon_state = "igniter"
|
||||
origin_tech = list(TECH_MAGNET = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10)
|
||||
|
||||
secured = 1
|
||||
wires = WIRE_RECEIVE
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
|
||||
icon_state = "infrared"
|
||||
origin_tech = list(TECH_MAGNET = 2)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, MAT_COPPER = 10, "waste" = 100)
|
||||
|
||||
wires = WIRE_PULSE
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "Used for scanning and alerting when someone enters a certain proximity."
|
||||
icon_state = "prox"
|
||||
origin_tech = list(TECH_MAGNET = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, MAT_COPPER = 10, "waste" = 50)
|
||||
wires = WIRE_PULSE
|
||||
|
||||
secured = 0
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "signaller"
|
||||
item_state = "signaler"
|
||||
origin_tech = list(TECH_MAGNET = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, MAT_COPPER = 10, "waste" = 100)
|
||||
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
|
||||
|
||||
secured = TRUE
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
|
||||
icon_state = "timer"
|
||||
origin_tech = list(TECH_MAGNET = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10)
|
||||
|
||||
wires = WIRE_PULSE
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
|
||||
icon_state = "voice"
|
||||
origin_tech = list(TECH_MAGNET = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10)
|
||||
var/listening = 0
|
||||
var/recorded //the activation message
|
||||
|
||||
|
||||
@@ -23,7 +23,11 @@
|
||||
var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
|
||||
var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID
|
||||
var/species = SPECIES_HUMAN
|
||||
var/species = SPECIES_HUMAN //defaults to generic-ass humans
|
||||
var/random_species = FALSE //flip to TRUE to randomize species from the list below
|
||||
var/list/random_species_list = list(SPECIES_HUMAN,SPECIES_TAJ,SPECIES_UNATHI,SPECIES_SKRELL) //preset list that can be overriden downstream. only includes common humanoids for voidsuit compatibility's sake.
|
||||
// var/random_appearance = FALSE //TODO: make this work
|
||||
// var/cause_of_death = null //TODO: set up a cause-of-death system. needs to support both damage types and actual wound types, so a body can have been bitten/stabbed/clawed/shot/burned/lasered/etc. to death
|
||||
delete_me = TRUE
|
||||
|
||||
/obj/effect/landmark/corpse/Initialize()
|
||||
@@ -33,13 +37,20 @@
|
||||
|
||||
/obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
|
||||
var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
|
||||
M.set_species(species)
|
||||
if(random_species)
|
||||
var/random_pick = pick(random_species_list)
|
||||
M.set_species(random_pick)
|
||||
src.species = random_pick
|
||||
else
|
||||
M.set_species(species)
|
||||
//TODO: insert appearance randomization, needs to be species-based
|
||||
M.real_name = src.name
|
||||
M.death(1) //Kills the new mob
|
||||
//TODO: insert cause of death handling/wound simulation here
|
||||
if(src.corpseuniform)
|
||||
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
|
||||
if(src.corpsesuit)
|
||||
M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
|
||||
M.equip_voidsuit_to_slot_or_del_with_refit(new src.corpsesuit(M), slot_wear_suit, src.species)
|
||||
if(src.corpseshoes)
|
||||
M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
|
||||
if(src.corpsegloves)
|
||||
@@ -51,7 +62,7 @@
|
||||
if(src.corpsemask)
|
||||
M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
|
||||
if(src.corpsehelmet)
|
||||
M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
|
||||
M.equip_voidhelm_to_slot_or_del_with_refit(new src.corpsehelmet(M), slot_head, src.species)
|
||||
if(src.corpsebelt)
|
||||
M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
|
||||
if(src.corpsepocket1)
|
||||
@@ -84,10 +95,6 @@
|
||||
|
||||
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/effect/landmark/corpse/syndicatesoldier
|
||||
name = "Mercenary"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
@@ -102,8 +109,6 @@
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
|
||||
|
||||
|
||||
/obj/effect/landmark/corpse/syndicatecommando
|
||||
name = "Syndicate Commando"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
@@ -119,10 +124,14 @@
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
|
||||
|
||||
|
||||
///////////Civilians//////////////////////
|
||||
|
||||
/obj/effect/landmark/corpse/random_civ
|
||||
name = "Civilian"
|
||||
corpseuniform = /obj/item/clothing/under/color/grey
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
random_species = TRUE
|
||||
|
||||
/obj/effect/landmark/corpse/chef
|
||||
name = "Chef"
|
||||
corpseuniform = /obj/item/clothing/under/rank/chef
|
||||
@@ -165,6 +174,7 @@
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/engineering
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/engineering
|
||||
corpseback = /obj/item/weapon/tank/oxygen
|
||||
|
||||
/obj/effect/landmark/corpse/clown
|
||||
name = "Clown"
|
||||
@@ -188,6 +198,39 @@
|
||||
corpseid = 1
|
||||
corpseidjob = "Scientist"
|
||||
corpseidaccess = "Scientist"
|
||||
|
||||
/obj/effect/landmark/corpse/security
|
||||
name = "Security Officer"
|
||||
corpseradio = /obj/item/device/radio/headset/headset_sec
|
||||
corpseuniform = /obj/item/clothing/under/rank/security
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vest
|
||||
corpseback = /obj/item/weapon/storage/backpack/security
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/jackboots
|
||||
corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud
|
||||
corpsegloves = /obj/item/clothing/gloves/black
|
||||
corpsehelmet = /obj/item/clothing/head/helmet
|
||||
corpseid = 1
|
||||
corpseidjob = "Security Officer"
|
||||
corpseidaccess = "Security Officer"
|
||||
|
||||
/obj/effect/landmark/corpse/security/rig
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/security
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/security
|
||||
corpseback = /obj/item/weapon/tank/jetpack/oxygen
|
||||
|
||||
/obj/effect/landmark/corpse/security/rig/eva
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/security/alt
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/security/alt
|
||||
corpseidjob = "Starship Security Officer"
|
||||
|
||||
/obj/effect/landmark/corpse/prisoner
|
||||
name = "Unknown Prisoner"
|
||||
corpseuniform = /obj/item/clothing/under/color/prison
|
||||
corpseshoes = /obj/item/clothing/shoes/orange
|
||||
corpseid = 1
|
||||
corpseidjob = "Prisoner"
|
||||
random_species = TRUE
|
||||
|
||||
/obj/effect/landmark/corpse/miner
|
||||
corpseradio = /obj/item/device/radio/headset/headset_cargo
|
||||
@@ -203,7 +246,69 @@
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/mining
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/mining
|
||||
corpseback = /obj/item/weapon/tank/oxygen
|
||||
|
||||
/////////////////Vintage//////////////////////
|
||||
|
||||
//define the basic props at this level and only change specifics for variants, e.z.
|
||||
/obj/effect/landmark/corpse/vintage
|
||||
name = "Unknown Crewmate"
|
||||
corpseuniform = /obj/item/clothing/under/utility
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseback = /obj/item/weapon/tank/oxygen
|
||||
corpseid = 1
|
||||
corpseidjob = "Crewmate"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/engineering
|
||||
name = "Unknown Engineer"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/engineering
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/engineering
|
||||
corpsebelt = /obj/item/weapon/storage/belt/utility/full
|
||||
corpseback = /obj/item/weapon/tank/oxygen/yellow
|
||||
corpseidjob = "Engineer"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/marine
|
||||
name = "Unknown Marine"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/marine
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/marine
|
||||
corpsebelt = /obj/item/weapon/storage/belt/security/tactical
|
||||
corpseidjob = "Marine"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/medical
|
||||
name = "Unknown Medic"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/medical
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/medical
|
||||
corpsebelt = /obj/item/weapon/storage/belt/medical
|
||||
corpseidjob = "Medic"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/mercenary
|
||||
name = "Unknown Mercenary"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/mercenary
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/mercenary
|
||||
corpsebelt = /obj/item/weapon/storage/belt/security/tactical
|
||||
corpseback = /obj/item/weapon/tank/oxygen/red
|
||||
corpseidjob = "Mercenary"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/officer
|
||||
name = "Unknown Captain"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/officer
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/officer
|
||||
corpseback = /obj/item/weapon/tank/oxygen/yellow
|
||||
corpseidjob = "Captain"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/pilot
|
||||
name = "Unknown Pilot"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/pilot
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/pilot
|
||||
corpseidjob = "Pilot"
|
||||
|
||||
/obj/effect/landmark/corpse/vintage/research
|
||||
name = "Unknown Researcher"
|
||||
corpsesuit = /obj/item/clothing/suit/space/void/refurb/research
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/research
|
||||
corpseidjob = "Researcher"
|
||||
|
||||
/////////////////Officers//////////////////////
|
||||
|
||||
|
||||
@@ -133,18 +133,66 @@ obj/machinery/gateway/centerstation/process()
|
||||
M.set_dir(SOUTH)
|
||||
return
|
||||
else
|
||||
//VOREStation Addition Start: Prevent taurriding abuse
|
||||
//VOREStation Addition Start: Prevent abuse
|
||||
if(istype(M, /obj/item/device/uav))
|
||||
var/obj/item/device/uav/L = M
|
||||
L.power_down()
|
||||
if(istype(M, /mob/living))
|
||||
var/mob/living/L = M
|
||||
if(LAZYLEN(L.buckled_mobs))
|
||||
var/datum/riding/R = L.riding_datum
|
||||
for(var/rider in L.buckled_mobs)
|
||||
R.force_dismount(rider)
|
||||
//VOREStation Addition End: Prevent taurriding abuse
|
||||
//VOREStation Addition End: Prevent abuse
|
||||
var/obj/effect/landmark/dest = pick(awaydestinations)
|
||||
if(dest)
|
||||
M.forceMove(dest.loc)
|
||||
M.set_dir(SOUTH)
|
||||
//VOREStation Addition Start: Abduction!
|
||||
if(istype(M, /mob/living) && dest.abductor)
|
||||
var/mob/living/L = M
|
||||
//Situations to get the mob out of
|
||||
if(L.buckled)
|
||||
L.buckled.unbuckle_mob()
|
||||
if(istype(L.loc,/obj/mecha))
|
||||
var/obj/mecha/ME = L.loc
|
||||
ME.go_out()
|
||||
else if(istype(L.loc,/obj/machinery/sleeper))
|
||||
var/obj/machinery/sleeper/SL = L.loc
|
||||
SL.go_out()
|
||||
else if(istype(L.loc,/obj/machinery/recharge_station))
|
||||
var/obj/machinery/recharge_station/RS = L.loc
|
||||
RS.go_out()
|
||||
if(!issilicon(L)) //Don't drop borg modules...
|
||||
var/list/mob_contents = list() //Things which are actually drained as a result of the above not being null.
|
||||
mob_contents |= L // The recursive check below does not add the object being checked to its list.
|
||||
mob_contents |= recursive_content_check(L, mob_contents, recursion_limit = 3, client_check = 0, sight_check = 0, include_mobs = 1, include_objects = 1, ignore_show_messages = 1)
|
||||
for(var/obj/item/weapon/holder/I in mob_contents)
|
||||
var/obj/item/weapon/holder/H = I
|
||||
var/mob/living/MI = H.held_mob
|
||||
MI.forceMove(get_turf(H))
|
||||
if(!issilicon(MI)) //Don't drop borg modules...
|
||||
for(var/obj/item/II in MI)
|
||||
if(istype(II,/obj/item/weapon/implant) || istype(II,/obj/item/device/nif))
|
||||
continue
|
||||
MI.drop_from_inventory(II, dest.loc)
|
||||
var/obj/effect/landmark/finaldest = pick(awayabductors)
|
||||
MI.forceMove(finaldest.loc)
|
||||
sleep(1)
|
||||
MI.Paralyse(10)
|
||||
MI << 'sound/effects/bamf.ogg'
|
||||
to_chat(MI,"<span class='warning'>You're starting to come to. You feel like you've been out for a few minutes, at least...</span>")
|
||||
for(var/obj/item/I in L)
|
||||
if(istype(I,/obj/item/weapon/implant) || istype(I,/obj/item/device/nif))
|
||||
continue
|
||||
L.drop_from_inventory(I, dest.loc)
|
||||
var/obj/effect/landmark/finaldest = pick(awayabductors)
|
||||
L.forceMove(finaldest.loc)
|
||||
sleep(1)
|
||||
L.Paralyse(10)
|
||||
L << 'sound/effects/bamf.ogg'
|
||||
to_chat(L,"<span class='warning'>You're starting to come to. You feel like you've been out for a few minutes, at least...</span>")
|
||||
//VOREStation Addition End
|
||||
return
|
||||
|
||||
/obj/machinery/gateway/centerstation/attackby(obj/item/device/W as obj, mob/user as mob)
|
||||
|
||||
@@ -8,18 +8,14 @@
|
||||
/obj/effect/spawner/lootdrop/Initialize()
|
||||
..()
|
||||
var/list/things = params2list(loot)
|
||||
|
||||
if(things && things.len)
|
||||
for(var/i = lootcount, i > 0, i--)
|
||||
if(!things.len)
|
||||
return
|
||||
|
||||
var/loot_spawn = pick(things)
|
||||
var/loot_path = text2path(loot_spawn)
|
||||
|
||||
if(!loot_path || !lootdoubles)
|
||||
things.Remove(loot_spawn)
|
||||
continue
|
||||
|
||||
new loot_path(get_turf(src))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -63,9 +63,29 @@ proc/createRandomZlevel()
|
||||
. = ..()
|
||||
awaydestinations += src
|
||||
|
||||
/obj/effect/landmark/gateway_scatter/abduct
|
||||
name = "uncalibrated gateway abductor"
|
||||
abductor = 1
|
||||
|
||||
/obj/effect/landmark/event_scatter
|
||||
name = "uncalibrated gateway destination"
|
||||
name = "uncalibrated event destination"
|
||||
/obj/effect/landmark/event_scatter/Initialize()
|
||||
. = ..()
|
||||
eventdestinations += src
|
||||
|
||||
/obj/effect/landmark/event_scatter/abduct
|
||||
name = "uncalibrated event abductor"
|
||||
abductor = 1
|
||||
|
||||
/obj/effect/landmark/gateway_abduct_dest
|
||||
name = "abductor gateway destination"
|
||||
/obj/effect/landmark/gateway_abduct_dest/Initialize()
|
||||
. = ..()
|
||||
awayabductors += src
|
||||
|
||||
/obj/effect/landmark/event_abduct_dest
|
||||
name = "abductor event destination"
|
||||
/obj/effect/landmark/event_abduct_dest/Initialize()
|
||||
. = ..()
|
||||
eventabductors += src
|
||||
//VOREStation Add End
|
||||
|
||||
@@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
/obj/structure/blob/Initialize(newloc, new_overmind)
|
||||
if(new_overmind)
|
||||
overmind = new_overmind
|
||||
faction = overmind.blob_type.faction
|
||||
update_icon()
|
||||
if(!integrity)
|
||||
integrity = max_integrity
|
||||
@@ -47,19 +48,24 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
color = null
|
||||
set_light(0)
|
||||
|
||||
/obj/structure/blob/update_transform()
|
||||
var/matrix/M = matrix()
|
||||
M.Scale(icon_scale_x, icon_scale_y)
|
||||
animate(src, transform = M, time = 10)
|
||||
|
||||
// Blob tiles are not actually dense so we need Special Code(tm).
|
||||
/obj/structure/blob/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSBLOB))
|
||||
return TRUE
|
||||
else if(istype(mover, /mob/living))
|
||||
var/mob/living/L = mover
|
||||
if(L.faction == "blob")
|
||||
if(L.faction == faction)
|
||||
return TRUE
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
if(istype(P.firer, /obj/structure/blob))
|
||||
return TRUE
|
||||
if(istype(P.firer) && P.firer.faction == "blob")
|
||||
if(istype(P.firer) && P.firer.faction == faction)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -88,6 +94,7 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
update_icon()
|
||||
pulse_timestamp = world.time + 1 SECOND
|
||||
if(overmind)
|
||||
faction = overmind.blob_type.faction
|
||||
overmind.blob_type.on_pulse(src)
|
||||
return TRUE //we did it, we were pulsed!
|
||||
return FALSE //oh no we failed
|
||||
@@ -106,6 +113,9 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
|
||||
for(var/L in blobs_to_affect)
|
||||
var/obj/structure/blob/B = L
|
||||
if(B.faction != faction)
|
||||
continue
|
||||
|
||||
if(!B.overmind && !istype(B, /obj/structure/blob/core) && prob(30))
|
||||
B.overmind = pulsing_overmind //reclaim unclaimed, non-core blobs.
|
||||
B.update_icon()
|
||||
@@ -138,7 +148,8 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
var/dirn = pick(dirs)
|
||||
dirs.Remove(dirn)
|
||||
T = get_step(src, dirn)
|
||||
if(!(locate(/obj/structure/blob) in T))
|
||||
var/obj/structure/blob/B = locate(/obj/structure/blob) in T
|
||||
if(!B || B.faction != faction) // Allow opposing blobs to fight.
|
||||
break
|
||||
else
|
||||
T = null
|
||||
@@ -164,6 +175,7 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
|
||||
if(make_blob) //well, can we?
|
||||
var/obj/structure/blob/B = new /obj/structure/blob/normal(src.loc)
|
||||
B.faction = faction
|
||||
if(controller)
|
||||
B.overmind = controller
|
||||
else
|
||||
@@ -340,7 +352,7 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
if(!P)
|
||||
return
|
||||
|
||||
if(istype(P.firer) && P.firer.faction == "blob")
|
||||
if(istype(P.firer) && P.firer.faction == faction)
|
||||
return
|
||||
|
||||
var/damage = P.get_structure_damage() // So tasers don't hurt the blob.
|
||||
@@ -366,6 +378,31 @@ GLOBAL_LIST_EMPTY(all_blobs)
|
||||
if(overmind)
|
||||
overmind.blob_type.on_water(src, amount)
|
||||
|
||||
/obj/structure/blob/blob_act(var/obj/structure/blob/B)
|
||||
. = ..()
|
||||
|
||||
if(B)
|
||||
|
||||
if(!B.overmind)
|
||||
return
|
||||
|
||||
if(B.faction != faction)
|
||||
var/damage = rand(B.overmind.blob_type.damage_lower, B.overmind.blob_type.damage_upper)
|
||||
var/inc_damage_type = B.overmind.blob_type.damage_type
|
||||
|
||||
if(overmind)
|
||||
damage = overmind.blob_type.on_received_damage(src, damage, inc_damage_type, B)
|
||||
|
||||
else
|
||||
faction = B.faction
|
||||
overmind = B.overmind
|
||||
update_icon()
|
||||
return
|
||||
|
||||
adjust_integrity(-1 * damage)
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/blob/proc/adjust_integrity(amount)
|
||||
integrity = between(0, integrity + amount, max_integrity)
|
||||
if(integrity == 0)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
var/mob/living/simple_mob/blob/spore/S = null
|
||||
if(overmind)
|
||||
S = new overmind.blob_type.spore_type(src.loc, src)
|
||||
S.faction = "blob"
|
||||
S.faction = overmind.blob_type.faction
|
||||
if(istype(S))
|
||||
S.overmind = overmind
|
||||
overmind.blob_mobs.Add(S)
|
||||
|
||||
@@ -19,4 +19,13 @@
|
||||
if(overmind)
|
||||
name = "[overmind.blob_type.name]"
|
||||
else
|
||||
name = "inert [base_name]"
|
||||
name = "inert [base_name]"
|
||||
|
||||
/obj/structure/blob/normal/pulsed()
|
||||
..()
|
||||
|
||||
if(prob(30))
|
||||
adjust_scale((rand(10, 13) / 10), (rand(10, 13) / 10))
|
||||
|
||||
else
|
||||
adjust_scale(1)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
description_info = "Some blob types will have core effects when the chunk is used in-hand, toggled with an alt click, or constantly active."
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blobcore"
|
||||
flags = OPENCONTAINER
|
||||
var/datum/blob_type/blob_type // The blob type this dropped from.
|
||||
|
||||
var/active_ability_cooldown = 20 SECONDS
|
||||
@@ -15,11 +16,17 @@
|
||||
var/passive_ability_cooldown = 5 SECONDS
|
||||
var/last_passive_use = 0
|
||||
|
||||
var/can_genesis = TRUE // Can the core chunk be used to grow a new blob?
|
||||
|
||||
drop_sound = 'sound/effects/slime_squish.ogg'
|
||||
|
||||
/obj/item/weapon/blobcore_chunk/is_open_container()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/blobcore_chunk/New(var/atom/newloc, var/datum/blob_type/parentblob = null)
|
||||
..(newloc)
|
||||
|
||||
create_reagents(120)
|
||||
setup_blobtype(parentblob)
|
||||
|
||||
/obj/item/weapon/blobcore_chunk/Destroy()
|
||||
@@ -91,10 +98,57 @@
|
||||
blob_type.on_chunk_tick(src)
|
||||
|
||||
/obj/item/weapon/blobcore_chunk/AltClick(mob/living/carbon/user)
|
||||
if(blob_type &&blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE)
|
||||
if(blob_type && blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE)
|
||||
should_tick = !should_tick
|
||||
|
||||
if(should_tick)
|
||||
to_chat(user, "<span class='alien'>\The [src] shudders with life.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='alien'>\The [src] stills, returning to a death-like state.</span>")
|
||||
|
||||
/obj/item/weapon/blobcore_chunk/proc/regen(var/newfaction = null)
|
||||
if(istype(blob_type))
|
||||
if(newfaction)
|
||||
blob_type.faction = newfaction
|
||||
|
||||
var/obj/structure/blob/core/NC = new (get_turf(src))
|
||||
NC.overmind.blob_type = blob_type
|
||||
NC.overmind.blob_core.update_icon()
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
/datum/chemical_reaction/blob_reconstitution
|
||||
name = "Hostile Blob Revival"
|
||||
id = "blob_revival"
|
||||
result = null
|
||||
required_reagents = list("phoron" = 60)
|
||||
result_amount = 1
|
||||
|
||||
/datum/chemical_reaction/blob_reconstitution/can_happen(var/datum/reagents/holder)
|
||||
if(holder.my_atom && istype(holder.my_atom, /obj/item/weapon/blobcore_chunk))
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
/datum/chemical_reaction/blob_reconstitution/on_reaction(var/datum/reagents/holder)
|
||||
var/obj/item/weapon/blobcore_chunk/chunk = holder.my_atom
|
||||
if(chunk.can_genesis && chunk.regen())
|
||||
chunk.visible_message("<span class='notice'>[chunk] bubbles, surrounding itself with a rapidly expanding mass of [chunk.blob_type.name]!</span>")
|
||||
chunk.can_genesis = FALSE
|
||||
else
|
||||
chunk.visible_message("<span class='warning'>[chunk] shifts strangely, but falls still.</span>")
|
||||
|
||||
/datum/chemical_reaction/blob_reconstitution/domination
|
||||
name = "Allied Blob Revival"
|
||||
id = "blob_friend"
|
||||
result = null
|
||||
required_reagents = list("hydrophoron" = 40, "peridaxon" = 20, "mutagen" = 20)
|
||||
result_amount = 1
|
||||
|
||||
/datum/chemical_reaction/blob_reconstitution/domination/on_reaction(var/datum/reagents/holder)
|
||||
var/obj/item/weapon/blobcore_chunk/chunk = holder.my_atom
|
||||
if(chunk.can_genesis && chunk.regen("neutral"))
|
||||
chunk.visible_message("<span class='notice'>[chunk] bubbles, surrounding itself with a rapidly expanding mass of [chunk.blob_type.name]!</span>")
|
||||
chunk.can_genesis = FALSE
|
||||
else
|
||||
chunk.visible_message("<span class='warning'>[chunk] shifts strangely, but falls still.</span>")
|
||||
|
||||
@@ -23,6 +23,14 @@ var/list/overminds = list()
|
||||
var/ai_controlled = TRUE
|
||||
var/auto_pilot = FALSE // If true, and if a client is attached, the AI routine will continue running.
|
||||
|
||||
universal_understand = TRUE
|
||||
|
||||
var/list/has_langs = list(LANGUAGE_BLOB)
|
||||
var/datum/language/default_language = null
|
||||
|
||||
/mob/observer/blob/get_default_language()
|
||||
return default_language
|
||||
|
||||
/mob/observer/blob/Initialize(newloc, pre_placed = 0, starting_points = 60, desired_blob_type = null)
|
||||
blob_points = starting_points
|
||||
if(pre_placed) //we already have a core!
|
||||
@@ -41,6 +49,11 @@ var/list/overminds = list()
|
||||
if(blob_core)
|
||||
blob_core.update_icon()
|
||||
|
||||
for(var/L in has_langs)
|
||||
languages |= GLOB.all_languages[L]
|
||||
if(languages.len)
|
||||
default_language = languages[1]
|
||||
|
||||
return ..(newloc)
|
||||
|
||||
/mob/observer/blob/Destroy()
|
||||
@@ -67,9 +80,9 @@ var/list/overminds = list()
|
||||
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
|
||||
stat(null, "Total Blobs: [GLOB.all_blobs.len]")
|
||||
|
||||
/mob/observer/blob/Move(NewLoc, Dir = 0)
|
||||
/mob/observer/blob/Move(var/atom/NewLoc, Dir = 0)
|
||||
if(placed)
|
||||
var/obj/structure/blob/B = locate() in range("3x3", NewLoc)
|
||||
var/obj/structure/blob/B = (locate() in view("5x5", NewLoc))
|
||||
if(B)
|
||||
forceMove(NewLoc)
|
||||
return TRUE
|
||||
@@ -93,3 +106,62 @@ var/list/overminds = list()
|
||||
if(blob_points >= 100)
|
||||
if(!auto_factory() && !auto_resource())
|
||||
auto_node()
|
||||
|
||||
/mob/observer/blob/say(var/message, var/datum/language/speaking = null, var/whispering = 0)
|
||||
message = sanitize(message)
|
||||
|
||||
if(!message)
|
||||
return
|
||||
|
||||
//If you're muted for IC chat
|
||||
if(client)
|
||||
if(message)
|
||||
client.handle_spam_prevention(MUTE_IC)
|
||||
if((client.prefs.muted & MUTE_IC) || say_disabled)
|
||||
to_chat(src, "<span class='warning'>You cannot speak in IC (Muted).</span>")
|
||||
return
|
||||
|
||||
//These will contain the main receivers of the message
|
||||
var/list/listening = list()
|
||||
var/list/listening_obj = list()
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(T)
|
||||
//Obtain the mobs and objects in the message range
|
||||
var/list/results = get_mobs_and_objs_in_view_fast(T, world.view, remote_ghosts = client ? TRUE : FALSE)
|
||||
listening = results["mobs"]
|
||||
listening_obj = results["objs"]
|
||||
else
|
||||
return 1 //If we're in nullspace, then forget it.
|
||||
|
||||
var/list/message_pieces = parse_languages(message)
|
||||
if(istype(message_pieces, /datum/multilingual_say_piece)) // Little quirk for dealing with hivemind/signlang languages.
|
||||
var/datum/multilingual_say_piece/S = message_pieces // Yay for BYOND's hilariously broken typecasting for allowing us to do this.
|
||||
S.speaking.broadcast(src, S.message)
|
||||
return 1
|
||||
|
||||
if(!LAZYLEN(message_pieces))
|
||||
log_runtime(EXCEPTION("Message failed to generate pieces. [message] - [json_encode(message_pieces)]"))
|
||||
return 0
|
||||
|
||||
//Handle nonverbal languages here
|
||||
for(var/datum/multilingual_say_piece/S in message_pieces)
|
||||
if(S.speaking.flags & NONVERBAL)
|
||||
custom_emote(1, "[pick(S.speaking.signlang_verb)].")
|
||||
|
||||
for(var/mob/M in listening)
|
||||
spawn()
|
||||
if(M && src)
|
||||
if(get_dist(M, src) <= world.view || (M.stat == DEAD && !forbid_seeing_deadchat))
|
||||
M.hear_say(message_pieces, "conveys", (M.faction == blob_type.faction), src)
|
||||
|
||||
//Object message delivery
|
||||
for(var/obj/O in listening_obj)
|
||||
spawn(0)
|
||||
if(O && src) //If we still exist, when the spawn processes
|
||||
var/dst = get_dist(get_turf(O),get_turf(src))
|
||||
if(dst <= world.view)
|
||||
O.hear_talk(src, message_pieces, "conveys")
|
||||
|
||||
log_say(message, src)
|
||||
return 1
|
||||
|
||||
@@ -80,8 +80,8 @@
|
||||
potential_blobs -= temp // Don't take up the core's shield spot.
|
||||
else if(!istype(temp, /obj/structure/blob/normal))
|
||||
potential_blobs -= temp // Not a normal blob.
|
||||
else if(temp.overmind != src)
|
||||
potential_blobs -= temp // Not our blob.
|
||||
else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction)
|
||||
potential_blobs -= temp // Not our blob, or even an ally.
|
||||
else
|
||||
B = temp
|
||||
break
|
||||
@@ -123,8 +123,8 @@
|
||||
potential_blobs -= temp // Don't take up the core's shield spot.
|
||||
else if(!istype(temp, /obj/structure/blob/normal))
|
||||
potential_blobs -= temp // Not a normal blob.
|
||||
else if(temp.overmind != src)
|
||||
potential_blobs -= temp // Not our blob.
|
||||
else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction)
|
||||
potential_blobs -= temp // Not our blob, or even an ally
|
||||
else
|
||||
B = temp
|
||||
break
|
||||
@@ -165,8 +165,8 @@
|
||||
potential_blobs -= temp
|
||||
else if(!istype(temp, /obj/structure/blob/normal))
|
||||
potential_blobs -= temp
|
||||
else if(temp.overmind != src)
|
||||
potential_blobs -= temp // Not our blob.
|
||||
else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction)
|
||||
potential_blobs -= temp // Not our blob, or even our ally.
|
||||
else
|
||||
B = temp
|
||||
break
|
||||
@@ -216,7 +216,7 @@
|
||||
for(var/mob/living/L in view(src))
|
||||
if(L.stat == DEAD)
|
||||
continue // Already dying or dead.
|
||||
if(L.faction == "blob")
|
||||
if(L.faction == blob_type.faction)
|
||||
continue // No friendly fire.
|
||||
if(locate(/obj/structure/blob) in L.loc)
|
||||
continue // Already has a blob over them.
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
var/color = "#FFFFFF" // The actual blob's color.
|
||||
var/complementary_color = "#000000" //a color that's complementary to the normal blob color. Blob mobs are colored in this.
|
||||
|
||||
var/faction = "blob" // The blob's faction.
|
||||
|
||||
var/attack_message = "The blob attacks you" // Base message the mob gets when blob_act() gets called on them by the blob. An exclaimation point is added to the end.
|
||||
var/attack_message_living = null // Appended to attack_message, if the target fails isSynthetic() check.
|
||||
var/attack_message_synth = null // Ditto, but if they pass isSynthetic().
|
||||
|
||||
@@ -33,6 +33,8 @@
|
||||
env.add_thermal_energy(10 * 1000)
|
||||
|
||||
/datum/blob_type/blazing_oil/on_chunk_tick(obj/item/weapon/blobcore_chunk/B)
|
||||
B.reagents.add_reagent("thermite_v", 0.5)
|
||||
|
||||
var/turf/T = get_turf(B)
|
||||
if(!T)
|
||||
return
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
env.add_thermal_energy(-10 * 1000)
|
||||
|
||||
/datum/blob_type/cryogenic_goo/on_chunk_tick(obj/item/weapon/blobcore_chunk/B)
|
||||
B.reagents.add_reagent("cryoslurry", 0.5)
|
||||
|
||||
var/turf/simulated/T = get_turf(B)
|
||||
if(!istype(T))
|
||||
return
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
listclearnulls(active_beams)
|
||||
var/atom/movable/beam_origin = B
|
||||
for(var/mob/living/L in oview(world.view, B))
|
||||
if(L.stat == DEAD || L.faction == "blob")
|
||||
if(L.stat == DEAD || L.faction == faction)
|
||||
continue
|
||||
if(prob(5))
|
||||
var/beamtarget_exists = FALSE
|
||||
@@ -82,7 +82,7 @@
|
||||
if(nearby_mobs.len)
|
||||
listclearnulls(active_beams)
|
||||
for(var/mob/living/L in nearby_mobs)
|
||||
if(L.stat == DEAD || L.faction == "blob")
|
||||
if(L.stat == DEAD || L.faction == faction)
|
||||
continue
|
||||
if(prob(5))
|
||||
var/beamtarget_exists = FALSE
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
for(var/mob/living/L in range(get_turf(victim), 1)) // We don't use orange(), in case there is more than one mob on the target tile.
|
||||
if(L == victim) // Already hit.
|
||||
continue
|
||||
if(L.faction == "blob") // No friendly fire
|
||||
if(L.faction == faction) // No friendly fire
|
||||
continue
|
||||
L.blob_act()
|
||||
|
||||
|
||||
@@ -24,9 +24,10 @@
|
||||
var/mob/living/simple_mob/blob/spore/S = new spore_type(T)
|
||||
if(istype(S))
|
||||
S.overmind = O
|
||||
S.faction = faction
|
||||
O.blob_mobs.Add(S)
|
||||
else
|
||||
S.faction = "blob"
|
||||
S.faction = faction
|
||||
S.update_icons()
|
||||
|
||||
/datum/blob_type/fulminant_organism/on_death(obj/structure/blob/B)
|
||||
@@ -35,9 +36,10 @@
|
||||
B.visible_message("<span class='danger'>\The [S] floats free from the [name]!</span>")
|
||||
if(istype(S))
|
||||
S.overmind = B.overmind
|
||||
S.faction = faction
|
||||
B.overmind.blob_mobs.Add(S)
|
||||
else
|
||||
S.faction = "blob"
|
||||
S.faction = faction
|
||||
S.update_icons()
|
||||
|
||||
/datum/blob_type/fulminant_organism/on_chunk_use(obj/item/weapon/blobcore_chunk/B, mob/living/user)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
attack_message = "The tide tries to swallow you"
|
||||
attack_message_living = ", and you feel your skin dissolve"
|
||||
attack_message_synth = ", and your external plating dissolves"
|
||||
faction = "nanomachines"
|
||||
|
||||
/datum/blob_type/grey_goo/on_emp(obj/structure/blob/B, severity)
|
||||
B.adjust_integrity(-(20 / severity))
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
if(!istype(L))
|
||||
return
|
||||
|
||||
if(istype(B, /obj/structure/blob/factory) && L.stat != DEAD && prob(ai_aggressiveness) && L.faction != "blob")
|
||||
if(istype(B, /obj/structure/blob/factory) && L.stat != DEAD && prob(ai_aggressiveness) && L.faction != faction)
|
||||
var/obj/item/projectile/arc/spore/P = new(get_turf(B))
|
||||
P.launch_projectile(L, BP_TORSO, B)
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
var/datum/chatOutput/chatOutput
|
||||
var/datum/volume_panel/volume_panel = null // Initialized by /client/verb/volume_panel()
|
||||
var/chatOutputLoadedAt
|
||||
var/seen_news = 0
|
||||
|
||||
var/adminhelped = 0
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
if( findtext(href,"<script",1,0) )
|
||||
to_world_log("Attempted use of scripts within a topic call, by [src]")
|
||||
message_admins("Attempted use of scripts within a topic call, by [src]")
|
||||
//del(usr)
|
||||
return
|
||||
|
||||
// Tgui Topic middleware
|
||||
@@ -227,7 +226,6 @@
|
||||
|
||||
if(!void)
|
||||
void = new()
|
||||
void.MakeGreed()
|
||||
screen += void
|
||||
|
||||
if((prefs.lastchangelog != changelog_hash) && isnewplayer(src.mob)) //bolds the changelog button on the interface so we know there are updates.
|
||||
|
||||
@@ -6,6 +6,37 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
var/icon/bgstate = "000"
|
||||
var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced")
|
||||
|
||||
var/ear_style // Type of selected ear style
|
||||
var/r_ears = 30 // Ear color.
|
||||
var/g_ears = 30 // Ear color
|
||||
var/b_ears = 30 // Ear color
|
||||
var/r_ears2 = 30 // Ear extra color.
|
||||
var/g_ears2 = 30 // Ear extra color
|
||||
var/b_ears2 = 30 // Ear extra color
|
||||
var/r_ears3 = 30 // Ear tertiary color.
|
||||
var/g_ears3 = 30 // Ear tertiary color
|
||||
var/b_ears3 = 30 // Ear tertiary color
|
||||
var/tail_style // Type of selected tail style
|
||||
var/r_tail = 30 // Tail/Taur color
|
||||
var/g_tail = 30 // Tail/Taur color
|
||||
var/b_tail = 30 // Tail/Taur color
|
||||
var/r_tail2 = 30 // For extra overlay.
|
||||
var/g_tail2 = 30 // For extra overlay.
|
||||
var/b_tail2 = 30 // For extra overlay.
|
||||
var/r_tail3 = 30 // For tertiary overlay.
|
||||
var/g_tail3 = 30 // For tertiary overlay.
|
||||
var/b_tail3 = 30 // For tertiary overlay.
|
||||
var/wing_style // Type of selected wing style
|
||||
var/r_wing = 30 // Wing color
|
||||
var/g_wing = 30 // Wing color
|
||||
var/b_wing = 30 // Wing color
|
||||
var/r_wing2 = 30 // Wing extra color
|
||||
var/g_wing2 = 30 // Wing extra color
|
||||
var/b_wing2 = 30 // Wing extra color
|
||||
var/r_wing3 = 30 // Wing tertiary color
|
||||
var/g_wing3 = 30 // Wing tertiary color
|
||||
var/b_wing3 = 30 // Wing tertiary color
|
||||
|
||||
/datum/category_item/player_setup_item/general/body
|
||||
name = "Body"
|
||||
sort_order = 3
|
||||
@@ -43,6 +74,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
S["synth_markings"] >> pref.synth_markings
|
||||
S["bgstate"] >> pref.bgstate
|
||||
S["body_descriptors"] >> pref.body_descriptors
|
||||
S["ear_style"] >> pref.ear_style
|
||||
S["r_ears"] >> pref.r_ears
|
||||
S["g_ears"] >> pref.g_ears
|
||||
S["b_ears"] >> pref.b_ears
|
||||
S["r_ears2"] >> pref.r_ears2
|
||||
S["g_ears2"] >> pref.g_ears2
|
||||
S["b_ears2"] >> pref.b_ears2
|
||||
S["r_ears3"] >> pref.r_ears3
|
||||
S["g_ears3"] >> pref.g_ears3
|
||||
S["b_ears3"] >> pref.b_ears3
|
||||
S["tail_style"] >> pref.tail_style
|
||||
S["r_tail"] >> pref.r_tail
|
||||
S["g_tail"] >> pref.g_tail
|
||||
S["b_tail"] >> pref.b_tail
|
||||
S["r_tail2"] >> pref.r_tail2
|
||||
S["g_tail2"] >> pref.g_tail2
|
||||
S["b_tail2"] >> pref.b_tail2
|
||||
S["r_tail3"] >> pref.r_tail3
|
||||
S["g_tail3"] >> pref.g_tail3
|
||||
S["b_tail3"] >> pref.b_tail3
|
||||
S["wing_style"] >> pref.wing_style
|
||||
S["r_wing"] >> pref.r_wing
|
||||
S["g_wing"] >> pref.g_wing
|
||||
S["b_wing"] >> pref.b_wing
|
||||
S["r_wing2"] >> pref.r_wing2
|
||||
S["g_wing2"] >> pref.g_wing2
|
||||
S["b_wing2"] >> pref.b_wing2
|
||||
S["r_wing3"] >> pref.r_wing3
|
||||
S["g_wing3"] >> pref.g_wing3
|
||||
S["b_wing3"] >> pref.b_wing3
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
|
||||
S["species"] << pref.species
|
||||
@@ -77,6 +138,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
S["synth_markings"] << pref.synth_markings
|
||||
S["bgstate"] << pref.bgstate
|
||||
S["body_descriptors"] << pref.body_descriptors
|
||||
S["ear_style"] << pref.ear_style
|
||||
S["r_ears"] << pref.r_ears
|
||||
S["g_ears"] << pref.g_ears
|
||||
S["b_ears"] << pref.b_ears
|
||||
S["r_ears2"] << pref.r_ears2
|
||||
S["g_ears2"] << pref.g_ears2
|
||||
S["b_ears2"] << pref.b_ears2
|
||||
S["r_ears3"] << pref.r_ears3
|
||||
S["g_ears3"] << pref.g_ears3
|
||||
S["b_ears3"] << pref.b_ears3
|
||||
S["tail_style"] << pref.tail_style
|
||||
S["r_tail"] << pref.r_tail
|
||||
S["g_tail"] << pref.g_tail
|
||||
S["b_tail"] << pref.b_tail
|
||||
S["r_tail2"] << pref.r_tail2
|
||||
S["g_tail2"] << pref.g_tail2
|
||||
S["b_tail2"] << pref.b_tail2
|
||||
S["r_tail3"] << pref.r_tail3
|
||||
S["g_tail3"] << pref.g_tail3
|
||||
S["b_tail3"] << pref.b_tail3
|
||||
S["wing_style"] << pref.wing_style
|
||||
S["r_wing"] << pref.r_wing
|
||||
S["g_wing"] << pref.g_wing
|
||||
S["b_wing"] << pref.b_wing
|
||||
S["r_wing2"] << pref.r_wing2
|
||||
S["g_wing2"] << pref.g_wing2
|
||||
S["b_wing2"] << pref.b_wing2
|
||||
S["r_wing3"] << pref.r_wing3
|
||||
S["g_wing3"] << pref.g_wing3
|
||||
S["b_wing3"] << pref.b_wing3
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
|
||||
if(!pref.species || !(pref.species in GLOB.playable_species))
|
||||
@@ -110,6 +201,49 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options))
|
||||
pref.bgstate = "000"
|
||||
|
||||
pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears))
|
||||
pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears))
|
||||
pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears))
|
||||
pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2))
|
||||
pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2))
|
||||
pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2))
|
||||
pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3))
|
||||
pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3))
|
||||
pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3))
|
||||
pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail))
|
||||
pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail))
|
||||
pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail))
|
||||
pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2))
|
||||
pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2))
|
||||
pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2))
|
||||
pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3))
|
||||
pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3))
|
||||
pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3))
|
||||
pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing))
|
||||
pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing))
|
||||
pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing))
|
||||
pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2))
|
||||
pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2))
|
||||
pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2))
|
||||
pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3))
|
||||
pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3))
|
||||
pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3))
|
||||
if(pref.ear_style)
|
||||
pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style))
|
||||
var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style]
|
||||
if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed)))
|
||||
pref.ear_style = initial(pref.ear_style)
|
||||
if(pref.tail_style)
|
||||
pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style))
|
||||
var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style]
|
||||
if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed)))
|
||||
pref.tail_style = initial(pref.tail_style)
|
||||
if(pref.wing_style)
|
||||
pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style))
|
||||
var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style]
|
||||
if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed)))
|
||||
pref.wing_style = initial(pref.wing_style)
|
||||
|
||||
// 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
|
||||
@@ -140,6 +274,37 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
character.g_synth = pref.g_synth
|
||||
character.b_synth = pref.b_synth
|
||||
character.synth_markings = pref.synth_markings
|
||||
character.ear_style = ear_styles_list[pref.ear_style]
|
||||
character.r_ears = pref.r_ears
|
||||
character.b_ears = pref.b_ears
|
||||
character.g_ears = pref.g_ears
|
||||
character.r_ears2 = pref.r_ears2
|
||||
character.b_ears2 = pref.b_ears2
|
||||
character.g_ears2 = pref.g_ears2
|
||||
character.r_ears3 = pref.r_ears3
|
||||
character.b_ears3 = pref.b_ears3
|
||||
character.g_ears3 = pref.g_ears3
|
||||
character.tail_style = tail_styles_list[pref.tail_style]
|
||||
character.r_tail = pref.r_tail
|
||||
character.b_tail = pref.b_tail
|
||||
character.g_tail = pref.g_tail
|
||||
character.r_tail2 = pref.r_tail2
|
||||
character.b_tail2 = pref.b_tail2
|
||||
character.g_tail2 = pref.g_tail2
|
||||
character.r_tail3 = pref.r_tail3
|
||||
character.b_tail3 = pref.b_tail3
|
||||
character.g_tail3 = pref.g_tail3
|
||||
character.wing_style = wing_styles_list[pref.wing_style]
|
||||
character.r_wing = pref.r_wing
|
||||
character.b_wing = pref.b_wing
|
||||
character.g_wing = pref.g_wing
|
||||
character.r_wing2 = pref.r_wing2
|
||||
character.b_wing2 = pref.b_wing2
|
||||
character.g_wing2 = pref.g_wing2
|
||||
character.r_wing3 = pref.r_wing3
|
||||
character.b_wing3 = pref.b_wing3
|
||||
character.g_wing3 = pref.g_wing3
|
||||
character.set_gender( pref.biological_gender)
|
||||
|
||||
// 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))
|
||||
@@ -352,6 +517,62 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
. += "<br><b>Body Color</b><br>"
|
||||
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> [color_square(pref.r_skin, pref.g_skin, pref.b_skin)]<br>"
|
||||
|
||||
. += "<h2>Genetics Settings</h2>"
|
||||
|
||||
var/ear_display = "Normal"
|
||||
if(pref.ear_style && (pref.ear_style in ear_styles_list))
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style]
|
||||
ear_display = instance.name
|
||||
|
||||
else if(pref.ear_style)
|
||||
ear_display = "REQUIRES UPDATE"
|
||||
. += "<b>Ears</b><br>"
|
||||
. += " Style: <a href='?src=\ref[src];ear_style=1'>[ear_display]</a><br>"
|
||||
if(ear_styles_list[pref.ear_style])
|
||||
var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style]
|
||||
if(ear.do_colouration)
|
||||
. += "<a href='?src=\ref[src];ear_color=1'>Change Color</a> [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]<br>"
|
||||
if(ear.extra_overlay)
|
||||
. += "<a href='?src=\ref[src];ear_color2=1'>Change Secondary Color</a> [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]<br>"
|
||||
if(ear.extra_overlay2)
|
||||
. += "<a href='?src=\ref[src];ear_color3=1'>Change Tertiary Color</a> [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]<br>"
|
||||
|
||||
var/tail_display = "Normal"
|
||||
if(pref.tail_style && (pref.tail_style in tail_styles_list))
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style]
|
||||
tail_display = instance.name
|
||||
else if(pref.tail_style)
|
||||
tail_display = "REQUIRES UPDATE"
|
||||
. += "<b>Tail</b><br>"
|
||||
. += " Style: <a href='?src=\ref[src];tail_style=1'>[tail_display]</a><br>"
|
||||
|
||||
if(tail_styles_list[pref.tail_style])
|
||||
var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style]
|
||||
if(T.do_colouration)
|
||||
. += "<a href='?src=\ref[src];tail_color=1'>Change Color</a> [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]<br>"
|
||||
if(T.extra_overlay)
|
||||
. += "<a href='?src=\ref[src];tail_color2=1'>Change Secondary Color</a> [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]<br>"
|
||||
if(T.extra_overlay2)
|
||||
. += "<a href='?src=\ref[src];tail_color3=1'>Change Tertiary Color</a> [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]<br>"
|
||||
|
||||
var/wing_display = "Normal"
|
||||
if(pref.wing_style && (pref.wing_style in wing_styles_list))
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style]
|
||||
wing_display = instance.name
|
||||
else if(pref.wing_style)
|
||||
wing_display = "REQUIRES UPDATE"
|
||||
. += "<b>Wing</b><br>"
|
||||
. += " Style: <a href='?src=\ref[src];wing_style=1'>[wing_display]</a><br>"
|
||||
|
||||
if(wing_styles_list[pref.wing_style])
|
||||
var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style]
|
||||
if(W.do_colouration)
|
||||
. += "<a href='?src=\ref[src];wing_color=1'>Change Color</a> [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]<br>"
|
||||
if(W.extra_overlay)
|
||||
. += "<a href='?src=\ref[src];wing_color2=1'>Change Secondary Color</a> [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]<br>"
|
||||
if(W.extra_overlay2)
|
||||
. += "<a href='?src=\ref[src];wing_color3=1'>Change Secondary Color</a> [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]<br>"
|
||||
|
||||
. += "<br><a href='?src=\ref[src];marking_style=1'>Body Markings +</a><br>"
|
||||
. += "<table>"
|
||||
for(var/M in pref.body_markings)
|
||||
@@ -860,6 +1081,132 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options)
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_style"])
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles
|
||||
if(new_ear_style)
|
||||
pref.ear_style = pretty_ear_styles[new_ear_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_color"])
|
||||
var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference",
|
||||
rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null
|
||||
if(new_earc)
|
||||
pref.r_ears = hex2num(copytext(new_earc, 2, 4))
|
||||
pref.g_ears = hex2num(copytext(new_earc, 4, 6))
|
||||
pref.b_ears = hex2num(copytext(new_earc, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_color2"])
|
||||
var/new_earc2 = input(user, "Choose your character's ear colour:", "Character Preference",
|
||||
rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null
|
||||
if(new_earc2)
|
||||
pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4))
|
||||
pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6))
|
||||
pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_color3"])
|
||||
var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference",
|
||||
rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null
|
||||
if(new_earc3)
|
||||
pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4))
|
||||
pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6))
|
||||
pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_style"])
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_tail_styles = list("Normal" = null)
|
||||
for(var/path in tail_styles_list)
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
|
||||
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit
|
||||
pretty_tail_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles
|
||||
if(new_tail_style)
|
||||
pref.tail_style = pretty_tail_styles[new_tail_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_color"])
|
||||
var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference",
|
||||
rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null
|
||||
if(new_tailc)
|
||||
pref.r_tail = hex2num(copytext(new_tailc, 2, 4))
|
||||
pref.g_tail = hex2num(copytext(new_tailc, 4, 6))
|
||||
pref.b_tail = hex2num(copytext(new_tailc, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_color2"])
|
||||
var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference",
|
||||
rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null
|
||||
if(new_tailc2)
|
||||
pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4))
|
||||
pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6))
|
||||
pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_color3"])
|
||||
var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference",
|
||||
rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null
|
||||
if(new_tailc3)
|
||||
pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4))
|
||||
pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6))
|
||||
pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_style"])
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_wing_styles = list("Normal" = null)
|
||||
for(var/path in wing_styles_list)
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
|
||||
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit
|
||||
pretty_wing_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles
|
||||
if(new_wing_style)
|
||||
pref.wing_style = pretty_wing_styles[new_wing_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_color"])
|
||||
var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference",
|
||||
rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null
|
||||
if(new_wingc)
|
||||
pref.r_wing = hex2num(copytext(new_wingc, 2, 4))
|
||||
pref.g_wing = hex2num(copytext(new_wingc, 4, 6))
|
||||
pref.b_wing = hex2num(copytext(new_wingc, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_color2"])
|
||||
var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference",
|
||||
rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null
|
||||
if(new_wingc2)
|
||||
pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4))
|
||||
pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6))
|
||||
pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_color3"])
|
||||
var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference",
|
||||
rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null
|
||||
if(new_wingc3)
|
||||
pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4))
|
||||
pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6))
|
||||
pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define LOADOUT_BAN_STRING "Custom loadout"
|
||||
|
||||
/datum/gear_tweak/proc/get_contents(var/metadata)
|
||||
return
|
||||
|
||||
@@ -165,7 +167,7 @@ var/datum/gear_tweak/custom_name/gear_tweak_free_name = new()
|
||||
return ""
|
||||
|
||||
/datum/gear_tweak/custom_name/get_metadata(var/user, var/metadata)
|
||||
if(jobban_isbanned(user, "Custom loadout"))
|
||||
if(jobban_isbanned(user, LOADOUT_BAN_STRING))
|
||||
to_chat(user, SPAN_WARNING("You are banned from using custom loadout names/descriptions."))
|
||||
return
|
||||
if(valid_custom_names)
|
||||
@@ -196,7 +198,7 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new()
|
||||
return ""
|
||||
|
||||
/datum/gear_tweak/custom_desc/get_metadata(var/user, var/metadata)
|
||||
if(jobban_isbanned(user, "Custom loadout"))
|
||||
if(jobban_isbanned(user, LOADOUT_BAN_STRING))
|
||||
to_chat(user, SPAN_WARNING("You are banned from using custom loadout names/descriptions."))
|
||||
return
|
||||
if(valid_custom_desc)
|
||||
@@ -507,3 +509,46 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new()
|
||||
var/t = ValidTeslaLinks[metadata[7]]
|
||||
I.tesla_link = new t(I)
|
||||
I.update_verbs()
|
||||
|
||||
/datum/gear_tweak/implant_location
|
||||
var/static/list/bodypart_names_to_tokens = list(
|
||||
"head" = BP_HEAD,
|
||||
"upper body" = BP_TORSO,
|
||||
"lower body" = BP_GROIN,
|
||||
"left hand" = BP_L_HAND,
|
||||
"left arm" = BP_L_ARM,
|
||||
"right hand" = BP_R_HAND,
|
||||
"right arm" = BP_R_ARM,
|
||||
"left foot" = BP_L_FOOT,
|
||||
"left leg" = BP_L_LEG,
|
||||
"right foot" = BP_R_FOOT,
|
||||
"right leg" = BP_R_LEG
|
||||
)
|
||||
var/static/list/bodypart_tokens_to_names = list(
|
||||
BP_HEAD = "head",
|
||||
BP_TORSO = "upper body",
|
||||
BP_GROIN = "lower body",
|
||||
BP_LEFT_HAND = "left hand",
|
||||
BP_LEFT_ARM = "left arm",
|
||||
BP_RIGHT_HAND = "right hand",
|
||||
BP_RIGHT_ARM = "right arm",
|
||||
BP_LEFT_FOOT = "left foot",
|
||||
BP_LEFT_LEG = "left leg",
|
||||
BP_RIGHT_FOOT = "right foot",
|
||||
BP_RIGHT_LEG = "right leg"
|
||||
)
|
||||
|
||||
/datum/gear_tweak/implant_location/get_default()
|
||||
return bodypart_names_to_tokens[1]
|
||||
|
||||
/datum/gear_tweak/implant_location/tweak_item(var/obj/item/weapon/implant/I, var/metadata)
|
||||
if(istype(I))
|
||||
I.initialize_loc = bodypart_names_to_tokens[metadata] || BP_TORSO
|
||||
|
||||
/datum/gear_tweak/implant_location/get_contents(var/metadata)
|
||||
return "Location: [metadata]"
|
||||
|
||||
/datum/gear_tweak/implant_location/get_metadata(var/user, var/metadata)
|
||||
return (input(user, "Select a bodypart for the implant to be implanted inside.", "Implant Location", metadata || "upper body") as null|anything in bodypart_names_to_tokens) || bodypart_tokens_to_names[BP_TORSO]
|
||||
|
||||
#undef LOADOUT_BAN_STRING
|
||||
@@ -77,6 +77,12 @@
|
||||
display_name = "drop pouches, white (Medical)"
|
||||
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic")
|
||||
|
||||
/datum/gear/accessory/bluespace
|
||||
display_name = "bluespace badge (Eng, Sec, Med, Exploration, Miner)"
|
||||
path = /obj/item/clothing/accessory/storage/bluespace
|
||||
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner")
|
||||
cost = 2
|
||||
|
||||
/datum/gear/accessory/webbing
|
||||
cost = 1
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/datum/gear/utility/implant
|
||||
display_name = "implant, neural assistance web"
|
||||
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
|
||||
path = /obj/item/weapon/implant/neural
|
||||
slot = "implant"
|
||||
exploitable = 1
|
||||
sort_category = "Cyberware"
|
||||
cost = 6
|
||||
|
||||
/datum/gear/utility/implant/tracking
|
||||
display_name = "implant, tracking"
|
||||
path = /obj/item/weapon/implant/tracking/weak
|
||||
cost = 10
|
||||
|
||||
// Remove these after generic implant has been in for awhile and everyone has had a reasonable period to copy their old descs.
|
||||
/datum/gear/utility/implant/dud1
|
||||
display_name = "implant, head"
|
||||
description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)."
|
||||
path = /obj/item/weapon/implant/dud
|
||||
cost = 1
|
||||
/datum/gear/utility/implant/dud2
|
||||
display_name = "implant, torso"
|
||||
description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)."
|
||||
path = /obj/item/weapon/implant/dud/torso
|
||||
cost = 1
|
||||
// End removal marker.
|
||||
|
||||
/datum/gear/utility/implant/generic
|
||||
display_name = "implant, generic, primary"
|
||||
description = "An implant with no obvious purpose."
|
||||
path = /obj/item/weapon/implant
|
||||
cost = 1
|
||||
|
||||
/datum/gear/utility/implant/generic/second
|
||||
display_name = "implant, generic, secondary"
|
||||
|
||||
/datum/gear/utility/implant/generic/third
|
||||
display_name = "implant, generic, tertiary"
|
||||
|
||||
/datum/gear/utility/implant/generic/New()
|
||||
..()
|
||||
gear_tweaks += global.gear_tweak_implant_location
|
||||
|
||||
/datum/gear/utility/implant/language
|
||||
cost = 2
|
||||
exploitable = 0
|
||||
|
||||
/datum/gear/utility/implant/language/eal
|
||||
display_name = "vocal synthesizer, EAL"
|
||||
description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
|
||||
path = /obj/item/weapon/implant/language/eal
|
||||
|
||||
/datum/gear/utility/implant/language/skrellian
|
||||
display_name = "vocal synthesizer, Skrellian"
|
||||
description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
|
||||
path = /obj/item/weapon/implant/language/skrellian
|
||||
@@ -27,6 +27,14 @@
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/eyes/thinblindfold
|
||||
display_name = "blindfold, thin white (recolorable)"
|
||||
path = /obj/item/clothing/glasses/sunglasses/thinblindfold
|
||||
|
||||
/datum/gear/eyes/thinblindfold/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/eyes/glasses
|
||||
display_name = "Glasses, prescription"
|
||||
path = /obj/item/clothing/glasses/regular
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
// 0-9 CKEYS
|
||||
/datum/gear/fluff/malady_crop
|
||||
path = /obj/item/weapon/material/twohanded/fluff/riding_crop/malady
|
||||
path = /obj/item/weapon/material/twohanded/riding_crop/malady
|
||||
display_name = "Malady's Crop"
|
||||
ckeywhitelist = list("1r1s")
|
||||
character_name = list("Malady Blanche")
|
||||
@@ -88,9 +88,9 @@
|
||||
ckeywhitelist = list("arokha")
|
||||
character_name = list("Aronai Sieyes")
|
||||
|
||||
/datum/gear/fluff/astraether_ritualknife
|
||||
path = /obj/item/weapon/material/knife/ritual
|
||||
display_name = "Astra's Ritual Knife"
|
||||
/datum/gear/fluff/astra_ritualknife
|
||||
path = /obj/item/weapon/material/knife/ritual/fluff/astra
|
||||
display_name = "Polished Ritual Knife"
|
||||
description = "A well kept strange ritual knife, There is a small tag with the name 'Astra Ether' on it. They are probably looking for this."
|
||||
ckeywhitelist = list("astraether")
|
||||
character_name = list("Astra Ether")
|
||||
@@ -959,6 +959,25 @@
|
||||
// U CKEYS
|
||||
|
||||
// V CKEYS
|
||||
/datum/gear/fluff/verie_suit
|
||||
path = /obj/item/clothing/under/fluff/verie
|
||||
display_name = "Verie's Salacious Suit"
|
||||
ckeywhitelist = list("vitoras")
|
||||
character_name = list("Verie")
|
||||
|
||||
/datum/gear/fluff/verie_hoodie
|
||||
path = /obj/item/clothing/suit/storage/hooded/fluff/verie
|
||||
display_name = "Verie's Helluva Hoodie"
|
||||
ckeywhitelist = list("vitoras")
|
||||
character_name = list("Verie")
|
||||
|
||||
/datum/gear/fluff/verie_comb
|
||||
path = /obj/item/weapon/fluff/verie
|
||||
display_name = "Verie's Crazy Comb"
|
||||
description = "(Note: The highlights this gives you will be placed above EVERYTHING... including mobs!)"
|
||||
ckeywhitelist = list("vitoras")
|
||||
character_name = list("Verie")
|
||||
|
||||
/datum/gear/fluff/cameron_glasses
|
||||
path = /obj/item/clothing/glasses/fluff/science_proper
|
||||
display_name = "Cameron's Science Glasses"
|
||||
@@ -1059,6 +1078,12 @@
|
||||
ckeywhitelist = list("vitoras")
|
||||
character_name = list("Roanna Ti'Rox")
|
||||
|
||||
/datum/gear/fluff/harmony_id
|
||||
path = /obj/item/weapon/card/id/fluff/harmony
|
||||
display_name = "Harmony's ITG-ID card"
|
||||
ckeywhitelist = list("verysoft")
|
||||
character_name = list("Harmony")
|
||||
|
||||
// W CKEYS
|
||||
/datum/gear/fluff/sthasha_bracer
|
||||
path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha
|
||||
|
||||
@@ -88,6 +88,11 @@
|
||||
display_name = "cap, grey"
|
||||
path = /obj/item/clothing/head/soft/grey
|
||||
|
||||
/datum/gear/head/cap/med
|
||||
display_name = "cap, medical (Medical)"
|
||||
path = /obj/item/clothing/head/soft/med
|
||||
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Search and Rescue")
|
||||
|
||||
/datum/gear/head/cap/orange
|
||||
display_name = "cap, orange"
|
||||
path = /obj/item/clothing/head/soft/orange
|
||||
@@ -330,7 +335,7 @@
|
||||
path = /obj/item/clothing/head/welding/engie
|
||||
|
||||
/datum/gear/head/beret/solgov
|
||||
display_name = "beret sol, selection"
|
||||
display_name = "beret government, selection"
|
||||
path = /obj/item/clothing/head/beret/solgov
|
||||
|
||||
/datum/gear/head/beret/solgov/New()
|
||||
@@ -386,4 +391,8 @@
|
||||
|
||||
/datum/gear/head/blackngoldheaddress
|
||||
display_name = "black and gold headdress"
|
||||
path = /obj/item/clothing/head/blackngoldheaddress
|
||||
path = /obj/item/clothing/head/blackngoldheaddress
|
||||
|
||||
/datum/gear/head/plaguedoctor2
|
||||
display_name = "golden plague doctor's hat"
|
||||
path = /obj/item/clothing/head/plaguedoctorhat/gold
|
||||
@@ -18,4 +18,28 @@
|
||||
/datum/gear/head/detective_alt
|
||||
display_name = "cyberscope headgear, detective"
|
||||
path = /obj/item/clothing/head/helmet/detective_alt
|
||||
allowed_roles = list("Head of Security", "Detective")
|
||||
allowed_roles = list("Head of Security", "Detective")
|
||||
|
||||
/datum/gear/head/bearpelt
|
||||
display_name = "brown bear pelt"
|
||||
path = /obj/item/clothing/head/pelt
|
||||
|
||||
/datum/gear/head/wolfpelt
|
||||
display_name = "brown wolf pelt"
|
||||
path = /obj/item/clothing/head/pelt/wolfpelt
|
||||
|
||||
/datum/gear/head/wolfpeltblack
|
||||
display_name = "black wolf pelt"
|
||||
path = /obj/item/clothing/head/pelt/wolfpeltblack
|
||||
|
||||
/datum/gear/head/tigerpelt
|
||||
display_name = "shiny tiger pelt"
|
||||
path = /obj/item/clothing/head/pelt/tigerpelt
|
||||
|
||||
/datum/gear/head/tigerpeltsnow
|
||||
display_name = "snow tiger pelt"
|
||||
path = /obj/item/clothing/head/pelt/tigerpeltsnow
|
||||
|
||||
/datum/gear/head/tigerpeltpink
|
||||
display_name = "pink tiger pelt"
|
||||
path = /obj/item/clothing/head/pelt/tigerpeltpink
|
||||
@@ -24,4 +24,9 @@
|
||||
|
||||
/datum/gear/mask/veil
|
||||
display_name = "black veil"
|
||||
path = /obj/item/clothing/mask/veil
|
||||
path = /obj/item/clothing/mask/veil
|
||||
|
||||
/datum/gear/mask/plaguedoctor2
|
||||
display_name = "golden plague doctor's mask"
|
||||
path = /obj/item/clothing/mask/gas/plaguedoctor/gold
|
||||
cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
|
||||
@@ -173,6 +173,10 @@ datum/gear/suit/duster
|
||||
path = /obj/item/clothing/suit/storage/toggle/labcoat/emt
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/suit/miscellaneous/labcoat
|
||||
display_name = "plague doctor's coat"
|
||||
path = /obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor
|
||||
|
||||
/datum/gear/suit/roles/surgical_apron
|
||||
display_name = "surgical apron"
|
||||
path = /obj/item/clothing/suit/surgicalapron
|
||||
|
||||
@@ -71,4 +71,14 @@
|
||||
//greek thing
|
||||
/datum/gear/suit/chiton
|
||||
display_name = "chiton"
|
||||
path = /obj/item/clothing/suit/chiton
|
||||
path = /obj/item/clothing/suit/chiton
|
||||
|
||||
|
||||
//oversized t-shirt
|
||||
/datum/gear/suit/oversize
|
||||
display_name = "oversized t-shirt (colorable)"
|
||||
path = /obj/item/clothing/suit/oversize
|
||||
|
||||
/datum/gear/suit/oversize/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
@@ -65,7 +65,7 @@
|
||||
..()
|
||||
var/list/skirts = list()
|
||||
for(var/skirt in (typesof(/obj/item/clothing/under/skirt)))
|
||||
if(skirt in typesof(/obj/item/clothing/under/skirt/fluff)) //VOREStation addition
|
||||
if((skirt in typesof(/obj/item/clothing/under/skirt/fluff)) || (skirt in typesof(/obj/item/clothing/under/skirt/outfit/fluff))) //VOREStation addition
|
||||
continue //VOREStation addition
|
||||
var/obj/item/clothing/under/skirt/skirt_type = skirt
|
||||
skirts[initial(skirt_type.name)] = skirt_type
|
||||
@@ -644,4 +644,16 @@
|
||||
|
||||
/datum/gear/uniform/gothic2
|
||||
display_name = "lacey gothic dress"
|
||||
path = /obj/item/clothing/under/dress/gothic2
|
||||
path = /obj/item/clothing/under/dress/gothic2
|
||||
|
||||
/datum/gear/uniform/flowerskirt
|
||||
display_name = "flower skirt"
|
||||
path = /obj/item/clothing/under/flower_skirt
|
||||
|
||||
/datum/gear/uniform/flowerskirt/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/uniform/countess
|
||||
display_name = "countess dress"
|
||||
path = /obj/item/clothing/under/dress/countess
|
||||
@@ -204,3 +204,11 @@ Qipao
|
||||
/datum/gear/uniform/qipao_white
|
||||
display_name = "qipao, white"
|
||||
path = /obj/item/clothing/under/dress/qipao/white
|
||||
|
||||
/*
|
||||
Bluespace jumpsuit
|
||||
*/
|
||||
/datum/gear/uniform/hfjumpsuit
|
||||
display_name = "HYPER jumpsuit"
|
||||
path = /obj/item/clothing/under/hyperfiber
|
||||
cost = 2
|
||||
@@ -115,60 +115,10 @@
|
||||
display_name = "cell, device"
|
||||
path = /obj/item/weapon/cell/device
|
||||
|
||||
/datum/gear/utility/implant
|
||||
slot = "implant"
|
||||
exploitable = 1
|
||||
|
||||
/datum/gear/utility/implant/tracking
|
||||
display_name = "implant, tracking"
|
||||
path = /obj/item/weapon/implant/tracking/weak
|
||||
cost = 0 //VOREStation Edit. Changed cost to 0
|
||||
|
||||
/datum/gear/utility/implant/neural
|
||||
display_name = "implant, neural assistance web"
|
||||
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
|
||||
path = /obj/item/weapon/implant/neural
|
||||
cost = 6
|
||||
|
||||
/datum/gear/utility/implant/dud1
|
||||
display_name = "implant, head"
|
||||
description = "An implant with no obvious purpose."
|
||||
path = /obj/item/weapon/implant/dud
|
||||
cost = 1
|
||||
|
||||
/datum/gear/utility/implant/dud2
|
||||
display_name = "implant, torso"
|
||||
description = "An implant with no obvious purpose."
|
||||
path = /obj/item/weapon/implant/dud/torso
|
||||
cost = 1
|
||||
|
||||
/datum/gear/utility/implant/language
|
||||
cost = 2
|
||||
exploitable = 0
|
||||
|
||||
/datum/gear/utility/implant/language/eal
|
||||
display_name = "vocal synthesizer, EAL"
|
||||
description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
|
||||
path = /obj/item/weapon/implant/language/eal
|
||||
|
||||
/datum/gear/utility/implant/language/skrellian
|
||||
display_name = "vocal synthesizer, Skrellian"
|
||||
description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
|
||||
path = /obj/item/weapon/implant/language/skrellian
|
||||
|
||||
/datum/gear/utility/pen
|
||||
display_name = "Fountain Pen"
|
||||
path = /obj/item/weapon/pen/fountain
|
||||
|
||||
/datum/gear/utility/wheelchair/color
|
||||
display_name = "wheelchair"
|
||||
path = /obj/item/wheelchair
|
||||
cost = 4
|
||||
|
||||
/datum/gear/utility/wheelchair/color/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/utility/umbrella
|
||||
display_name = "Umbrella"
|
||||
path = /obj/item/weapon/melee/umbrella
|
||||
@@ -178,6 +128,20 @@
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/utility/wheelchair
|
||||
display_name = "wheelchair selection"
|
||||
path = /obj/item/wheelchair
|
||||
cost = 4
|
||||
|
||||
/datum/gear/utility/wheelchair/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
var/list/wheelchairs = list(
|
||||
"wheelchair" = /obj/item/wheelchair,
|
||||
"motorized wheelchair" = /obj/item/wheelchair/motor
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(wheelchairs)
|
||||
|
||||
/****************
|
||||
modular computers
|
||||
****************/
|
||||
|
||||
@@ -670,3 +670,10 @@
|
||||
path = /obj/item/clothing/glasses/aerogelgoggles
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/utility/teshchair
|
||||
display_name = "small electric wheelchair (Teshari)"
|
||||
path = /obj/item/wheelchair/motor/small
|
||||
whitelisted = SPECIES_TESHARI
|
||||
sort_category = "Xenowear"
|
||||
cost = 4
|
||||
|
||||
@@ -149,6 +149,9 @@
|
||||
var/available_in_hours = job.available_in_playhours(user.client)
|
||||
. += "<del>[rank]</del></td></a><td> \[IN [round(available_in_hours, 0.1)] DEPTHOURS]</td></tr>"
|
||||
continue
|
||||
if(!is_job_whitelisted(user,rank))
|
||||
. += "<del>[rank]</del></td></a><td><b> \[WHITELIST ONLY]</b></td></tr>"
|
||||
continue
|
||||
//VOREStation Add End
|
||||
if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age))
|
||||
. += "<del>[rank]</del></td></a><td> \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]</td></tr>"
|
||||
|
||||
@@ -299,7 +299,3 @@
|
||||
if(PREF_FBP_SOFTWARE)
|
||||
return 150
|
||||
return S.max_age // welp
|
||||
|
||||
/datum/category_item/player_setup_item/proc/color_square(red, green, blue, hex)
|
||||
var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]"
|
||||
return "<span style='font-face: fixedsys; font-size: 14px; background-color: [color]; color: [color]'>___</span>"
|
||||
@@ -23,7 +23,8 @@
|
||||
|
||||
// Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state.
|
||||
/datum/trait/modifier/physical
|
||||
category = "Physical Quirks" //VOREStation Edit
|
||||
name = "Physical"
|
||||
category = "Physical"
|
||||
|
||||
|
||||
/datum/trait/modifier/physical/flimsy
|
||||
@@ -194,6 +195,7 @@
|
||||
// 'Mental' traits are just those that only sapients can have, for now, and generally involves fears.
|
||||
// So far, all of them are just for fluff/don't have mechanical effects.
|
||||
/datum/trait/modifier/mental
|
||||
name = "Mental"
|
||||
category = "Mental"
|
||||
|
||||
/datum/trait/modifier/mental/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
|
||||
|
||||
@@ -3,373 +3,3 @@
|
||||
name = "VORE"
|
||||
sort_order = 8
|
||||
category_item_type = /datum/category_item/player_setup_item/vore
|
||||
|
||||
// Define a place to save appearance in character setup
|
||||
/datum/preferences
|
||||
var/ear_style // Type of selected ear style
|
||||
var/r_ears = 30 // Ear color.
|
||||
var/g_ears = 30 // Ear color
|
||||
var/b_ears = 30 // Ear color
|
||||
var/r_ears2 = 30 // Ear extra color.
|
||||
var/g_ears2 = 30 // Ear extra color
|
||||
var/b_ears2 = 30 // Ear extra color
|
||||
var/r_ears3 = 30 // Ear tertiary color.
|
||||
var/g_ears3 = 30 // Ear tertiary color
|
||||
var/b_ears3 = 30 // Ear tertiary color
|
||||
var/tail_style // Type of selected tail style
|
||||
var/r_tail = 30 // Tail/Taur color
|
||||
var/g_tail = 30 // Tail/Taur color
|
||||
var/b_tail = 30 // Tail/Taur color
|
||||
var/r_tail2 = 30 // For extra overlay.
|
||||
var/g_tail2 = 30 // For extra overlay.
|
||||
var/b_tail2 = 30 // For extra overlay.
|
||||
var/r_tail3 = 30 // For tertiary overlay.
|
||||
var/g_tail3 = 30 // For tertiary overlay.
|
||||
var/b_tail3 = 30 // For tertiary overlay.
|
||||
var/wing_style // Type of selected wing style
|
||||
var/r_wing = 30 // Wing color
|
||||
var/g_wing = 30 // Wing color
|
||||
var/b_wing = 30 // Wing color
|
||||
var/r_wing2 = 30 // Wing extra color
|
||||
var/g_wing2 = 30 // Wing extra color
|
||||
var/b_wing2 = 30 // Wing extra color
|
||||
var/r_wing3 = 30 // Wing tertiary color
|
||||
var/g_wing3 = 30 // Wing tertiary color
|
||||
var/b_wing3 = 30 // Wing tertiary color
|
||||
|
||||
// Definition of the stuff for Ears
|
||||
/datum/category_item/player_setup_item/vore/ears
|
||||
name = "Appearance"
|
||||
sort_order = 1
|
||||
|
||||
/datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S)
|
||||
S["ear_style"] >> pref.ear_style
|
||||
S["r_ears"] >> pref.r_ears
|
||||
S["g_ears"] >> pref.g_ears
|
||||
S["b_ears"] >> pref.b_ears
|
||||
S["r_ears2"] >> pref.r_ears2
|
||||
S["g_ears2"] >> pref.g_ears2
|
||||
S["b_ears2"] >> pref.b_ears2
|
||||
S["r_ears3"] >> pref.r_ears3
|
||||
S["g_ears3"] >> pref.g_ears3
|
||||
S["b_ears3"] >> pref.b_ears3
|
||||
S["tail_style"] >> pref.tail_style
|
||||
S["r_tail"] >> pref.r_tail
|
||||
S["g_tail"] >> pref.g_tail
|
||||
S["b_tail"] >> pref.b_tail
|
||||
S["r_tail2"] >> pref.r_tail2
|
||||
S["g_tail2"] >> pref.g_tail2
|
||||
S["b_tail2"] >> pref.b_tail2
|
||||
S["r_tail3"] >> pref.r_tail3
|
||||
S["g_tail3"] >> pref.g_tail3
|
||||
S["b_tail3"] >> pref.b_tail3
|
||||
S["wing_style"] >> pref.wing_style
|
||||
S["r_wing"] >> pref.r_wing
|
||||
S["g_wing"] >> pref.g_wing
|
||||
S["b_wing"] >> pref.b_wing
|
||||
S["r_wing2"] >> pref.r_wing2
|
||||
S["g_wing2"] >> pref.g_wing2
|
||||
S["b_wing2"] >> pref.b_wing2
|
||||
S["r_wing3"] >> pref.r_wing3
|
||||
S["g_wing3"] >> pref.g_wing3
|
||||
S["b_wing3"] >> pref.b_wing3
|
||||
|
||||
/datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S)
|
||||
S["ear_style"] << pref.ear_style
|
||||
S["r_ears"] << pref.r_ears
|
||||
S["g_ears"] << pref.g_ears
|
||||
S["b_ears"] << pref.b_ears
|
||||
S["r_ears2"] << pref.r_ears2
|
||||
S["g_ears2"] << pref.g_ears2
|
||||
S["b_ears2"] << pref.b_ears2
|
||||
S["r_ears3"] << pref.r_ears3
|
||||
S["g_ears3"] << pref.g_ears3
|
||||
S["b_ears3"] << pref.b_ears3
|
||||
S["tail_style"] << pref.tail_style
|
||||
S["r_tail"] << pref.r_tail
|
||||
S["g_tail"] << pref.g_tail
|
||||
S["b_tail"] << pref.b_tail
|
||||
S["r_tail2"] << pref.r_tail2
|
||||
S["g_tail2"] << pref.g_tail2
|
||||
S["b_tail2"] << pref.b_tail2
|
||||
S["r_tail3"] << pref.r_tail3
|
||||
S["g_tail3"] << pref.g_tail3
|
||||
S["b_tail3"] << pref.b_tail3
|
||||
S["wing_style"] << pref.wing_style
|
||||
S["r_wing"] << pref.r_wing
|
||||
S["g_wing"] << pref.g_wing
|
||||
S["b_wing"] << pref.b_wing
|
||||
S["r_wing2"] << pref.r_wing2
|
||||
S["g_wing2"] << pref.g_wing2
|
||||
S["b_wing2"] << pref.b_wing2
|
||||
S["r_wing3"] << pref.r_wing3
|
||||
S["g_wing3"] << pref.g_wing3
|
||||
S["b_wing3"] << pref.b_wing3
|
||||
|
||||
/datum/category_item/player_setup_item/vore/ears/sanitize_character()
|
||||
pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears))
|
||||
pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears))
|
||||
pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears))
|
||||
pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2))
|
||||
pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2))
|
||||
pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2))
|
||||
pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3))
|
||||
pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3))
|
||||
pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3))
|
||||
pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail))
|
||||
pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail))
|
||||
pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail))
|
||||
pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2))
|
||||
pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2))
|
||||
pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2))
|
||||
pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3))
|
||||
pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3))
|
||||
pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3))
|
||||
pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing))
|
||||
pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing))
|
||||
pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing))
|
||||
pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2))
|
||||
pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2))
|
||||
pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2))
|
||||
pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3))
|
||||
pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3))
|
||||
pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3))
|
||||
|
||||
if(pref.ear_style)
|
||||
pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style))
|
||||
var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style]
|
||||
if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed)))
|
||||
pref.ear_style = initial(pref.ear_style)
|
||||
if(pref.tail_style)
|
||||
pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style))
|
||||
var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style]
|
||||
if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed)))
|
||||
pref.tail_style = initial(pref.tail_style)
|
||||
if(pref.wing_style)
|
||||
pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style))
|
||||
var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style]
|
||||
if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed)))
|
||||
pref.wing_style = initial(pref.wing_style)
|
||||
|
||||
/datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.ear_style = ear_styles_list[pref.ear_style]
|
||||
character.r_ears = pref.r_ears
|
||||
character.b_ears = pref.b_ears
|
||||
character.g_ears = pref.g_ears
|
||||
character.r_ears2 = pref.r_ears2
|
||||
character.b_ears2 = pref.b_ears2
|
||||
character.g_ears2 = pref.g_ears2
|
||||
character.r_ears3 = pref.r_ears3
|
||||
character.b_ears3 = pref.b_ears3
|
||||
character.g_ears3 = pref.g_ears3
|
||||
character.tail_style = tail_styles_list[pref.tail_style]
|
||||
character.r_tail = pref.r_tail
|
||||
character.b_tail = pref.b_tail
|
||||
character.g_tail = pref.g_tail
|
||||
character.r_tail2 = pref.r_tail2
|
||||
character.b_tail2 = pref.b_tail2
|
||||
character.g_tail2 = pref.g_tail2
|
||||
character.r_tail3 = pref.r_tail3
|
||||
character.b_tail3 = pref.b_tail3
|
||||
character.g_tail3 = pref.g_tail3
|
||||
character.wing_style = wing_styles_list[pref.wing_style]
|
||||
character.r_wing = pref.r_wing
|
||||
character.b_wing = pref.b_wing
|
||||
character.g_wing = pref.g_wing
|
||||
character.r_wing2 = pref.r_wing2
|
||||
character.b_wing2 = pref.b_wing2
|
||||
character.g_wing2 = pref.g_wing2
|
||||
character.r_wing3 = pref.r_wing3
|
||||
character.b_wing3 = pref.b_wing3
|
||||
character.g_wing3 = pref.g_wing3
|
||||
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/vore/ears/content(var/mob/user)
|
||||
. += "<h2>VORE Station Settings</h2>"
|
||||
|
||||
var/ear_display = "Normal"
|
||||
if(pref.ear_style && (pref.ear_style in ear_styles_list))
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style]
|
||||
ear_display = instance.name
|
||||
|
||||
else if(pref.ear_style)
|
||||
ear_display = "REQUIRES UPDATE"
|
||||
. += "<b>Ears</b><br>"
|
||||
. += " Style: <a href='?src=\ref[src];ear_style=1'>[ear_display]</a><br>"
|
||||
if(ear_styles_list[pref.ear_style])
|
||||
var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style]
|
||||
if(ear.do_colouration)
|
||||
. += "<a href='?src=\ref[src];ear_color=1'>Change Color</a> [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]<br>"
|
||||
if(ear.extra_overlay)
|
||||
. += "<a href='?src=\ref[src];ear_color2=1'>Change Secondary Color</a> [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]<br>"
|
||||
if(ear.extra_overlay2)
|
||||
. += "<a href='?src=\ref[src];ear_color3=1'>Change Tertiary Color</a> [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]<br>"
|
||||
|
||||
var/tail_display = "Normal"
|
||||
if(pref.tail_style && (pref.tail_style in tail_styles_list))
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style]
|
||||
tail_display = instance.name
|
||||
else if(pref.tail_style)
|
||||
tail_display = "REQUIRES UPDATE"
|
||||
. += "<b>Tail</b><br>"
|
||||
. += " Style: <a href='?src=\ref[src];tail_style=1'>[tail_display]</a><br>"
|
||||
|
||||
if(tail_styles_list[pref.tail_style])
|
||||
var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style]
|
||||
if(T.do_colouration)
|
||||
. += "<a href='?src=\ref[src];tail_color=1'>Change Color</a> [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]<br>"
|
||||
if(T.extra_overlay)
|
||||
. += "<a href='?src=\ref[src];tail_color2=1'>Change Secondary Color</a> [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]<br>"
|
||||
if(T.extra_overlay2)
|
||||
. += "<a href='?src=\ref[src];tail_color3=1'>Change Tertiary Color</a> [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]<br>"
|
||||
|
||||
var/wing_display = "Normal"
|
||||
if(pref.wing_style && (pref.wing_style in wing_styles_list))
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style]
|
||||
wing_display = instance.name
|
||||
else if(pref.wing_style)
|
||||
wing_display = "REQUIRES UPDATE"
|
||||
. += "<b>Wing</b><br>"
|
||||
. += " Style: <a href='?src=\ref[src];wing_style=1'>[wing_display]</a><br>"
|
||||
|
||||
if(wing_styles_list[pref.wing_style])
|
||||
var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style]
|
||||
if (W.do_colouration)
|
||||
. += "<a href='?src=\ref[src];wing_color=1'>Change Color</a> [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]<br>"
|
||||
if (W.extra_overlay)
|
||||
. += "<a href='?src=\ref[src];wing_color2=1'>Change Secondary Color</a> [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]<br>"
|
||||
if (W.extra_overlay2)
|
||||
. += "<a href='?src=\ref[src];wing_color3=1'>Change Secondary Color</a> [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]<br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(!CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
|
||||
else if(href_list["ear_style"])
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles
|
||||
if(new_ear_style)
|
||||
pref.ear_style = pretty_ear_styles[new_ear_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_color"])
|
||||
var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference",
|
||||
rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null
|
||||
if(new_earc)
|
||||
pref.r_ears = hex2num(copytext(new_earc, 2, 4))
|
||||
pref.g_ears = hex2num(copytext(new_earc, 4, 6))
|
||||
pref.b_ears = hex2num(copytext(new_earc, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_color2"])
|
||||
var/new_earc2 = input(user, "Choose your character's secondary ear colour:", "Character Preference",
|
||||
rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null
|
||||
if(new_earc2)
|
||||
pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4))
|
||||
pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6))
|
||||
pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["ear_color3"])
|
||||
var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference",
|
||||
rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null
|
||||
if(new_earc3)
|
||||
pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4))
|
||||
pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6))
|
||||
pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_style"])
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_tail_styles = list("Normal" = null)
|
||||
for(var/path in tail_styles_list)
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
|
||||
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
|
||||
pretty_tail_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles
|
||||
if(new_tail_style)
|
||||
pref.tail_style = pretty_tail_styles[new_tail_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_color"])
|
||||
var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference",
|
||||
rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null
|
||||
if(new_tailc)
|
||||
pref.r_tail = hex2num(copytext(new_tailc, 2, 4))
|
||||
pref.g_tail = hex2num(copytext(new_tailc, 4, 6))
|
||||
pref.b_tail = hex2num(copytext(new_tailc, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_color2"])
|
||||
var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference",
|
||||
rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null
|
||||
if(new_tailc2)
|
||||
pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4))
|
||||
pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6))
|
||||
pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["tail_color3"])
|
||||
var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference",
|
||||
rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null
|
||||
if(new_tailc3)
|
||||
pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4))
|
||||
pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6))
|
||||
pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_style"])
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_wing_styles = list("Normal" = null)
|
||||
for(var/path in wing_styles_list)
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
|
||||
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
|
||||
pretty_wing_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles
|
||||
if(new_wing_style)
|
||||
pref.wing_style = pretty_wing_styles[new_wing_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_color"])
|
||||
var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference",
|
||||
rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null
|
||||
if(new_wingc)
|
||||
pref.r_wing = hex2num(copytext(new_wingc, 2, 4))
|
||||
pref.g_wing = hex2num(copytext(new_wingc, 4, 6))
|
||||
pref.b_wing = hex2num(copytext(new_wingc, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_color2"])
|
||||
var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference",
|
||||
rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null
|
||||
if(new_wingc2)
|
||||
pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4))
|
||||
pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6))
|
||||
pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["wing_color3"])
|
||||
var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference",
|
||||
rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null
|
||||
if(new_wingc3)
|
||||
pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4))
|
||||
pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6))
|
||||
pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8))
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
character.weight_gain = pref.weight_gain
|
||||
character.weight_loss = pref.weight_loss
|
||||
character.fuzzy = pref.fuzzy
|
||||
character.appearance_flags -= pref.fuzzy*PIXEL_SCALE
|
||||
character.resize(pref.size_multiplier, animate = FALSE)
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
|
||||
@@ -70,7 +69,7 @@
|
||||
|
||||
else if(href_list["toggle_fuzzy"])
|
||||
pref.fuzzy = pref.fuzzy ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["weight"])
|
||||
var/new_weight = input(user, "Choose your character's relative body weight.\n\
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
var/UNATHI_EGG = "Unathi"
|
||||
var/TAJARAN_EGG = "Tajaran"
|
||||
var/AKULA_EGG = "Akula"
|
||||
var/SKRELL_EGG = "Skrell"
|
||||
var/SERGAL_EGG = "Sergal"
|
||||
var/HUMAN_EGG = "Human"
|
||||
var/NEVREAN_EGG = "nevrean"
|
||||
var/SLIME_EGG = "Slime"
|
||||
var/EGG_EGG = "Egg"
|
||||
var/XENOCHIMERA_EGG = "Xenochimera"
|
||||
var/XENOMORPH_EGG = "Xenomorph"
|
||||
|
||||
// Define a place to save appearance in character setup
|
||||
/datum/preferences
|
||||
var/vore_egg_type = "Egg" //The egg type they have.
|
||||
@@ -26,8 +14,7 @@ var/XENOMORPH_EGG = "Xenomorph"
|
||||
S["vore_egg_type"] << pref.vore_egg_type
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/sanitize_character()
|
||||
var/valid_vore_egg_types = global_vore_egg_types
|
||||
pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, valid_vore_egg_types, initial(pref.vore_egg_type))
|
||||
pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, global_vore_egg_types, initial(pref.vore_egg_type))
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.vore_egg_type = pref.vore_egg_type
|
||||
@@ -44,7 +31,7 @@ var/XENOMORPH_EGG = "Xenomorph"
|
||||
var/list/vore_egg_types = global_vore_egg_types
|
||||
var/selection = input(user, "Choose your character's egg type:", "Character Preference", pref.vore_egg_type) as null|anything in vore_egg_types
|
||||
if(selection)
|
||||
pref.vore_egg_type = vore_egg_types[selection]
|
||||
pref.vore_egg_type = selection
|
||||
return TOPIC_REFRESH
|
||||
else
|
||||
return
|
||||
|
||||
@@ -2,11 +2,19 @@
|
||||
#define NEUTRAL_MODE 2
|
||||
#define NEGATIVE_MODE 3
|
||||
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/preferences
|
||||
var/custom_species // Custom species name, can't be changed due to it having been used in savefiles already.
|
||||
var/custom_base // What to base the custom species on
|
||||
var/blood_color = "#A10808"
|
||||
|
||||
var/custom_say = null
|
||||
var/custom_whisper = null
|
||||
var/custom_ask = null
|
||||
var/custom_exclaim = null
|
||||
|
||||
var/list/pos_traits = list() // What traits they've selected for their custom species
|
||||
var/list/neu_traits = list()
|
||||
var/list/neg_traits = list()
|
||||
@@ -15,6 +23,7 @@
|
||||
var/starting_trait_points = STARTING_SPECIES_POINTS
|
||||
var/max_traits = MAX_SPECIES_TRAITS
|
||||
var/dirty_synth = 0 //Are you a synth
|
||||
var/gross_meatbag = 0 //Where'd I leave my Voight-Kampff test kit?
|
||||
|
||||
// Definition of the stuff for Ears
|
||||
/datum/category_item/player_setup_item/vore/traits
|
||||
@@ -29,10 +38,15 @@
|
||||
S["neg_traits"] >> pref.neg_traits
|
||||
S["blood_color"] >> pref.blood_color
|
||||
|
||||
S["traits_cheating"]>> pref.traits_cheating
|
||||
S["traits_cheating"] >> pref.traits_cheating
|
||||
S["max_traits"] >> pref.max_traits
|
||||
S["trait_points"] >> pref.starting_trait_points
|
||||
|
||||
S["custom_say"] >> pref.custom_say
|
||||
S["custom_whisper"] >> pref.custom_whisper
|
||||
S["custom_ask"] >> pref.custom_ask
|
||||
S["custom_exclaim"] >> pref.custom_exclaim
|
||||
|
||||
/datum/category_item/player_setup_item/vore/traits/save_character(var/savefile/S)
|
||||
S["custom_species"] << pref.custom_species
|
||||
S["custom_base"] << pref.custom_base
|
||||
@@ -41,10 +55,15 @@
|
||||
S["neg_traits"] << pref.neg_traits
|
||||
S["blood_color"] << pref.blood_color
|
||||
|
||||
S["traits_cheating"]<< pref.traits_cheating
|
||||
S["traits_cheating"] << pref.traits_cheating
|
||||
S["max_traits"] << pref.max_traits
|
||||
S["trait_points"] << pref.starting_trait_points
|
||||
|
||||
S["custom_say"] << pref.custom_say
|
||||
S["custom_whisper"] << pref.custom_whisper
|
||||
S["custom_ask"] << pref.custom_ask
|
||||
S["custom_exclaim"] << pref.custom_exclaim
|
||||
|
||||
/datum/category_item/player_setup_item/vore/traits/sanitize_character()
|
||||
if(!pref.pos_traits) pref.pos_traits = list()
|
||||
if(!pref.neu_traits) pref.neu_traits = list()
|
||||
@@ -58,47 +77,59 @@
|
||||
|
||||
if(pref.species != SPECIES_CUSTOM)
|
||||
pref.pos_traits.Cut()
|
||||
pref.neu_traits.Cut()
|
||||
pref.neg_traits.Cut()
|
||||
else
|
||||
// Clean up positive traits
|
||||
for(var/path in pref.pos_traits)
|
||||
if(!(path in positive_traits))
|
||||
pref.pos_traits -= path
|
||||
//Neutral traits
|
||||
for(var/path in pref.neu_traits)
|
||||
if(!(path in neutral_traits))
|
||||
pref.neu_traits -= path
|
||||
//Negative traits
|
||||
for(var/path in pref.neg_traits)
|
||||
if(!(path in negative_traits))
|
||||
pref.neg_traits -= path
|
||||
// Clean up positive traits
|
||||
for(var/path in pref.pos_traits)
|
||||
if(!(path in positive_traits))
|
||||
pref.pos_traits -= path
|
||||
//Neutral traits
|
||||
for(var/path in pref.neu_traits)
|
||||
if(!(path in neutral_traits))
|
||||
pref.neu_traits -= path
|
||||
if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits))
|
||||
pref.neu_traits -= path
|
||||
//Negative traits
|
||||
for(var/path in pref.neg_traits)
|
||||
if(!(path in negative_traits))
|
||||
pref.neg_traits -= path
|
||||
|
||||
var/datum/species/selected_species = GLOB.all_species[pref.species]
|
||||
if(selected_species.selects_bodytype)
|
||||
// Allowed!
|
||||
else if(!pref.custom_base || !(pref.custom_base in custom_species_bases))
|
||||
else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases))
|
||||
pref.custom_base = SPECIES_HUMAN
|
||||
|
||||
/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.custom_species = pref.custom_species
|
||||
var/datum/species/selected_species = GLOB.all_species[pref.species]
|
||||
character.custom_say = pref.custom_say
|
||||
character.custom_ask = pref.custom_ask
|
||||
character.custom_whisper = pref.custom_whisper
|
||||
character.custom_exclaim = pref.custom_exclaim
|
||||
|
||||
if(character.isSynthetic()) //Checking if we have a synth on our hands, boys.
|
||||
pref.dirty_synth = 1
|
||||
pref.gross_meatbag = 0
|
||||
else
|
||||
pref.gross_meatbag = 1
|
||||
pref.dirty_synth = 0
|
||||
|
||||
if(selected_species.selects_bodytype)
|
||||
var/datum/species/custom/CS = character.species
|
||||
var/S = pref.custom_base ? pref.custom_base : "Human"
|
||||
var/datum/species/custom/new_CS = CS.produceCopy(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character)
|
||||
var/datum/species/S = character.species
|
||||
var/SB
|
||||
if(S.selects_bodytype)
|
||||
SB = pref.custom_base ? pref.custom_base : "Human"
|
||||
else
|
||||
SB = S.name
|
||||
var/datum/species/new_S = S.produceCopy(SB, pref.pos_traits + pref.neu_traits + pref.neg_traits, character)
|
||||
|
||||
//Any additional non-trait settings can be applied here
|
||||
new_CS.blood_color = pref.blood_color
|
||||
//Any additional non-trait settings can be applied here
|
||||
new_S.blood_color = pref.blood_color
|
||||
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
//Statistics for this would be nice
|
||||
var/english_traits = english_list(new_S.traits, and_text = ";", comma_text = ";")
|
||||
log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet
|
||||
else
|
||||
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
//Statistics for this would be nice
|
||||
var/english_traits = english_list(new_CS.traits, and_text = ";", comma_text = ";")
|
||||
log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet
|
||||
|
||||
/datum/category_item/player_setup_item/vore/traits/content(var/mob/user)
|
||||
. += "<b>Custom Species Name:</b> "
|
||||
@@ -109,15 +140,16 @@
|
||||
. += "<b>Icon Base: </b> "
|
||||
. += "<a href='?src=\ref[src];custom_base=1'>[pref.custom_base ? pref.custom_base : "Human"]</a><br>"
|
||||
|
||||
var/traits_left = pref.max_traits
|
||||
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
var/points_left = pref.starting_trait_points
|
||||
var/traits_left = pref.max_traits
|
||||
|
||||
for(var/T in pref.pos_traits + pref.neg_traits)
|
||||
points_left -= traits_costs[T]
|
||||
traits_left--
|
||||
|
||||
. += "<b>Points Left:</b> [points_left]<br>"
|
||||
. += "<b>Traits Left:</b> [traits_left]<br>"
|
||||
. += "<b>Points Left:</b> [points_left]<br>"
|
||||
if(points_left < 0 || traits_left < 0 || !pref.custom_species)
|
||||
. += "<span style='color:red;'><b>^ Fix things! ^</b></span><br>"
|
||||
|
||||
@@ -128,22 +160,31 @@
|
||||
. += "<li>- <a href='?src=\ref[src];clicked_pos_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
|
||||
. += "</ul>"
|
||||
|
||||
. += "<a href='?src=\ref[src];add_trait=[NEUTRAL_MODE]'>Neutral Trait +</a><br>"
|
||||
. += "<ul>"
|
||||
for(var/T in pref.neu_traits)
|
||||
var/datum/trait/trait = neutral_traits[T]
|
||||
. += "<li>- <a href='?src=\ref[src];clicked_neu_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
|
||||
. += "</ul>"
|
||||
|
||||
. += "<a href='?src=\ref[src];add_trait=[NEGATIVE_MODE]'>Negative Trait +</a><br>"
|
||||
. += "<ul>"
|
||||
for(var/T in pref.neg_traits)
|
||||
var/datum/trait/trait = negative_traits[T]
|
||||
. += "<li>- <a href='?src=\ref[src];clicked_neg_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
|
||||
. += "</ul>"
|
||||
. += "<a href='?src=\ref[src];add_trait=[NEUTRAL_MODE]'>Neutral Trait +</a><br>"
|
||||
. += "<ul>"
|
||||
for(var/T in pref.neu_traits)
|
||||
var/datum/trait/trait = neutral_traits[T]
|
||||
. += "<li>- <a href='?src=\ref[src];clicked_neu_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
|
||||
. += "</ul>"
|
||||
. += "<b>Blood Color: </b>" //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color.
|
||||
. += "<a href='?src=\ref[src];blood_color=1'>Set Color</a>"
|
||||
. += "<a href='?src=\ref[src];blood_reset=1'>R</a><br>"
|
||||
. += "<br>"
|
||||
|
||||
. += "<b>Custom Say: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_say=1'>Set Say Verb</a><br>"
|
||||
. += "<b>Custom Whisper: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_whisper=1'>Set Whisper Verb</a><br>"
|
||||
. += "<b>Custom Ask: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_ask=1'>Set Ask Verb</a><br>"
|
||||
. += "<b>Custom Exclaim: </b>"
|
||||
. += "<a href='?src=\ref[src];custom_exclaim=1'>Set Exclaim Verb</a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(!CanUseTopic(user))
|
||||
@@ -163,7 +204,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["custom_base"])
|
||||
var/list/choices = custom_species_bases
|
||||
var/list/choices = GLOB.custom_species_bases
|
||||
if(pref.species != SPECIES_CUSTOM)
|
||||
choices = (choices | pref.species)
|
||||
var/text_choice = input("Pick an icon set for your species:","Icon Base") in choices
|
||||
@@ -204,6 +245,30 @@
|
||||
pref.neg_traits -= trait
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["custom_say"])
|
||||
var/say_choice = sanitize(input(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say) as null|text, 12)
|
||||
if(say_choice)
|
||||
pref.custom_say = say_choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["custom_whisper"])
|
||||
var/whisper_choice = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [pref.real_name] whispers, \"Hi...\"", "Custom Whisper", pref.custom_whisper) as null|text, 12)
|
||||
if(whisper_choice)
|
||||
pref.custom_whisper = whisper_choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["custom_ask"])
|
||||
var/ask_choice = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [pref.real_name] asks, \"Hi?\"", "Custom Ask", pref.custom_ask) as null|text, 12)
|
||||
if(ask_choice)
|
||||
pref.custom_ask = ask_choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["custom_exclaim"])
|
||||
var/exclaim_choice = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [pref.real_name] exclaims, \"Hi!\"", "Custom Exclaim", pref.custom_exclaim) as null|text, 12)
|
||||
if(exclaim_choice)
|
||||
pref.custom_exclaim = exclaim_choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["add_trait"])
|
||||
var/mode = text2num(href_list["add_trait"])
|
||||
var/list/picklist
|
||||
@@ -213,8 +278,12 @@
|
||||
picklist = positive_traits.Copy() - pref.pos_traits
|
||||
mylist = pref.pos_traits
|
||||
if(NEUTRAL_MODE)
|
||||
picklist = neutral_traits.Copy() - pref.neu_traits
|
||||
mylist = pref.neu_traits
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
picklist = neutral_traits.Copy() - pref.neu_traits
|
||||
mylist = pref.neu_traits
|
||||
else
|
||||
picklist = everyone_traits.Copy() - pref.neu_traits
|
||||
mylist = pref.neu_traits
|
||||
if(NEGATIVE_MODE)
|
||||
picklist = negative_traits.Copy() - pref.neg_traits
|
||||
mylist = pref.neg_traits
|
||||
@@ -260,13 +329,23 @@
|
||||
|
||||
var/conflict = FALSE
|
||||
|
||||
user.isSynthetic() //Recheck just to be sure
|
||||
if(pref.dirty_synth && instance.not_for_synths)//if you are a synth you can't take this trait.
|
||||
alert("You cannot take this trait as a SYNTH.\
|
||||
Please remove that trait, or pick another trait to add.","Error")
|
||||
if(pref.dirty_synth && !(instance.can_take & SYNTHETICS))
|
||||
alert("The trait you've selected can only be taken by organic characters!","Error")
|
||||
pref.dirty_synth = 0 //Just to be sure
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(pref.gross_meatbag && !(instance.can_take & ORGANICS))
|
||||
alert("The trait you've selected can only be taken by synthetic characters!","Error")
|
||||
pref.gross_meatbag = 0 //Just to be sure
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(pref.species in instance.banned_species)
|
||||
alert("The trait you've selected cannot be taken by the species you've chosen!","Error")
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if( LAZYLEN(instance.allowed_species) && !(pref.species in instance.allowed_species)) //Adding white list handling -shark
|
||||
alert("The trait you've selected cannot be taken by the species you've chosen!","Error")
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits)
|
||||
conflict = instance.name
|
||||
|
||||
@@ -6,10 +6,16 @@
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S)
|
||||
S["show_in_directory"] >> pref.show_in_directory
|
||||
S["directory_tag"] >> pref.directory_tag
|
||||
S["directory_erptag"] >> pref.directory_erptag
|
||||
S["directory_ad"] >> pref.directory_ad
|
||||
S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
|
||||
S["show_in_directory"] << pref.show_in_directory
|
||||
S["directory_tag"] << pref.directory_tag
|
||||
S["directory_erptag"] << pref.directory_erptag
|
||||
S["directory_ad"] << pref.directory_ad
|
||||
S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable
|
||||
|
||||
//TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout.
|
||||
@@ -20,17 +26,38 @@
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/sanitize_character()
|
||||
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
|
||||
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
|
||||
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
|
||||
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
|
||||
. += "<br>"
|
||||
. += "<b>Appear in Character Directory:</b> <a [pref.show_in_directory ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_show_in_directory=1'><b>[pref.show_in_directory ? "Yes" : "No"]</b></a><br>"
|
||||
. += "<b>Character Directory Vore Tag:</b> <a href='?src=\ref[src];directory_tag=1'><b>[pref.directory_tag]</b></a><br>"
|
||||
. += "<b>Character Directory ERP Tag:</b> <a href='?src=\ref[src];directory_erptag=1'><b>[pref.directory_erptag]</b></a><br>"
|
||||
. += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>"
|
||||
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>" //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
|
||||
if(href_list["toggle_show_in_directory"])
|
||||
pref.show_in_directory = pref.show_in_directory ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["directory_tag"])
|
||||
var/new_tag = input(user, "Pick a new Vore tag for the character directory", "Character Vore Tag", pref.directory_tag) as null|anything in GLOB.char_directory_tags
|
||||
if(!new_tag)
|
||||
return
|
||||
pref.directory_tag = new_tag
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["directory_erptag"])
|
||||
var/new_erptag = input(user, "Pick a new ERP tag for the character directory", "Character ERP Tag", pref.directory_erptag) as null|anything in GLOB.char_directory_erptags
|
||||
if(!new_erptag)
|
||||
return
|
||||
pref.directory_erptag = new_erptag
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["directory_ad"])
|
||||
var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes
|
||||
pref.directory_ad = msg
|
||||
return TOPIC_REFRESH
|
||||
//TFF 5/8/19 - add new thing so you can choose the sensor setting your character can get.
|
||||
else if(href_list["toggle_sensor_setting"])
|
||||
var/new_sensorpref = input(user, "Choose your character's sensor preferences:", "Character Preferences", sensorpreflist[pref.sensorpref]) as null|anything in sensorpreflist
|
||||
|
||||
@@ -82,11 +82,11 @@ datum/preferences
|
||||
//Mob preview
|
||||
var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen.
|
||||
var/static/list/preview_screen_locs = list(
|
||||
"1" = "character_preview_map:1,5:-12",
|
||||
"2" = "character_preview_map:1,3:15",
|
||||
"4" = "character_preview_map:1:7,2:10",
|
||||
"8" = "character_preview_map:1:-7,1:5",
|
||||
"BG" = "character_preview_map:1,1 to 1,5"
|
||||
"1" = "character_preview_map:2,7",
|
||||
"2" = "character_preview_map:2,5",
|
||||
"4" = "character_preview_map:2,3",
|
||||
"8" = "character_preview_map:2,1",
|
||||
"BG" = "character_preview_map:1,1 to 3,8"
|
||||
)
|
||||
|
||||
//Jobs, uses bitflags
|
||||
@@ -235,7 +235,7 @@ datum/preferences
|
||||
to_chat(user, "<span class='danger'>No mob exists for the given client!</span>")
|
||||
close_load_dialog(user)
|
||||
return
|
||||
|
||||
|
||||
if(!char_render_holders)
|
||||
update_preview_icon()
|
||||
show_character_previews()
|
||||
@@ -274,13 +274,13 @@ datum/preferences
|
||||
if(!BG)
|
||||
BG = new
|
||||
BG.plane = TURF_PLANE
|
||||
BG.icon = 'icons/effects/128x48.dmi'
|
||||
BG.icon = 'icons/effects/setup_backgrounds_vr.dmi'
|
||||
BG.pref = src
|
||||
LAZYSET(char_render_holders, "BG", BG)
|
||||
client.screen |= BG
|
||||
BG.icon_state = bgstate
|
||||
BG.screen_loc = preview_screen_locs["BG"]
|
||||
|
||||
|
||||
for(var/D in global.cardinal)
|
||||
var/obj/screen/setup_preview/O = LAZYACCESS(char_render_holders, "[D]")
|
||||
if(!O)
|
||||
@@ -400,13 +400,15 @@ datum/preferences
|
||||
if(S)
|
||||
dat += "<b>Select a character slot to load</b><hr>"
|
||||
var/name
|
||||
var/nickname //vorestation edit - This set appends nicknames to the save slot
|
||||
for(var/i=1, i<= config.character_slots, i++)
|
||||
S.cd = "/character[i]"
|
||||
S["real_name"] >> name
|
||||
S["nickname"] >> nickname //vorestation edit
|
||||
if(!name) name = "Character[i]"
|
||||
if(i==default_slot)
|
||||
name = "<b>[name]</b>"
|
||||
dat += "<a href='?src=\ref[src];changeslot=[i]'>[name]</a><br>"
|
||||
dat += "<a href='?src=\ref[src];changeslot=[i]'>[name][nickname ? " ([nickname])" : ""]</a><br>" //vorestation edit
|
||||
|
||||
dat += "<hr>"
|
||||
dat += "</center></tt>"
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
/datum/preferences
|
||||
var/show_in_directory = 1 //Show in Character Directory
|
||||
var/directory_tag = "Unset" //Sorting tag to use in character directory
|
||||
var/directory_erptag = "Unset" //ditto, but for non-vore scenes
|
||||
var/directory_ad = "" //Advertisement stuff to show in character directory.
|
||||
var/sensorpref = 5 //Set character's suit sensor level
|
||||
|
||||
var/job_talon_high = 0
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
|
||||
/client/verb/who_advanced()
|
||||
set name = "Advanced Who"
|
||||
set category = "OOC"
|
||||
|
||||
var/msg = "<b>Current Players:</b>\n"
|
||||
|
||||
var/list/Lines = list()
|
||||
|
||||
if(holder)
|
||||
for(var/client/C in GLOB.clients)
|
||||
var/entry = "<tr><td>[C.key]"
|
||||
if(C.holder && C.holder.fakekey)
|
||||
entry += " <i>(as [C.holder.fakekey])</i>"
|
||||
|
||||
entry += "</td><td>"
|
||||
|
||||
if(C.mob.real_name)
|
||||
switch(C.mob.stat)
|
||||
if(UNCONSCIOUS)
|
||||
entry += "<span class='darkgray'><b>Unconscious</b></span>" // these are literally all spans so I can apply .inverted to them because black on dark grey isn't legible
|
||||
|
||||
if(DEAD)
|
||||
if(isobserver(C.mob))
|
||||
var/mob/observer/dead/O = C.mob
|
||||
if(O.started_as_observer)
|
||||
entry += "<span class='gray'>Observing</span>"
|
||||
else
|
||||
entry += "<span class='black'><b>Died</b></span>"
|
||||
|
||||
else
|
||||
entry += "<span class='green'>Playing</span>"
|
||||
|
||||
entry += " as [C.mob.real_name]"
|
||||
|
||||
else if(isnewplayer(C.mob))
|
||||
entry += "<span class='blue'><b>In lobby</b></span>"
|
||||
|
||||
entry += "</td><td>"
|
||||
|
||||
var/age
|
||||
if(isnum(C.player_age))
|
||||
age = C.player_age
|
||||
else
|
||||
age = 0
|
||||
|
||||
if(age <= 1)
|
||||
age = "<span class='red'><b>[age]</b></span>"
|
||||
else if(age < 10)
|
||||
age = "<span class='orange'><b>[age]</b></span>"
|
||||
|
||||
entry += "Age: [age]"
|
||||
entry += "</td><td>"
|
||||
|
||||
if(is_special_character(C.mob))
|
||||
if(C.mob?.mind?.special_role)
|
||||
entry += "<b><span class='red'>[C.mob.mind.special_role]</span></b>"
|
||||
else
|
||||
entry += "<b><span class='red'>Antagonist</span></b>"
|
||||
|
||||
entry += "</td><td>"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
entry += " (AFK - "
|
||||
entry += "[round(seconds / 60)] minutes, "
|
||||
entry += "[seconds % 60] seconds)"
|
||||
|
||||
entry += "</td><td>"
|
||||
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
|
||||
entry += "</td></tr>"
|
||||
|
||||
Lines += entry
|
||||
else
|
||||
for(var/client/C in GLOB.clients)
|
||||
var/entry = "\t"
|
||||
if(C.holder && C.holder.fakekey)
|
||||
entry += "[C.holder.fakekey]"
|
||||
else
|
||||
entry += "[C.key]"
|
||||
var/mob/observer/dead/O = C.mob
|
||||
if(isobserver(O))
|
||||
entry += " - <span class='gray'>Observing</span><br>"
|
||||
else if(istype(O,/mob/new_player))
|
||||
entry += " - <span class='blue'>In Lobby</span><br>"
|
||||
else
|
||||
entry += " - <span class='green'>Playing</span><br>"
|
||||
|
||||
Lines += entry
|
||||
|
||||
msg += "<table>"
|
||||
for(var/line in sortList(Lines))
|
||||
msg += "[line]"
|
||||
msg += "</table>"
|
||||
msg += "<b>Total Players: [length(Lines)]</b>"
|
||||
msg = "<span class='filter_info'>" + msg + "</span>"
|
||||
to_chat(src, msg)
|
||||
@@ -0,0 +1,139 @@
|
||||
GLOBAL_DATUM(character_directory, /datum/character_directory)
|
||||
|
||||
/client/verb/show_character_directory()
|
||||
set name = "Character Directory"
|
||||
set category = "OOC"
|
||||
set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more."
|
||||
|
||||
// This is primarily to stop malicious users from trying to lag the server by spamming this verb
|
||||
if(!usr.checkMoveCooldown())
|
||||
to_chat(usr, "<span class='warning'>Don't spam character directory refresh.</span>")
|
||||
return
|
||||
usr.setMoveCooldown(10)
|
||||
|
||||
if(!GLOB.character_directory)
|
||||
GLOB.character_directory = new
|
||||
GLOB.character_directory.tgui_interact(mob)
|
||||
|
||||
|
||||
// This is a global singleton. Keep in mind that all operations should occur on usr, not src.
|
||||
/datum/character_directory
|
||||
/datum/character_directory/tgui_state(mob/user)
|
||||
return GLOB.tgui_always_state
|
||||
|
||||
/datum/character_directory/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "CharacterDirectory", "Character Directory")
|
||||
ui.open()
|
||||
|
||||
/datum/character_directory/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
|
||||
data["personalVisibility"] = user?.client?.prefs?.show_in_directory
|
||||
data["personalTag"] = user?.client?.prefs?.directory_tag || "Unset"
|
||||
data["personalErpTag"] = user?.client?.prefs?.directory_erptag || "Unset"
|
||||
|
||||
return data
|
||||
|
||||
/datum/character_directory/tgui_static_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
|
||||
var/list/directory_mobs = list()
|
||||
for(var/client/C in GLOB.clients)
|
||||
// Allow opt-out.
|
||||
if(!C?.prefs?.show_in_directory)
|
||||
continue
|
||||
|
||||
// These are the three vars we're trying to find
|
||||
// The approach differs based on the mob the client is controlling
|
||||
var/name = null
|
||||
var/ooc_notes = null
|
||||
var/flavor_text = null
|
||||
var/tag = C.prefs.directory_tag || "Unset"
|
||||
var/erptag = C.prefs.directory_erptag || "Unset"
|
||||
var/character_ad = C.prefs.directory_ad
|
||||
|
||||
if(ishuman(C.mob))
|
||||
var/mob/living/carbon/human/H = C.mob
|
||||
if(data_core && data_core.general)
|
||||
if(!find_general_record("name", H.real_name))
|
||||
if(!find_record("name", H.real_name, data_core.hidden_general))
|
||||
continue
|
||||
name = H.real_name
|
||||
ooc_notes = H.ooc_notes
|
||||
flavor_text = H.flavor_texts["general"]
|
||||
|
||||
if(isAI(C.mob))
|
||||
var/mob/living/silicon/ai/A = C.mob
|
||||
name = "[A.name] (Artificial Intelligence)"
|
||||
ooc_notes = A.ooc_notes
|
||||
flavor_text = null // No flavor text for AIs :c
|
||||
|
||||
if(isrobot(C.mob))
|
||||
var/mob/living/silicon/robot/R = C.mob
|
||||
if(R.scrambledcodes || (R.module && R.module.hide_on_manifest))
|
||||
continue
|
||||
name = "[R.name] ([R.modtype] [R.braintype])"
|
||||
ooc_notes = R.ooc_notes
|
||||
flavor_text = R.flavor_text
|
||||
|
||||
// It's okay if we fail to find OOC notes and flavor text
|
||||
// But if we can't find the name, they must be using a non-compatible mob type currently.
|
||||
if(!name)
|
||||
continue
|
||||
|
||||
directory_mobs.Add(list(list(
|
||||
"name" = name,
|
||||
"ooc_notes" = ooc_notes,
|
||||
"tag" = tag,
|
||||
"erptag" = erptag,
|
||||
"character_ad" = character_ad,
|
||||
"flavor_text" = flavor_text,
|
||||
)))
|
||||
|
||||
data["directory"] = directory_mobs
|
||||
|
||||
return data
|
||||
|
||||
|
||||
/datum/character_directory/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("refresh")
|
||||
// This is primarily to stop malicious users from trying to lag the server by spamming this verb
|
||||
if(!usr.checkMoveCooldown())
|
||||
to_chat(usr, "<span class='warning'>Don't spam character directory refresh.</span>")
|
||||
return
|
||||
usr.setMoveCooldown(10)
|
||||
update_tgui_static_data(usr, ui)
|
||||
return TRUE
|
||||
if("setTag")
|
||||
var/list/new_tag = input(usr, "Pick a new Vore tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags
|
||||
if(!new_tag)
|
||||
return
|
||||
usr?.client?.prefs?.directory_tag = new_tag
|
||||
return TRUE
|
||||
if("setErpTag")
|
||||
var/list/new_erptag = input(usr, "Pick a new ERP tag for the character directory", "Character ERP Tag", usr?.client?.prefs?.directory_erptag) as null|anything in GLOB.char_directory_erptags
|
||||
if(!new_erptag)
|
||||
return
|
||||
usr?.client?.prefs?.directory_erptag = new_erptag
|
||||
return TRUE
|
||||
if("setVisible")
|
||||
usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory
|
||||
to_chat(usr, "<span class='notice'>You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.</span>")
|
||||
return TRUE
|
||||
if("editAd")
|
||||
if(!usr?.client?.prefs)
|
||||
return
|
||||
|
||||
var/current_ad = usr.client.prefs.directory_ad
|
||||
var/new_ad = sanitize(input(usr, "Change your character ad", "Character Ad", current_ad) as message|null, extra = 0)
|
||||
if(isnull(new_ad))
|
||||
return
|
||||
usr.client.prefs.directory_ad = new_ad
|
||||
return TRUE
|
||||
@@ -0,0 +1,48 @@
|
||||
/client/verb/ignore(key_to_ignore as text)
|
||||
set name = "Ignore"
|
||||
set category = "OOC"
|
||||
set desc = "Makes OOC and Deadchat messages from a specific player not appear to you."
|
||||
|
||||
if(!key_to_ignore)
|
||||
return
|
||||
key_to_ignore = ckey(sanitize(key_to_ignore))
|
||||
if(prefs && prefs.ignored_players)
|
||||
if(key_to_ignore in prefs.ignored_players)
|
||||
to_chat(usr, "<span class='warning'>[key_to_ignore] is already being ignored.</span>")
|
||||
return
|
||||
if(key_to_ignore == usr.ckey)
|
||||
to_chat(usr, "<span class='notice'>You can't ignore yourself.</span>")
|
||||
return
|
||||
|
||||
prefs.ignored_players |= key_to_ignore
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
to_chat(usr, "<span class='notice'>Now ignoring <b>[key_to_ignore]</b>.</span>")
|
||||
|
||||
/client/verb/unignore(key_to_unignore as text)
|
||||
set name = "Unignore"
|
||||
set category = "OOC"
|
||||
set desc = "Reverts your ignoring of a specific player."
|
||||
|
||||
if(!key_to_unignore)
|
||||
return
|
||||
key_to_unignore = ckey(sanitize(key_to_unignore))
|
||||
if(prefs && prefs.ignored_players)
|
||||
if(!(key_to_unignore in prefs.ignored_players))
|
||||
to_chat(usr, "<span class='warning'>[key_to_unignore] isn't being ignored.</span>")
|
||||
return
|
||||
prefs.ignored_players -= key_to_unignore
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
to_chat(usr, "<span class='notice'>Reverted ignore on <b>[key_to_unignore]</b>.</span>")
|
||||
|
||||
/mob/proc/is_key_ignored(var/key_to_check)
|
||||
if(client)
|
||||
return client.is_key_ignored(key_to_check)
|
||||
return 0
|
||||
|
||||
/client/proc/is_key_ignored(var/key_to_check)
|
||||
key_to_check = ckey(key_to_check)
|
||||
if(key_to_check in prefs.ignored_players)
|
||||
if(GLOB.directory[key_to_check] in GLOB.admins) // This is here so this is only evaluated if someone is actually being blocked.
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
@@ -0,0 +1,193 @@
|
||||
|
||||
/client/verb/ooc(msg as text)
|
||||
set name = "OOC"
|
||||
set category = "OOC"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='warning'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
if(!mob) return
|
||||
if(IsGuestKey(key))
|
||||
to_chat(src, "Guests may not use OOC.")
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
if(!msg) return
|
||||
|
||||
if(!is_preference_enabled(/datum/client_preference/show_ooc))
|
||||
to_chat(src, "<span class='warning'>You have OOC muted.</span>")
|
||||
return
|
||||
|
||||
if(!holder)
|
||||
if(!config.ooc_allowed)
|
||||
to_chat(src, "<span class='danger'>OOC is globally muted.</span>")
|
||||
return
|
||||
if(!config.dooc_allowed && (mob.stat == DEAD))
|
||||
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
|
||||
return
|
||||
if(prefs.muted & MUTE_OOC)
|
||||
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
|
||||
return
|
||||
if(findtext(msg, "byond://") && !config.allow_byond_links)
|
||||
to_chat(src, "<B>Advertising other servers is not allowed.</B>")
|
||||
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
|
||||
return
|
||||
if(findtext(msg, "discord.gg") && !config.allow_discord_links)
|
||||
to_chat(src, "<B>Advertising discords is not allowed.</B>")
|
||||
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
|
||||
return
|
||||
if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
|
||||
to_chat(src, "<B>Posting external links is not allowed.</B>")
|
||||
log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
|
||||
return
|
||||
|
||||
log_ooc(msg, src)
|
||||
|
||||
if(msg)
|
||||
handle_spam_prevention(MUTE_OOC)
|
||||
|
||||
var/ooc_style = "everyone"
|
||||
if(holder && !holder.fakekey)
|
||||
ooc_style = "elevated"
|
||||
//VOREStation Block Edit Start
|
||||
if(holder.rights & R_EVENT) //Retired Admins
|
||||
ooc_style = "event_manager"
|
||||
if(holder.rights & R_ADMIN && !(holder.rights & R_BAN)) //Game Masters
|
||||
ooc_style = "moderator"
|
||||
if(holder.rights & R_SERVER && !(holder.rights & R_BAN)) //Developers
|
||||
ooc_style = "developer"
|
||||
if(holder.rights & R_ADMIN && holder.rights & R_BAN) //Admins
|
||||
ooc_style = "admin"
|
||||
//VOREStation Block Edit End
|
||||
|
||||
for(var/client/target in GLOB.clients)
|
||||
if(target.is_preference_enabled(/datum/client_preference/show_ooc))
|
||||
if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
|
||||
continue
|
||||
var/display_name = src.key
|
||||
if(holder)
|
||||
if(holder.fakekey)
|
||||
if(target.holder)
|
||||
display_name = "[holder.fakekey]/([src.key])"
|
||||
else
|
||||
display_name = holder.fakekey
|
||||
if(holder && !holder.fakekey && (holder.rights & R_ADMIN|R_FUN|R_EVENT) && config.allow_admin_ooccolor && (src.prefs.ooccolor != initial(src.prefs.ooccolor))) // keeping this for the badmins
|
||||
to_chat(target, "<font color='[src.prefs.ooccolor]'><span class='ooc'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>")
|
||||
else
|
||||
to_chat(target, "<span class='ooc'><span class='[ooc_style]'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></span>")
|
||||
|
||||
/client/verb/looc(msg as text)
|
||||
set name = "LOOC"
|
||||
set desc = "Local OOC, seen only by those in view."
|
||||
set category = "OOC"
|
||||
|
||||
if(say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
|
||||
if(!mob)
|
||||
return
|
||||
|
||||
if(IsGuestKey(key))
|
||||
to_chat(src, "Guests may not use OOC.")
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
if(!is_preference_enabled(/datum/client_preference/show_looc))
|
||||
to_chat(src, "<span class='danger'>You have LOOC muted.</span>")
|
||||
return
|
||||
|
||||
if(!holder)
|
||||
if(!config.looc_allowed)
|
||||
to_chat(src, "<span class='danger'>LOOC is globally muted.</span>")
|
||||
return
|
||||
if(!config.dooc_allowed && (mob.stat == DEAD))
|
||||
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
|
||||
return
|
||||
if(prefs.muted & MUTE_OOC)
|
||||
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
|
||||
return
|
||||
if(findtext(msg, "byond://") && !config.allow_byond_links)
|
||||
to_chat(src, "<B>Advertising other servers is not allowed.</B>")
|
||||
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
|
||||
return
|
||||
if(findtext(msg, "discord.gg") && !config.allow_discord_links)
|
||||
to_chat(src, "<B>Advertising discords is not allowed.</B>")
|
||||
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
|
||||
return
|
||||
if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
|
||||
to_chat(src, "<B>Posting external links is not allowed.</B>")
|
||||
log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
|
||||
message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
|
||||
return
|
||||
|
||||
log_looc(msg,src)
|
||||
|
||||
if(msg)
|
||||
handle_spam_prevention(MUTE_OOC)
|
||||
|
||||
var/mob/source = mob.get_looc_source()
|
||||
var/turf/T = get_turf(source)
|
||||
if(!T) return
|
||||
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
|
||||
var/list/m_viewers = in_range["mobs"]
|
||||
|
||||
var/list/receivers = list() //Clients, not mobs.
|
||||
var/list/r_receivers = list()
|
||||
|
||||
var/display_name = key
|
||||
if(holder && holder.fakekey)
|
||||
display_name = holder.fakekey
|
||||
if(mob.stat != DEAD)
|
||||
display_name = mob.name
|
||||
//VOREStation Add - Resleeving shenanigan prevention
|
||||
if(ishuman(mob))
|
||||
var/mob/living/carbon/human/H = mob
|
||||
if(H.original_player && H.original_player != H.ckey) //In a body not their own
|
||||
display_name = "[H.mind.name] (as [H.name])"
|
||||
//VOREStation Add End
|
||||
|
||||
// Everyone in normal viewing range of the LOOC
|
||||
for(var/mob/viewer in m_viewers)
|
||||
if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc))
|
||||
receivers |= viewer.client
|
||||
else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
|
||||
var/mob/observer/eye/E = viewer
|
||||
if(E.owner && E.owner.client)
|
||||
receivers |= E.owner.client
|
||||
|
||||
// Admins with RLOOC displayed who weren't already in
|
||||
for(var/client/admin in GLOB.admins)
|
||||
if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
|
||||
r_receivers |= admin
|
||||
|
||||
// Send a message
|
||||
for(var/client/target in receivers)
|
||||
var/admin_stuff = ""
|
||||
|
||||
if(target in GLOB.admins)
|
||||
admin_stuff += "/([key])"
|
||||
|
||||
to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>")
|
||||
|
||||
for(var/client/target in r_receivers)
|
||||
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
|
||||
|
||||
to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>")
|
||||
|
||||
/mob/proc/get_looc_source()
|
||||
return src
|
||||
|
||||
/mob/living/silicon/ai/get_looc_source()
|
||||
if(eyeobj)
|
||||
return eyeobj
|
||||
return src
|
||||
@@ -0,0 +1,12 @@
|
||||
/client/proc/pingfromtime(time)
|
||||
return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100
|
||||
|
||||
/client/verb/display_ping(time as num)
|
||||
set instant = TRUE
|
||||
set name = ".display_ping"
|
||||
to_chat(src, "<span class='notice'>Round trip ping took [round(pingfromtime(time),1)]ms</span>")
|
||||
|
||||
/client/verb/ping()
|
||||
set name = "Ping"
|
||||
set category = "OOC"
|
||||
winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]")
|
||||
@@ -0,0 +1,168 @@
|
||||
/mob/var/suiciding = 0
|
||||
|
||||
/mob/living/carbon/human/verb/suicide()
|
||||
set hidden = 1
|
||||
|
||||
if (stat == DEAD)
|
||||
to_chat(src, "You're already dead!")
|
||||
return
|
||||
|
||||
if (!ticker)
|
||||
to_chat(src, "You can't commit suicide before the game starts!")
|
||||
return
|
||||
|
||||
if(!player_is_antag(mind))
|
||||
message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
|
||||
to_chat(src, "No. Adminhelp if there is a legitimate reason.")
|
||||
return
|
||||
|
||||
if (suiciding)
|
||||
to_chat(src, "You're already committing suicide! Be patient!")
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
|
||||
if(confirm == "Yes")
|
||||
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
|
||||
to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
|
||||
return
|
||||
suiciding = 15
|
||||
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
|
||||
var/obj/item/held_item = get_active_hand()
|
||||
if(held_item)
|
||||
var/damagetype = held_item.suicide_act(src)
|
||||
if(damagetype)
|
||||
log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
|
||||
var/damage_mod = 1
|
||||
switch(damagetype) //Sorry about the magic numbers.
|
||||
//brute = 1, burn = 2, tox = 4, oxy = 8
|
||||
if(15) //4 damage types
|
||||
damage_mod = 4
|
||||
|
||||
if(6, 11, 13, 14) //3 damage types
|
||||
damage_mod = 3
|
||||
|
||||
if(3, 5, 7, 9, 10, 12) //2 damage types
|
||||
damage_mod = 2
|
||||
|
||||
if(1, 2, 4, 8) //1 damage type
|
||||
damage_mod = 1
|
||||
|
||||
else //This should not happen, but if it does, everything should still work
|
||||
damage_mod = 1
|
||||
|
||||
//Do 175 damage divided by the number of damage types applied.
|
||||
if(damagetype & BRUTELOSS)
|
||||
adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
|
||||
adjustOxyLoss(145/damage_mod)
|
||||
|
||||
if(damagetype & FIRELOSS)
|
||||
adjustFireLoss(175/damage_mod)
|
||||
|
||||
if(damagetype & TOXLOSS)
|
||||
adjustToxLoss(175/damage_mod)
|
||||
|
||||
if(damagetype & OXYLOSS)
|
||||
adjustOxyLoss(175/damage_mod)
|
||||
|
||||
//If something went wrong, just do normal oxyloss
|
||||
if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
|
||||
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
log_and_message_admins("[key_name(src)] commited suicide")
|
||||
|
||||
var/datum/gender/T = gender_datums[get_visible_gender()]
|
||||
|
||||
var/suicidemsg
|
||||
suicidemsg = pick("<span class='danger'>[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.</span>")
|
||||
if(isSynthetic())
|
||||
suicidemsg = "<span class='danger'>[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide.</span>"
|
||||
visible_message(suicidemsg)
|
||||
|
||||
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
|
||||
/mob/living/carbon/brain/verb/suicide()
|
||||
set hidden = 1
|
||||
|
||||
if (stat == 2)
|
||||
to_chat(src, "You're already dead!")
|
||||
return
|
||||
|
||||
if (!ticker)
|
||||
to_chat(src, "You can't commit suicide before the game starts!")
|
||||
return
|
||||
|
||||
if (suiciding)
|
||||
to_chat(src, "You're already committing suicide! Be patient!")
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
to_chat(viewers(loc),"<span class='danger'>[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.</span>")
|
||||
spawn(50)
|
||||
death(0)
|
||||
suiciding = 0
|
||||
|
||||
/mob/living/silicon/ai/verb/suicide()
|
||||
set hidden = 1
|
||||
|
||||
if (stat == 2)
|
||||
to_chat(src, "You're already dead!")
|
||||
return
|
||||
|
||||
if (suiciding)
|
||||
to_chat(src, "You're already committing suicide! Be patient!")
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
to_chat(viewers(src),"<span class='danger'>[src] is powering down. It looks like they're trying to commit suicide.</span>")
|
||||
//put em at -175
|
||||
adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/robot/verb/suicide()
|
||||
set hidden = 1
|
||||
|
||||
if (stat == 2)
|
||||
to_chat(src, "You're already dead!")
|
||||
return
|
||||
|
||||
if (suiciding)
|
||||
to_chat(src, "You're already committing suicide! Be patient!")
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
to_chat(viewers(src),"<span class='danger'>[src] is powering down. It looks like they're trying to commit suicide.</span>")
|
||||
//put em at -175
|
||||
adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/pai/verb/suicide()
|
||||
set category = "pAI Commands"
|
||||
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
|
||||
set name = "pAI Suicide"
|
||||
var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
|
||||
if(answer == "Yes")
|
||||
var/obj/item/device/paicard/card = loc
|
||||
card.removePersonality()
|
||||
var/turf/T = get_turf_or_move(card.loc)
|
||||
for (var/mob/M in viewers(T))
|
||||
M.show_message("<span class='notice'>[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"</span>", 3, "<span class='notice'>[src] bleeps electronically.</span>", 2)
|
||||
death(0)
|
||||
else
|
||||
to_chat(src, "Aborting suicide attempt.")
|
||||
@@ -0,0 +1,208 @@
|
||||
/client/verb/who()
|
||||
set name = "Who"
|
||||
set category = "OOC"
|
||||
|
||||
var/msg = "<b>Current Players:</b>\n"
|
||||
|
||||
var/list/Lines = list()
|
||||
|
||||
if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights))
|
||||
for(var/client/C in GLOB.clients)
|
||||
var/entry = "\t[C.key]"
|
||||
if(C.holder && C.holder.fakekey)
|
||||
entry += " <i>(as [C.holder.fakekey])</i>"
|
||||
entry += " - Playing as [C.mob.real_name]"
|
||||
switch(C.mob.stat)
|
||||
if(UNCONSCIOUS)
|
||||
entry += " - <font color='darkgray'><b>Unconscious</b></font>"
|
||||
if(DEAD)
|
||||
if(isobserver(C.mob))
|
||||
var/mob/observer/dead/O = C.mob
|
||||
if(O.started_as_observer)
|
||||
entry += " - <font color='gray'>Observing</font>"
|
||||
else
|
||||
entry += " - <font color='black'><b>DEAD</b></font>"
|
||||
else
|
||||
entry += " - <font color='black'><b>DEAD</b></font>"
|
||||
|
||||
var/age
|
||||
if(isnum(C.player_age))
|
||||
age = C.player_age
|
||||
else
|
||||
age = 0
|
||||
|
||||
if(age <= 1)
|
||||
age = "<font color='#ff0000'><b>[age]</b></font>"
|
||||
else if(age < 10)
|
||||
age = "<font color='#ff8c00'><b>[age]</b></font>"
|
||||
|
||||
entry += " - [age]"
|
||||
|
||||
if(is_special_character(C.mob))
|
||||
entry += " - <b><font color='red'>Antagonist</font></b>"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
entry += " (AFK - "
|
||||
entry += "[round(seconds / 60)] minutes, "
|
||||
entry += "[seconds % 60] seconds)"
|
||||
|
||||
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
|
||||
Lines += entry
|
||||
else
|
||||
for(var/client/C in GLOB.clients)
|
||||
if(C.holder && C.holder.fakekey)
|
||||
Lines += C.holder.fakekey
|
||||
else
|
||||
Lines += C.key
|
||||
|
||||
for(var/line in sortList(Lines))
|
||||
msg += "[line]\n"
|
||||
|
||||
msg += "<b>Total Players: [length(Lines)]</b>"
|
||||
to_chat(src,msg)
|
||||
|
||||
/client/verb/staffwho()
|
||||
set category = "Admin"
|
||||
set name = "Staffwho"
|
||||
|
||||
var/message = get_staffwho_message(holder)
|
||||
to_chat(src, message)
|
||||
|
||||
// VOREStation Edit - This whole proc has various vorestation edits throughout. Practically every other line.
|
||||
/proc/get_staffwho_message(datum/admins/holder)
|
||||
var/msg = ""
|
||||
var/modmsg = ""
|
||||
var/devmsg = ""
|
||||
var/eventMmsg = ""
|
||||
var/num_mods_online = 0
|
||||
var/num_admins_online = 0
|
||||
var/num_devs_online = 0
|
||||
var/num_event_managers_online = 0
|
||||
|
||||
if(holder)
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
|
||||
|
||||
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins
|
||||
continue
|
||||
|
||||
msg += "\t[C] is a [C.holder.rank]"
|
||||
|
||||
if(C.holder.fakekey)
|
||||
msg += " <i>(as [C.holder.fakekey])</i>"
|
||||
|
||||
if(isobserver(C.mob))
|
||||
msg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
msg += " - Lobby"
|
||||
else
|
||||
msg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
msg += " (AFK - "
|
||||
msg += "[round(seconds / 60)] minutes, "
|
||||
msg += "[seconds % 60] seconds)"
|
||||
msg += "\n"
|
||||
|
||||
num_admins_online++
|
||||
else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
|
||||
modmsg += "\t[C] is a [C.holder.rank]"
|
||||
|
||||
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
|
||||
continue
|
||||
if(C.holder.fakekey)
|
||||
msg += " <i>(as [C.holder.fakekey])</i>"
|
||||
|
||||
if(isobserver(C.mob))
|
||||
modmsg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
modmsg += " - Lobby"
|
||||
else
|
||||
modmsg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
modmsg += " (AFK - "
|
||||
modmsg += "[round(seconds / 60)] minutes, "
|
||||
modmsg += "[seconds % 60] seconds)"
|
||||
modmsg += "\n"
|
||||
num_mods_online++
|
||||
|
||||
else if(R_SERVER & C.holder.rights)
|
||||
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
|
||||
continue
|
||||
devmsg += "\t[C] is a [C.holder.rank]"
|
||||
if(C.holder.fakekey)
|
||||
devmsg += " <i>(as [C.holder.fakekey])</i>"
|
||||
if(isobserver(C.mob))
|
||||
devmsg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
devmsg += " - Lobby"
|
||||
else
|
||||
devmsg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
devmsg += "(AFK - "
|
||||
devmsg += "[round(seconds / 60)] minutes, "
|
||||
devmsg += "[seconds % 60] seconds)"
|
||||
devmsg += "\n"
|
||||
num_devs_online++
|
||||
|
||||
else
|
||||
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights))
|
||||
continue
|
||||
eventMmsg += "\t[C] is a [C.holder.rank]"
|
||||
if(C.holder.fakekey)
|
||||
eventMmsg += " <i>(as [C.holder.fakekey])</i>"
|
||||
if(isobserver(C.mob))
|
||||
eventMmsg += " - Observing"
|
||||
else if(istype(C.mob,/mob/new_player))
|
||||
eventMmsg += " - Lobby"
|
||||
else
|
||||
eventMmsg += " - Playing"
|
||||
|
||||
if(C.is_afk())
|
||||
var/seconds = C.last_activity_seconds()
|
||||
eventMmsg += " (AFK - "
|
||||
eventMmsg += "[round(seconds / 60)] minutes, "
|
||||
eventMmsg += "[seconds % 60] seconds)"
|
||||
eventMmsg += "\n"
|
||||
num_event_managers_online++
|
||||
|
||||
else
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights)
|
||||
if(!C.holder.fakekey)
|
||||
msg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_admins_online++
|
||||
else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights))
|
||||
if(!C.holder.fakekey)
|
||||
modmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_mods_online++
|
||||
else if(R_SERVER & C.holder.rights)
|
||||
if(!C.holder.fakekey)
|
||||
devmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_devs_online++
|
||||
else
|
||||
if(!C.holder.fakekey)
|
||||
eventMmsg += "\t[C] is a [C.holder.rank]\n"
|
||||
num_event_managers_online++
|
||||
|
||||
msg = "<b>Current Admins ([num_admins_online]):</b>\n" + msg
|
||||
|
||||
if(config.show_mods)
|
||||
msg += "\n<b> Current Game Masters ([num_mods_online]):</b>\n" + modmsg
|
||||
|
||||
if(config.show_devs)
|
||||
msg += "\n<b> Current Developers ([num_devs_online]):</b>\n" + devmsg
|
||||
|
||||
if(config.show_event_managers)
|
||||
msg += "\n<b> Current Miscellaneous ([num_event_managers_online]):</b>\n" + eventMmsg
|
||||
|
||||
msg += "\n<span class='info'>Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond.</span>"
|
||||
|
||||
return msg
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
// Aurora forensics port.
|
||||
/obj/item/clothing/clean_blood()
|
||||
..()
|
||||
. = ..()
|
||||
gunshot_residue = null
|
||||
|
||||
|
||||
@@ -55,6 +55,12 @@
|
||||
verbs |= /obj/item/clothing/proc/change_color
|
||||
//VOREStation edit start
|
||||
|
||||
/obj/item/clothing/update_icon()
|
||||
overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required.
|
||||
if(blood_DNA)
|
||||
add_blood()
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/equipped(var/mob/user,var/slot)
|
||||
..()
|
||||
if(enables_planes)
|
||||
@@ -366,6 +372,11 @@
|
||||
return
|
||||
*/
|
||||
|
||||
/obj/item/clothing/gloves/clean_blood()
|
||||
. = ..()
|
||||
transfer_blood = 0
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE)
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
@@ -685,9 +696,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/shoes/update_icon()
|
||||
overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required.
|
||||
if(blood_DNA)
|
||||
add_blood()
|
||||
. = ..()
|
||||
if(holding)
|
||||
overlays += image(icon, "[icon_state]_knife")
|
||||
if(contaminated)
|
||||
@@ -698,7 +707,6 @@
|
||||
if(ismob(usr))
|
||||
var/mob/M = usr
|
||||
M.update_inv_shoes()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/shoes/clean_blood()
|
||||
update_icon()
|
||||
@@ -736,6 +744,8 @@
|
||||
slot_flags = SLOT_OCLOTHING
|
||||
var/blood_overlay_type = "suit"
|
||||
blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood.
|
||||
|
||||
var/taurized = FALSE
|
||||
siemens_coefficient = 0.9
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
preserve_item = 1
|
||||
@@ -771,6 +781,43 @@
|
||||
|
||||
set_clothing_index()
|
||||
|
||||
/obj/item/clothing/suit/equipped(var/mob/user, var/slot)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if((taurized && !isTaurTail(H.tail_style)) || (!taurized && isTaurTail(H.tail_style)))
|
||||
taurize(user)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur)
|
||||
if(isTaurTail(Taur.tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style
|
||||
if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites)))
|
||||
icon_override = taurtail.suit_sprites
|
||||
taurized = TRUE
|
||||
|
||||
if(!taurized)
|
||||
icon_override = initial(icon_override)
|
||||
taurized = FALSE
|
||||
|
||||
// Taur suits need to be shifted so its centered on their taur half.
|
||||
/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask)
|
||||
var/image/standing = ..()
|
||||
if(taurized) //Special snowflake var on suits
|
||||
standing.pixel_x = -16
|
||||
standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody.
|
||||
return standing
|
||||
|
||||
/obj/item/clothing/suit/apply_accessories(var/image/standing)
|
||||
if(LAZYLEN(accessories) && taurized)
|
||||
for(var/obj/item/clothing/accessory/A in accessories)
|
||||
var/image/I = new(A.get_mob_overlay())
|
||||
I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body.
|
||||
standing.add_overlay(I)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//Under clothing
|
||||
/obj/item/clothing/under
|
||||
@@ -1045,7 +1092,6 @@
|
||||
to_chat(usr, "<span class='notice'>You roll down your [src]'s sleeves.</span>")
|
||||
update_clothing_icon()
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/New()
|
||||
sensor_mode = pick(0,1,2,3)
|
||||
..()
|
||||
|
||||
@@ -148,48 +148,11 @@
|
||||
|
||||
//Switch to taur sprites if a taur equips
|
||||
/obj/item/clothing/suit
|
||||
var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi',
|
||||
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi')
|
||||
|
||||
/obj/item/clothing/suit/equipped(var/mob/user, var/slot)
|
||||
var/normalize = TRUE
|
||||
|
||||
//Pyramid of doom-y. Improve somehow?
|
||||
if(!taurized && slot == slot_wear_suit && ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(isTaurTail(H.tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/taurtail = H.tail_style
|
||||
if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites)))
|
||||
icon_override = taurtail.suit_sprites
|
||||
normalize = FALSE
|
||||
taurized = TRUE
|
||||
|
||||
if(normalize && taurized)
|
||||
icon_override = initial(icon_override)
|
||||
taurized = FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
// Taur suits need to be shifted so its centered on their taur half.
|
||||
/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask)
|
||||
var/image/standing = ..()
|
||||
if(taurized) //Special snowflake var on suits
|
||||
standing.pixel_x = -16
|
||||
standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody.
|
||||
return standing
|
||||
|
||||
/obj/item/clothing/suit/apply_accessories(var/image/standing)
|
||||
if(LAZYLEN(accessories) && taurized)
|
||||
for(var/obj/item/clothing/accessory/A in accessories)
|
||||
var/image/I = new(A.get_mob_overlay())
|
||||
I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body.
|
||||
standing.add_overlay(I)
|
||||
else
|
||||
return ..()
|
||||
|
||||
//TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default?
|
||||
/obj/item/clothing/under
|
||||
sensor_mode = 3
|
||||
|
||||
@@ -397,6 +397,13 @@ BLIND // can't see anything
|
||||
desc = "A white blindfold that covers the eyes, preventing sight."
|
||||
icon_state = "blindfoldwhite"
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/thinblindfold
|
||||
name = "thin white blindfold"
|
||||
desc = "A thin blindfold to help protect sensitive eyes while still allowing some sight"
|
||||
icon_state = "blindfoldwhite"
|
||||
flash_protection = FLASH_PROTECTION_MODERATE //not as thick, only offers some protection
|
||||
tint = TINT_HEAVY
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold/tape
|
||||
name = "length of tape"
|
||||
desc = "It's a robust DIY blindfold!"
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
return battery
|
||||
|
||||
/obj/item/clothing/gloves/ring/buzzer/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
if(!battery)
|
||||
battery = new battery_type(src)
|
||||
|
||||
|
||||
@@ -117,6 +117,15 @@
|
||||
min_cold_protection_temperature = T0C - 20
|
||||
cold_protection = HEAD
|
||||
|
||||
/obj/item/clothing/head/helmet/explorer
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
flags = THICKMATERIAL
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
siemens_coefficient = 0.9
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
|
||||
|
||||
/obj/item/clothing/head/helmet/swat
|
||||
name = "\improper SWAT helmet"
|
||||
desc = "They're often used by highly trained SWAT Officers."
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
icon_state = "beret_corporate_hos"
|
||||
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
|
||||
|
||||
|
||||
//Medical
|
||||
/obj/item/clothing/head/surgery
|
||||
name = "surgical cap"
|
||||
|
||||
@@ -126,6 +126,11 @@
|
||||
siemens_coefficient = 0.9
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/plaguedoctorhat/gold
|
||||
name = "golden plague doctor's hat"
|
||||
desc = "These were once used by plague doctors, allegedly. This one has gold accents."
|
||||
icon_state = "plaguedoctor2"
|
||||
|
||||
/obj/item/clothing/head/hasturhood
|
||||
name = "hastur's hood"
|
||||
desc = "It's unspeakably stylish"
|
||||
@@ -452,3 +457,31 @@
|
||||
icon_state = "blackngoldheaddress"
|
||||
flags_inv = HIDEEYES
|
||||
body_parts_covered = HEAD|EYES
|
||||
|
||||
//Corporate Berets
|
||||
|
||||
/obj/item/clothing/head/beret/corp/saare
|
||||
name = "\improper SAARE beret"
|
||||
desc = "A red beret denoting service with Stealth Assault Enterprises. For mercenaries that are more inclined towards style than safety."
|
||||
icon_state = "beret_red"
|
||||
|
||||
/obj/item/clothing/head/beret/corp/saare/officer
|
||||
name = "\improper SAARE officer beret"
|
||||
desc = "A red beret with a gold insignia, denoting senior service with Stealth Assault Enterprises. For mercenaries who are more inclined towards style than safety."
|
||||
icon_state = "beret_redgold"
|
||||
|
||||
/obj/item/clothing/head/beret/corp/pcrc
|
||||
name = "\improper PCRC beret"
|
||||
desc = "A black beret with a PCRC logo insignia, denoting service with Proxima Centauri Risk Control. For private security personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_black_observatory"
|
||||
|
||||
|
||||
/obj/item/clothing/head/beret/corp/hedberg
|
||||
name = "\improper Hedberg-Hammarstrom beret"
|
||||
desc = "A tan beret denoting service with Hedberg-Hammarstrom private security. For mercenaries who are more inclined towards style than safety."
|
||||
icon_state = "beret_tan"
|
||||
|
||||
/obj/item/clothing/head/beret/corp/xion
|
||||
name = "\improper Xion beret"
|
||||
desc = "An orange beret denoting employment with Xion Manufacturing. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_orange"
|
||||
@@ -151,11 +151,11 @@
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
|
||||
if(src.icon_state == "ushankadown")
|
||||
src.icon_state = "ushankaup"
|
||||
if(src.icon_state == initial(icon_state))
|
||||
src.icon_state = "[icon_state]up"
|
||||
to_chat(user, "You raise the ear flaps on the ushanka.")
|
||||
else
|
||||
src.icon_state = "ushankadown"
|
||||
src.icon_state = initial(icon_state)
|
||||
to_chat(user, "You lower the ear flaps on the ushanka.")
|
||||
|
||||
/*
|
||||
|
||||
@@ -46,4 +46,44 @@
|
||||
/obj/item/clothing/head/shiny_hood/closed/poly
|
||||
name = "polychromic closed shiny hood"
|
||||
icon_state = "hood_col_o"
|
||||
polychromic = TRUE
|
||||
polychromic = TRUE
|
||||
|
||||
/obj/item/clothing/head/pelt
|
||||
name = "Bear pelt"
|
||||
desc = "A luxurious bear pelt, good to keep warm in winter. Or to sleep through winter."
|
||||
icon = 'icons/obj/clothing/hats_vr.dmi'
|
||||
icon_override = 'icons/mob/head_vr.dmi'
|
||||
icon_state = "bearpelt_brown"
|
||||
item_state = "bearpelt_brown"
|
||||
|
||||
/obj/item/clothing/head/pelt/wolfpelt
|
||||
name = "Wolf pelt"
|
||||
desc = "A fuzzy wolf pelt, demanding respect as a hunter, well if it isn't synthetic or anything at least. Or bought."
|
||||
icon_override = 'icons/mob/wolfpelt_vr.dmi'
|
||||
icon_state = "wolfpelt_brown"
|
||||
item_state = "wolfpelt_brown"
|
||||
|
||||
/obj/item/clothing/head/pelt/wolfpeltblack
|
||||
name = "Wolf pelt"
|
||||
desc = "A fuzzy wolf pelt, demanding respect as a hunter, well if it isn't synthetic or anything at least. Or bought."
|
||||
icon_override = 'icons/mob/wolfpelt_vr.dmi'
|
||||
icon_state = "wolfpelt_gray"
|
||||
item_state = "wolfpelt_gray"
|
||||
|
||||
/obj/item/clothing/head/pelt/tigerpelt
|
||||
name = "Shiny tiger pelt"
|
||||
desc = "A vibrant tiger pelt, particularly fabulous."
|
||||
icon_state = "tigerpelt_shiny"
|
||||
item_state = "tigerpelt_shiny"
|
||||
|
||||
/obj/item/clothing/head/pelt/tigerpeltsnow
|
||||
name = "Snow tiger pelt"
|
||||
desc = "A pelt of a less vibrant tiger, but rather warm."
|
||||
icon_state = "tigerpelt_snow"
|
||||
item_state = "tigerpelt_snow"
|
||||
|
||||
/obj/item/clothing/head/pelt/tigerpeltpink
|
||||
name = "Pink tiger pelt"
|
||||
desc = "A particularly vibrant tiger pelt, for those who want to be the most fabulous at parties."
|
||||
icon_state = "tigerpelt_pink"
|
||||
item_state = "tigerpelt_pink"
|
||||
@@ -99,3 +99,9 @@
|
||||
desc = "It's a ballcap bearing the colors of Major Bill's Shipping."
|
||||
icon_state = "mbillsoft"
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills)
|
||||
|
||||
/obj/item/clothing/head/soft/med
|
||||
name = "medical cap"
|
||||
desc = "It's a field cap in white, with a blue cross on the front."
|
||||
icon_state = "medsoft"
|
||||
item_state_slots = list(slot_r_hand_str = "mimesoft", slot_l_hand_str = "mimesoft")
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/soft/solgov/veteranhat
|
||||
name = "veteran hat"
|
||||
desc = "It's a tacky black ballcap bearing the yellow service ribbon of the Gaia Conflict."
|
||||
name = "veteran cap"
|
||||
desc = "It's a tacky black ballcap bearing the yellow service ribbon of the Almach War."
|
||||
icon_state = "cap_veteran"
|
||||
|
||||
/obj/item/clothing/head/soft/solgov/sifguard
|
||||
name = "\improper SifGuard cap"
|
||||
desc = "It's a black ballcap bearing a Sif Defense Force crest."
|
||||
icon_state = "expeditionsoft"
|
||||
icon_state = "sifguardsoft"
|
||||
item_state_slots = list(
|
||||
slot_l_hand_str = "blacksoft",
|
||||
slot_r_hand_str = "blacksoft",
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/clothing/head/soft/solgov/sifguard/co
|
||||
name = "\improper SifGuard captain's cap"
|
||||
desc = "It's a black ballcap bearing the Sif Defense Force crest. The brim has gold trim."
|
||||
icon_state = "expeditioncomsoft"
|
||||
icon_state = "sifguardcomsoft"
|
||||
|
||||
/obj/item/clothing/head/soft/solgov/fleet
|
||||
name = "fleet cap"
|
||||
@@ -88,17 +88,17 @@
|
||||
/obj/item/clothing/head/service/sifguard
|
||||
name = "\improper SifGuard peaked cap"
|
||||
desc = "A peaked black uniform cap belonging to the Sif Defense Force Corps."
|
||||
icon_state = "ecdresscap"
|
||||
icon_state = "sifguarddresscap"
|
||||
|
||||
/obj/item/clothing/head/service/sifguard/command
|
||||
name = "\improper SifGuard officer's peaked cap"
|
||||
desc = "A peaked black uniform cap belonging to the Sif Defense Force. This one is trimmed in gold."
|
||||
icon_state = "ecdresscap_ofcr"
|
||||
icon_state = "sifguarddresscap_ofcr"
|
||||
|
||||
/obj/item/clothing/head/service/sifguard/captain
|
||||
name = "\improper SifGuard captain's peaked cap"
|
||||
desc = "A gold-trimmed peaked black uniform cap belonging to a Captain of the Sif Defense Force."
|
||||
icon_state = "ecdresscap_capt"
|
||||
icon_state = "sifguarddresscap_capt"
|
||||
|
||||
/obj/item/clothing/head/service/sifguard/senior_command
|
||||
name = "senior SifGuard officer's peaked cap"
|
||||
@@ -127,7 +127,7 @@
|
||||
|
||||
/obj/item/clothing/head/service/army/campaign
|
||||
name = "campaign cover"
|
||||
desc = "A green campaign cover with an SCG Marine crest. Only found on the heads of Drill Sergeants."
|
||||
desc = "A green campaign cover with an SCG Marine crest. Typically found on the heads of Drill Sergeants."
|
||||
icon_state = "greendrill"
|
||||
|
||||
//Dress
|
||||
@@ -170,60 +170,45 @@
|
||||
|
||||
//Berets
|
||||
|
||||
//Government Departments
|
||||
|
||||
/obj/item/clothing/head/beret/solgov
|
||||
name = "peacekeeper beret"
|
||||
desc = "A beret in Solar Confederate Government colors. For peacekeepers that are more inclined towards style than safety."
|
||||
name = "\improper SCG beret"
|
||||
desc = "A beret in basic Solar Confederate Government colors. For peacekeepers that are more inclined towards style than safety."
|
||||
icon_state = "beret_lightblue"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/homeguard
|
||||
name = "home guard beret"
|
||||
desc = "A red beret denoting service in the Sol Home Guard. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_red"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/gateway
|
||||
name = "gateway administration beret"
|
||||
desc = "An orange beret denoting service in the Gateway Administration. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_orange"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/customs
|
||||
name = "customs and trade beret"
|
||||
desc = "A purple beret denoting service in the Customs and Trade Bureau. For personnel that are more inclined towards style than safety."
|
||||
/obj/item/clothing/head/beret/solgov/ttc
|
||||
name = "transgressive technologies beret"
|
||||
desc = "A purple beret denoting service in the Transgressive Technologies Commission. For g-men that are more inclined towards style than safety."
|
||||
icon_state = "beret_purpleyellow"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/orbital
|
||||
name = "orbital assault beret"
|
||||
desc = "A blue beret denoting orbital assault training. For helljumpers that are more inclined towards style than safety."
|
||||
/obj/item/clothing/head/beret/solgov/eio
|
||||
name = "intelligence oversight beret"
|
||||
desc = "A blue beret denoting service in Emergent Intelligent Oversight. For g-men that are more inclined towards style than safety."
|
||||
icon_state = "beret_blue"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/research
|
||||
name = "government research beret"
|
||||
desc = "A green beret denoting service in the Bureau of Research. For explorers that are more inclined towards style than safety."
|
||||
/obj/item/clothing/head/beret/solgov/survey
|
||||
name = "government survey beret"
|
||||
desc = "A green beret denoting service in the SCG Galactic Survey Administration. For explorers that are more inclined towards style than safety."
|
||||
icon_state = "beret_green"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/survey/extraplanar
|
||||
name = "extraplanar survey beret"
|
||||
desc = "A green beret with a silver emblem, denoting service in the Extraplanar Discovery Division of the GSA. For extraplanar explorers who are more inclined towards style than safety."
|
||||
icon_state = "beret_greensilver"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/inspector
|
||||
name = "\improper Solar Inspection Group beret"
|
||||
desc = "A grey beret with a silver insignia, denoting service in the Solar Inspection Group. For Almach-inspection personnel who are more inclined towards style than safety."
|
||||
icon_state = "beret_graysilver"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/health
|
||||
name = "health service beret"
|
||||
desc = "A white beret denoting service in the Interstellar Health Service. For medics that are more inclined towards style than safety."
|
||||
icon_state = "beret_white"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/marcom
|
||||
name = "\improper MARSCOM beret"
|
||||
desc = "A red beret with a gold insignia, denoting service in the SCGDF Mars Central Command. For brass who are more inclined towards style than safety."
|
||||
icon_state = "beret_redgold"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/stratcom
|
||||
name = "\improper STRATCOM beret"
|
||||
desc = "A grey beret with a silver insignia, denoting service in the SCGDF Strategic Command. For intelligence personnel who are more inclined towards style than safety."
|
||||
icon_state = "beret_graysilver"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/diplomatic
|
||||
name = "diplomatic security beret"
|
||||
desc = "A tan beret denoting service in the SCG Marines Diplomatic Security Group. For security personnel who are more inclined towards style than safety."
|
||||
icon_state = "beret_tan"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/borderguard
|
||||
name = "border security beret"
|
||||
desc = "A green beret with a silver emblem, denoting service in the Bureau of Border Security. For border guards who are more inclined towards style than safety."
|
||||
icon_state = "beret_greensilver"
|
||||
//SifGuard
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/sifguard
|
||||
name = "\improper SifGuard beret"
|
||||
@@ -260,15 +245,12 @@
|
||||
desc = "A Sif Defense Force beret with a command crest. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_black_command"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/sifguard/branch
|
||||
name = "\improper Field Operations beret"
|
||||
desc = "An Sif Defense Force beret carrying insignia of the Field Operations section of the Sif Defense Force. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_black_fieldOps"
|
||||
/obj/item/clothing/head/beret/solgov/sifguard/patrol
|
||||
name = "\improper SifGuard Anti-piracy beret"
|
||||
desc = "An Sif Defense Force beret carrying insignia of the Anti-Piracy taskforce. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_black_patrol"
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/sifguard/branch/observatory
|
||||
name = "\improper Observatory beret"
|
||||
desc = "An Sif Defense Force beret carrying insignia of the Observatory section of the Sif Defense Force. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_black_observatory"
|
||||
//Fleet
|
||||
|
||||
/obj/item/clothing/head/beret/solgov/fleet
|
||||
name = "fleet beret"
|
||||
@@ -320,6 +302,8 @@
|
||||
desc = "A white SCG Fleet beret with a golden crest. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_whiterim_com"
|
||||
|
||||
/*
|
||||
Unused Baylore Stuff
|
||||
/obj/item/clothing/head/beret/solgov/fleet/branch
|
||||
name = "first fleet beret"
|
||||
desc = "An SCG Fleet beret carrying insignia of First Fleet, the Sol Guard, stationed in Sol. For personnel that are more inclined towards style than safety."
|
||||
@@ -345,46 +329,44 @@
|
||||
desc = "An SCG Fleet beret carrying insignia of Fifth Fleet, the Quick Reaction Force, recently formed and outfited with last tech. For personnel that are more inclined towards style than safety."
|
||||
icon_state = "beret_navy_fifth"
|
||||
|
||||
*/
|
||||
|
||||
//ushanka
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov
|
||||
name = "\improper SifGuard fur hat"
|
||||
desc = "An Sif Defense Force synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "ecushankadown"
|
||||
//icon_state_up = "ecushankaup"
|
||||
icon_state = "sifguardushankadown"
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov/fleet
|
||||
name = "fleet fur hat"
|
||||
desc = "An SCG Fleet synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "flushankadown"
|
||||
//icon_state_up = "flushankaup"
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov/army
|
||||
/obj/item/clothing/head/ushanka/solgov/marine
|
||||
name = "marine fur hat"
|
||||
desc = "An SCG Marine synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "barushankadown"
|
||||
//icon_state_up = "barushankaup"
|
||||
|
||||
/obj/item/clothing/head/ushanka/solgov/army/green
|
||||
name = "green marine fur hat"
|
||||
desc = "An SCG Marine synthfur-lined hat for operating in cold environments."
|
||||
/obj/item/clothing/head/ushanka/solgov/marine/green
|
||||
name = "\improper Hedberg-Hammarstrom fur hat"
|
||||
desc = "An Hedberg-Hammarstrom private security synthfur-lined hat for operating in cold environments."
|
||||
icon_state = "arushankadown"
|
||||
//icon_state_up = "mcushankaup"
|
||||
|
||||
//Terran
|
||||
//Almachi
|
||||
|
||||
/obj/item/clothing/head/terran/navy/service
|
||||
name = "ICCGN service cover"
|
||||
desc = "A service uniform cover, worn by low-ranking crew within the Independent Navy."
|
||||
icon_state = "terranservice"
|
||||
item_state = "terranservice"
|
||||
/obj/item/clothing/head/almach
|
||||
name = "\improper Almach Militia service cover"
|
||||
desc = "A service uniform cover, occasionally worn by crew within the defunct Almach Militia."
|
||||
icon_state = "almachhat"
|
||||
item_state = "almachhat"
|
||||
item_state_slots = list(
|
||||
slot_l_hand_str = "helmet",
|
||||
slot_r_hand_str = "helmet")
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/terran/navy/service/command
|
||||
name = "ICCGN command service cover"
|
||||
desc = "A service uniform cover, worn by high-ranking crew within the Independent Navy."
|
||||
icon_state = "terranservice_comm"
|
||||
item_state = "terranservice_comm"
|
||||
name = "\improper Almach Militia command service cover"
|
||||
desc = "A service uniform cover, occasionally worn by command crew within the defunct Almach Militia."
|
||||
icon_state = "almachhat_comm"
|
||||
item_state = "almachhat_comm"
|
||||
|
||||
@@ -69,6 +69,11 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 90, rad = 0)
|
||||
body_parts_covered = HEAD|FACE|EYES
|
||||
|
||||
/obj/item/clothing/mask/gas/plaguedoctor/gold
|
||||
name = "gold plague doctor mask"
|
||||
desc = "A modern version of the age old classic, this mask is both capable of filtering air, and connecting to an air supply. This one is gold."
|
||||
icon_state = "plaguedoctor2"
|
||||
|
||||
/obj/item/clothing/mask/gas/swat
|
||||
name = "\improper SWAT mask"
|
||||
desc = "A close-fitting tactical mask that can be connected to an air supply."
|
||||
|
||||
@@ -267,12 +267,18 @@
|
||||
|
||||
/stat_rig_module/Click()
|
||||
if(CanUse())
|
||||
var/list/href_list = list(
|
||||
"interact_module" = module.holder.installed_modules.Find(module),
|
||||
"module_mode" = module_mode
|
||||
)
|
||||
AddHref(href_list)
|
||||
module.holder.Topic(usr, href_list)
|
||||
switch(module_mode)
|
||||
if("select")
|
||||
module.holder.selected_module = module
|
||||
if("engage")
|
||||
module.engage()
|
||||
if("toggle")
|
||||
if(module.active)
|
||||
module.deactivate()
|
||||
else
|
||||
module.activate()
|
||||
if("select_charge_type")
|
||||
module.charge_selected = module.charges[module.charges.Find(module.charge_selected)]
|
||||
|
||||
/stat_rig_module/DblClick()
|
||||
return Click()
|
||||
|
||||
@@ -56,31 +56,6 @@
|
||||
..()
|
||||
helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/janitor //autoinstall the helmet
|
||||
|
||||
/obj/item/clothing/suit/space/void/responseteam
|
||||
sprite_sheets = list(
|
||||
SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi',
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi',
|
||||
SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi',
|
||||
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi',
|
||||
SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi',
|
||||
SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi',
|
||||
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi',
|
||||
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi',
|
||||
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi'
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi'
|
||||
)
|
||||
|
||||
|
||||
//override the attackby screwdriver proc so that people can't remove the helmet
|
||||
/obj/item/clothing/suit/space/void/responseteam/attackby(obj/item/W as obj, mob/user as mob)
|
||||
@@ -130,14 +105,40 @@
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
|
||||
siemens_coefficient = 0.5
|
||||
icon = 'icons/obj/clothing/hats_vr.dmi'
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_AUGMENTED)
|
||||
var/away_planes = null
|
||||
plane_slots = list(slot_head)
|
||||
var/hud_active = 1
|
||||
var/activation_sound = 'sound/items/nif_click.ogg'
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/responseteam/verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Toggle Mark 7 Suit HUD"
|
||||
set src in usr
|
||||
|
||||
if(usr.canmove && !usr.stat && !usr.restrained())
|
||||
if(src.hud_active)
|
||||
away_planes = enables_planes
|
||||
enables_planes = null
|
||||
to_chat(usr, "You disable the inbuilt heads-up display.")
|
||||
hud_active = 0
|
||||
else
|
||||
enables_planes = away_planes
|
||||
away_planes = null
|
||||
to_chat(usr, "You enable the inbuilt heads-up display.")
|
||||
hud_active = 1
|
||||
usr << activation_sound
|
||||
usr.recalculate_vis()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/responseteam/command
|
||||
name = "Mark VII-C Emergency Response Team Commander Helmet"
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_CH_WANTED,VIS_AUGMENTED)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/responseteam/medical
|
||||
name = "Mark VII-M Emergency Medical Response Helmet"
|
||||
icon_state = "erthelmet_m"
|
||||
item_state = "erthelmet_m"
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/responseteam/engineer
|
||||
name = "Mark VII-E Emergency Engineering Response Helmet"
|
||||
@@ -148,12 +149,50 @@
|
||||
name = "Mark VII-S Emergency Security Response Helmet"
|
||||
icon_state = "erthelmet_s"
|
||||
item_state = "erthelmet_s"
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_WANTED,VIS_AUGMENTED)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/responseteam/janitor
|
||||
name = "Mark VII-J Emergency Cleanup Response Helmet"
|
||||
icon_state = "erthelmet_j"
|
||||
item_state = "erthelmet_j"
|
||||
|
||||
/obj/item/clothing/suit/space/void/responseteam
|
||||
sprite_sheets = list(
|
||||
SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi',
|
||||
SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi',
|
||||
SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi',
|
||||
SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi',
|
||||
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi',
|
||||
SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi',
|
||||
SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi',
|
||||
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi',
|
||||
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi',
|
||||
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi',
|
||||
SPECIES_SHADEKIN_CREW = 'icons/mob/species/vulpkanin/suit_vr.dmi',
|
||||
SPECIES_VASILISSAN = 'icons/mob/spacesuit_vr.dmi',
|
||||
SPECIES_NEVREAN = 'icons/mob/spacesuit_vr.dmi',
|
||||
SPECIES_RAPALA = 'icons/mob/spacesuit_vr.dmi',
|
||||
SPECIES_ALRAUNE = 'icons/mob/spacesuit_vr.dmi',
|
||||
SPECIES_ZADDAT = 'icons/mob/spacesuit_vr.dmi'
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_SHADEKIN_CREW = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_VASILISSAN = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_NEVREAN = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_RAPALA = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_ALRAUNE = 'icons/obj/clothing/suits_vr.dmi',
|
||||
SPECIES_ZADDAT = 'icons/obj/clothing/suits_vr.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/void/responseteam
|
||||
sprite_sheets = list(
|
||||
SPECIES_HUMAN = 'icons/mob/head_vr.dmi',
|
||||
@@ -165,7 +204,13 @@
|
||||
SPECIES_SERGAL = 'icons/mob/species/unathi/helmet_vr.dmi',
|
||||
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
|
||||
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
|
||||
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi'
|
||||
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
|
||||
SPECIES_SHADEKIN_CREW = 'icons/mob/species/vulpkanin/helmet_vr.dmi',
|
||||
SPECIES_VASILISSAN = 'icons/mob/head_vr.dmi',
|
||||
SPECIES_NEVREAN = 'icons/mob/head_vr.dmi',
|
||||
SPECIES_RAPALA = 'icons/mob/head_vr.dmi',
|
||||
SPECIES_ALRAUNE = 'icons/mob/head_vr.dmi',
|
||||
SPECIES_ZADDAT = 'icons/mob/head_vr.dmi'
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
SPECIES_TAJ = 'icons/obj/clothing/hats_vr.dmi',
|
||||
@@ -176,6 +221,12 @@
|
||||
SPECIES_SERGAL = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_VULPKANIN = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi'
|
||||
SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_SHADEKIN_CREW = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_VASILISSAN = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_NEVREAN = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_RAPALA = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_ALRAUNE = 'icons/obj/clothing/hats_vr.dmi',
|
||||
SPECIES_ZADDAT = 'icons/obj/clothing/hats_vr.dmi'
|
||||
)
|
||||
sprite_sheets_refit = list() //have to nullify this as well just to be thorough
|
||||
@@ -179,7 +179,7 @@
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/space/void/autolok/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
helmet = new /obj/item/clothing/head/helmet/space/void/autolok //autoinstall the helmet
|
||||
|
||||
//override the attackby screwdriver proc so that people can't remove the helmet
|
||||
|
||||
@@ -353,6 +353,11 @@
|
||||
icon_badge = "pcrcvest_badge"
|
||||
icon_nobadge = "pcrcvest_nobadge"
|
||||
|
||||
/obj/item/clothing/suit/storage/vest/solgov/hedberg
|
||||
name = "Hedberg-Hammarstrom armor vest"
|
||||
desc = "A simple kevlar plate carrier belonging to Hedberg-Hammarstrom. The company logo is clearly visible."
|
||||
icon_state = "secwebvest"
|
||||
|
||||
/obj/item/clothing/suit/storage/vest/solgov
|
||||
name = "\improper Solar Confederate Government armored vest"
|
||||
desc = "A synthetic armor vest. This one is marked with the crest of the Solar Confederate Government."
|
||||
@@ -361,14 +366,9 @@
|
||||
|
||||
/obj/item/clothing/suit/storage/vest/solgov/heavy
|
||||
name = "\improper Solar Confederate Government heavy armored vest"
|
||||
desc = "A synthetic armor vest with PEACEKEEPER printed in distinctive blue lettering on the chest. This one has added webbing and ballistic plates."
|
||||
desc = "A synthetic armor vest with Solar Confederate Government printed in distinctive blue lettering on the chest. This one has added webbing and ballistic plates."
|
||||
icon_state = "solwebvest"
|
||||
|
||||
/obj/item/clothing/suit/storage/vest/solgov/security
|
||||
name = "master at arms heavy armored vest"
|
||||
desc = "A synthetic armor vest with MASTER AT ARMS printed in silver lettering on the chest. This one has added webbing and ballistic plates."
|
||||
icon_state = "secwebvest"
|
||||
|
||||
/obj/item/clothing/suit/storage/vest/solgov/command
|
||||
name = "command heavy armored vest"
|
||||
desc = "A synthetic armor vest with Solar Confederate Government printed in detailed gold lettering on the chest. This one has added webbing and ballistic plates."
|
||||
@@ -539,6 +539,14 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/explorer
|
||||
name = "explorer suit"
|
||||
desc = "A lightweight explorer plate carrier. It can be equipped with armor plates, but only protects from the cold on it's own."
|
||||
icon_state = "explorer"
|
||||
flags = THICKMATERIAL
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/light
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate)
|
||||
|
||||
@@ -593,6 +601,30 @@
|
||||
desc = "A lightweight tan plate carrier vest. It can be equipped with armor plates, but provides no protection of its own."
|
||||
icon_state = "pcarrier_tan"
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/laserproof
|
||||
name = "ablative plate carrier"
|
||||
desc = "A specialist laser resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own."
|
||||
icon_state = "ablative"
|
||||
armor = list(melee = 0, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/laserproof)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/bulletproof
|
||||
name = "ballistic plate carrier"
|
||||
desc = "A specialist bullet resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own."
|
||||
icon_state = "ballistic"
|
||||
armor = list(melee = 0, bullet = 5, laser = 0, energy = 0, bomb = 5, bio = 0, rad = 0)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/riot
|
||||
name = "riot plate carrier"
|
||||
desc = "A specialist melee resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own."
|
||||
icon_state = "riot"
|
||||
armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/explorer/light
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/explorer, /obj/item/clothing/accessory/armor/armguards/explorer, /obj/item/clothing/accessory/armor/legguards/explorer, /obj/item/clothing/accessory/storage/pouches/green)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/tan/tactical
|
||||
name = "tactical plate carrier"
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan)
|
||||
@@ -600,3 +632,11 @@
|
||||
/obj/item/clothing/suit/armor/pcarrier/merc
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/merc, /obj/item/clothing/accessory/armor/armguards/merc, /obj/item/clothing/accessory/armor/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/laserproof/full
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/laserproof, /obj/item/clothing/accessory/armor/armguards/laserproof, /obj/item/clothing/accessory/armor/legguards/laserproof, /obj/item/clothing/accessory/storage/pouches/blue)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/bulletproof/full
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof, /obj/item/clothing/accessory/armor/armguards/bulletproof, /obj/item/clothing/accessory/armor/legguards/bulletproof, /obj/item/clothing/accessory/storage/pouches)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/riot/full
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches)
|
||||
@@ -86,10 +86,10 @@
|
||||
/obj/item/clothing/head/bio_hood/cmo
|
||||
icon_state = "bio_cmo"
|
||||
|
||||
//Plague Dr mask can be found in clothing/masks/gasmask.dm
|
||||
//Plague Dr mask can be found in clothing/masks/gasmask.dm. Golden can be found in labcoat.dm.
|
||||
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit
|
||||
name = "Plague doctor suit"
|
||||
name = "plague doctor suit"
|
||||
desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against viruses."
|
||||
icon_state = "plaguedoctor"
|
||||
item_state_slots = list(slot_r_hand_str = "bio", slot_l_hand_str = "bio")
|
||||
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
||||
flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
|
||||
@@ -104,4 +104,10 @@
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/blue_edge
|
||||
name = "blue-edged labcoat"
|
||||
desc = "A suit that protects against minor chemical spills. This one has blue trim."
|
||||
icon_state = "blue_edge_labcoat"
|
||||
icon_state = "blue_edge_labcoat"
|
||||
|
||||
/obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor
|
||||
name = "golden plague doctor suit"
|
||||
desc = "If it worked then, it works now. This classic design comes in gold."
|
||||
icon_state = "plaguedoctor2"
|
||||
index = 1
|
||||
|
||||
@@ -4,9 +4,16 @@
|
||||
/obj/item/clothing/suit/chiton
|
||||
name = "chiton"
|
||||
desc = "A traditional piece of clothing from Greece."
|
||||
icon = 'icons/mob/suit_vr.dmi'
|
||||
icon = 'icons/obj/clothing/suits_vr.dmi'
|
||||
icon_state = "chiton"
|
||||
icon_override = 'icons/obj/clothing/suits_vr.dmi' //why won't it work without this WHY GOD PLEASE
|
||||
icon_override = 'icons/mob/suit_vr.dmi'
|
||||
|
||||
/obj/item/clothing/suit/oversize
|
||||
name = "oversized t-shirt"
|
||||
desc = "This ain't your daddy's shirt! Well, it might be..."
|
||||
icon = 'icons/obj/clothing/suits_vr.dmi'
|
||||
icon_state = "oversize"
|
||||
icon_override = 'icons/mob/suit_vr.dmi'
|
||||
|
||||
//HERE BE TAUR RELATED CLOTHES
|
||||
|
||||
|
||||
@@ -23,19 +23,19 @@
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard
|
||||
name = "\improper SifGuard jacket"
|
||||
desc = "A uniform service jacket belonging to the Sif Defense Force."
|
||||
icon_state = "ecservice_crew"
|
||||
icon_state = "sgservice_crew"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/medical
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/medical/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/engineering
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/engineering/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/supply
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service)
|
||||
@@ -44,28 +44,28 @@
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/security/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/service
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/service/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/exploration
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/exploration/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/research
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/research/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/sifguard/command
|
||||
icon_state = "ecservice_officer"
|
||||
icon_state = "sgservice_officer"
|
||||
starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service)
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/service/fleet
|
||||
@@ -181,8 +181,8 @@
|
||||
/obj/item/clothing/suit/storage/solgov/dress
|
||||
name = "dress jacket"
|
||||
desc = "A uniform dress jacket, fancy."
|
||||
icon_state = "ecdress_xpl"
|
||||
item_state = "ecdress_xpl"
|
||||
icon_state = "sgdress_xpl"
|
||||
item_state = "sgdress_xpl"
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
@@ -193,39 +193,39 @@
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard
|
||||
name = "\improper SifGuard dress jacket"
|
||||
desc = "A silver and grey dress jacket belonging to the Sif Defense Force. Fashionable, for the 25th century at least."
|
||||
icon_state = "ecdress_xpl"
|
||||
item_state = "ecdress_xpl"
|
||||
icon_state = "sgdress_xpl"
|
||||
item_state = "sgdress_xpl"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard/senior
|
||||
name = "\improper SifGuard senior's dress coat"
|
||||
icon_state = "ecdress_sxpl"
|
||||
item_state = "ecdress_sxpl"
|
||||
icon_state = "sgdress_sxpl"
|
||||
item_state = "sgdress_sxpl"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard/chief
|
||||
name = "\improper SifGuard chief's dress coat"
|
||||
icon_state = "ecdress_cxpl"
|
||||
item_state = "ecdress_cxpl"
|
||||
item_state = "sgdress_cxpl"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard/command
|
||||
name = "\improper SifGuard officer's dress coat"
|
||||
desc = "A gold and black dress peacoat belonging to the Sif Defense Force. The height of fashion."
|
||||
icon_state = "ecdress_ofcr"
|
||||
item_state = "ecdress_ofcr"
|
||||
item_state = "sgdress_ofcr"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard/command/cdr
|
||||
name = "\improper SifGuard commander's dress coat"
|
||||
icon_state = "ecdress_cdr"
|
||||
item_state = "ecdress_cdr"
|
||||
icon_state = "sgdress_cdr"
|
||||
item_state = "sgdress_cdr"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard/command/capt
|
||||
name = "\improper SifGuard captain's dress coat"
|
||||
icon_state = "ecdress_capt"
|
||||
item_state = "ecdress_capt"
|
||||
icon_state = "sgdress_capt"
|
||||
item_state = "sgdress_capt"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/sifguard/command/adm
|
||||
name = "\improper SifGuard admiral's dress coat"
|
||||
icon_state = "ecdress_adm"
|
||||
item_state = "ecdress_adm"
|
||||
icon_state = "sgdress_adm"
|
||||
item_state = "sgdress_adm"
|
||||
|
||||
/obj/item/clothing/suit/storage/solgov/dress/fleet
|
||||
name = "fleet dress jacket"
|
||||
@@ -328,36 +328,36 @@
|
||||
item_state = "labcoat"
|
||||
blood_overlay_type = "coat"
|
||||
|
||||
/obj/item/clothing/suit/storage/marshal_jacket
|
||||
name = "colonial marshal jacket"
|
||||
desc = "A black synthleather jacket. The word 'MARSHAL' is stenciled onto the back in gold lettering."
|
||||
/obj/item/clothing/suit/storage/eio_jacket
|
||||
name = "EIO jacket"
|
||||
desc = "A black synthleather jacket. The acronym 'EIO' of the Emergent Intelligence Oversight is stenciled onto the back in gold lettering."
|
||||
icon_state = "marshal_jacket"
|
||||
item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black")
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
//Terrans
|
||||
//SAARE Mercenaries
|
||||
|
||||
//Service
|
||||
|
||||
/obj/item/clothing/suit/storage/terran/service/navy
|
||||
name = "ICCGN coat"
|
||||
desc = "A ICCG Navy service coat. Black and undecorated."
|
||||
/obj/item/clothing/suit/storage/saare/service/
|
||||
name = "SAARE coat"
|
||||
desc = "An Stealth Assault Enterprises . Black and undecorated."
|
||||
icon_state = "terranservice"
|
||||
item_state = "terranservice"
|
||||
icon = 'icons/obj/clothing/suits_solgov.dmi'
|
||||
icon_override = 'icons/mob/suit_solgov.dmi'
|
||||
|
||||
/obj/item/clothing/suit/storage/terran/service/navy/command
|
||||
name = "indie command coat"
|
||||
desc = "An ICCG Navy service command coat. White and undecorated."
|
||||
/obj/item/clothing/suit/storage/saare/service/command
|
||||
name = "SAARE command coat"
|
||||
desc = "An Stealth Assault Enterprises command coat. White and undecorated."
|
||||
icon_state = "terranservice_comm"
|
||||
item_state = "terranservice_comm"
|
||||
|
||||
//Dress
|
||||
|
||||
/obj/item/clothing/suit/dress/terran
|
||||
/obj/item/clothing/suit/dress/saare
|
||||
name = "dress jacket"
|
||||
desc = "A uniform dress jacket, fancy."
|
||||
desc = "A Stealth Assault Enterprises uniform dress jacket, fancy."
|
||||
icon_state = "terrandress"
|
||||
item_state = "terrandress"
|
||||
icon = 'icons/obj/clothing/suits_solgov.dmi'
|
||||
@@ -369,19 +369,19 @@
|
||||
valid_accessory_slots = (ACCESSORY_SLOT_MEDAL|ACCESSORY_SLOT_RANK)
|
||||
|
||||
/obj/item/clothing/suit/dress/terran/navy
|
||||
name = "ICCGN dress cloak"
|
||||
desc = "A black ICCG Navy dress cloak with red detailing. So sexy it hurts."
|
||||
name = "SAARE dress cloak"
|
||||
desc = "A Stealth Assault Enterprises dress cloak with red detailing. So sexy it hurts."
|
||||
icon_state = "terrandress"
|
||||
item_state = "terrandress"
|
||||
|
||||
/obj/item/clothing/suit/dress/terran/navy/officer
|
||||
name = "ICCGN officer's dress cloak"
|
||||
desc = "A black ICCG Navy dress cloak with gold detailing. Smells like ceremony."
|
||||
name = "SAARE officer's dress cloak"
|
||||
desc = "A black Stealth Assault Enterprises dress cloak with gold detailing. Smells like ceremony."
|
||||
icon_state = "terrandress_off"
|
||||
item_state = "terrandress_off"
|
||||
|
||||
/obj/item/clothing/suit/dress/terran/navy/command
|
||||
name = "ICCGN command dress cloak"
|
||||
desc = "A black ICCG Navy dress cloak with royal detailing. Smells like ceremony."
|
||||
name = "SAARE command dress cloak"
|
||||
desc = "A black Stealth Assault Enterprises dress cloak with royal detailing. Smells like ceremony."
|
||||
icon_state = "terrandress_comm"
|
||||
item_state = "terrandress_comm"
|
||||
@@ -145,7 +145,7 @@
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
/obj/item/clothing/accessory/collar/shock/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) // Makes it so you don't need to change the frequency off of default for it to work.
|
||||
|
||||
/obj/item/clothing/accessory/collar/shock/Destroy() //Clean up your toys when you're done.
|
||||
|
||||
@@ -92,6 +92,12 @@
|
||||
armor = list(melee = 30, bullet = 15, laser = 40, energy = 10, bomb = 25, bio = 0, rad = 0)
|
||||
slot = ACCESSORY_SLOT_ARMOR_C
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/explorer
|
||||
name = "explorer armor plate"
|
||||
desc = "A flexible plate made of synthetic fibers, designed to protect from the Sivian fauna. Attaches to a plate carrier."
|
||||
icon_state = "armor_light"
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armorplate/stab
|
||||
name = "mesh armor plate"
|
||||
desc = "A mesh armor plate made of steel-reinforced synthetic fibers, great for dealing with small blades. Attaches to a plate carrier."
|
||||
@@ -145,7 +151,7 @@
|
||||
/obj/item/clothing/accessory/armor/armorplate/laserproof
|
||||
name = "ablative armor plate"
|
||||
desc = "A durasteel-scaled synthetic armor plate, providing good protection against lasers. Attaches to a plate carrier."
|
||||
icon_state = "armor_medium"
|
||||
icon_state = "armor_ablative"
|
||||
slowdown = 0.6
|
||||
armor = list(melee = 10, bullet = 10, laser = 70, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
armorsoak = list(melee = 0, bullet = 0, laser = 10, energy = 15, bomb = 0, bio = 0, rad = 0)
|
||||
@@ -203,6 +209,12 @@
|
||||
desc = "A pair of tan arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_tan"
|
||||
|
||||
/obj/item/clothing/accessory/armor/armguards/explorer
|
||||
name = "explorer arm guards"
|
||||
desc = "A pair of green arm pads reinforced with armor plating. Attaches to a plate carrier."
|
||||
icon_state = "armguards_green"
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
|
||||
|
||||
/obj/item/clothing/accessory/armor/armguards/merc
|
||||
name = "heavy arm guards"
|
||||
desc = "A pair of red-trimmed black arm pads reinforced with heavy armor plating. Attaches to a plate carrier."
|
||||
@@ -262,6 +274,12 @@
|
||||
desc = "A pair of armored leg pads in tan. Attaches to a plate carrier."
|
||||
icon_state = "legguards_tan"
|
||||
|
||||
/obj/item/clothing/accessory/armor/legguards/explorer
|
||||
name = "explorer leg guards"
|
||||
desc = "A pair of armored leg pads in green. Attaches to a plate carrier."
|
||||
icon_state = "legguards_green"
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35)
|
||||
|
||||
/obj/item/clothing/accessory/armor/legguards/merc
|
||||
name = "heavy leg guards"
|
||||
desc = "A pair of heavily armored leg pads in red-trimmed black. Attaches to a plate carrier."
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/hide_on_roll = FALSE
|
||||
|
||||
/obj/item/clothing/accessory/storage/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
hold = new/obj/item/weapon/storage/internal(src)
|
||||
hold.max_storage_space = slots * 2
|
||||
hold.max_w_class = ITEMSIZE_SMALL
|
||||
@@ -95,7 +95,7 @@
|
||||
slots = 2
|
||||
|
||||
/obj/item/clothing/accessory/storage/knifeharness/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
hold.max_storage_space = ITEMSIZE_COST_SMALL * 2
|
||||
hold.can_hold = list(/obj/item/weapon/material/knife/machete/hatchet/unathiknife,\
|
||||
/obj/item/weapon/material/knife,\
|
||||
|
||||
@@ -164,6 +164,7 @@
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards"
|
||||
icon_state = "scrubs"
|
||||
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/rank/psych
|
||||
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
|
||||
|
||||
@@ -560,12 +560,18 @@
|
||||
icon_state = "pentagram"
|
||||
index = 1
|
||||
|
||||
obj/item/clothing/under/dress/yellowswoop
|
||||
/obj/item/clothing/under/dress/yellowswoop
|
||||
name = "yellow swooped dress"
|
||||
desc = "A yellow dress that swoops to the side."
|
||||
icon_state = "yellowswoop"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/countess
|
||||
name = "countess dress"
|
||||
desc = "A red and black dress fit for a countess."
|
||||
icon_state = "countess"
|
||||
index = 1
|
||||
|
||||
/*
|
||||
* wedding stuff
|
||||
*/
|
||||
@@ -621,13 +627,13 @@ Uniforms and such
|
||||
*/
|
||||
|
||||
/obj/item/clothing/under/sundress
|
||||
name = "flowery white sundress"
|
||||
name = "sundress"
|
||||
desc = "Makes you want to frolic in a field of daisies."
|
||||
icon_state = "sundress"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/under/sundress_white
|
||||
name = "white sundress"
|
||||
name = "flowery white sundress"
|
||||
desc = "A white sundress decorated with purple lilies."
|
||||
icon_state = "sundress_white"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
@@ -637,41 +643,48 @@ Uniforms and such
|
||||
desc = "A cute pink sundress."
|
||||
icon_state = "pinksun"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/sundress_white
|
||||
name = "white sundress"
|
||||
desc = "A white sundress, it's short."
|
||||
icon_state = "whitesun"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/sundress_pinkbow
|
||||
name = "bowed pink sundress"
|
||||
desc = "A cute pink sundress with a bow."
|
||||
icon_state = "bowsun"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/sundress_blue
|
||||
name = "long blue sundress"
|
||||
desc = "A long blue sun dress with white frills towards the bottom."
|
||||
icon_state = "bluesun"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/sundress_pinkshort
|
||||
name = "short pink sundress"
|
||||
desc = "A very short pink sundress, it's more like a chemise."
|
||||
icon_state = "shortpink"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/twopiece
|
||||
name = "two-piece dress"
|
||||
desc = "A fancy two-piece dress, the pieces are sewn together."
|
||||
icon_state = "twopiece"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/dress/gothic2
|
||||
name = "lacey gothic dress"
|
||||
desc = "An elegant gothic dress with lace decorations."
|
||||
icon_state = "gothic2"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/captainformal
|
||||
name = "site manager's formal uniform"
|
||||
@@ -888,6 +901,12 @@ Uniforms and such
|
||||
icon_state = "disheveled"
|
||||
index = 1
|
||||
|
||||
/obj/item/clothing/under/flower_skirt
|
||||
name = "flower skirt"
|
||||
desc = "A flowery skirt that comes in a variety of colors."
|
||||
icon_state = "flowerskirt"
|
||||
index = 1
|
||||
|
||||
/*
|
||||
* swimsuit
|
||||
*/
|
||||
|
||||
@@ -16,51 +16,56 @@
|
||||
item_state = "golem" //This is dumb and hacky but was here when I got here.
|
||||
worn_state = "golem" //It's basically just a coincidentally black iconstate in the file.
|
||||
|
||||
/obj/item/clothing/under/bluespace
|
||||
name = "bluespace jumpsuit"
|
||||
icon_state = "lingchameleon"
|
||||
/obj/item/clothing/under/hyperfiber
|
||||
name = "HYPER jumpsuit"
|
||||
icon = 'icons/obj/clothing/uniforms_vr.dmi'
|
||||
icon_override = 'icons/mob/uniform_vr.dmi'
|
||||
icon_state = "hyper"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi',
|
||||
)
|
||||
item_state = "lingchameleon"
|
||||
worn_state = "lingchameleon"
|
||||
desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \
|
||||
Allows one to resize themselves at will, and conceals their true weight."
|
||||
item_state = "hyper"
|
||||
worn_state = "hyper"
|
||||
desc = "Got a lot to hide on your body? Well, this Heavy Yield Protrusion Erasing and Retracting suit seems perfect for you. \
|
||||
Hides any bulges on your body, as well as conceals your true weight."
|
||||
hides_bulges = TRUE
|
||||
var/original_size
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/under/bluespace/verb/toggle_fibers()
|
||||
/obj/item/clothing/under/hyperfiber/verb/toggle_fibers()
|
||||
set category = "Object"
|
||||
set name = "Adjust fibers"
|
||||
set desc = "Adjust your suit fibers. This makes it so your stomach(s) will show or not."
|
||||
set name = "Adjust Bluespace Fibers"
|
||||
set desc = "Adjust your suit's HYPER fibers. Activating it hides your stomach(s) and your general body-build. Good if you have a lot to hide."
|
||||
set src in usr
|
||||
|
||||
adjust_fibers(usr)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/under/bluespace/proc/adjust_fibers(mob/user)
|
||||
/obj/item/clothing/under/hyperfiber/proc/adjust_fibers(mob/user)
|
||||
if(hides_bulges == FALSE)
|
||||
hides_bulges = TRUE
|
||||
to_chat(user, "You tense the suit fibers, hiding your stomach(s).")
|
||||
to_chat(user, "You tense the suit fibers, hiding your stomach(s) and weight.")
|
||||
else
|
||||
hides_bulges = FALSE
|
||||
to_chat(user, "You relax the suit fibers, showing your stomach(s).")
|
||||
to_chat(user, "You relax the suit fibers, revealing your stomach(s) and weight.")
|
||||
|
||||
/obj/item/clothing/under/hyperfiber/bluespace
|
||||
name = "bluespace jumpsuit"
|
||||
icon_state = "bluespace"
|
||||
item_state = "bluespace"
|
||||
worn_state = "bluespace"
|
||||
desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \
|
||||
Allows one to resize themselves at will, and conceals their true weight as well as any bulges or protrusions on their body."
|
||||
var/original_size
|
||||
|
||||
|
||||
/obj/item/clothing/under/bluespace/verb/resize()
|
||||
set name = "Adjust Size"
|
||||
/obj/item/clothing/under/hyperfiber/bluespace/verb/resize()
|
||||
set name = "Adjust Bluespace Fibers"
|
||||
set desc = "Adjust your suit's bluespace fibers. Activating it allows you to expand your own body or reduce it in size! Effect is limited to when you have the suit on."
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
bluespace_size(usr)
|
||||
..()
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/under/bluespace/proc/bluespace_size(mob/usr as mob)
|
||||
/obj/item/clothing/under/hyperfiber/bluespace/proc/bluespace_size(mob/usr as mob)
|
||||
if (!ishuman(usr))
|
||||
return
|
||||
|
||||
@@ -73,7 +78,7 @@
|
||||
to_chat(H,"<span class='warning'>You must be WEARING the uniform to change your size.</span>")
|
||||
return
|
||||
|
||||
var/new_size = input("Put the desired size (25-200%)", "Set Size", 200) as num|null
|
||||
var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
|
||||
|
||||
//Check AGAIN because we accepted user input which is blocking.
|
||||
if (src != H.w_uniform)
|
||||
@@ -89,7 +94,7 @@
|
||||
H.update_icons() //Just want the matrix transform
|
||||
return
|
||||
|
||||
if (!ISINRANGE(new_size,25,200))
|
||||
if (!H.size_range_check(new_size))
|
||||
to_chat(H,"<span class='notice'>The safety features of the uniform prevent you from choosing this size.</span>")
|
||||
return
|
||||
|
||||
@@ -102,7 +107,7 @@
|
||||
else //They chose their current size.
|
||||
return
|
||||
|
||||
/obj/item/clothing/under/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0)
|
||||
/obj/item/clothing/under/hyperfiber/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0)
|
||||
. = ..()
|
||||
if(. && ishuman(M) && original_size)
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
@@ -471,30 +471,30 @@
|
||||
|
||||
//Terrans
|
||||
|
||||
/obj/item/clothing/under/terran
|
||||
name = "master ICCGN uniform"
|
||||
/obj/item/clothing/under/saare
|
||||
name = "master SAARE uniform"
|
||||
desc = "You shouldn't be seeing this."
|
||||
icon = 'icons/obj/clothing/uniforms_solgov.dmi'
|
||||
item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi')
|
||||
armor = list(melee = 5, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 5, rad = 5)
|
||||
siemens_coefficient = 0.8
|
||||
|
||||
/obj/item/clothing/under/terran/navy/utility
|
||||
name = "ICCGN utility uniform"
|
||||
desc = "A comfortable black utility jumpsuit. Worn by the ICCG Navy."
|
||||
/obj/item/clothing/under/saare/utility
|
||||
name = "SAARE utility uniform"
|
||||
desc = "A comfortable black utility jumpsuit. Worn by Stealth Assault Enterprises mercenaries."
|
||||
icon_state = "terranutility"
|
||||
worn_state = "terranutility"
|
||||
|
||||
/obj/item/clothing/under/terran/navy/service
|
||||
name = "ICCGN service uniform"
|
||||
desc = "The service uniform of the ICCG Navy, for low-ranking crew."
|
||||
/obj/item/clothing/under/saare/service
|
||||
name = "SAARE service uniform"
|
||||
desc = "The service uniform of Stealth Assault Enterprises, for low-ranking mercenaries."
|
||||
icon_state = "terranservice"
|
||||
worn_state = "terranservice"
|
||||
armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 5, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
/obj/item/clothing/under/terran/navy/service/command
|
||||
name = "ICCGN command service uniform"
|
||||
desc = "The service uniform of the ICCG Navy, for high-ranking crew."
|
||||
/obj/item/clothing/under/saare/service/command
|
||||
name = "SAARE command service uniform"
|
||||
desc = "The service uniform of Stealth Assault Enterprises, for high-ranking mercenaries."
|
||||
icon_state = "terranservice_comm"
|
||||
worn_state = "terranservice_comm"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user