Merge branch 'master' into SyndicateStuff
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
/datum/menu/Admin/Generate_list(client/C)
|
||||
/datum/verbs/menu/Admin/Generate_list(client/C)
|
||||
if (C.holder)
|
||||
. = ..()
|
||||
|
||||
/datum/menu/Admin/verb/playerpanel()
|
||||
/datum/verbs/menu/Admin/verb/playerpanel()
|
||||
set name = "Player Panel"
|
||||
set desc = "Player Panel"
|
||||
set category = "Admin"
|
||||
|
||||
@@ -14,11 +14,12 @@
|
||||
if(type == INDIVIDUAL_SHOW_ALL_LOG)
|
||||
dat += "<center>Displaying all logs of [key_name(M)]</center><br><hr>"
|
||||
for(var/log_type in M.logging)
|
||||
var/list/reversed = M.logging[log_type]
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
dat += "<center><b>[log_type]</b></center><br>"
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
var/list/reversed = M.logging[log_type]
|
||||
if(islist(reversed))
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
dat += "<hr>"
|
||||
else
|
||||
dat += "<center>[type] of [key_name(M)]</center><br>"
|
||||
@@ -26,6 +27,6 @@
|
||||
if(reversed)
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><hr>"
|
||||
|
||||
usr << browse(dat, "window=invidual_logging;size=600x480")
|
||||
usr << browse(dat, "window=invidual_logging_[M];size=600x480")
|
||||
|
||||
@@ -13,6 +13,14 @@
|
||||
icon_state = "filter_off_f"
|
||||
flipped = 1
|
||||
|
||||
// These two filter types have critical_machine flagged to on and thus causes the area they are in to be exempt from the Grid Check event.
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/critical
|
||||
critical_machine = TRUE
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/flipped/critical
|
||||
critical_machine = TRUE
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/filter/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
|
||||
@@ -543,6 +543,13 @@
|
||||
crate_name = "electrical maintenance crate"
|
||||
crate_type = /obj/structure/closet/crate/engineering/electrical
|
||||
|
||||
/datum/supply_pack/engineering/inducers
|
||||
name = "NT-75 Electromagnetic Power Inducers Crate"
|
||||
cost = 2000
|
||||
contains = list(/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0},/obj/item/weapon/inducer/sci {cell_type = /obj/item/weapon/stock_parts/cell/{maxcharge = 5000; charge = 5000};opened = 0}) //FALSE doesn't work in modified type paths apparently.
|
||||
crate_name = "inducer crate"
|
||||
crate_type = /obj/structure/closet/crate/engineering/electrical
|
||||
|
||||
/datum/supply_pack/engineering/engiequipment
|
||||
name = "Engineering Gear Crate"
|
||||
cost = 1300
|
||||
|
||||
@@ -292,10 +292,9 @@ GLOBAL_LIST(external_rsc_urls)
|
||||
|
||||
add_verbs_from_config()
|
||||
set_client_age_from_db(tdata)
|
||||
var/cached_player_age = player_age //we have to cache this because other shit may change it and we need it's current value now down below.
|
||||
var/cached_player_age = set_client_age_from_db(tdata) //we have to cache this because other shit may change it and we need it's current value now down below.
|
||||
if (isnum(cached_player_age) && cached_player_age == -1) //first connection
|
||||
player_age = 0
|
||||
|
||||
if (isnum(cached_player_age) && cached_player_age == -1) //first connection
|
||||
if (config.panic_bunker && !holder && !(ckey in GLOB.deadmins))
|
||||
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
|
||||
@@ -356,9 +355,9 @@ GLOBAL_LIST(external_rsc_urls)
|
||||
|
||||
hook_vr("client_new",list(src))
|
||||
|
||||
var/list/topmenus = GLOB.menulist[/datum/menu]
|
||||
var/list/topmenus = GLOB.menulist[/datum/verbs/menu]
|
||||
for (var/thing in topmenus)
|
||||
var/datum/menu/topmenu = thing
|
||||
var/datum/verbs/menu/topmenu = thing
|
||||
var/topmenuname = "[topmenu]"
|
||||
if (topmenuname == "[topmenu.type]")
|
||||
var/list/tree = splittext(topmenuname, "/")
|
||||
@@ -367,13 +366,13 @@ GLOBAL_LIST(external_rsc_urls)
|
||||
var/list/entries = topmenu.Generate_list(src)
|
||||
for (var/child in entries)
|
||||
winset(src, "[url_encode(child)]", "[entries[child]]")
|
||||
if (!ispath(child, /datum/menu))
|
||||
if (!ispath(child, /datum/verbs/menu))
|
||||
var/atom/verb/verbpath = child
|
||||
if (copytext(verbpath.name,1,2) != "@")
|
||||
new child(src)
|
||||
|
||||
for (var/thing in prefs.menuoptions)
|
||||
var/datum/menu/menuitem = GLOB.menulist[thing]
|
||||
var/datum/verbs/menu/menuitem = GLOB.menulist[thing]
|
||||
if (menuitem)
|
||||
menuitem.Load_checked(src)
|
||||
|
||||
@@ -493,6 +492,9 @@ GLOBAL_LIST(external_rsc_urls)
|
||||
account_join_date = "Error"
|
||||
var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),COALESCE(INET_ATON('[world.internet_address]'), 0),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')")
|
||||
query_log_connection.Execute()
|
||||
if(new_player)
|
||||
player_age = -1
|
||||
. = player_age
|
||||
|
||||
/client/proc/findJoinDate()
|
||||
var/list/http = world.Export("http://byond.com/members/[ckey]?format=text")
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
//this works as is to create a single checked item, but has no back end code for toggleing the check yet
|
||||
#define TOGGLE_CHECKBOX(PARENT, CHILD) PARENT/CHILD/abstract = TRUE;PARENT/CHILD/checkbox = CHECKBOX_TOGGLE;PARENT/CHILD/verb/CHILD
|
||||
|
||||
//Example usage TOGGLE_CHECKBOX(datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
|
||||
|
||||
|
||||
//Example usage TOGGLE_CHECKBOX(datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
|
||||
|
||||
//override because we don't want to save preferences twice.
|
||||
/datum/menu/Settings/Set_checked(client/C, verbpath)
|
||||
/datum/verbs/menu/Settings/Set_checked(client/C, verbpath)
|
||||
if (checkbox == CHECKBOX_GROUP)
|
||||
C.prefs.menuoptions[type] = verbpath
|
||||
else if (checkbox == CHECKBOX_TOGGLE)
|
||||
var/checked = Get_checked(C)
|
||||
C.prefs.menuoptions[type] = !checked
|
||||
winset(C, "[verbpath]", "is-checked = [!checked]")
|
||||
|
||||
/datum/menu/Settings/verb/setup_character()
|
||||
|
||||
/datum/verbs/menu/Settings/verb/setup_character()
|
||||
set name = "Game Preferences"
|
||||
set category = "Preferences"
|
||||
set category = "Preferences"
|
||||
set desc = "Open Game Preferences Window"
|
||||
usr.client.prefs.current_tab = 1
|
||||
usr.client.prefs.ShowChoices(usr)
|
||||
|
||||
//toggles
|
||||
/datum/menu/Settings/Ghost/chatterbox
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox
|
||||
name = "Chat Box Spam"
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
|
||||
set name = "Show/Hide GhostEars"
|
||||
set category = "Preferences"
|
||||
set desc = "See All Speech"
|
||||
@@ -31,10 +31,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)()
|
||||
to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_GHOSTEARS
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)()
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)()
|
||||
set name = "Show/Hide GhostSight"
|
||||
set category = "Preferences"
|
||||
set desc = "See All Emotes"
|
||||
@@ -42,10 +42,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)()
|
||||
to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_GHOSTSIGHT
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)()
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)()
|
||||
set name = "Show/Hide GhostWhispers"
|
||||
set category = "Preferences"
|
||||
set desc = "See All Whispers"
|
||||
@@ -53,10 +53,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)()
|
||||
to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_GHOSTWHISPER
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)()
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)()
|
||||
set name = "Show/Hide GhostRadio"
|
||||
set category = "Preferences"
|
||||
set desc = "See All Radio Chatter"
|
||||
@@ -64,60 +64,60 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)()
|
||||
to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1
|
||||
/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_GHOSTRADIO
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)()
|
||||
set name = "Show/Hide GhostPDA"
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)()
|
||||
set name = "Show/Hide GhostPDA"
|
||||
set category = "Preferences"
|
||||
set desc = "See All PDA Messages"
|
||||
usr.client.prefs.chat_toggles ^= CHAT_GHOSTPDA
|
||||
to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_GHOSTPDA
|
||||
|
||||
/datum/menu/Settings/Ghost/chatterbox/Events
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/Events
|
||||
name = "Events"
|
||||
|
||||
//please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)()
|
||||
set name = "Toggle Deathrattle"
|
||||
|
||||
//please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)()
|
||||
set name = "Toggle Deathrattle"
|
||||
set category = "Preferences"
|
||||
set desc = "Death"
|
||||
usr.client.prefs.toggles ^= DISABLE_DEATHRATTLE
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.")
|
||||
SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments.
|
||||
/datum/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C)
|
||||
return !(C.prefs.toggles & DISABLE_DEATHRATTLE)
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)()
|
||||
set name = "Toggle Arrivalrattle"
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)()
|
||||
set name = "Toggle Arrivalrattle"
|
||||
set category = "Preferences"
|
||||
set desc = "New Player Arrival"
|
||||
usr.client.prefs.toggles ^= DISABLE_ARRIVALRATTLE
|
||||
to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong.
|
||||
/datum/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C)
|
||||
return !(C.prefs.toggles & DISABLE_ARRIVALRATTLE)
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost, togglemidroundantag)()
|
||||
set name = "Toggle Midround Antagonist"
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost, togglemidroundantag)()
|
||||
set name = "Toggle Midround Antagonist"
|
||||
set category = "Preferences"
|
||||
set desc = "Midround Antagonist"
|
||||
usr.client.prefs.toggles ^= MIDROUND_ANTAG
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.")
|
||||
SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[usr.client.prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C)
|
||||
return C.prefs.toggles & MIDROUND_ANTAG
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggletitlemusic)()
|
||||
set name = "Hear/Silence LobbyMusic"
|
||||
set category = "Preferences"
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggletitlemusic)()
|
||||
set name = "Hear/Silence LobbyMusic"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear Music In Lobby"
|
||||
usr.client.prefs.toggles ^= SOUND_LOBBY
|
||||
usr.client.prefs.save_preferences()
|
||||
@@ -125,33 +125,33 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggletitlemusic)()
|
||||
to_chat(usr, "You will now hear music in the game lobby.")
|
||||
if(isnewplayer(usr))
|
||||
usr.client.playtitlemusic()
|
||||
else
|
||||
else
|
||||
to_chat(usr, "You will no longer hear music in the game lobby.")
|
||||
usr.stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[usr.client.prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_LOBBY
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, togglemidis)()
|
||||
set name = "Hear/Silence Midis"
|
||||
set category = "Preferences"
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)()
|
||||
set name = "Hear/Silence Midis"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear Admin Triggered Sounds (Midis)"
|
||||
usr.client.prefs.toggles ^= SOUND_MIDI
|
||||
usr.client.prefs.save_preferences()
|
||||
if(usr.client.prefs.toggles & SOUND_MIDI)
|
||||
to_chat(usr, "You will now hear any sounds uploaded by admins.")
|
||||
else
|
||||
else
|
||||
to_chat(usr, "You will no longer hear sounds uploaded by admins")
|
||||
usr.stop_sound_channel(CHANNEL_ADMIN)
|
||||
SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[usr.client.prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Sound/togglemidis/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_MIDI
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_instruments)()
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_instruments)()
|
||||
set name = "Hear/Silence Instruments"
|
||||
set category = "Preferences"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear In-game Instruments"
|
||||
usr.client.prefs.toggles ^= SOUND_INSTRUMENTS
|
||||
usr.client.prefs.save_preferences()
|
||||
@@ -160,57 +160,57 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_instruments)()
|
||||
else
|
||||
to_chat(usr, "You will no longer hear musical instruments.")
|
||||
SSblackbox.add_details("preferences_verb","Toggle Instruments|[usr.client.prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Sound/toggle_instruments/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/toggle_instruments/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_INSTRUMENTS
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, Toggle_Soundscape)()
|
||||
set name = "Hear/Silence Ambience"
|
||||
set category = "Preferences"
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, Toggle_Soundscape)()
|
||||
set name = "Hear/Silence Ambience"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear Ambient Sound Effects"
|
||||
usr.client.prefs.toggles ^= SOUND_AMBIENCE
|
||||
usr.client.prefs.save_preferences()
|
||||
if(usr.client.prefs.toggles & SOUND_AMBIENCE)
|
||||
to_chat(usr, "You will now hear ambient sounds.")
|
||||
else
|
||||
else
|
||||
to_chat(usr, "You will no longer hear ambient sounds.")
|
||||
usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
|
||||
usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ambience|[usr.client.prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_AMBIENCE
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_ship_ambience)()
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_ship_ambience)()
|
||||
set name = "Hear/Silence Ship Ambience"
|
||||
set category = "Preferences"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear Ship Ambience Roar"
|
||||
usr.client.prefs.toggles ^= SOUND_SHIP_AMBIENCE
|
||||
usr.client.prefs.save_preferences()
|
||||
if(usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
|
||||
to_chat(usr, "You will now hear ship ambience.")
|
||||
else
|
||||
else
|
||||
to_chat(usr, "You will no longer hear ship ambience.")
|
||||
usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
usr.client.ambience_playing = 0
|
||||
SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
|
||||
/datum/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_SHIP_AMBIENCE
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_announcement_sound)()
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_announcement_sound)()
|
||||
set name = "Hear/Silence Announcements"
|
||||
set category = "Preferences"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear Announcement Sound"
|
||||
usr.client.prefs.toggles ^= SOUND_ANNOUNCEMENTS
|
||||
to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].")
|
||||
usr.client.prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_ANNOUNCEMENTS
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)()
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)()
|
||||
set name = "Hear/Silence Prayer Sounds"
|
||||
set category = "Preferences"
|
||||
set desc = "Hear Prayer Sounds"
|
||||
@@ -218,14 +218,14 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)()
|
||||
usr.client.prefs.save_preferences()
|
||||
if(usr.client.prefs.toggles & SOUND_PRAYERS)
|
||||
to_chat(usr, "You will now hear prayer sounds.")
|
||||
else
|
||||
else
|
||||
to_chat(usr, "You will no longer prayer sounds.")
|
||||
SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[usr.client.prefs.toggles & SOUND_PRAYERS]")
|
||||
/datum/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C)
|
||||
return C.prefs.toggles & SOUND_PRAYERS
|
||||
|
||||
|
||||
/datum/menu/Settings/Sound/verb/stop_client_sounds()
|
||||
/datum/verbs/menu/Settings/Sound/verb/stop_client_sounds()
|
||||
set name = "Stop Sounds"
|
||||
set category = "Preferences"
|
||||
set desc = "Stop Current Sounds"
|
||||
@@ -233,7 +233,7 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)()
|
||||
SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
TOGGLE_CHECKBOX(/datum/menu/Settings, listen_ooc)()
|
||||
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)()
|
||||
set name = "Show/Hide OOC"
|
||||
set category = "Preferences"
|
||||
set desc = "Show OOC Chat"
|
||||
@@ -241,171 +241,171 @@ TOGGLE_CHECKBOX(/datum/menu/Settings, listen_ooc)()
|
||||
usr.client.prefs.save_preferences()
|
||||
to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
|
||||
SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[usr.client.prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
/datum/menu/Settings/listen_ooc/Get_checked(client/C)
|
||||
/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C)
|
||||
return C.prefs.chat_toggles & CHAT_OOC
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
|
||||
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
|
||||
"ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \
|
||||
"ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink", "ghost_purpleswirl","ghost_funkypurp","ghost_pinksherbert","ghost_blazeit",\
|
||||
"ghost_mellow","ghost_rainbow","ghost_camo","ghost_fire", "catghost"))
|
||||
/client/proc/pick_form()
|
||||
if(!is_content_unlocked())
|
||||
alert("This setting is for accounts with BYOND premium only.")
|
||||
return
|
||||
var/new_form = input(src, "Thanks for supporting BYOND - Choose your ghostly form:","Thanks for supporting BYOND",null) as null|anything in GLOB.ghost_forms
|
||||
if(new_form)
|
||||
prefs.ghost_form = new_form
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.update_icon(new_form)
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOST_ORBIT_SQUARE,GHOST_ORBIT_HEXAGON,GHOST_ORBIT_PENTAGON))
|
||||
|
||||
/client/proc/pick_ghost_orbit()
|
||||
if(!is_content_unlocked())
|
||||
alert("This setting is for accounts with BYOND premium only.")
|
||||
return
|
||||
var/new_orbit = input(src, "Thanks for supporting BYOND - Choose your ghostly orbit:","Thanks for supporting BYOND",null) as null|anything in GLOB.ghost_orbits
|
||||
if(new_orbit)
|
||||
prefs.ghost_orbit = new_orbit
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.ghost_orbit = new_orbit
|
||||
|
||||
/client/proc/pick_ghost_accs()
|
||||
var/new_ghost_accs = alert("Do you want your ghost to show full accessories where possible, hide accessories but still use the directional sprites where possible, or also ignore the directions and stick to the default sprites?",,"full accessories", "only directional sprites", "default sprites")
|
||||
if(new_ghost_accs)
|
||||
switch(new_ghost_accs)
|
||||
if("full accessories")
|
||||
prefs.ghost_accs = GHOST_ACCS_FULL
|
||||
if("only directional sprites")
|
||||
prefs.ghost_accs = GHOST_ACCS_DIR
|
||||
if("default sprites")
|
||||
prefs.ghost_accs = GHOST_ACCS_NONE
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.update_icon()
|
||||
|
||||
/client/verb/pick_ghost_customization()
|
||||
set name = "Ghost Customization"
|
||||
set category = "Preferences"
|
||||
set desc = "Customize your ghastly appearance."
|
||||
if(is_content_unlocked())
|
||||
switch(alert("Which setting do you want to change?",,"Ghost Form","Ghost Orbit","Ghost Accessories"))
|
||||
if("Ghost Form")
|
||||
pick_form()
|
||||
if("Ghost Orbit")
|
||||
pick_ghost_orbit()
|
||||
if("Ghost Accessories")
|
||||
pick_ghost_accs()
|
||||
else
|
||||
pick_ghost_accs()
|
||||
|
||||
/client/verb/pick_ghost_others()
|
||||
set name = "Ghosts of Others"
|
||||
set category = "Preferences"
|
||||
set desc = "Change display settings for the ghosts of other players."
|
||||
var/new_ghost_others = alert("Do you want the ghosts of others to show up as their own setting, as their default sprites or always as the default white ghost?",,"Their Setting", "Default Sprites", "White Ghost")
|
||||
if(new_ghost_others)
|
||||
switch(new_ghost_others)
|
||||
if("Their Setting")
|
||||
prefs.ghost_others = GHOST_OTHERS_THEIR_SETTING
|
||||
if("Default Sprites")
|
||||
prefs.ghost_others = GHOST_OTHERS_DEFAULT_SPRITE
|
||||
if("White Ghost")
|
||||
prefs.ghost_others = GHOST_OTHERS_SIMPLE
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.update_sight()
|
||||
|
||||
/client/verb/toggle_intent_style()
|
||||
set name = "Toggle Intent Selection Style"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle between directly clicking the desired intent or clicking to rotate through."
|
||||
prefs.toggles ^= INTENT_STYLE
|
||||
to_chat(src, "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]")
|
||||
prefs.save_preferences()
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_forms, list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
|
||||
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
|
||||
"ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \
|
||||
"ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink", "ghost_purpleswirl","ghost_funkypurp","ghost_pinksherbert","ghost_blazeit",\
|
||||
"ghost_mellow","ghost_rainbow","ghost_camo","ghost_fire", "catghost"))
|
||||
/client/proc/pick_form()
|
||||
if(!is_content_unlocked())
|
||||
alert("This setting is for accounts with BYOND premium only.")
|
||||
return
|
||||
var/new_form = input(src, "Thanks for supporting BYOND - Choose your ghostly form:","Thanks for supporting BYOND",null) as null|anything in GLOB.ghost_forms
|
||||
if(new_form)
|
||||
prefs.ghost_form = new_form
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.update_icon(new_form)
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOST_ORBIT_SQUARE,GHOST_ORBIT_HEXAGON,GHOST_ORBIT_PENTAGON))
|
||||
|
||||
/client/proc/pick_ghost_orbit()
|
||||
if(!is_content_unlocked())
|
||||
alert("This setting is for accounts with BYOND premium only.")
|
||||
return
|
||||
var/new_orbit = input(src, "Thanks for supporting BYOND - Choose your ghostly orbit:","Thanks for supporting BYOND",null) as null|anything in GLOB.ghost_orbits
|
||||
if(new_orbit)
|
||||
prefs.ghost_orbit = new_orbit
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.ghost_orbit = new_orbit
|
||||
|
||||
/client/proc/pick_ghost_accs()
|
||||
var/new_ghost_accs = alert("Do you want your ghost to show full accessories where possible, hide accessories but still use the directional sprites where possible, or also ignore the directions and stick to the default sprites?",,"full accessories", "only directional sprites", "default sprites")
|
||||
if(new_ghost_accs)
|
||||
switch(new_ghost_accs)
|
||||
if("full accessories")
|
||||
prefs.ghost_accs = GHOST_ACCS_FULL
|
||||
if("only directional sprites")
|
||||
prefs.ghost_accs = GHOST_ACCS_DIR
|
||||
if("default sprites")
|
||||
prefs.ghost_accs = GHOST_ACCS_NONE
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.update_icon()
|
||||
|
||||
/client/verb/pick_ghost_customization()
|
||||
set name = "Ghost Customization"
|
||||
set category = "Preferences"
|
||||
set desc = "Customize your ghastly appearance."
|
||||
if(is_content_unlocked())
|
||||
switch(alert("Which setting do you want to change?",,"Ghost Form","Ghost Orbit","Ghost Accessories"))
|
||||
if("Ghost Form")
|
||||
pick_form()
|
||||
if("Ghost Orbit")
|
||||
pick_ghost_orbit()
|
||||
if("Ghost Accessories")
|
||||
pick_ghost_accs()
|
||||
else
|
||||
pick_ghost_accs()
|
||||
|
||||
/client/verb/pick_ghost_others()
|
||||
set name = "Ghosts of Others"
|
||||
set category = "Preferences"
|
||||
set desc = "Change display settings for the ghosts of other players."
|
||||
var/new_ghost_others = alert("Do you want the ghosts of others to show up as their own setting, as their default sprites or always as the default white ghost?",,"Their Setting", "Default Sprites", "White Ghost")
|
||||
if(new_ghost_others)
|
||||
switch(new_ghost_others)
|
||||
if("Their Setting")
|
||||
prefs.ghost_others = GHOST_OTHERS_THEIR_SETTING
|
||||
if("Default Sprites")
|
||||
prefs.ghost_others = GHOST_OTHERS_DEFAULT_SPRITE
|
||||
if("White Ghost")
|
||||
prefs.ghost_others = GHOST_OTHERS_SIMPLE
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.update_sight()
|
||||
|
||||
/client/verb/toggle_intent_style()
|
||||
set name = "Toggle Intent Selection Style"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle between directly clicking the desired intent or clicking to rotate through."
|
||||
prefs.toggles ^= INTENT_STYLE
|
||||
to_chat(src, "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]")
|
||||
prefs.save_preferences()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Intent Selection|[prefs.toggles & INTENT_STYLE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_ghost_hud_pref()
|
||||
set name = "Toggle Ghost HUD"
|
||||
set category = "Preferences"
|
||||
set desc = "Hide/Show Ghost HUD"
|
||||
|
||||
prefs.ghost_hud = !prefs.ghost_hud
|
||||
to_chat(src, "Ghost HUD will now be [prefs.ghost_hud ? "visible" : "hidden"].")
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
mob.hud_used.show_hud()
|
||||
|
||||
/client/verb/toggle_ghost_hud_pref()
|
||||
set name = "Toggle Ghost HUD"
|
||||
set category = "Preferences"
|
||||
set desc = "Hide/Show Ghost HUD"
|
||||
|
||||
prefs.ghost_hud = !prefs.ghost_hud
|
||||
to_chat(src, "Ghost HUD will now be [prefs.ghost_hud ? "visible" : "hidden"].")
|
||||
prefs.save_preferences()
|
||||
if(isobserver(mob))
|
||||
mob.hud_used.show_hud()
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost HUD|[prefs.ghost_hud]")
|
||||
|
||||
/client/verb/toggle_inquisition() // warning: unexpected inquisition
|
||||
set name = "Toggle Inquisitiveness"
|
||||
set desc = "Sets whether your ghost examines everything on click by default"
|
||||
set category = "Preferences"
|
||||
|
||||
prefs.inquisitive_ghost = !prefs.inquisitive_ghost
|
||||
prefs.save_preferences()
|
||||
if(prefs.inquisitive_ghost)
|
||||
to_chat(src, "<span class='notice'>You will now examine everything you click on.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You will no longer examine things you click on.</span>")
|
||||
|
||||
/client/verb/toggle_inquisition() // warning: unexpected inquisition
|
||||
set name = "Toggle Inquisitiveness"
|
||||
set desc = "Sets whether your ghost examines everything on click by default"
|
||||
set category = "Preferences"
|
||||
|
||||
prefs.inquisitive_ghost = !prefs.inquisitive_ghost
|
||||
prefs.save_preferences()
|
||||
if(prefs.inquisitive_ghost)
|
||||
to_chat(src, "<span class='notice'>You will now examine everything you click on.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You will no longer examine things you click on.</span>")
|
||||
SSblackbox.add_details("preferences_verb","Toggle Ghost Inquisitiveness|[prefs.inquisitive_ghost]")
|
||||
|
||||
//Admin Preferences
|
||||
/client/proc/toggleadminhelpsound()
|
||||
set name = "Hear/Silence Adminhelps"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle hearing a notification when admin PMs are received"
|
||||
if(!holder)
|
||||
return
|
||||
prefs.toggles ^= SOUND_ADMINHELP
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
|
||||
|
||||
//Admin Preferences
|
||||
/client/proc/toggleadminhelpsound()
|
||||
set name = "Hear/Silence Adminhelps"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle hearing a notification when admin PMs are received"
|
||||
if(!holder)
|
||||
return
|
||||
prefs.toggles ^= SOUND_ADMINHELP
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
|
||||
SSblackbox.add_details("admin_toggle","Toggle Adminhelp Sound|[prefs.toggles & SOUND_ADMINHELP]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/toggleannouncelogin()
|
||||
set name = "Do/Don't Announce Login"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle if you want an announcement to admins when you login during a round"
|
||||
if(!holder)
|
||||
return
|
||||
prefs.toggles ^= ANNOUNCE_LOGIN
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "You will [(prefs.toggles & ANNOUNCE_LOGIN) ? "now" : "no longer"] have an announcement to other admins when you login.")
|
||||
|
||||
/client/proc/toggleannouncelogin()
|
||||
set name = "Do/Don't Announce Login"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle if you want an announcement to admins when you login during a round"
|
||||
if(!holder)
|
||||
return
|
||||
prefs.toggles ^= ANNOUNCE_LOGIN
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "You will [(prefs.toggles & ANNOUNCE_LOGIN) ? "now" : "no longer"] have an announcement to other admins when you login.")
|
||||
SSblackbox.add_details("admin_toggle","Toggle Login Announcement|[prefs.toggles & ANNOUNCE_LOGIN]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/toggle_hear_radio()
|
||||
set name = "Show/Hide Radio Chatter"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle seeing radiochatter from nearby radios and speakers"
|
||||
if(!holder) return
|
||||
prefs.chat_toggles ^= CHAT_RADIO
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "You will [(prefs.chat_toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from nearby radios or speakers")
|
||||
|
||||
/client/proc/toggle_hear_radio()
|
||||
set name = "Show/Hide Radio Chatter"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle seeing radiochatter from nearby radios and speakers"
|
||||
if(!holder) return
|
||||
prefs.chat_toggles ^= CHAT_RADIO
|
||||
prefs.save_preferences()
|
||||
to_chat(usr, "You will [(prefs.chat_toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from nearby radios or speakers")
|
||||
SSblackbox.add_details("admin_toggle","Toggle Radio Chatter|[prefs.chat_toggles & CHAT_RADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/deadchat()
|
||||
set name = "Show/Hide Deadchat"
|
||||
set category = "Preferences"
|
||||
set desc ="Toggles seeing deadchat"
|
||||
prefs.chat_toggles ^= CHAT_DEAD
|
||||
prefs.save_preferences()
|
||||
to_chat(src, "You will [(prefs.chat_toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
|
||||
|
||||
/client/proc/deadchat()
|
||||
set name = "Show/Hide Deadchat"
|
||||
set category = "Preferences"
|
||||
set desc ="Toggles seeing deadchat"
|
||||
prefs.chat_toggles ^= CHAT_DEAD
|
||||
prefs.save_preferences()
|
||||
to_chat(src, "You will [(prefs.chat_toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
|
||||
SSblackbox.add_details("admin_toggle","Toggle Deadchat Visibility|[prefs.chat_toggles & CHAT_DEAD]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/toggleprayers()
|
||||
set name = "Show/Hide Prayers"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles seeing prayers"
|
||||
prefs.chat_toggles ^= CHAT_PRAYER
|
||||
prefs.save_preferences()
|
||||
to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
|
||||
|
||||
/client/proc/toggleprayers()
|
||||
set name = "Show/Hide Prayers"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles seeing prayers"
|
||||
prefs.chat_toggles ^= CHAT_PRAYER
|
||||
prefs.save_preferences()
|
||||
to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
|
||||
SSblackbox.add_details("admin_toggle","Toggle Prayer Visibility|[prefs.chat_toggles & CHAT_PRAYER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
|
||||
/datum/round_event/immovable_rod/start()
|
||||
var/startside = pick(GLOB.cardinal)
|
||||
var/turf/startT = spaceDebrisStartLoc(startside, ZLEVEL_STATION)
|
||||
var/turf/endT = spaceDebrisFinishLoc(startside, ZLEVEL_STATION)
|
||||
var/turf/startT = spaceDebrisStartLoc(startside, ZLEVEL_STATION)
|
||||
var/turf/endT = spaceDebrisFinishLoc(startside, ZLEVEL_STATION)
|
||||
new /obj/effect/immovablerod(startT, endT)
|
||||
|
||||
/obj/effect/immovablerod
|
||||
@@ -82,13 +82,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
if(clong.density)
|
||||
clong.ex_act(2)
|
||||
|
||||
else if(ismob(clong))
|
||||
if(ishuman(clong))
|
||||
var/mob/living/carbon/human/H = clong
|
||||
H.visible_message("<span class='danger'>[H.name] is penetrated by an immovable rod!</span>" , "<span class='userdanger'>The rod penetrates you!</span>" , "<span class ='danger'>You hear a CLANG!</span>")
|
||||
H.adjustBruteLoss(160)
|
||||
if(clong.density || prob(10))
|
||||
clong.ex_act(2)
|
||||
else if(isliving(clong))
|
||||
penetrate(clong)
|
||||
else if(istype(clong, type))
|
||||
var/obj/effect/immovablerod/other = clong
|
||||
visible_message("<span class='danger'>[src] collides with [other]!\
|
||||
@@ -98,3 +93,11 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
smoke.start()
|
||||
qdel(src)
|
||||
qdel(other)
|
||||
|
||||
/obj/effect/immovablerod/proc/penetrate(mob/living/L)
|
||||
L.visible_message("<span class='danger'>[L] is penetrated by an immovable rod!</span>" , "<span class='userdanger'>The rod penetrates you!</span>" , "<span class ='danger'>You hear a CLANG!</span>")
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.adjustBruteLoss(160)
|
||||
if(L && (L.density || prob(10)))
|
||||
L.ex_act(2)
|
||||
|
||||
@@ -71,12 +71,12 @@
|
||||
if(!bounds)
|
||||
return
|
||||
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
|
||||
if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init
|
||||
repopulate_sorted_areas()
|
||||
|
||||
//initialize things that are normally initialized after map load
|
||||
initTemplateBounds(bounds)
|
||||
|
||||
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
sharpness = IS_SHARP
|
||||
var/list/trophies = list()
|
||||
var/charged = TRUE
|
||||
var/charge_time = 14
|
||||
var/charge_time = 15
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/Destroy()
|
||||
for(var/a in trophies)
|
||||
@@ -92,16 +92,21 @@
|
||||
for(var/t in trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_mark_detonation(target, user)
|
||||
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
|
||||
var/backstab_dir = get_dir(user, L)
|
||||
var/def_check = L.getarmor(type = "bomb")
|
||||
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
|
||||
L.apply_damage(80, BRUTE, blocked = def_check)
|
||||
playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
|
||||
else
|
||||
L.apply_damage(50, BRUTE, blocked = def_check)
|
||||
if(!QDELETED(C) && !QDELETED(L))
|
||||
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
|
||||
if(!QDELETED(L))
|
||||
if(!QDELETED(C))
|
||||
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
|
||||
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
|
||||
var/backstab_dir = get_dir(user, L)
|
||||
var/def_check = L.getarmor(type = "bomb")
|
||||
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
|
||||
if(!QDELETED(C))
|
||||
C.total_damage += 80 //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item
|
||||
L.apply_damage(80, BRUTE, blocked = def_check)
|
||||
playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
|
||||
else
|
||||
if(!QDELETED(C))
|
||||
C.total_damage += 50
|
||||
L.apply_damage(50, BRUTE, blocked = def_check)
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
|
||||
if(!charged)
|
||||
@@ -185,9 +190,70 @@
|
||||
/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
|
||||
/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user
|
||||
|
||||
//goliath
|
||||
/obj/item/crusher_trophy/goliath_tentacle
|
||||
name = "goliath tentacle"
|
||||
desc = "A sliced-off goliath tentacle. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "goliath_tentacle"
|
||||
denied_type = /obj/item/crusher_trophy/goliath_tentacle
|
||||
bonus_value = 2
|
||||
var/missing_health_ratio = 0.1
|
||||
var/missing_health_desc = 10
|
||||
/obj/item/crusher_trophy/goliath_tentacle/effect_desc()
|
||||
return "mark detonation to do <b>[bonus_value]</b> more damage for every <b>[missing_health_desc]</b> health you are missing"
|
||||
|
||||
/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
var/missing_health = user.health - user.maxHealth
|
||||
missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
|
||||
missing_health *= bonus_value //multiply the remaining amount by bonus_value
|
||||
if(missing_health > 0)
|
||||
target.adjustBruteLoss(missing_health) //and do that much damage
|
||||
|
||||
/watcher
|
||||
/obj/item/crusher_trophy/watcher_wing
|
||||
name = "watcher wing"
|
||||
desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "watcher_wing"
|
||||
denied_type = /obj/item/crusher_trophy/watcher_wing
|
||||
bonus_value = 8
|
||||
|
||||
/obj/item/crusher_trophy/watcher_wing/effect_desc()
|
||||
return "mark detonation to prevent certain creatures from using certain attacks for <b>[bonus_value*0.1]</b> second[bonus_value*0.1 == 1 ? "":"s"]"
|
||||
|
||||
/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
if(ishostile(target))
|
||||
var/mob/living/simple_animal/hostile/H = target
|
||||
if(H.ranged) //briefly delay ranged attacks
|
||||
if(H.ranged_cooldown_time >= world.time)
|
||||
H.ranged_cooldown_time += bonus_value
|
||||
else
|
||||
H.ranged_cooldown_time = bonus_value + world.time
|
||||
|
||||
//legion
|
||||
/obj/item/crusher_trophy/legion_skull
|
||||
name = "legion skull"
|
||||
desc = "A dead and lifeless legion skull. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "legion_skull"
|
||||
denied_type = /obj/item/crusher_trophy/legion_skull
|
||||
bonus_value = 3
|
||||
|
||||
/obj/item/crusher_trophy/legion_skull/effect_desc()
|
||||
return "a kinetic crusher to recharge <b>[bonus_value*0.1]</b> second[bonus_value*0.1 == 1 ? "":"s"] faster"
|
||||
|
||||
/obj/item/crusher_trophy/legion_skull/add_to(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
H.charge_time -= bonus_value
|
||||
|
||||
/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
H.charge_time += bonus_value
|
||||
|
||||
|
||||
//ash drake
|
||||
/obj/item/crusher_trophy/tail_spike
|
||||
desc = "A spike taken from a ash drake's tail."
|
||||
desc = "A spike taken from a ash drake's tail. Suitable as a trophy for a kinetic crusher."
|
||||
denied_type = /obj/item/crusher_trophy/tail_spike
|
||||
bonus_value = 5
|
||||
|
||||
@@ -210,7 +276,7 @@
|
||||
//bubblegum
|
||||
/obj/item/crusher_trophy/demon_claws
|
||||
name = "demon claws"
|
||||
desc = "A set of blood-drenched claws from a massive demon's hand."
|
||||
desc = "A set of blood-drenched claws from a massive demon's hand. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "demon_claws"
|
||||
gender = PLURAL
|
||||
denied_type = /obj/item/crusher_trophy/demon_claws
|
||||
@@ -244,7 +310,7 @@
|
||||
//colossus
|
||||
/obj/item/crusher_trophy/blaster_tubes
|
||||
name = "blaster tubes"
|
||||
desc = "The blaster tubes from a colossus's arm."
|
||||
desc = "The blaster tubes from a colossus's arm. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "blaster_tubes"
|
||||
gender = PLURAL
|
||||
denied_type = /obj/item/crusher_trophy/blaster_tubes
|
||||
@@ -273,7 +339,7 @@
|
||||
//hierophant
|
||||
/obj/item/crusher_trophy/vortex_talisman
|
||||
name = "vortex talisman"
|
||||
desc = "A glowing trinket that was originally the Hierophant's beacon."
|
||||
desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "vortex_talisman"
|
||||
denied_type = /obj/item/crusher_trophy/vortex_talisman
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
desc = "It's watching you suspiciously."
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
|
||||
var/loot = rand(1,27)
|
||||
var/loot = rand(1,28)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/device/shared_storage/red(src)
|
||||
@@ -69,6 +69,8 @@
|
||||
if(27)
|
||||
new /obj/item/borg/upgrade/modkit/lifesteal(src)
|
||||
new /obj/item/weapon/bedsheet/cult(src)
|
||||
if(28)
|
||||
new /obj/item/borg/upgrade/modkit/bounty(src)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
if(istype(thing, /obj/item/weapon/storage/bag/ore))
|
||||
OB = thing
|
||||
break
|
||||
else if(issilicon(AM))
|
||||
else if(iscyborg(AM))
|
||||
var/mob/living/silicon/robot/R = AM
|
||||
for(var/thing in R.module_active)
|
||||
if(istype(thing, /obj/item/weapon/storage/bag/ore))
|
||||
|
||||
@@ -57,3 +57,13 @@
|
||||
nutrition -= HUNGER_FACTOR/10
|
||||
if((disabilities & FAT) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360)
|
||||
bodytemperature += 2
|
||||
|
||||
/mob/living/carbon/Moved(oldLoc, Dir)
|
||||
. = ..()
|
||||
for(var/obj/O in internal_organs)
|
||||
O.on_mob_move(dir, src, oldLoc)
|
||||
|
||||
/mob/living/carbon/setDir(newdir)
|
||||
. = ..()
|
||||
for(var/obj/O in internal_organs)
|
||||
O.on_mob_turn(newdir, src)
|
||||
|
||||
@@ -1540,7 +1540,7 @@
|
||||
if(stunning && stunCheck.stunned)
|
||||
shouldFire = 0
|
||||
if(shouldFire)
|
||||
if(P.power_supply.charge <= 10) // can shoot seems to bug out for tasers, using this hacky method instead
|
||||
if(P.cell.charge <= 10) // can shoot seems to bug out for tasers, using this hacky method instead
|
||||
P.update_icon()
|
||||
npcDrop(P,1)
|
||||
else
|
||||
|
||||
@@ -6,17 +6,20 @@
|
||||
/mob/living/carbon/human/Weaken(amount, updating = 1, ignore_canstun = 0)
|
||||
amount = dna.species.spec_stun(src,amount)
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/Paralyse(amount, updating = 1, ignore_canstun = 0)
|
||||
amount = dna.species.spec_stun(src,amount)
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/cure_husk()
|
||||
. = ..()
|
||||
if(.)
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/become_husk()
|
||||
if(istype(dna.species, /datum/species/skeleton)) //skeletons shouldn't be husks.
|
||||
cure_husk()
|
||||
return
|
||||
. = ..()
|
||||
if(.)
|
||||
update_hair()
|
||||
|
||||
@@ -97,6 +97,9 @@
|
||||
buckle_lying = FALSE
|
||||
can_ride_typecache = list(/mob/living/carbon/human)
|
||||
|
||||
/mob/living/silicon/robot/get_cell()
|
||||
return cell
|
||||
|
||||
/mob/living/silicon/robot/Initialize(mapload)
|
||||
spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
add_fingerprint(user)
|
||||
if(opened && !wiresexposed && !issilicon(user))
|
||||
if(cell)
|
||||
cell.updateicon()
|
||||
cell.update_icon()
|
||||
cell.add_fingerprint(user)
|
||||
user.put_in_active_hand(cell)
|
||||
to_chat(user, "<span class='notice'>You remove \the [cell].</span>")
|
||||
|
||||
@@ -104,10 +104,10 @@
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/wire)
|
||||
|
||||
else if(istype(S, /obj/item/stack/marker_beacon))
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon)
|
||||
|
||||
else if(istype(S, /obj/item/stack/marker_beacon))
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon)
|
||||
|
||||
if(S && S.source)
|
||||
S.materials = list()
|
||||
S.is_cyborg = 1
|
||||
@@ -149,8 +149,8 @@
|
||||
F.update_icon()
|
||||
else if(istype(I, /obj/item/weapon/melee/baton))
|
||||
var/obj/item/weapon/melee/baton/B = I
|
||||
if(B.bcell)
|
||||
B.bcell.charge = B.bcell.maxcharge
|
||||
if(B.cell)
|
||||
B.cell.charge = B.cell.maxcharge
|
||||
else if(istype(I, /obj/item/weapon/gun/energy))
|
||||
var/obj/item/weapon/gun/energy/EG = I
|
||||
if(!EG.chambered)
|
||||
@@ -202,9 +202,9 @@
|
||||
/obj/item/weapon/robot_module/proc/do_transform_animation()
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
R.notransform = TRUE
|
||||
var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R)
|
||||
var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R)
|
||||
ANM.layer = R.layer - 0.01
|
||||
new /obj/effect/temp_visual/small_smoke(R.loc)
|
||||
new /obj/effect/temp_visual/small_smoke(R.loc)
|
||||
if(R.hat)
|
||||
R.hat.forceMove(get_turf(R))
|
||||
R.hat = null
|
||||
@@ -226,7 +226,7 @@
|
||||
if(R.hud_used)
|
||||
R.hud_used.update_robot_modules_display()
|
||||
if(feedback_key && !did_feedback)
|
||||
SSblackbox.inc(feedback_key, 1)
|
||||
SSblackbox.inc(feedback_key, 1)
|
||||
|
||||
/obj/item/weapon/robot_module/standard
|
||||
name = "Standard"
|
||||
@@ -250,7 +250,7 @@
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg,
|
||||
/obj/item/clockwork/ratvarian_spear/cyborg,
|
||||
/obj/item/clockwork/clockwork_proselytizer/cyborg)
|
||||
/obj/item/clockwork/replica_fabricator/cyborg)
|
||||
moduleselect_icon = "standard"
|
||||
feedback_key = "cyborg_standard"
|
||||
hat_offset = -3
|
||||
@@ -275,7 +275,7 @@
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/borg/cyborghug/medical,
|
||||
/obj/item/stack/medical/gauze/cyborg,
|
||||
/obj/item/weapon/organ_storage,
|
||||
/obj/item/weapon/organ_storage,
|
||||
/obj/item/borg/lollipop)
|
||||
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/hacked)
|
||||
ratvar_modules = list(
|
||||
@@ -314,7 +314,7 @@
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/engineer,
|
||||
/obj/item/clockwork/clockwork_proselytizer/cyborg)
|
||||
/obj/item/clockwork/replica_fabricator/cyborg)
|
||||
cyborg_base_icon = "engineer"
|
||||
moduleselect_icon = "engineer"
|
||||
feedback_key = "cyborg_engineering"
|
||||
@@ -395,9 +395,9 @@
|
||||
..()
|
||||
var/obj/item/weapon/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/e_gun/advtaser/cyborg) in basic_modules
|
||||
if(T)
|
||||
if(T.power_supply.charge < T.power_supply.maxcharge)
|
||||
if(T.cell.charge < T.cell.maxcharge)
|
||||
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
|
||||
T.power_supply.give(S.e_cost * coeff)
|
||||
T.cell.give(S.e_cost * coeff)
|
||||
T.update_icon()
|
||||
else
|
||||
T.charge_tick = 0
|
||||
@@ -411,8 +411,8 @@
|
||||
/obj/item/weapon/reagent_containers/borghypo/peace,
|
||||
/obj/item/weapon/holosign_creator/cyborg,
|
||||
/obj/item/borg/cyborghug/peacekeeper,
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/borg/projectile_dampen)
|
||||
/obj/item/weapon/extinguisher,
|
||||
/obj/item/borg/projectile_dampen)
|
||||
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/peace/hacked)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/peacekeeper,
|
||||
@@ -444,7 +444,7 @@
|
||||
emag_modules = list(/obj/item/weapon/reagent_containers/spray/cyborg_lube)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/janitor,
|
||||
/obj/item/clockwork/clockwork_proselytizer/cyborg)
|
||||
/obj/item/clockwork/replica_fabricator/cyborg)
|
||||
cyborg_base_icon = "janitor"
|
||||
moduleselect_icon = "janitor"
|
||||
feedback_key = "cyborg_janitor"
|
||||
@@ -542,8 +542,8 @@
|
||||
/obj/item/weapon/storage/bag/sheetsnatcher/borg,
|
||||
/obj/item/device/t_scanner/adv_mining_scanner,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg,
|
||||
/obj/item/device/gps/cyborg,
|
||||
/obj/item/stack/marker_beacon)
|
||||
/obj/item/device/gps/cyborg,
|
||||
/obj/item/stack/marker_beacon)
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/miner,
|
||||
@@ -639,8 +639,8 @@
|
||||
max_energy = 2500
|
||||
recharge_rate = 250
|
||||
name = "Medical Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/beacon
|
||||
max_energy = 30
|
||||
recharge_rate = 1
|
||||
name = "Marker Beacon Storage"
|
||||
|
||||
/datum/robot_energy_storage/beacon
|
||||
max_energy = 30
|
||||
recharge_rate = 1
|
||||
name = "Marker Beacon Storage"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
maxHealth = 100
|
||||
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
obj_damage = 60
|
||||
environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
|
||||
environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
radio_key = /obj/item/device/encryptionkey/headset_sec
|
||||
@@ -358,21 +358,21 @@ Auto Patrol[]"},
|
||||
|
||||
var/obj/item/weapon/ed209_assembly/Sa = new /obj/item/weapon/ed209_assembly(Tsec)
|
||||
Sa.build_step = 1
|
||||
Sa.add_overlay("hs_hole")
|
||||
Sa.add_overlay("hs_hole")
|
||||
Sa.created_name = name
|
||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
||||
|
||||
if(!lasercolor)
|
||||
var/obj/item/weapon/gun/energy/e_gun/advtaser/G = new /obj/item/weapon/gun/energy/e_gun/advtaser(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.cell.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "b")
|
||||
var/obj/item/weapon/gun/energy/laser/bluetag/G = new /obj/item/weapon/gun/energy/laser/bluetag(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.cell.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "r")
|
||||
var/obj/item/weapon/gun/energy/laser/redtag/G = new /obj/item/weapon/gun/energy/laser/redtag(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.cell.charge = 0
|
||||
G.update_icon()
|
||||
|
||||
if(prob(50))
|
||||
@@ -390,7 +390,7 @@ Auto Patrol[]"},
|
||||
if(lasercolor == "r")
|
||||
new /obj/item/clothing/suit/redtag(Tsec)
|
||||
|
||||
do_sparks(3, TRUE, src)
|
||||
do_sparks(3, TRUE, src)
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
..()
|
||||
@@ -444,7 +444,7 @@ Auto Patrol[]"},
|
||||
if(severity==2 && prob(70))
|
||||
..(severity-1)
|
||||
else
|
||||
new /obj/effect/temp_visual/emp(loc)
|
||||
new /obj/effect/temp_visual/emp(loc)
|
||||
var/list/mob/living/carbon/targets = new
|
||||
for(var/mob/living/carbon/C in view(12,src))
|
||||
if(C.stat==2)
|
||||
|
||||
@@ -91,6 +91,16 @@
|
||||
icon_living = icon_state
|
||||
icon_dead = "[visualAppearence]_dead"
|
||||
|
||||
/obj/item/drone_shell/dusty
|
||||
name = "derelict drone shell"
|
||||
desc = "A long-forgotten drone shell. It seems kind of... Space Russian."
|
||||
drone_type = /mob/living/simple_animal/drone/derelict
|
||||
|
||||
/mob/living/simple_animal/drone/derelict
|
||||
name = "derelict drone"
|
||||
default_hatmask = /obj/item/clothing/head/ushanka
|
||||
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab
|
||||
name = "cogscarab"
|
||||
desc = "A strange, drone-like machine. It constantly emits the hum of gears."
|
||||
@@ -120,14 +130,14 @@
|
||||
hacked = TRUE
|
||||
visualAppearence = CLOCKDRONE
|
||||
can_be_held = FALSE
|
||||
flavortext = "<span class='heavy_brass'>You are a cogscarab</span><b>, a clockwork creation of Ratvar. As a cogscarab, you have low health, an inbuilt proselytizer that can convert brass \
|
||||
to liquified alloy, a set of relatively fast tools, </b><span class='heavy_brass'>can communicate over the Hierophant Network with :b</span><b>, and are immune to extreme \
|
||||
flavortext = "<span class='heavy_brass'>You are a cogscarab</span><b>, a clockwork creation of Ratvar. As a cogscarab, you have low health, an inbuilt fabricator that can convert brass \
|
||||
to power, a set of relatively fast tools, </b><span class='heavy_brass'>can communicate over the Hierophant Network with :b</span><b>, and are immune to extreme \
|
||||
temperatures and pressures. \nYour goal is to serve the Justiciar and his servants by repairing and defending all they create.</b>"
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/ratvar //a subtype for spawning when ratvar is alive, has a slab that it can use and a normal proselytizer
|
||||
/mob/living/simple_animal/drone/cogscarab/ratvar //a subtype for spawning when ratvar is alive, has a slab that it can use and a normal fabricatorlab that it can use and a normal fabricator
|
||||
default_storage = /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost proselytizer and slab in its box
|
||||
/mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost fabricator and slab in its box
|
||||
default_storage = /obj/item/weapon/storage/toolbox/brass/prefilled/ratvar/admin
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/Initialize()
|
||||
@@ -167,9 +177,7 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/can_use_guns(obj/item/weapon/gun/G)
|
||||
if(!GLOB.ratvar_awakens)
|
||||
changeNext_move(CLICK_CD_RANGE*4) //about as much delay as an unupgraded kinetic accelerator
|
||||
return TRUE
|
||||
return GLOB.ratvar_awakens
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/get_armor_effectiveness()
|
||||
if(GLOB.ratvar_awakens)
|
||||
@@ -191,11 +199,41 @@
|
||||
/mob/living/simple_animal/drone/cogscarab/ratvar_act()
|
||||
fully_heal(TRUE)
|
||||
|
||||
/obj/item/drone_shell/dusty
|
||||
name = "derelict drone shell"
|
||||
desc = "A long-forgotten drone shell. It seems kind of... Space Russian."
|
||||
drone_type = /mob/living/simple_animal/drone/derelict
|
||||
/mob/living/simple_animal/drone/cogscarab/update_icons()
|
||||
if(stat != DEAD)
|
||||
if(incapacitated())
|
||||
icon_state = "[visualAppearence]_flipped"
|
||||
else
|
||||
icon_state = visualAppearence
|
||||
else
|
||||
icon_state = "[visualAppearence]_dead"
|
||||
|
||||
/mob/living/simple_animal/drone/derelict
|
||||
name = "derelict drone"
|
||||
default_hatmask = /obj/item/clothing/head/ushanka
|
||||
/mob/living/simple_animal/drone/cogscarab/Stun(amount, updating = 1, ignore_canstun = 0)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_icons()
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/SetStunned(amount, updating = 1, ignore_canstun = 0)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_icons()
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/AdjustStunned(amount, updating = 1, ignore_canstun = 0)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_icons()
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/Weaken(amount, updating = 1, ignore_canweaken = 0)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_icons()
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/SetWeakened(amount, updating = 1, ignore_canweaken = 0)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_icons()
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/AdjustWeakened(amount, updating = 1, ignore_canweaken = 0)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_icons()
|
||||
|
||||
@@ -132,6 +132,12 @@ Difficulty: Hard
|
||||
if(spawned_beacon && loc == spawned_beacon.loc && did_reset)
|
||||
arena_trap(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/hierophant/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(istype(the_target, /mob/living/simple_animal/hostile/asteroid/hivelordbrood)) //ignore temporary targets in favor of more permenant targets
|
||||
return FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
. = ..()
|
||||
if(src && . > 0 && !blinking)
|
||||
|
||||
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
var/mob/living/creator = null // the creator
|
||||
var/destroy_objects = 0
|
||||
var/knockdown_people = 0
|
||||
var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes")
|
||||
var/static/mutable_appearance/googly_eyes = mutable_appearance('icons/mob/mob.dmi', "googly_eyes")
|
||||
gold_core_spawnable = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/Initialize(mapload, obj/copy, mob/living/creator, destroy_original = 0)
|
||||
@@ -203,7 +203,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
if(..())
|
||||
emote_see = list("aims menacingly")
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so
|
||||
ranged = 1
|
||||
retreat_distance = 1 //just enough to shoot
|
||||
minimum_distance = 6
|
||||
@@ -229,10 +229,10 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/ranged/OpenFire(the_target)
|
||||
if(Zapgun)
|
||||
if(Zapgun.power_supply)
|
||||
if(Zapgun.cell)
|
||||
var/obj/item/ammo_casing/energy/shot = Zapgun.ammo_type[Zapgun.select]
|
||||
if(Zapgun.power_supply.charge >= shot.e_cost)
|
||||
Zapgun.power_supply.use(shot.e_cost)
|
||||
if(Zapgun.cell.charge >= shot.e_cost)
|
||||
Zapgun.cell.use(shot.e_cost)
|
||||
Zapgun.update_icon()
|
||||
..()
|
||||
else if(Zapstick)
|
||||
|
||||
@@ -76,5 +76,9 @@
|
||||
stat_attack = UNCONSCIOUS
|
||||
movement_type = FLYING
|
||||
robust_searching = 1
|
||||
crusher_loot = /obj/item/crusher_trophy/watcher_wing
|
||||
loot = list()
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
|
||||
fromtendril = TRUE
|
||||
|
||||
@@ -85,11 +85,16 @@
|
||||
icon_dead = "goliath_dead"
|
||||
throw_message = "does nothing to the tough hide of the"
|
||||
pre_attack_icon = "goliath2"
|
||||
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
|
||||
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||
loot = list()
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
|
||||
fromtendril = TRUE
|
||||
|
||||
|
||||
//tentacles
|
||||
/obj/effect/goliath_tentacle
|
||||
name = "Goliath tentacle"
|
||||
|
||||
@@ -46,6 +46,10 @@
|
||||
OpenFire()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot()
|
||||
loot += crusher_loot //we don't butcher
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
|
||||
mouse_opacity = 1
|
||||
..(gibbed)
|
||||
@@ -101,6 +105,7 @@
|
||||
speak_emote = list("echoes")
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
throw_message = "bounces harmlessly off of"
|
||||
crusher_loot = /obj/item/crusher_trophy/legion_skull
|
||||
loot = list(/obj/item/organ/regenerative_core/legion)
|
||||
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
|
||||
del_on_death = 1
|
||||
@@ -119,6 +124,10 @@
|
||||
new /obj/effect/mob_spawn/human/corpse/damaged(T)
|
||||
..(gibbed)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril
|
||||
fromtendril = TRUE
|
||||
|
||||
|
||||
//Legion skull
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
|
||||
name = "legion"
|
||||
|
||||
@@ -11,14 +11,21 @@
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "strikes"
|
||||
var/crusher_loot
|
||||
status_flags = 0
|
||||
a_intent = INTENT_HARM
|
||||
var/throw_message = "bounces off of"
|
||||
var/icon_aggro = null // for swapping to when we get aggressive
|
||||
var/fromtendril = FALSE
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/Aggro()
|
||||
..()
|
||||
if(vision_range != aggro_vision_range)
|
||||
@@ -44,14 +51,21 @@
|
||||
if(!stat)
|
||||
Aggro()
|
||||
if(T.throwforce <= 20)
|
||||
visible_message("<span class='notice'>The [T.name] [src.throw_message] [src.name]!</span>")
|
||||
visible_message("<span class='notice'>The [T.name] [throw_message] [src.name]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
|
||||
SSblackbox.add_details("mobs_killed_mining","[src.type]")
|
||||
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
if(C && crusher_loot && prob((C.total_damage/maxHealth)) * 5) //on average, you'll need to kill 20 creatures before getting the item
|
||||
spawn_crusher_loot()
|
||||
..(gibbed)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot()
|
||||
butcher_results[crusher_loot] = 1
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
|
||||
if(bodytemperature < minbodytemp)
|
||||
adjustBruteLoss(2)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
maxHealth = 250
|
||||
max_mobs = 3
|
||||
spawn_time = 300 //30 seconds default
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
|
||||
spawn_text = "emerges from"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
@@ -28,10 +28,10 @@
|
||||
var/obj/effect/light_emitter/tendril/emitted_light
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/legion
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -178,11 +178,18 @@
|
||||
if(mob.throwing)
|
||||
mob.throwing.finalize(FALSE)
|
||||
|
||||
for(var/obj/O in mob)
|
||||
O.on_mob_move(direct, src)
|
||||
|
||||
return .
|
||||
|
||||
/mob/Moved(oldLoc, dir)
|
||||
. = ..()
|
||||
for(var/obj/O in contents)
|
||||
O.on_mob_move(dir, src, oldLoc)
|
||||
|
||||
/mob/setDir(newDir)
|
||||
. = ..()
|
||||
for(var/obj/O in contents)
|
||||
O.on_mob_turn(newDir, src)
|
||||
|
||||
|
||||
///Process_Grab()
|
||||
///Called by client/Move()
|
||||
@@ -209,10 +216,10 @@
|
||||
return
|
||||
var/mob/living/L = mob
|
||||
switch(L.incorporeal_move)
|
||||
if(INCORPOREAL_MOVE_BASIC)
|
||||
if(INCORPOREAL_MOVE_BASIC)
|
||||
L.loc = get_step(L, direct)
|
||||
L.setDir(direct)
|
||||
if(INCORPOREAL_MOVE_SHADOW)
|
||||
if(INCORPOREAL_MOVE_SHADOW)
|
||||
if(prob(50))
|
||||
var/locx
|
||||
var/locy
|
||||
@@ -242,15 +249,15 @@
|
||||
L.loc = locate(locx,locy,mobloc.z)
|
||||
var/limit = 2//For only two trailing shadows.
|
||||
for(var/turf/T in getline(mobloc, L.loc))
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
|
||||
limit--
|
||||
if(limit<=0)
|
||||
break
|
||||
else
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
|
||||
L.loc = get_step(L, direct)
|
||||
L.setDir(direct)
|
||||
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
|
||||
var/turf/open/floor/stepTurf = get_step(L, direct)
|
||||
for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
|
||||
to_chat(L, "<span class='warning'>[S] bars your passage!</span>")
|
||||
@@ -295,12 +302,12 @@
|
||||
return A
|
||||
else
|
||||
var/atom/movable/AM = A
|
||||
if(AM == buckled)
|
||||
if(AM == buckled)
|
||||
continue
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(M.buckled)
|
||||
continue
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(M.buckled)
|
||||
continue
|
||||
if(!AM.CanPass(src) || AM.density)
|
||||
if(AM.anchored)
|
||||
return AM
|
||||
|
||||
@@ -26,6 +26,11 @@
|
||||
return battery_module.battery.give(amount)
|
||||
return 0
|
||||
|
||||
/obj/item/device/modular_computer/get_cell()
|
||||
var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
|
||||
if(battery_module && battery_module.battery)
|
||||
return battery_module.battery
|
||||
|
||||
|
||||
// Used in following function to reduce copypaste
|
||||
/obj/item/device/modular_computer/proc/power_failure()
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
/datum/computer_file/program/card_mod/New()
|
||||
..()
|
||||
change_position_cooldown = config.id_console_jobslot_delay
|
||||
addtimer(CALLBACK(src, .proc/SetConfigCooldown), 0)
|
||||
|
||||
/datum/computer_file/program/card_mod/proc/SetConfigCooldown()
|
||||
|
||||
|
||||
/datum/computer_file/program/card_mod/event_idremoved(background, slot)
|
||||
|
||||
@@ -111,7 +111,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
|
||||
S.cell.charge += charge
|
||||
charge = 0
|
||||
corrupt()
|
||||
updateicon()
|
||||
update_icon()
|
||||
|
||||
|
||||
//RDCONSOLE//
|
||||
|
||||
@@ -56,6 +56,8 @@ Contents:
|
||||
var/s_bombs = 10//Number of starting ninja smoke bombs.
|
||||
var/a_boost = 3//Number of adrenaline boosters.
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/get_cell()
|
||||
return cell
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/New()
|
||||
..()
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
U.put_in_hands(old_cell)
|
||||
old_cell.add_fingerprint(U)
|
||||
old_cell.corrupt()
|
||||
old_cell.updateicon()
|
||||
old_cell.update_icon()
|
||||
cell = CELL
|
||||
to_chat(U, "<span class='notice'>Upgrade complete. Maximum capacity: <b>[round(cell.maxcharge/100)]</b>%</span>")
|
||||
else
|
||||
|
||||
@@ -93,6 +93,10 @@
|
||||
var/update_overlay = -1
|
||||
var/icon_update_needed = FALSE
|
||||
|
||||
/obj/machinery/power/apc/get_cell()
|
||||
return cell
|
||||
|
||||
|
||||
/obj/machinery/power/apc/connect_to_network()
|
||||
//Override because the APC does not directly connect to the network; it goes through a terminal.
|
||||
//The terminal is what the power computer looks for anyway.
|
||||
@@ -622,14 +626,10 @@
|
||||
return
|
||||
if(usr == user && opened && (!issilicon(user)))
|
||||
if(cell)
|
||||
user.visible_message("[user] removes \the [cell] from [src]!","<span class='notice'>You remove \the [cell].</span>")
|
||||
user.put_in_hands(cell)
|
||||
cell.add_fingerprint(user)
|
||||
cell.updateicon()
|
||||
|
||||
cell.update_icon()
|
||||
src.cell = null
|
||||
user.visible_message("[user.name] removes the power cell from [src.name]!",\
|
||||
"<span class='notice'>You remove the power cell.</span>")
|
||||
//to_chat(user, "You remove the power cell.")
|
||||
charging = 0
|
||||
src.update_icon()
|
||||
return
|
||||
|
||||
@@ -19,13 +19,16 @@
|
||||
var/ratingdesc = TRUE
|
||||
var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/get_cell()
|
||||
return src
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/New()
|
||||
..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
charge = maxcharge
|
||||
if(ratingdesc)
|
||||
desc += " This one has a power rating of [maxcharge], and you should not swallow it."
|
||||
updateicon()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -46,16 +49,16 @@
|
||||
else
|
||||
return PROCESS_KILL
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/proc/updateicon()
|
||||
/obj/item/weapon/stock_parts/cell/update_icon()
|
||||
cut_overlays()
|
||||
if(grown_battery)
|
||||
add_overlay("grown_wires")
|
||||
add_overlay("grown_wires")
|
||||
if(charge < 0.01)
|
||||
return
|
||||
else if(charge/maxcharge >=0.995)
|
||||
add_overlay("cell-o2")
|
||||
add_overlay("cell-o2")
|
||||
else
|
||||
add_overlay("cell-o1")
|
||||
add_overlay("cell-o1")
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/proc/percent() // return % charge of cell
|
||||
return 100*charge/maxcharge
|
||||
@@ -69,7 +72,7 @@
|
||||
return 0
|
||||
charge = (charge - amount)
|
||||
if(!istype(loc, /obj/machinery/power/apc))
|
||||
SSblackbox.add_details("cell_used","[src.type]")
|
||||
SSblackbox.add_details("cell_used","[src.type]")
|
||||
return 1
|
||||
|
||||
// recharge the cell
|
||||
@@ -123,7 +126,7 @@
|
||||
corrupt()
|
||||
return
|
||||
//explosion(T, 0, 1, 2, 2)
|
||||
explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range)
|
||||
explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/proc/corrupt()
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel
|
||||
spawnableTurfs = list(/turf/open/floor/plasteel = 100)
|
||||
var/ignore_wall = FALSE
|
||||
allowAtomsOnSpace = TRUE
|
||||
|
||||
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/place(turf/T)
|
||||
if(isclosedturf(T))
|
||||
if(isclosedturf(T) && !ignore_wall)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -13,6 +14,7 @@
|
||||
/datum/mapGeneratorModule/border/normalWalls
|
||||
spawnableAtoms = list()
|
||||
spawnableTurfs = list(/turf/closed/wall = 100)
|
||||
allowAtomsOnSpace = TRUE
|
||||
|
||||
/datum/mapGenerator/repair
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel,
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
|
||||
#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4
|
||||
|
||||
/obj/item/weapon/gun
|
||||
name = "gun"
|
||||
desc = "It's a gun. It's pretty terrible, though."
|
||||
@@ -229,7 +232,7 @@
|
||||
break
|
||||
if(chambered && chambered.BB)
|
||||
if(randomspread)
|
||||
sprd = round((rand() - 0.5) * (randomized_gun_spread + randomized_bonus_spread))
|
||||
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
|
||||
else //Smart spread
|
||||
sprd = round((((rand_spr/burst_size) * i) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
|
||||
|
||||
@@ -250,7 +253,7 @@
|
||||
firing_burst = 0
|
||||
else
|
||||
if(chambered)
|
||||
sprd = round((rand() - 0.5) * (randomized_gun_spread + randomized_bonus_spread))
|
||||
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
|
||||
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd))
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
desc = "A basic energy-based gun."
|
||||
icon = 'icons/obj/guns/energy.dmi'
|
||||
|
||||
var/obj/item/weapon/stock_parts/cell/power_supply //What type of power cell this uses
|
||||
var/obj/item/weapon/stock_parts/cell/cell //What type of power cell this uses
|
||||
var/cell_type = /obj/item/weapon/stock_parts/cell
|
||||
var/modifystate = 0
|
||||
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
|
||||
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
|
||||
var/can_charge = 1 //Can it be charged in a recharger?
|
||||
var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()?
|
||||
var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()?
|
||||
var/charge_sections = 4
|
||||
ammo_x_offset = 2
|
||||
var/shaded_charge = 0 //if this gun uses a stateful charge bar for more detail
|
||||
@@ -20,19 +20,22 @@
|
||||
var/use_cyborg_cell = 0 //whether the gun's cell drains the cyborg user's cell to recharge
|
||||
|
||||
/obj/item/weapon/gun/energy/emp_act(severity)
|
||||
power_supply.use(round(power_supply.charge / severity))
|
||||
cell.use(round(cell.charge / severity))
|
||||
chambered = null //we empty the chamber
|
||||
recharge_newshot() //and try to charge a new shot
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/energy/get_cell()
|
||||
return cell
|
||||
|
||||
/obj/item/weapon/gun/energy/Initialize()
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/gun/energy/Initialize()
|
||||
. = ..()
|
||||
if(cell_type)
|
||||
power_supply = new cell_type(src)
|
||||
cell = new cell_type(src)
|
||||
else
|
||||
power_supply = new(src)
|
||||
power_supply.give(power_supply.maxcharge)
|
||||
cell = new(src)
|
||||
cell.give(cell.maxcharge)
|
||||
update_ammo_types()
|
||||
recharge_newshot(1)
|
||||
if(selfcharge)
|
||||
@@ -50,9 +53,7 @@
|
||||
fire_delay = shot.delay
|
||||
|
||||
/obj/item/weapon/gun/energy/Destroy()
|
||||
if(power_supply)
|
||||
qdel(power_supply)
|
||||
power_supply = null
|
||||
QDEL_NULL(cell)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
@@ -62,9 +63,9 @@
|
||||
if(charge_tick < charge_delay)
|
||||
return
|
||||
charge_tick = 0
|
||||
if(!power_supply)
|
||||
if(!cell)
|
||||
return
|
||||
power_supply.give(100)
|
||||
cell.give(100)
|
||||
if(!chambered) //if empty chamber we try to charge a new shot
|
||||
recharge_newshot(1)
|
||||
update_icon()
|
||||
@@ -76,10 +77,10 @@
|
||||
|
||||
/obj/item/weapon/gun/energy/can_shoot()
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
|
||||
return power_supply.charge >= shot.e_cost
|
||||
return cell.charge >= shot.e_cost
|
||||
|
||||
/obj/item/weapon/gun/energy/recharge_newshot(no_cyborg_drain)
|
||||
if (!ammo_type || !power_supply)
|
||||
if (!ammo_type || !cell)
|
||||
return
|
||||
if(use_cyborg_cell && !no_cyborg_drain)
|
||||
if(iscyborg(loc))
|
||||
@@ -87,10 +88,10 @@
|
||||
if(R.cell)
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
|
||||
if(R.cell.use(shot.e_cost)) //Take power from the borg...
|
||||
power_supply.give(shot.e_cost) //... to recharge the shot
|
||||
cell.give(shot.e_cost) //... to recharge the shot
|
||||
if(!chambered)
|
||||
var/obj/item/ammo_casing/energy/AC = ammo_type[select]
|
||||
if(power_supply.charge >= AC.e_cost) //if there's enough power in the power_supply cell...
|
||||
if(cell.charge >= AC.e_cost) //if there's enough power in the cell cell...
|
||||
chambered = AC //...prepare a new shot based on the current ammo type selected
|
||||
if(!chambered.BB)
|
||||
chambered.newshot()
|
||||
@@ -98,7 +99,7 @@
|
||||
/obj/item/weapon/gun/energy/process_chamber()
|
||||
if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
|
||||
var/obj/item/ammo_casing/energy/shot = chambered
|
||||
power_supply.use(shot.e_cost)//... drain the power_supply cell
|
||||
cell.use(shot.e_cost)//... drain the cell cell
|
||||
chambered = null //either way, released the prepared shot
|
||||
recharge_newshot() //try to charge a new shot
|
||||
|
||||
@@ -117,10 +118,10 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/update_icon()
|
||||
..()
|
||||
if(!automatic_charge_overlays)
|
||||
return
|
||||
var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections)
|
||||
..()
|
||||
if(!automatic_charge_overlays)
|
||||
return
|
||||
var/ratio = Ceiling((cell.charge / cell.maxcharge) * charge_sections)
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
|
||||
var/iconState = "[icon_state]_charge"
|
||||
var/itemState = null
|
||||
@@ -131,16 +132,16 @@
|
||||
iconState += "_[shot.select_name]"
|
||||
if(itemState)
|
||||
itemState += "[shot.select_name]"
|
||||
if(power_supply.charge < shot.e_cost)
|
||||
if(cell.charge < shot.e_cost)
|
||||
add_overlay("[icon_state]_empty")
|
||||
else
|
||||
if(!shaded_charge)
|
||||
var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState)
|
||||
var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState)
|
||||
for(var/i = ratio, i >= 1, i--)
|
||||
charge_overlay.pixel_x = ammo_x_offset * (i - 1)
|
||||
add_overlay(charge_overlay)
|
||||
charge_overlay.pixel_x = ammo_x_offset * (i - 1)
|
||||
add_overlay(charge_overlay)
|
||||
else
|
||||
add_overlay("[icon_state]_charge[ratio]")
|
||||
add_overlay("[icon_state]_charge[ratio]")
|
||||
if(itemState)
|
||||
itemState += "[ratio]"
|
||||
item_state = itemState
|
||||
@@ -156,7 +157,7 @@
|
||||
user.visible_message("<span class='suicide'>[user] melts [user.p_their()] face off with [src]!</span>")
|
||||
playsound(loc, fire_sound, 50, 1, -1)
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
|
||||
power_supply.use(shot.e_cost)
|
||||
cell.use(shot.e_cost)
|
||||
update_icon()
|
||||
return(FIRELOSS)
|
||||
else
|
||||
@@ -191,17 +192,17 @@
|
||||
user.visible_message("<span class='danger'>[user] tries to light their [A.name] with [src], but it doesn't do anything. Dumbass.</span>")
|
||||
playsound(user, E.fire_sound, 50, 1)
|
||||
playsound(user, BB.hitsound, 50, 1)
|
||||
power_supply.use(E.e_cost)
|
||||
cell.use(E.e_cost)
|
||||
. = ""
|
||||
else if(BB.damage_type != BURN)
|
||||
user.visible_message("<span class='danger'>[user] tries to light their [A.name] with [src], but only succeeds in utterly destroying it. Dumbass.</span>")
|
||||
playsound(user, E.fire_sound, 50, 1)
|
||||
playsound(user, BB.hitsound, 50, 1)
|
||||
power_supply.use(E.e_cost)
|
||||
cell.use(E.e_cost)
|
||||
qdel(A)
|
||||
. = ""
|
||||
else
|
||||
playsound(user, E.fire_sound, 50, 1)
|
||||
playsound(user, BB.hitsound, 50, 1)
|
||||
power_supply.use(E.e_cost)
|
||||
cell.use(E.e_cost)
|
||||
. = "<span class='danger'>[user] casually lights their [A.name] with [src]. Damn.</span>"
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
empty()
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
|
||||
power_supply.use(500)
|
||||
cell.use(500)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
|
||||
@@ -125,7 +125,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
|
||||
power_supply.give(500)
|
||||
cell.give(500)
|
||||
recharge_newshot(1)
|
||||
if(!suppressed)
|
||||
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
|
||||
@@ -163,6 +163,7 @@
|
||||
range = 3
|
||||
log_override = TRUE
|
||||
|
||||
var/pressure_decrease_active = FALSE
|
||||
var/pressure_decrease = 0.25
|
||||
var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun
|
||||
|
||||
@@ -179,6 +180,7 @@
|
||||
if(pressure > 50)
|
||||
name = "weakened [name]"
|
||||
damage = damage * pressure_decrease
|
||||
pressure_decrease_active = TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/item/projectile/kinetic/on_range()
|
||||
@@ -194,7 +196,10 @@
|
||||
if(!target_turf)
|
||||
target_turf = get_turf(src)
|
||||
if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
|
||||
for(var/obj/item/borg/upgrade/modkit/M in kinetic_gun.get_modkits())
|
||||
var/list/mods = kinetic_gun.get_modkits()
|
||||
for(var/obj/item/borg/upgrade/modkit/M in mods)
|
||||
M.projectile_strike_predamage(src, target_turf, target, kinetic_gun)
|
||||
for(var/obj/item/borg/upgrade/modkit/M in mods)
|
||||
M.projectile_strike(src, target_turf, target, kinetic_gun)
|
||||
if(ismineralturf(target_turf))
|
||||
var/turf/closed/mineral/M = target_turf
|
||||
@@ -210,6 +215,7 @@
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "modkit"
|
||||
origin_tech = "programming=2;materials=2;magnets=4"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
require_module = 1
|
||||
module_type = /obj/item/weapon/robot_module/miner
|
||||
var/denied_type = null
|
||||
@@ -264,6 +270,10 @@
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
|
||||
|
||||
//use this one for effects you want to trigger before mods that do damage
|
||||
/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
//and this one for things that don't need to trigger before other damage-dealing mods
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
|
||||
//Range
|
||||
@@ -370,7 +380,7 @@
|
||||
modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
|
||||
cost = 50
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
var/valid_repeat = FALSE
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
@@ -380,7 +390,7 @@
|
||||
valid_repeat = TRUE
|
||||
if(valid_repeat)
|
||||
KA.overheat = FALSE
|
||||
KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds.
|
||||
KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds.
|
||||
|
||||
/obj/item/borg/upgrade/modkit/lifesteal
|
||||
name = "lifesteal crystal"
|
||||
@@ -390,7 +400,7 @@
|
||||
cost = 20
|
||||
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
if(isliving(target) && isliving(K.firer))
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
@@ -414,6 +424,43 @@
|
||||
return
|
||||
new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/bounty
|
||||
name = "death syphon"
|
||||
desc = "Killing or assisting in killing a creature permenantly increases your damage against that type of creature."
|
||||
denied_type = /obj/item/borg/upgrade/modkit/bounty
|
||||
modifier = 1.25
|
||||
cost = 30
|
||||
var/maximum_bounty = 25
|
||||
var/list/bounties_reaped = list()
|
||||
|
||||
/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK)
|
||||
for(var/i in existing_marks)
|
||||
var/datum/status_effect/syphon_mark/SM = i
|
||||
if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward
|
||||
SM.reward_target = null
|
||||
qdel(SM)
|
||||
var/datum/status_effect/syphon_mark/SM = L.apply_status_effect(STATUS_EFFECT_SYPHONMARK)
|
||||
SM.reward_target = src
|
||||
if(bounties_reaped[L.type])
|
||||
var/kill_modifier = 1
|
||||
if(K.pressure_decrease_active)
|
||||
kill_modifier *= K.pressure_decrease
|
||||
var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration)
|
||||
L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
|
||||
var/bonus_mod = 1
|
||||
if(ismegafauna(L)) //megafauna reward
|
||||
bonus_mod = 4
|
||||
if(!bounties_reaped[L.type])
|
||||
bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty)
|
||||
else
|
||||
bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty)
|
||||
|
||||
|
||||
//Indoors
|
||||
/obj/item/borg/upgrade/modkit/indoors
|
||||
name = "decrease pressure penalty"
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
/obj/item/weapon/gun/energy/decloner/update_icon()
|
||||
..()
|
||||
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
|
||||
if(power_supply.charge > shot.e_cost)
|
||||
if(cell.charge > shot.e_cost)
|
||||
add_overlay("decloner_spin")
|
||||
|
||||
/obj/item/weapon/gun/energy/floragun
|
||||
@@ -137,19 +137,19 @@
|
||||
|
||||
/obj/item/weapon/gun/energy/plasmacutter/examine(mob/user)
|
||||
..()
|
||||
if(power_supply)
|
||||
to_chat(user, "<span class='notice'>[src] is [round(power_supply.percent())]% charged.</span>")
|
||||
if(cell)
|
||||
to_chat(user, "<span class='notice'>[src] is [round(cell.percent())]% charged.</span>")
|
||||
|
||||
/obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
|
||||
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
|
||||
var/obj/item/stack/sheet/S = A
|
||||
S.use(1)
|
||||
power_supply.give(1000)
|
||||
cell.give(1000)
|
||||
recharge_newshot(1)
|
||||
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
|
||||
else if(istype(A, /obj/item/weapon/ore/plasma))
|
||||
qdel(A)
|
||||
power_supply.give(500)
|
||||
cell.give(500)
|
||||
recharge_newshot(1)
|
||||
to_chat(user, "<span class='notice'>You insert [A] in [src], recharging it.</span>")
|
||||
else
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
return "chest"
|
||||
|
||||
/obj/item/projectile/proc/prehit(atom/target)
|
||||
return
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/proc/on_hit(atom/target, blocked = 0)
|
||||
var/turf/target_loca = get_turf(target)
|
||||
@@ -142,7 +142,7 @@
|
||||
if(firer && !ricochets)
|
||||
if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech
|
||||
loc = A.loc
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
@@ -155,13 +155,14 @@
|
||||
|
||||
var/turf/target_turf = get_turf(A)
|
||||
|
||||
prehit(A)
|
||||
if(!prehit(A))
|
||||
return FALSE
|
||||
var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null
|
||||
if(permutation == -1 || forcedodge)// the bullet passes through a dense object!
|
||||
loc = target_turf
|
||||
if(A)
|
||||
permutated.Add(A)
|
||||
return 0
|
||||
return FALSE
|
||||
else
|
||||
if(A && A.density && !ismob(A) && !(A.flags & ON_BORDER)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile.
|
||||
var/list/mobs_list = list()
|
||||
@@ -169,9 +170,11 @@
|
||||
mobs_list += L
|
||||
if(mobs_list.len)
|
||||
var/mob/living/picked_mob = pick(mobs_list)
|
||||
prehit(picked_mob)
|
||||
if(!prehit(picked_mob))
|
||||
return FALSE
|
||||
picked_mob.bullet_act(src, def_zone)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/proc/check_ricochet()
|
||||
if(prob(ricochet_chance))
|
||||
@@ -277,46 +280,53 @@
|
||||
Range()
|
||||
sleep(config.run_speed * 0.9)
|
||||
|
||||
|
||||
/obj/item/projectile/proc/preparePixelProjectile(atom/target, var/turf/targloc, mob/living/user, params, spread)
|
||||
var/turf/curloc = get_turf(user)
|
||||
src.loc = get_turf(user)
|
||||
src.starting = get_turf(user)
|
||||
src.current = curloc
|
||||
src.yo = targloc.y - curloc.y
|
||||
src.xo = targloc.x - curloc.x
|
||||
forceMove(get_turf(user))
|
||||
starting = get_turf(user)
|
||||
current = curloc
|
||||
yo = targloc.y - curloc.y
|
||||
xo = targloc.x - curloc.x
|
||||
|
||||
if(params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
if(mouse_control["icon-x"])
|
||||
src.p_x = text2num(mouse_control["icon-x"])
|
||||
if(mouse_control["icon-y"])
|
||||
src.p_y = text2num(mouse_control["icon-y"])
|
||||
if(mouse_control["screen-loc"])
|
||||
//Split screen-loc up into X+Pixel_X and Y+Pixel_Y
|
||||
var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
|
||||
var/list/calculated = calculate_projectile_angle_and_pixel_offsets(user, params)
|
||||
Angle = calculated[1]
|
||||
p_x = calculated[2]
|
||||
p_y = calculated[3]
|
||||
|
||||
//Split X+Pixel_X up into list(X, Pixel_X)
|
||||
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
|
||||
|
||||
//Split Y+Pixel_Y up into list(Y, Pixel_Y)
|
||||
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
|
||||
// to_chat(world, "X: [screen_loc_X[1]] PixelX: [screen_loc_X[2]] / Y: [screen_loc_Y[1]] PixelY: [screen_loc_Y[2]]")
|
||||
var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32
|
||||
var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32
|
||||
|
||||
//Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
|
||||
var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
|
||||
|
||||
var/ox = round(screenview/2) //"origin" x
|
||||
var/oy = round(screenview/2) //"origin" y
|
||||
// to_chat(world, "Pixel position: [x] [y]")
|
||||
var/angle = Atan2(y - oy, x - ox)
|
||||
// to_chat(world, "Angle: [angle]")
|
||||
src.Angle = angle
|
||||
if(spread)
|
||||
src.Angle += spread
|
||||
|
||||
/proc/calculate_projectile_angle_and_pixel_offsets(mob/user, params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
var/p_x = 0
|
||||
var/p_y = 0
|
||||
var/angle = 0
|
||||
if(mouse_control["icon-x"])
|
||||
p_x = text2num(mouse_control["icon-x"])
|
||||
if(mouse_control["icon-y"])
|
||||
p_y = text2num(mouse_control["icon-y"])
|
||||
if(mouse_control["screen-loc"])
|
||||
//Split screen-loc up into X+Pixel_X and Y+Pixel_Y
|
||||
var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
|
||||
|
||||
//Split X+Pixel_X up into list(X, Pixel_X)
|
||||
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
|
||||
|
||||
//Split Y+Pixel_Y up into list(Y, Pixel_Y)
|
||||
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
|
||||
// to_chat(world, "X: [screen_loc_X[1]] PixelX: [screen_loc_X[2]] / Y: [screen_loc_Y[1]] PixelY: [screen_loc_Y[2]]")
|
||||
var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32
|
||||
var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32
|
||||
|
||||
//Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
|
||||
var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
|
||||
|
||||
var/ox = round(screenview/2) - user.client.pixel_x //"origin" x
|
||||
var/oy = round(screenview/2) - user.client.pixel_y //"origin" y
|
||||
// to_chat(world, "Pixel position: [x] [y]")
|
||||
angle = Atan2(y - oy, x - ox)
|
||||
// to_chat(world, "Angle: [angle]")
|
||||
return list(angle, p_x, p_y)
|
||||
|
||||
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
|
||||
..()
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
idle_power_usage = 40
|
||||
interact_offline = 1
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/energy = 100
|
||||
var/max_energy = 100
|
||||
var/cell_type = /obj/item/weapon/stock_parts/cell/high
|
||||
var/obj/item/weapon/stock_parts/cell/cell
|
||||
var/powerefficiency = 0.01
|
||||
var/amount = 30
|
||||
var/recharged = 0
|
||||
var/recharge_delay = 5
|
||||
@@ -54,6 +55,7 @@
|
||||
|
||||
/obj/machinery/chem_dispenser/Initialize()
|
||||
. = ..()
|
||||
cell = new cell_type
|
||||
recharge()
|
||||
dispensable_reagents = sortList(dispensable_reagents)
|
||||
|
||||
@@ -66,11 +68,8 @@
|
||||
recharged -= 1
|
||||
|
||||
/obj/machinery/chem_dispenser/proc/recharge()
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
var/addenergy = 1
|
||||
var/oldenergy = energy
|
||||
energy = min(energy + addenergy, max_energy)
|
||||
if(energy != oldenergy)
|
||||
var/usedpower = cell.give( 1 / powerefficiency) //Should always be a gain of one on the UI.
|
||||
if(usedpower)
|
||||
use_power(2500)
|
||||
|
||||
/obj/machinery/chem_dispenser/emag_act(mob/user)
|
||||
@@ -106,8 +105,8 @@
|
||||
/obj/machinery/chem_dispenser/ui_data()
|
||||
var/data = list()
|
||||
data["amount"] = amount
|
||||
data["energy"] = energy
|
||||
data["maxEnergy"] = max_energy
|
||||
data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI.
|
||||
data["maxEnergy"] = cell.maxcharge * powerefficiency
|
||||
data["isBeakerLoaded"] = beaker ? 1 : 0
|
||||
|
||||
var beakerContents[0]
|
||||
@@ -149,10 +148,10 @@
|
||||
if(beaker && dispensable_reagents.Find(reagent))
|
||||
var/datum/reagents/R = beaker.reagents
|
||||
var/free = R.maximum_volume - R.total_volume
|
||||
var/actual = min(amount, energy * 10, free)
|
||||
var/actual = min(amount, (cell.charge * powerefficiency)*10, free)
|
||||
|
||||
R.add_reagent(reagent, actual)
|
||||
energy = max(energy - actual / 10, 0)
|
||||
cell.use((actual / 10) / powerefficiency)
|
||||
. = TRUE
|
||||
if("remove")
|
||||
var/amount = text2num(params["amount"])
|
||||
@@ -189,15 +188,36 @@
|
||||
add_overlay(beaker_overlay)
|
||||
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag))
|
||||
to_chat(user, "<span class='warning'>You can't load \the [I] into the machine!</span>")
|
||||
return ..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/chem_dispenser/get_cell()
|
||||
return cell
|
||||
|
||||
/obj/machinery/chem_dispenser/emp_act(severity)
|
||||
var/list/datum/reagents/R = list()
|
||||
var/total = min(rand(7,15), Floor(cell.charge*powerefficiency))
|
||||
var/datum/reagents/Q = new(total*10)
|
||||
if(beaker && beaker.reagents)
|
||||
R += beaker.reagents
|
||||
for(var/i in 1 to total)
|
||||
Q.add_reagent(pick(dispensable_reagents), 10)
|
||||
R += Q
|
||||
chem_splash(get_turf(src), 3, R)
|
||||
if(beaker && beaker.reagents)
|
||||
beaker.reagents.remove_all()
|
||||
cell.use(total/powerefficiency)
|
||||
cell.emp_act()
|
||||
visible_message("<span class='danger'> The [src] malfunctions, spraying chemicals everywhere!</span>")
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/chem_dispenser/constructable
|
||||
name = "portable chem dispenser"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "minidispenser"
|
||||
energy = 10
|
||||
max_energy = 10
|
||||
powerefficiency = 0.001
|
||||
amount = 5
|
||||
recharge_delay = 30
|
||||
dispensable_reagents = list()
|
||||
@@ -263,16 +283,13 @@
|
||||
|
||||
/obj/machinery/chem_dispenser/constructable/RefreshParts()
|
||||
var/time = 0
|
||||
var/temp_energy = 0
|
||||
var/i
|
||||
for(var/obj/item/weapon/stock_parts/cell/P in component_parts)
|
||||
cell = P
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
|
||||
temp_energy += M.rating
|
||||
temp_energy--
|
||||
max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest
|
||||
time += M.rating
|
||||
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
|
||||
time += C.rating
|
||||
for(var/obj/item/weapon/stock_parts/cell/P in component_parts)
|
||||
time += round(P.maxcharge, 10000) / 10000
|
||||
recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
for(i=1, i<=M.rating, i++)
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
var/roundstart = 0
|
||||
var/self_delay = 0 //pills are instant, this is because patches inheret their aplication from pills
|
||||
|
||||
/obj/item/weapon/reagent_containers/pill/Initialize()
|
||||
. = ..()
|
||||
/obj/item/weapon/reagent_containers/pill/Initialize()
|
||||
. = ..()
|
||||
if(!icon_state)
|
||||
icon_state = "pill[rand(1,20)]"
|
||||
if(reagents.total_volume && roundstart)
|
||||
@@ -142,3 +142,10 @@
|
||||
icon_state = "pill18"
|
||||
list_reagents = list("insulin" = 50)
|
||||
roundstart = 1
|
||||
|
||||
/obj/item/weapon/reagent_containers/pill/shadowtoxin
|
||||
name = "black pill"
|
||||
desc = "I wouldn't eat this if I were you."
|
||||
icon_state = "pill9"
|
||||
color = "#454545"
|
||||
list_reagents = list("shadowmutationtoxin" = 1)
|
||||
|
||||
@@ -190,6 +190,18 @@
|
||||
build_path = /obj/item/organ/eyes/robotic/shield
|
||||
category = list("Misc", "Medical Designs")
|
||||
|
||||
/datum/design/cyberimp_gloweyes
|
||||
name = "Luminescent Eyes"
|
||||
desc = "A pair of cybernetic eyes that can emit multicolored light"
|
||||
id = "ci-gloweyes"
|
||||
req_tech = list("materials" = 3, "biotech" = 3, "engineering" = 4)
|
||||
build_type = PROTOLATHE | MECHFAB
|
||||
construction_time = 40
|
||||
materials = list(MAT_METAL = 600, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/organ/eyes/robotic/glow
|
||||
category = list("Misc", "Medical Designs")
|
||||
|
||||
|
||||
/datum/design/cyberimp_breather
|
||||
name = "Breathing Tube Implant"
|
||||
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
|
||||
|
||||
@@ -68,6 +68,17 @@
|
||||
build_path = /obj/item/device/lightreplacer
|
||||
category = list("Power Designs")
|
||||
|
||||
/datum/design/inducer
|
||||
name = "Inducer"
|
||||
desc = "The NT-75 Electromagnetic Power Inducer can wirelessly induce electric charge in an object, allowing you to recharge power cells without having to remove them."
|
||||
id = "inducer"
|
||||
req_tech = list("powerstorage" = 4, "engineering" = 4, "magnets" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/weapon/inducer/sci
|
||||
category = list("Power Designs")
|
||||
|
||||
|
||||
/datum/design/board/pacman
|
||||
name = "Machine Design (PACMAN-type Generator Board)"
|
||||
desc = "The circuit board that for a PACMAN-type portable generator."
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
|
||||
name = "Syndicate Comms Agent"
|
||||
flavour_text = "<font size=3>You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base without good cause.</b> Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!</b>"
|
||||
flavour_text = "<font size=3>You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Monitor enemy activity as best you can, and try to keep a low profile. <font size=6><b>DON'T</b></font> abandon the base without good cause.</b> Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!</b>"
|
||||
outfit = /datum/outfit/lavaland_syndicate/comms
|
||||
|
||||
/datum/outfit/lavaland_syndicate/comms
|
||||
|
||||
@@ -10,18 +10,20 @@ GLOBAL_PROTECT(reboot_mode)
|
||||
/world/proc/IRCBroadcast(msg)
|
||||
ExportService("[SERVICE_REQUEST_IRC_BROADCAST] [msg]")
|
||||
|
||||
/world/proc/ServiceEndProcess()
|
||||
log_world("Sending shutdown request!");
|
||||
sleep(1) //flush the buffers
|
||||
ExportService(SERVICE_REQUEST_KILL_PROCESS)
|
||||
|
||||
//called at the exact moment the world is supposed to reboot
|
||||
/world/proc/ServiceReboot()
|
||||
switch(GLOB.reboot_mode)
|
||||
if(REBOOT_MODE_HARD)
|
||||
to_chat(src, "<span class='boldannounce'>Hard reboot triggered, you will automatically reconnect...</span>")
|
||||
log_world("Sending shutdown request!");
|
||||
sleep(1) //flush the buffers
|
||||
ExportService(SERVICE_REQUEST_KILL_PROCESS)
|
||||
ServiceEndProcess()
|
||||
if(REBOOT_MODE_SHUTDOWN)
|
||||
to_chat(src, "<span class='boldannounce'>The server is shutting down...</span>")
|
||||
log_world("Deleting world")
|
||||
qdel(src)
|
||||
ServiceEndProcess()
|
||||
|
||||
/world/proc/ServiceCommand(list/params)
|
||||
var/sCK = RunningService()
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3)))
|
||||
W.wizard = M
|
||||
W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell
|
||||
W.damage_bonus += spell_level * 20 //You do more damage when you upgrade the spell
|
||||
W.start_turf = start
|
||||
M.forceMove(W)
|
||||
M.notransform = 1
|
||||
@@ -26,6 +27,7 @@
|
||||
|
||||
/obj/effect/immovablerod/wizard
|
||||
var/max_distance = 13
|
||||
var/damage_bonus = 0
|
||||
var/mob/living/wizard
|
||||
var/turf/start_turf
|
||||
notify = FALSE
|
||||
@@ -41,3 +43,7 @@
|
||||
wizard.notransform = 0
|
||||
wizard.forceMove(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/obj/effect/immovablerod/wizard/penetrate(mob/living/L)
|
||||
L.visible_message("<span class='danger'>[L] is penetrated by an immovable rod!</span>" , "<span class='userdanger'>The rod penetrates you!</span>" , "<span class ='danger'>You hear a CLANG!</span>")
|
||||
L.adjustBruteLoss(70 + damage_bonus)
|
||||
|
||||
@@ -132,3 +132,176 @@
|
||||
|
||||
/obj/item/organ/eyes/robotic/shield/emp_act(severity)
|
||||
return
|
||||
|
||||
#define RGB2EYECOLORSTRING(definitionvar) ("[copytext(definitionvar,2,3)][copytext(definitionvar,4,5)][copytext(definitionvar,6,7)]")
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow
|
||||
name = "High Luminosity Eyes"
|
||||
desc = "Special glowing eyes, used by snowflakes who want to be special."
|
||||
origin_tech = "material=3;biotech=3;engineering=3;magnets=4"
|
||||
eye_color = "000"
|
||||
actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle)
|
||||
var/current_color_string = "#ffffff"
|
||||
var/active = FALSE
|
||||
var/max_light_beam_distance = 5
|
||||
var/light_beam_distance = 5
|
||||
var/light_object_range = 1
|
||||
var/light_object_power = 2
|
||||
var/list/obj/effect/abstract/eye_lighting/eye_lighting
|
||||
var/obj/effect/abstract/eye_lighting/on_mob
|
||||
var/image/mob_overlay
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/Initialize()
|
||||
. = ..()
|
||||
mob_overlay = image('icons/mob/human_face.dmi', "eyes_glow_gs")
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/Destroy()
|
||||
terminate_effects()
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/Remove()
|
||||
terminate_effects()
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/terminate_effects()
|
||||
if(owner && active)
|
||||
deactivate()
|
||||
active = FALSE
|
||||
clear_visuals(TRUE)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/ui_action_click(owner, action)
|
||||
if(istype(action, /datum/action/item_action/organ_action/toggle))
|
||||
toggle_active()
|
||||
else if(istype(action, /datum/action/item_action/organ_action/use))
|
||||
prompt_for_controls(owner)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/toggle_active()
|
||||
if(active)
|
||||
deactivate()
|
||||
else
|
||||
activate()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/prompt_for_controls(mob/user)
|
||||
var/C = input(owner, "Select Color", "Select color", "#ffffff") as null|color
|
||||
if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user)
|
||||
return
|
||||
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
|
||||
|
||||
set_distance(Clamp(range, 0, max_light_beam_distance))
|
||||
assume_rgb(C)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor)
|
||||
current_color_string = newcolor
|
||||
eye_color = RGB2EYECOLORSTRING(current_color_string)
|
||||
sync_light_effects()
|
||||
cycle_mob_overlay()
|
||||
if(!QDELETED(owner) && ishuman(owner)) //Other carbon mobs don't have eye color.
|
||||
owner.dna.species.handle_body(owner)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/cycle_mob_overlay()
|
||||
remove_mob_overlay()
|
||||
mob_overlay.color = current_color_string
|
||||
add_mob_overlay()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/add_mob_overlay()
|
||||
if(!QDELETED(owner))
|
||||
owner.add_overlay(mob_overlay)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/remove_mob_overlay()
|
||||
if(!QDELETED(owner))
|
||||
owner.cut_overlay(mob_overlay)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/emp_act()
|
||||
if(active)
|
||||
deactivate(silent = TRUE)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/on_mob_move()
|
||||
if(QDELETED(owner) || !active)
|
||||
return
|
||||
update_visuals()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/on_mob_turn()
|
||||
if(QDELETED(owner) || !active)
|
||||
return
|
||||
update_visuals()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/activate(silent = FALSE)
|
||||
start_visuals()
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='warning'>Your [src] clicks and makes a whining noise, before shooting out a beam of light!</span>")
|
||||
active = TRUE
|
||||
cycle_mob_overlay()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/deactivate(silent = FALSE)
|
||||
clear_visuals()
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='warning'>Your [src] shuts off!</span>")
|
||||
active = FALSE
|
||||
remove_mob_overlay()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/update_visuals()
|
||||
if((LAZYLEN(eye_lighting) < light_beam_distance) || !on_mob)
|
||||
regenerate_light_effects()
|
||||
var/turf/scanfrom = get_turf(owner)
|
||||
var/scandir = owner.dir
|
||||
if(!istype(scanfrom))
|
||||
clear_visuals()
|
||||
var/turf/scanning = scanfrom
|
||||
var/stop = FALSE
|
||||
on_mob.forceMove(scanning)
|
||||
for(var/i in 1 to light_beam_distance)
|
||||
scanning = get_step(scanning, scandir)
|
||||
if(scanning.opacity || scanning.has_opaque_atom)
|
||||
stop = TRUE
|
||||
var/obj/effect/abstract/eye_lighting/L = LAZYACCESS(eye_lighting, i)
|
||||
if(stop)
|
||||
L.forceMove(src)
|
||||
else
|
||||
L.forceMove(scanning)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/clear_visuals(delete_everything = FALSE)
|
||||
if(delete_everything)
|
||||
QDEL_LIST(eye_lighting)
|
||||
QDEL_NULL(on_mob)
|
||||
else
|
||||
for(var/i in eye_lighting)
|
||||
var/obj/effect/abstract/eye_lighting/L = i
|
||||
L.forceMove(src)
|
||||
if(!QDELETED(on_mob))
|
||||
on_mob.forceMove(src)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/start_visuals()
|
||||
if(!islist(eye_lighting))
|
||||
regenerate_light_effects()
|
||||
if((eye_lighting.len < light_beam_distance) || !on_mob)
|
||||
regenerate_light_effects()
|
||||
sync_light_effects()
|
||||
update_visuals()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/set_distance(dist)
|
||||
light_beam_distance = dist
|
||||
regenerate_light_effects()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/regenerate_light_effects()
|
||||
clear_visuals(TRUE)
|
||||
on_mob = new(src)
|
||||
for(var/i in 1 to light_beam_distance)
|
||||
LAZYADD(eye_lighting,new /obj/effect/abstract/eye_lighting(src))
|
||||
sync_light_effects()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/sync_light_effects()
|
||||
for(var/I in eye_lighting)
|
||||
var/obj/effect/abstract/eye_lighting/L = I
|
||||
L.set_light(light_object_range, light_object_power, current_color_string)
|
||||
if(on_mob)
|
||||
on_mob.set_light(1, 1, current_color_string)
|
||||
|
||||
/obj/effect/abstract/eye_lighting
|
||||
var/obj/item/organ/eyes/robotic/glow/parent
|
||||
|
||||
/obj/effect/abstract/eye_lighting/Initialize()
|
||||
. = ..()
|
||||
parent = loc
|
||||
if(!istype(parent))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -164,7 +164,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/nukeoffer/sniper
|
||||
name = "Sniper bundle"
|
||||
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollowpoint \
|
||||
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollow-point \
|
||||
haemorrhage magazine, a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie."
|
||||
item = /obj/item/weapon/storage/briefcase/sniperbundle
|
||||
cost = 20 // normally 26
|
||||
@@ -202,7 +202,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/dangerous/shotgun
|
||||
name = "Bulldog Shotgun"
|
||||
desc = "A fully-loaded semi-automatic drum-fed shotgun. Compatiable with all 12g rounds. Designed for close \
|
||||
desc = "A fully-loaded semi-automatic drum-fed shotgun. Compatible with all 12g rounds. Designed for close \
|
||||
quarter anti-personnel engagements."
|
||||
item = /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog
|
||||
cost = 8
|
||||
@@ -241,7 +241,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/dangerous/sniper
|
||||
name = "Sniper Rifle"
|
||||
desc = "Ranged fury, Syndicate style. guaranteed to cause shock and awe or your TC back!"
|
||||
desc = "Ranged fury, Syndicate style. Guaranteed to cause shock and awe or your TC back!"
|
||||
item = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle/syndicate
|
||||
cost = 16
|
||||
surplus = 25
|
||||
@@ -260,7 +260,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
fit into a pocket or slip into a bag unnoticed. It will synthesize \
|
||||
and fire bolts tipped with a paralyzing toxin that will briefly stun \
|
||||
targets and cause them to slur as if inebriated. It can produce an \
|
||||
infinite amount of bolts, but takes time to automatically recharge \
|
||||
infinite number of bolts, but takes time to automatically recharge \
|
||||
after each shot."
|
||||
item = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
|
||||
cost = 12
|
||||
@@ -455,22 +455,22 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/shotgun/bag
|
||||
name = "12g Ammo Duffelbag"
|
||||
desc = "A duffelbag filled with enough 12g ammo to supply an entire team, at a discounted price."
|
||||
name = "12g Ammo Dufflebag"
|
||||
desc = "A dufflebag filled with enough 12g ammo to supply an entire team, at a discounted price."
|
||||
item = /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/shotgun
|
||||
cost = 12
|
||||
|
||||
/datum/uplink_item/ammo/smg
|
||||
name = ".45 SMG Magazine"
|
||||
desc = "An additional 20-round .45 magazine sutable for use with the C-20r submachine gun. \
|
||||
desc = "An additional 20-round .45 magazine suitable for use with the C-20r submachine gun. \
|
||||
These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
|
||||
item = /obj/item/ammo_box/magazine/smgm45
|
||||
cost = 3
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/gang)
|
||||
|
||||
/datum/uplink_item/ammo/smg/bag
|
||||
name = ".45 Ammo Duffelbag"
|
||||
desc = "A duffelbag filled with enough .45 ammo to supply an entire team, at a discounted price."
|
||||
name = ".45 Ammo Dufflebag"
|
||||
desc = "A dufflebag filled with enough .45 ammo to supply an entire team, at a discounted price."
|
||||
item = /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo/smg
|
||||
cost = 20
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -591,7 +591,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/support/mauler
|
||||
name = "Mauler Exosuit"
|
||||
desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targetting, thrust vectoring, \
|
||||
desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring, \
|
||||
and deployable smoke."
|
||||
item = /obj/mecha/combat/marauder/mauler/loaded
|
||||
cost = 140
|
||||
@@ -865,7 +865,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/suits/hardsuit/elite
|
||||
name = "Elite Syndicate Hardsuit"
|
||||
desc = "An advanced hardsuit with superior armor and mobility to the standard Syndicate Hardsuit."
|
||||
desc = "An advanced hardsuit with superior armor and mobility to the standard Syndicate hardsuit."
|
||||
item = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
cost = 8
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -932,7 +932,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/device_tools/thermal
|
||||
name = "Thermal Imaging Glasses"
|
||||
desc = "These goggles can be turned to resemble common eyewears throughout the station. \
|
||||
desc = "These goggles can be turned to resemble common eyewear found throughout the station. \
|
||||
They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, \
|
||||
emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms \
|
||||
and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
|
||||
@@ -1068,7 +1068,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
cost = 3
|
||||
|
||||
/datum/uplink_item/device_tools/assault_pod
|
||||
name = "Assault Pod Targetting Device"
|
||||
name = "Assault Pod Targeting Device"
|
||||
desc = "Use to select the landing zone of your assault pod."
|
||||
item = /obj/item/device/assault_pod
|
||||
cost = 30
|
||||
@@ -1345,8 +1345,8 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/badass/bundle
|
||||
name = "Syndicate Bundle"
|
||||
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. \
|
||||
These items are collectively worth more than 20 telecrystals, but you do not know which specialisation \
|
||||
desc = "Syndicate Bundles are specialized groups of items that arrive in a plain box. \
|
||||
These items are collectively worth more than 20 telecrystals, but you do not know which specialization \
|
||||
you will receive."
|
||||
item = /obj/item/weapon/storage/box/syndicate
|
||||
cost = 20
|
||||
|
||||
Reference in New Issue
Block a user