Merge branch 'master' into upstream-merge-29794

This commit is contained in:
LetterJay
2017-08-18 11:14:45 -05:00
committed by GitHub
273 changed files with 4542 additions and 2267 deletions
+11 -10
View File
@@ -1,15 +1,16 @@
//Investigate logging defines
#define INVESTIGATE_ATMOS "atmos"
#define INVESTIGATE_BOTANY "botany"
#define INVESTIGATE_CARGO "cargo"
#define INVESTIGATE_EXPERIMENTOR "experimentor"
#define INVESTIGATE_GRAVITY "gravity"
#define INVESTIGATE_RECORDS "records"
#define INVESTIGATE_SINGULO "singulo"
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_TELESCI "telesci"
#define INVESTIGATE_WIRES "wires"
#define INVESTIGATE_ATMOS "atmos"
#define INVESTIGATE_BOTANY "botany"
#define INVESTIGATE_CARGO "cargo"
#define INVESTIGATE_EXPERIMENTOR "experimentor"
#define INVESTIGATE_GRAVITY "gravity"
#define INVESTIGATE_RECORDS "records"
#define INVESTIGATE_SINGULO "singulo"
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_TELESCI "telesci"
#define INVESTIGATE_WIRES "wires"
#define INVESTIGATE_PORTAL "portals"
#define INVESTIGATE_HALLUCINATIONS "hallucinations"
//Individual logging defines
#define INDIVIDUAL_ATTACK_LOG "Attack log"
+9
View File
@@ -0,0 +1,9 @@
diff a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm (rejected hunks)
@@ -9,6 +9,7 @@
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_TELESCI "telesci"
#define INVESTIGATE_WIRES "wires"
+#define INVESTIGATE_HALLUCINATIONS "hallucinations"
//Individual logging defines
#define INDIVIDUAL_ATTACK_LOG "Attack log"
+2 -1
View File
@@ -8,7 +8,7 @@
//You can use these defines to get the typepath of the currently running proc/verb (yes procs + verbs are objects)
/* eg:
/mob/living/carbon/human/death()
world << THIS_PROC_TYPE_STR //You can only output the string versions
to_chat(world, THIS_PROC_TYPE_STR) //You can only output the string versions
Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a string with () (eg: the _WITH_ARGS defines) to make it look nicer)
*/
#define THIS_PROC_TYPE .....
@@ -350,6 +350,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
//debug printing macros
#define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]")
#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]")
#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]")
#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]")
+4 -1
View File
@@ -4,6 +4,9 @@
#define IRC_STATUS_THROTTLE 5
#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
//This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
//keep these in sync with TGS3
#define SERVICE_WORLD_PARAM "server_service"
#define SERVICE_PR_TEST_JSON "..\\..\\prtestjob.json"
@@ -17,7 +20,7 @@
#define SERVICE_CMD_NAME_CHECK "namecheck"
#define SERVICE_CMD_ADMIN_WHO "adminwho"
//#define SERVICE_CMD_PARAM_KEY //defined in __compile_options.dm
#define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
#define SERVICE_CMD_PARAM_COMMAND "command"
#define SERVICE_CMD_PARAM_MESSAGE "message"
#define SERVICE_CMD_PARAM_TARGET "target"
+2 -2
View File
@@ -320,7 +320,7 @@
return r
// Returns the key based on the index
#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null)
#define KEYBYINDEX(L, index) (((index <= length(L)) && (index > 0)) ? L[index] : null)
/proc/count_by_type(list/L, type)
var/i = 0
@@ -468,7 +468,7 @@
. |= key_list[key]
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((islist(L) && L:len) ? pick(L) : default)
#define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default)
#define LAZYINITLIST(L) if (!L) L = list()
#define UNSETEMPTY(L) if (L && !L.len) L = null
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
+25 -18
View File
@@ -1,3 +1,10 @@
//wrapper macros for easier grepping
#define DIRECT_OUTPUT(A, B) A << B
#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image)
#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound)
#define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text)
#define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text)
//print a warning message to world.log
#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
/proc/warning(msg)
@@ -20,13 +27,13 @@
/proc/log_admin(text)
GLOB.admin_log.Add(text)
if (config.log_admin)
GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ADMIN: [text]")
//Items using this proc are stripped from public logs - use with caution
/proc/log_admin_private(text)
GLOB.admin_log.Add(text)
if (config.log_admin)
GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ADMINPRIVATE: [text]")
/proc/log_adminsay(text)
if (config.log_adminchat)
@@ -38,65 +45,65 @@
/proc/log_game(text)
if (config.log_game)
GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]GAME: [text]")
/proc/log_vote(text)
if (config.log_vote)
GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]VOTE: [text]")
/proc/log_access(text)
if (config.log_access)
GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ACCESS: [text]")
/proc/log_say(text)
if (config.log_say)
GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SAY: [text]")
/proc/log_prayer(text)
if (config.log_prayer)
GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PRAY: [text]")
/proc/log_law(text)
if (config.log_law)
GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LAW: [text]")
/proc/log_ooc(text)
if (config.log_ooc)
GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]OOC: [text]")
/proc/log_whisper(text)
if (config.log_whisper)
GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]WHISPER: [text]")
/proc/log_emote(text)
if (config.log_emote)
GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]EMOTE: [text]")
/proc/log_attack(text)
if (config.log_attack)
GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]"
WRITE_FILE(GLOB.world_attack_log, "\[[time_stamp()]]ATTACK: [text]")
/proc/log_pda(text)
if (config.log_pda)
GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PDA: [text]")
/proc/log_comment(text)
if (config.log_pda)
//reusing the PDA option because I really don't think news comments are worth a config option
GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]COMMENT: [text]")
/proc/log_chat(text)
if (config.log_pda)
GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]CHAT: [text]")
/proc/log_sql(text)
if(config.sql_enabled)
GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]"
WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SQL: [text]")
//This replaces world.log so it displays both in DD and the file
/proc/log_world(text)
GLOB.world_runtime_log << text
world.log << text
WRITE_FILE(GLOB.world_runtime_log, text)
SEND_TEXT(world.log, text)
// Helper procs for building detailed log lines
+2 -2
View File
@@ -418,7 +418,7 @@
/proc/showCandidatePollWindow(mob/M, poll_time, Question, list/candidates, ignore_category, time_passed, flashwindow = TRUE)
set waitfor = 0
M << 'sound/misc/notice2.ogg' //Alerting them to their consideration
SEND_SOUND(M, 'sound/misc/notice2.ogg') //Alerting them to their consideration
if(flashwindow)
window_flash(M.client)
switch(ignore_category ? askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time))
@@ -426,7 +426,7 @@
to_chat(M, "<span class='notice'>Choice registered: Yes.</span>")
if(time_passed + poll_time <= world.time)
to_chat(M, "<span class='danger'>Sorry, you answered too late to be considered!</span>")
M << 'sound/machines/buzz-sigh.ogg'
SEND_SOUND(M, 'sound/machines/buzz-sigh.ogg')
candidates -= M
else
candidates += M
+123 -14
View File
@@ -167,7 +167,7 @@ mob
Output_Icon()
set name = "2. Output Icon"
to_chat(src, "Icon is: [bicon(getFlatIcon(src))]")
to_chat(src, "Icon is: [icon2base64html(getFlatIcon(src))]")
Label_Icon()
set name = "3. Label Icon"
@@ -712,7 +712,8 @@ The _flatIcons list is a cache for generated icon files.
if(!current)
curIndex++ //Try the next layer
continue
currentLayer = current:layer
var/image/I = current
currentLayer = I.layer
if(currentLayer<0) // Special case for FLY_LAYER
if(currentLayer <= -1000) return flat
if(pSet == 0) // Underlay
@@ -747,22 +748,22 @@ The _flatIcons list is a cache for generated icon files.
// Dimensions of overlay being added
var/{addX1;addX2;addY1;addY2}
for(var/I in layers)
if(I:alpha == 0)
for(var/V in layers)
var/image/I = V
if(I.alpha == 0)
continue
if(I == copy) // 'I' is an /image based on the object being flattened.
curblend = BLEND_OVERLAY
add = icon(I:icon, I:icon_state, I:dir)
add = icon(I.icon, I.icon_state, I.dir)
else // 'I' is an appearance object.
add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend)
// Find the new dimensions of the flat icon to fit the added overlay
addX1 = min(flatX1, I:pixel_x+1)
addX2 = max(flatX2, I:pixel_x+add.Width())
addY1 = min(flatY1, I:pixel_y+1)
addY2 = max(flatY2, I:pixel_y+add.Height())
addX1 = min(flatX1, I.pixel_x+1)
addX2 = max(flatX2, I.pixel_x+add.Width())
addY1 = min(flatY1, I.pixel_y+1)
addY2 = max(flatY2, I.pixel_y+add.Height())
if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2)
// Resize the flattened icon so the new icon fits
@@ -771,7 +772,7 @@ The _flatIcons list is a cache for generated icon files.
flatY1=addY1;flatY2=addY2
// Blend the overlay into the flattened icon
flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1)
flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1)
if(A.color)
flat.Blend(A.color, ICON_MULTIPLY)
@@ -782,10 +783,11 @@ The _flatIcons list is a cache for generated icon files.
/proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N
var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A.
for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it.
if(I:layer>A.layer)
for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it.
var/image/I = V
if(I.layer>A.layer)
continue//If layer is greater than what we need, skip it.
var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects.
var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects.
//Also, icons cannot directly set icon_state. Slower than changing variables but whatever.
alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay.
return alpha_mask//And now return the mask.
@@ -993,3 +995,110 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
#undef FROZEN_RED_COLOR
#undef FROZEN_GREEN_COLOR
#undef FROZEN_BLUE_COLOR
//Converts an icon to base64. Operates by putting the icon in the iconCache savefile,
// exporting it as text, and then parsing the base64 from that.
// (This relies on byond automatically storing icons in savefiles as base64)
/proc/icon2base64(icon/icon, iconKey = "misc")
if (!isicon(icon))
return FALSE
WRITE_FILE(GLOB.iconCache[iconKey], icon)
var/iconData = GLOB.iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
return replacetext(copytext(partial[2], 3, -5), "\n", "")
/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE)
if (!thing)
return
var/key
var/icon/I = thing
if (!target)
return
if (target == world)
target = GLOB.clients
var/list/targets
if (!islist(target))
targets = list(target)
else
targets = target
if (!targets.len)
return
if (!isicon(I))
if (isfile(thing)) //special snowflake
var/name = sanitize_filename("[generate_asset_name(thing)].png")
register_asset(name, thing)
for (var/thing2 in targets)
send_asset(thing2, key, FALSE)
return "<img class='icon icon-misc' src=\"[url_encode(name)]\">"
var/atom/A = thing
if (isnull(dir))
dir = A.dir
if (isnull(icon_state))
icon_state = A.icon_state
I = A.icon
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
var/icon/temp = I
I = icon()
I.Insert(temp, dir = SOUTH)
dir = SOUTH
else
if (isnull(dir))
dir = SOUTH
if (isnull(icon_state))
icon_state = ""
I = icon(I, icon_state, dir, frame, moving)
key = "[generate_asset_name(I)].png"
register_asset(key, I)
for (var/thing2 in targets)
send_asset(thing2, key, FALSE)
return "<img class='icon icon-[icon_state]' src=\"[url_encode(key)]\">"
/proc/icon2base64html(thing)
if (!thing)
return
var/static/list/bicon_cache = list()
if (isicon(thing))
var/icon/I = thing
var/icon_base64 = icon2base64(I)
if (I.Height() > world.icon_size || I.Width() > world.icon_size)
var/icon_md5 = md5(icon_base64)
icon_base64 = bicon_cache[icon_md5]
if (!icon_base64) // Doesn't exist yet, make it.
bicon_cache[icon_md5] = icon_base64 = icon2base64(I)
return "<img class='icon icon-misc' src='data:image/png;base64,[icon_base64]'>"
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
var/atom/A = thing
var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]"
if (!bicon_cache[key]) // Doesn't exist, make it.
var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1)
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
var/icon/temp = I
I = icon()
I.Insert(temp, dir = SOUTH)
bicon_cache[key] = icon2base64(I, key)
return "<img class='icon icon-[A.icon_state]' src='data:image/png;base64,[bicon_cache[key]]'>"
//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs.
/proc/costly_icon2html(thing, target)
if (!thing)
return
if (isicon(thing))
return icon2html(thing, target)
var/icon/I = getFlatIcon(thing)
return icon2html(I, target)
-3
View File
@@ -1,6 +1,3 @@
//wrapper macro for sending images that makes grepping easy
#define SEND_IMAGE(target, image) target << image
/proc/random_blood_type()
return pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
+4 -3
View File
@@ -24,11 +24,12 @@
announcement += "<br><span class='alert'>[html_encode(text)]</span><br>"
announcement += "<br>"
var/s = sound(sound)
for(var/mob/M in GLOB.player_list)
if(!isnewplayer(M) && M.can_hear())
to_chat(M, announcement)
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
M << sound(sound)
SEND_SOUND(M, s)
/proc/print_command_report(text = "", title = null, announce=TRUE)
if(!title)
@@ -55,6 +56,6 @@
to_chat(M, "<b><font size = 3><font color = red>[title]</font color><BR>[message]</font size></b><BR>")
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
if(alert)
M << sound('sound/misc/notice1.ogg')
SEND_SOUND(M, sound('sound/misc/notice1.ogg'))
else
M << sound('sound/misc/notice2.ogg')
SEND_SOUND(M, sound('sound/misc/notice2.ogg'))
+5 -2
View File
@@ -45,6 +45,9 @@
index = findtext(t, char, index+1)
return t
/proc/sanitize_filename(t)
return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"=""))
//Runs byond's sanitization proc along-side sanitize_simple
/proc/sanitize(t,list/repl_chars = null)
return html_encode(sanitize_simple(t,repl_chars))
@@ -553,14 +556,14 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
var/list/tosend = list()
tosend["data"] = finalized
log << json_encode(tosend)
WRITE_FILE(log, json_encode(tosend))
//Used for applying byonds text macros to strings that are loaded at runtime
/proc/apply_text_macros(string)
var/next_backslash = findtext(string, "\\")
if(!next_backslash)
return string
var/leng = length(string)
var/next_space = findtext(string, " ", next_backslash + 1)
+3 -3
View File
@@ -289,7 +289,7 @@ Turf and target are separate in case you want to teleport some distance from a t
var/list/pois = list()
for(var/mob/M in mobs)
if(skip_mindless && (!M.mind && !M.ckey))
if(!isbot(M) && !istype(M, /mob/camera/))
if(!isbot(M) && !istype(M, /mob/camera) && !ismegafauna(M))
continue
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
continue
@@ -845,11 +845,11 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list(
/obj/proc/atmosanalyzer_scan(datum/gas_mixture/air_contents, mob/user, obj/target = src)
var/obj/icon = target
user.visible_message("[user] has used the analyzer on [bicon(icon)] [target].", "<span class='notice'>You use the analyzer on [bicon(icon)] [target].</span>")
user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(src))] [target].", "<span class='notice'>You use the analyzer on [icon2html(icon, user)] [target].</span>")
var/pressure = air_contents.return_pressure()
var/total_moles = air_contents.total_moles()
to_chat(user, "<span class='notice'>Results of analysis of [bicon(icon)] [target].</span>")
to_chat(user, "<span class='notice'>Results of analysis of [icon2html(icon, user)] [target].</span>")
if(total_moles>0)
to_chat(user, "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>")
-2
View File
@@ -69,8 +69,6 @@
#error You need version 511 or higher
#endif
#define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
//Update this whenever the db schema changes
//make sure you add an update to the schema_version stable in the db changelog
#define DB_MAJOR_VERSION 3
+14 -14
View File
@@ -275,7 +275,7 @@
if(M.config_tag)
if(!(M.config_tag in modes)) // ensure each mode is added only once
GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration."
WRITE_FILE(GLOB.config_error_log, "Adding game mode [M.name] ([M.config_tag]) to configuration.")
modes += M.config_tag
mode_names[M.config_tag] = M.name
probabilities[M.config_tag] = M.probability
@@ -548,7 +548,7 @@
if("irc_announce_new_game")
irc_announce_new_game = TRUE
else
GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'")
else if(type == "game_options")
switch(name)
@@ -611,13 +611,13 @@
if(mode_name in modes)
continuous[mode_name] = 1
else
GLOB.config_error_log << "Unknown continuous configuration definition: [mode_name]."
WRITE_FILE(GLOB.config_error_log, "Unknown continuous configuration definition: [mode_name].")
if("midround_antag")
var/mode_name = lowertext(value)
if(mode_name in modes)
midround_antag[mode_name] = 1
else
GLOB.config_error_log << "Unknown midround antagonist configuration definition: [mode_name]."
WRITE_FILE(GLOB.config_error_log, "Unknown midround antagonist configuration definition: [mode_name].")
if("midround_antag_time_check")
midround_antag_time_check = text2num(value)
if("midround_antag_life_check")
@@ -633,9 +633,9 @@
if(mode_name in modes)
min_pop[mode_name] = text2num(mode_value)
else
GLOB.config_error_log << "Unknown minimum population configuration definition: [mode_name]."
WRITE_FILE(GLOB.config_error_log, "Unknown minimum population configuration definition: [mode_name].")
else
GLOB.config_error_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]."
WRITE_FILE(GLOB.config_error_log, "Incorrect minimum population configuration definition: [mode_name] [mode_value].")
if("max_pop")
var/pop_pos = findtext(value, " ")
var/mode_name = null
@@ -647,9 +647,9 @@
if(mode_name in modes)
max_pop[mode_name] = text2num(mode_value)
else
GLOB.config_error_log << "Unknown maximum population configuration definition: [mode_name]."
WRITE_FILE(GLOB.config_error_log, "Unknown maximum population configuration definition: [mode_name].")
else
GLOB.config_error_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
WRITE_FILE(GLOB.config_error_log, "Incorrect maximum population configuration definition: [mode_name] [mode_value].")
if("shuttle_refuel_delay")
shuttle_refuel_delay = text2num(value)
if("show_game_type_odds")
@@ -677,9 +677,9 @@
if(prob_name in modes)
probabilities[prob_name] = text2num(prob_value)
else
GLOB.config_error_log << "Unknown game mode probability configuration definition: [prob_name]."
WRITE_FILE(GLOB.config_error_log, "Unknown game mode probability configuration definition: [prob_name].")
else
GLOB.config_error_log << "Incorrect probability configuration definition: [prob_name] [prob_value]."
WRITE_FILE(GLOB.config_error_log, "Incorrect probability configuration definition: [prob_name] [prob_value].")
if("protect_roles_from_antagonist")
protect_roles_from_antagonist = 1
@@ -726,7 +726,7 @@
// Value is in the form "LAWID,NUMBER"
var/list/L = splittext(value, ",")
if(L.len != 2)
GLOB.config_error_log << "Invalid LAW_WEIGHT: " + t
WRITE_FILE(GLOB.config_error_log, "Invalid LAW_WEIGHT: " + t)
continue
var/lawid = L[1]
var/weight = text2num(L[2])
@@ -781,7 +781,7 @@
if("mice_roundstart")
mice_roundstart = text2num(value)
else
GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'")
else if(type == "policies")
policies[name] = value
@@ -839,7 +839,7 @@
if ("disabled")
currentmap = null
else
GLOB.config_error_log << "Unknown command in map vote config: '[command]'"
WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'")
/datum/configuration/proc/loadsql(filename)
@@ -883,7 +883,7 @@
if("feedback_tableprefix")
global.sqlfdbktableprefix = value
else
GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'")
/datum/configuration/proc/pick_mode(mode_name)
// I wish I didn't have to instance the game modes in order to look up
+4 -1
View File
@@ -3,12 +3,15 @@ SUBSYSTEM_DEF(assets)
init_order = INIT_ORDER_ASSETS
flags = SS_NO_FIRE
var/list/cache = list()
var/list/preload = list()
/datum/controller/subsystem/assets/Initialize(timeofday)
for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple))
var/datum/asset/A = new type()
A.register()
preload = cache.Copy() //don't preload assets generated during the round
for(var/client/C in GLOB.clients)
addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, cache, FALSE), 10)
addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10)
..()
+5 -5
View File
@@ -250,7 +250,7 @@ SUBSYSTEM_DEF(blackbox)
return 0
return value
/datum/feedback_variable/proc/get_variable()
/datum/feedback_variable/proc/get_variable()
return variable
/datum/feedback_variable/proc/set_details(text)
@@ -260,12 +260,12 @@ SUBSYSTEM_DEF(blackbox)
/datum/feedback_variable/proc/add_details(text)
if (istext(text))
if (!details)
details = text
details = "\"[text]\""
else
details += " [text]"
details += " | \"[text]\""
/datum/feedback_variable/proc/get_details()
/datum/feedback_variable/proc/get_details()
return details
/datum/feedback_variable/proc/get_parsed()
return list(variable,value,details)
return list(variable,value,details)
-1
View File
@@ -149,7 +149,6 @@ SUBSYSTEM_DEF(pai)
continue
if(!(ROLE_PAI in G.client.prefs.be_special))
continue
//G << 'sound/misc/server-ready.ogg' //Alerting them to their consideration
to_chat(G, "<span class='ghostalert'>[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.</span>")
addtimer(CALLBACK(src, .proc/spam_again), spam_delay)
var/list/available = list()
+4 -4
View File
@@ -49,7 +49,7 @@ SUBSYSTEM_DEF(persistence)
satchel_string = pick_n_take(expanded_old_satchels)
old_secret_satchels = jointext(expanded_old_satchels,"#")
secret_satchels[SSmapping.config.map_name] << old_secret_satchels
WRITE_FILE(secret_satchels[SSmapping.config.map_name], old_secret_satchels)
var/list/chosen_satchel = splittext(satchel_string,"|")
if(!chosen_satchel || isemptylist(chosen_satchel) || chosen_satchel.len != 3) //Malformed
@@ -171,7 +171,7 @@ SUBSYSTEM_DEF(persistence)
if(isemptylist(savable_obj))
continue
old_secret_satchels += "[F.x]|[F.y]|[pick(savable_obj)]#"
secret_satchels[SSmapping.config.map_name] << old_secret_satchels
WRITE_FILE(secret_satchels[SSmapping.config.map_name], old_secret_satchels)
/datum/controller/subsystem/persistence/proc/CollectChiselMessages()
var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav")
@@ -181,14 +181,14 @@ SUBSYSTEM_DEF(persistence)
log_world("Saved [saved_messages.len] engraved messages on map [SSmapping.config.map_name]")
chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages)
WRITE_FILE(chisel_messages_sav[SSmapping.config.map_name], json_encode(saved_messages))
/datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M)
saved_messages += list(M.pack()) // dm eats one list
/datum/controller/subsystem/persistence/proc/CollectTrophies()
trophy_sav << json_encode(saved_trophies)
WRITE_FILE(trophy_sav, json_encode(saved_trophies))
/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T)
if(!T.added_roundstart && T.showpiece)
-2
View File
@@ -101,8 +101,6 @@ SUBSYSTEM_DEF(shuttle)
T.color = "#00ffff"
#endif
//world.log << "[transit_turfs.len] transit turfs registered"
/datum/controller/subsystem/shuttle/fire()
for(var/thing in mobile)
if(!thing)
+17 -17
View File
@@ -225,7 +225,7 @@ SUBSYSTEM_DEF(ticker)
round_start_time = world.time
to_chat(world, "<FONT color='blue'><B>Welcome to [station_name()], enjoy your stay!</B></FONT>")
world << sound('sound/ai/welcome.ogg')
SEND_SOUND(world, sound('sound/ai/welcome.ogg'))
current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME)
@@ -300,7 +300,7 @@ SUBSYSTEM_DEF(ticker)
if("nuclear emergency") //Nuke wasn't on station when it blew up
flick("intro_nuke",cinematic)
sleep(35)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
flick("station_intact_fade_red",cinematic)
cinematic.icon_state = "summary_nukefail"
@@ -308,12 +308,12 @@ SUBSYSTEM_DEF(ticker)
cinematic.icon_state = null
flick("intro_cult",cinematic)
sleep(25)
world << sound('sound/magic/enter_blood.ogg')
SEND_SOUND(world, sound('sound/magic/enter_blood.ogg'))
sleep(28)
world << sound('sound/machines/terminal_off.ogg')
SEND_SOUND(world, sound('sound/machines/terminal_off.ogg'))
sleep(20)
flick("station_corrupted",cinematic)
world << sound('sound/effects/ghost.ogg')
SEND_SOUND(world, sound('sound/effects/ghost.ogg'))
actually_blew_up = FALSE
if("gang war") //Gang Domination (just show the override screen)
cinematic.icon_state = "intro_malf_still"
@@ -323,19 +323,19 @@ SUBSYSTEM_DEF(ticker)
if("fake") //The round isn't over, we're just freaking people out for fun
flick("intro_nuke",cinematic)
sleep(35)
world << sound('sound/items/bikehorn.ogg')
SEND_SOUND(world, sound('sound/items/bikehorn.ogg'))
flick("summary_selfdes",cinematic)
actually_blew_up = FALSE
else
flick("intro_nuke",cinematic)
sleep(35)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
if(NUKE_MISS_STATION || NUKE_SYNDICATE_BASE) //nuke was nowhere nearby //TODO: a really distant explosion animation
sleep(50)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
actually_blew_up = station_missed == NUKE_SYNDICATE_BASE //don't kill everyone on station if it detonated off station
else //station was destroyed
@@ -346,42 +346,42 @@ SUBSYSTEM_DEF(ticker)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
cinematic.icon_state = "summary_nukewin"
if("AI malfunction") //Malf (screen,explosion,summary)
flick("intro_malf",cinematic)
sleep(76)
flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb) //TODO: If we ever decide to actually detonate the vault bomb
cinematic.icon_state = "summary_malf"
if("blob") //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb) //TODO: no idea what this case could be
cinematic.icon_state = "summary_selfdes"
if("cult") //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb) //TODO: no idea what this case could be
cinematic.icon_state = "summary_cult"
if("no_core") //Nuke failed to detonate as it had no core
flick("intro_nuke",cinematic)
sleep(35)
flick("station_intact",cinematic)
world << sound('sound/ambience/signal.ogg')
SEND_SOUND(world, sound('sound/ambience/signal.ogg'))
addtimer(CALLBACK(src, .proc/finish_cinematic, null, FALSE), 100)
return //Faster exit, since nothing happened
else //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red", cinematic)
world << sound('sound/effects/explosionfar.ogg')
SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg'))
station_explosion_detonation(bomb)
cinematic.icon_state = "summary_selfdes"
//If its actually the end of the round, wait for it to end.
@@ -636,7 +636,7 @@ SUBSYSTEM_DEF(ticker)
if(living_player_count() < config.hard_popcap)
if(next_in_line && next_in_line.client)
to_chat(next_in_line, "<span class='userdanger'>A slot has opened! You have approximately 20 seconds to join. <a href='?src=\ref[next_in_line];late_join=override'>\>\>Join Game\<\<</a></span>")
next_in_line << sound('sound/misc/notice1.ogg')
SEND_SOUND(next_in_line, sound('sound/misc/notice1.ogg'))
next_in_line.LateChoices()
return
queued_players -= next_in_line //Client disconnected, remove he
@@ -804,7 +804,7 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/proc/save_mode(the_mode)
var/F = file("data/mode.txt")
fdel(F)
F << the_mode
WRITE_FILE(F, the_mode)
/datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound)
set waitfor = FALSE
@@ -858,4 +858,4 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/disappointed.ogg'\
)
world << sound(round_end_sound)
SEND_SOUND(world, sound(round_end_sound))
+1 -1
View File
@@ -53,7 +53,7 @@ SUBSYSTEM_DEF(title)
/datum/controller/subsystem/title/Shutdown()
if(file_path)
var/F = file("data/previous_title.dat")
F << file_path
WRITE_FILE(F, file_path)
for(var/thing in GLOB.clients)
if(!thing)
+3 -2
View File
@@ -169,7 +169,7 @@
/datum/action/item_action/toggle_firemode
name = "Toggle Firemode"
/datum/action/item_action/rcl
name = "Change Cable Color"
button_icon_state = "rcl_rainbow"
@@ -490,7 +490,8 @@
var/obj/effect/proc_holder/spell/S = target
S.action = src
name = S.name
icon_icon = S.action_icon
desc = S.desc
button_icon = S.action_icon
button_icon_state = S.action_icon_state
background_icon_state = S.action_background_icon_state
button.name = name
+1 -1
View File
@@ -280,7 +280,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
if(!D)
return
to_chat(world, "<font size=5><span class='danger'><b>\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"</font></span>")
world << 'sound/hallucinations/veryfar_noise.ogg'
SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg'))
give_appropriate_spells()
D.convert_to_archdevil()
if(istype(D.loc, /obj/effect/dummy/slaughter/))
+1 -1
View File
@@ -141,7 +141,7 @@
/datum/antagonist/ninja/greet()
owner.current << sound('sound/effects/ninja_greeting.ogg')
SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg'))
to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A <font color='red'><B>SPACE NINJA</B></font>!")
to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
+54
View File
@@ -100,3 +100,57 @@
if (object == GLOBAL_PROC)
return call(delegate)(arglist(calling_arguments))
return call(object, delegate)(arglist(calling_arguments))
/datum/callback_select
var/list/finished
var/pendingcount
var/total
/datum/callback_select/New(count, savereturns)
total = count
if (savereturns)
finished = new(count)
/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE)
set waitfor = FALSE
if (!callback || !istype(callback))
//This check only exists because the alternative is callback_select would block forever if given invalid data
CRASH("invalid callback passed to invoke_callback")
if (!length(callback_args))
callback_args = list()
pendingcount++
var/rtn = callback.Invoke(arglist(callback_args))
pendingcount--
if (savereturn)
finished[index] = rtn
//runs a list of callbacks asynchronously, returning once all of them return.
//callbacks can be repeated.
//callbacks-args is a optional list of argument lists, in the same order as the callbacks,
// the inner lists will be sent to the callbacks when invoked() as additional args.
//can optionly save and return a list of return values, in the same order as the original list of callbacks
//resolution is the number of byond ticks between checks.
/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1)
if (!callbacks)
return
var/count = length(callbacks)
if (!count)
return
if (!callback_args)
callback_args = list()
callback_args.len = count
var/datum/callback_select/CS = new(count, savereturns)
for (var/i in 1 to count)
CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns)
while(CS.pendingcount)
sleep(resolution*world.tick_lag)
return CS.finished
+62
View File
@@ -0,0 +1,62 @@
diff a/code/datums/callback.dm b/code/datums/callback.dm (rejected hunks)
@@ -100,60 +100,3 @@
if (object == GLOBAL_PROC)
return call(delegate)(arglist(calling_arguments))
return call(object, delegate)(arglist(calling_arguments))
-
-
-/datum/callback_select
- var/list/finished
- var/pendingcount
- var/total
-
-/datum/callback_select/New(count, savereturns)
- total = count
- if (savereturns)
- finished = new(count)
-
-
-/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE)
- set waitfor = FALSE
- if (!callback || !istype(callback))
- //This check only exists because the alternative is callback_select would block forever if given invalid data
- CRASH("invalid callback passed to invoke_callback")
- if (!length(callback_args))
- callback_args = list()
- pendingcount++
- debug_usr("calling callback")
- var/rtn = callback.Invoke(arglist(callback_args))
- debug_usr("callback returned")
- pendingcount--
- if (savereturn)
- finished[index] = rtn
-
-
-
-
-//runs a list of callbacks asynchronously, returning once all of them return.
-//callbacks can be repeated.
-//callbacks-args is a optional list of argument lists, in the same order as the callbacks,
-// the inner lists will be sent to the callbacks when invoked() as additional args.
-//can optionly save and return a list of return values, in the same order as the original list of callbacks
-//resolution is the number of byond ticks between checks.
-/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1)
- if (!callbacks)
- return
- var/count = length(callbacks)
- if (!count)
- return
- if (!callback_args)
- callback_args = list()
-
- callback_args.len = count
-
- var/datum/callback_select/CS = new(count, savereturns)
- for (var/i in 1 to count)
- CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns)
- debug_usr("starting callbacks: [CS.pendingcount]")
- while(CS.pendingcount)
- debug_usr("callbacks: [CS.pendingcount]")
- sleep(resolution*world.tick_lag)
- return CS.finished
-
+20
View File
@@ -929,6 +929,26 @@
manipulate_organs(C)
href_list["datumrefresh"] = href_list["editorgans"]
else if(href_list["hallucinate"])
if(!check_rights(0))
return
var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list
if(!istype(C))
to_chat(usr, "This can only be done to instances of type /mob/living/carbon")
return
var/list/hallucinations = subtypesof(/datum/hallucination)
var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations
if(!usr)
return
if(QDELETED(C))
to_chat(usr, "Mob doesn't exist anymore")
return
if(result)
new result(C, TRUE)
else if(href_list["makehuman"])
if(!check_rights(R_SPAWN))
return
@@ -59,4 +59,4 @@ Bonus
else
if(prob(base_message_chance))
to_chat(M, "<span class='userdanger'>[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]</span>")
M.hallucination += (15 * power)
M.hallucination += (45 * power)
+6 -6
View File
@@ -805,11 +805,11 @@
possible_targets += possible_target.current
var/mob/def_target = null
var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon)
if (objective&&(objective.type in objective_list) && objective:target)
def_target = objective:target.current
var/list/objective_list = typecacheof(list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon))
if (is_type_in_typecache(objective, objective_list) && objective.target)
def_target = objective.target.current
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
var/mob/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
if (!new_target)
return
@@ -817,12 +817,12 @@
if (new_target == "Free objective")
new_objective = new objective_path
new_objective.owner = src
new_objective:target = null
new_objective.target = null
new_objective.explanation_text = "Free objective"
else
new_objective = new objective_path
new_objective.owner = src
new_objective:target = new_target:mind
new_objective.target = new_target.mind
//Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops.
new_objective.update_explanation_text()
+2 -2
View File
@@ -37,7 +37,7 @@
icon_state = "shadow_mend"
/datum/status_effect/void_price/tick()
owner << sound('sound/magic/summon_karp.ogg', volume = 25)
SEND_SOUND(owner, sound('sound/magic/summon_karp.ogg', volume = 25))
owner.adjustBruteLoss(3)
@@ -247,7 +247,7 @@
for(var/datum/mind/B in SSticker.mode.cult)
if(isliving(B.current))
var/mob/living/M = B.current
M << 'sound/hallucinations/veryfar_noise.ogg'
SEND_SOUND(M, sound('sound/hallucinations/veryfar_noise.ogg'))
to_chat(M, "<span class='cultlarge'>The Cult's Master, [owner], has fallen in \the [A]!</span>")
/datum/status_effect/cult_master/tick()
+3 -3
View File
@@ -69,7 +69,7 @@
if(telegraph_message)
to_chat(M, telegraph_message)
if(telegraph_sound)
M << sound(telegraph_sound)
SEND_SOUND(M, sound(telegraph_sound))
addtimer(CALLBACK(src, .proc/start), telegraph_duration)
/datum/weather/proc/start()
@@ -83,7 +83,7 @@
if(weather_message)
to_chat(M, weather_message)
if(weather_sound)
M << sound(weather_sound)
SEND_SOUND(M, sound(weather_sound))
START_PROCESSING(SSweather, src)
addtimer(CALLBACK(src, .proc/wind_down), weather_duration)
@@ -98,7 +98,7 @@
if(end_message)
to_chat(M, end_message)
if(end_sound)
M << sound(end_sound)
SEND_SOUND(M, sound(end_sound))
STOP_PROCESSING(SSweather, src)
addtimer(CALLBACK(src, .proc/end), end_duration)
+5 -5
View File
@@ -20,12 +20,12 @@
var/mob/living/simple_animal/bot/mulebot/M = holder
switch(wire)
if(WIRE_POWER1, WIRE_POWER2)
holder.visible_message("<span class='notice'>[bicon(M)] The charge light flickers.</span>")
holder.visible_message("<span class='notice'>[icon2html(M, viewers(holder))] The charge light flickers.</span>")
if(WIRE_AVOIDANCE)
holder.visible_message("<span class='notice'>[bicon(M)] The external warning lights flash briefly.</span>")
holder.visible_message("<span class='notice'>[icon2html(M, viewers(holder))] The external warning lights flash briefly.</span>")
if(WIRE_LOADCHECK)
holder.visible_message("<span class='notice'>[bicon(M)] The load platform clunks.</span>")
holder.visible_message("<span class='notice'>[icon2html(M, viewers(holder))] The load platform clunks.</span>")
if(WIRE_MOTOR1, WIRE_MOTOR2)
holder.visible_message("<span class='notice'>[bicon(M)] The drive motor whines briefly.</span>")
holder.visible_message("<span class='notice'>[icon2html(M, viewers(holder))] The drive motor whines briefly.</span>")
else
holder.visible_message("<span class='notice'>[bicon(M)] You hear a radio crackle.</span>")
holder.visible_message("<span class='notice'>[icon2html(M, viewers(holder))] You hear a radio crackle.</span>")
+1 -1
View File
@@ -25,7 +25,7 @@
if(WIRE_INTERFACE)
C.interface_control = !C.interface_control
if(WIRE_LIMIT)
C.visible_message("[bicon(C)]<b>[C]</b> makes a large whirring noise.")
C.visible_message("[icon2html(C, viewers(holder))]<b>[C]</b> makes a large whirring noise.")
/datum/wires/particle_accelerator/control_box/on_cut(wire, mend)
var/obj/machinery/particle_accelerator/control_box/C = holder
+12 -12
View File
@@ -19,21 +19,21 @@
switch(wire)
if(WIRE_BOOM)
if(B.active)
holder.visible_message("<span class='danger'>[bicon(B)] An alarm sounds! It's go-</span>")
holder.visible_message("<span class='danger'>[icon2html(B, viewers(holder))] An alarm sounds! It's go-</span>")
B.explode_now = TRUE
tell_admins(B)
if(WIRE_UNBOLT)
holder.visible_message("<span class='notice'>[bicon(B)] The bolts spin in place for a moment.</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] The bolts spin in place for a moment.</span>")
if(WIRE_DELAY)
if(B.delayedbig)
holder.visible_message("<span class='notice'>[bicon(B)] The bomb has already been delayed.</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] The bomb has already been delayed.</span>")
else
holder.visible_message("<span class='notice'>[bicon(B)] The bomb chirps.</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] The bomb chirps.</span>")
playsound(B, 'sound/machines/chime.ogg', 30, 1)
B.detonation_timer += 300
B.delayedbig = TRUE
if(WIRE_PROCEED)
holder.visible_message("<span class='danger'>[bicon(B)] The bomb buzzes ominously!</span>")
holder.visible_message("<span class='danger'>[icon2html(B, viewers(holder))] The bomb buzzes ominously!</span>")
playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1)
var/seconds = B.seconds_remaining()
if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them.
@@ -44,13 +44,13 @@
B.detonation_timer = world.time + 100
if(WIRE_ACTIVATE)
if(!B.active && !B.defused)
holder.visible_message("<span class='danger'>[bicon(B)] You hear the bomb start ticking!</span>")
holder.visible_message("<span class='danger'>[icon2html(B, viewers(holder))] You hear the bomb start ticking!</span>")
B.activate()
B.update_icon()
else if(B.delayedlittle)
holder.visible_message("<span class='notice'>[bicon(B)] Nothing happens.</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] Nothing happens.</span>")
else
holder.visible_message("<span class='notice'>[bicon(B)] The bomb seems to hesitate for a moment.</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] The bomb seems to hesitate for a moment.</span>")
B.detonation_timer += 100
B.delayedlittle = TRUE
@@ -62,24 +62,24 @@
B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage.
else
if(B.active)
holder.visible_message("<span class='danger'>[bicon(B)] An alarm sounds! It's go-</span>")
holder.visible_message("<span class='danger'>[icon2html(B, viewers(holder))] An alarm sounds! It's go-</span>")
B.explode_now = TRUE
tell_admins(B)
else
B.defused = TRUE
if(WIRE_UNBOLT)
if(!mend && B.anchored)
holder.visible_message("<span class='notice'>[bicon(B)] The bolts lift out of the ground!</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] The bolts lift out of the ground!</span>")
playsound(B, 'sound/effects/stealthoff.ogg', 30, 1)
B.anchored = FALSE
if(WIRE_PROCEED)
if(!mend && B.active)
holder.visible_message("<span class='danger'>[bicon(B)] An alarm sounds! It's go-</span>")
holder.visible_message("<span class='danger'>[icon2html(B, viewers(holder))] An alarm sounds! It's go-</span>")
B.explode_now = TRUE
tell_admins(B)
if(WIRE_ACTIVATE)
if(!mend && B.active)
holder.visible_message("<span class='notice'>[bicon(B)] The timer stops! The bomb has been defused!</span>")
holder.visible_message("<span class='notice'>[icon2html(B, viewers(holder))] The timer stops! The bomb has been defused!</span>")
B.active = FALSE
B.defused = TRUE
B.update_icon()
+2 -2
View File
@@ -439,7 +439,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
// Ambience goes down here -- make sure to list each area separately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
L.client.ambience_playing = 1
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ))
if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE)))
return //General ambience check is below the ship ambience so one can play without the other
@@ -448,7 +448,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
var/sound = pick(ambientsounds)
if(!L.client.played)
L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)
SEND_SOUND(L, sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE))
L.client.played = 1
sleep(600) //ewww - this is very very bad
if(L.&& L.client)
+10
View File
@@ -0,0 +1,10 @@
diff a/code/game/area/areas.dm b/code/game/area/areas.dm (rejected hunks)
@@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
L.client.ambience_playing = 1
- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
+ SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ))
if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE)))
return //General ambience check is below the ship ambience so one can play without the other
+1 -1
View File
@@ -270,7 +270,7 @@
f_name = "a "
f_name += "<span class='danger'>blood-stained</span> [name]!"
to_chat(user, "[bicon(src)] That's [f_name]")
to_chat(user, "[icon2html(src, user)] That's [f_name]")
if(desc)
to_chat(user, desc)
+1 -1
View File
@@ -292,7 +292,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
/datum/signal/proc/debug_print()
if (source)
. = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n"
. = "signal = {source = '[source]' [COORD(source)]\n"
else
. = "signal = {source = '[source]' ()\n"
for (var/i in data)
+1 -1
View File
@@ -110,7 +110,7 @@
SSticker.mode.apprentices += M.mind
M.mind.special_role = "apprentice"
SSticker.mode.update_wiz_icons_added(M.mind)
M << sound('sound/effects/magic.ogg')
SEND_SOUND(M, sound('sound/effects/magic.ogg'))
var/newname = copytext(sanitize(input(M, "You are [wizard_name]'s apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = randomname
+2 -2
View File
@@ -171,8 +171,8 @@
if(candidates.len) //if we got at least one candidate, they're a blobbernaut now.
var/client/C = pick(candidates)
blobber.key = C.key
blobber << 'sound/effects/blobattack.ogg'
blobber << 'sound/effects/attackblob.ogg'
SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg'))
SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg'))
to_chat(blobber, "<b>You are a blobbernaut!</b>")
to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.")
to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via <b>:b</b>")
+2 -1
View File
@@ -24,6 +24,7 @@
M.changeNext_move(CLICK_CD_MELEE)
var/a = pick("gently stroke", "nuzzle", "affectionatly pet", "cuddle")
M.visible_message("<span class='notice'>[M] [a]s [src]!</span>", "<span class='notice'>You [a] [src]!</span>")
to_chat(overmind, "<span class='notice'>[M] [a]s you!</span>")
playsound(src, 'sound/effects/blobattack.ogg', 50, 1) //SQUISH SQUISH
@@ -235,7 +236,7 @@
if(istype(I, /obj/item/device/analyzer))
user.changeNext_move(CLICK_CD_MELEE)
to_chat(user, "<b>The analyzer beeps once, then reports:</b><br>")
user << 'sound/machines/ping.ogg'
SEND_SOUND(user, sound('sound/machines/ping.ogg'))
chemeffectreport(user)
typereport(user)
else
@@ -16,10 +16,10 @@
C.confused += 25
C.Jitter(50)
else
C << sound('sound/effects/screech.ogg')
SEND_SOUND(C, sound('sound/effects/screech.ogg'))
if(issilicon(M))
M << sound('sound/weapons/flash.ogg')
SEND_SOUND(M, sound('sound/weapons/flash.ogg'))
M.Knockdown(rand(100,200))
for(var/obj/machinery/light/L in range(4, user))
+1 -1
View File
@@ -38,7 +38,7 @@
/mob/living/simple_animal/hostile/clockwork/examine(mob/user)
var/t_He = p_they(TRUE)
var/t_s = p_s()
var/msg = "<span class='brass'>*---------*\nThis is [bicon(src)] \a <b>[src]</b>!\n"
var/msg = "<span class='brass'>*---------*\nThis is [icon2html(src, user)] \a <b>[src]</b>!\n"
msg += "[desc]\n"
if(health < maxHealth)
msg += "<span class='warning'>"
@@ -150,7 +150,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
if(prob(ratvarian_prob))
message = text2ratvar(message)
to_chat(invoker, "<span class='[get_component_span(primary_component)]_large'>\"[message]\"</span>")
invoker << 'sound/magic/clockwork/invoke_general.ogg'
SEND_SOUND(invoker, sound('sound/magic/clockwork/invoke_general.ogg'))
return TRUE
/datum/clockwork_scripture/proc/check_offstation_penalty()
+5 -5
View File
@@ -103,13 +103,13 @@
if(B.current)
B.current.update_action_buttons_icon()
if(!B.current.incapacitated())
B.current << 'sound/hallucinations/im_here1.ogg'
SEND_SOUND(B.current, 'sound/hallucinations/im_here1.ogg')
to_chat(B.current, "<span class='cultlarge'>Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.</span>")
sleep(100)
var/list/asked_cultists = list()
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current && B.current != Nominee && !B.current.incapacitated())
B.current << 'sound/magic/exit_blood.ogg'
SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg')
asked_cultists += B.current
var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists)
if(QDELETED(Nominee) || Nominee.incapacitated())
@@ -280,7 +280,7 @@
for(var/datum/mind/B in SSticker.mode.cult)
if(B.current && B.current.stat != DEAD && B.current.client)
to_chat(B.current, "<span class='cultlarge'><b>Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!</b></span>")
B.current << pick(sound('sound/hallucinations/over_here2.ogg',0,1,75), sound('sound/hallucinations/over_here3.ogg',0,1,75))
SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75))
B.current.client.images += GLOB.blood_target_image
attached_action.owner.update_action_buttons_icon()
remove_ranged_ability("<span class='cult'>The marking rite is complete! It will last for 90 seconds.</span>")
@@ -324,7 +324,7 @@
return FALSE
if(cooldown > world.time)
if(!PM.active)
owner << "<span class='cultlarge'><b>You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!</b></span>"
to_chat(owner, "<span class='cultlarge'><b>You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!</b></span>")
return FALSE
return ..()
@@ -367,7 +367,7 @@
if(!attached_action.throwing)
attached_action.throwing = TRUE
attached_action.throwee = target
ranged_ability_user << 'sound/weapons/thudswoosh.ogg'
SEND_SOUND(ranged_ability_user, sound('sound/weapons/thudswoosh.ogg'))
to_chat(ranged_ability_user,"<span class='cult'><b>You reach through the veil with your mind's eye and seize [target]!</b></span>")
return
else
+5 -1
View File
@@ -161,11 +161,15 @@
/obj/item/weapon/sharpener/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
icon_state = "cult_sharpener"
used = 0
increment = 5
max = 40
prefix = "darkened"
/obj/item/weapon/sharpener/cult/update_icon()
icon_state = "cult_sharpener[used ? "_used" : ""]"
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
name = "empowered cultist armor"
desc = "Empowered garb which creates a powerful shield around the user."
@@ -391,7 +395,7 @@
if(!iscultist(user))
to_chat(user, "That doesn't seem to do anything useful.")
return
if(istype(A, /obj/item))
var/list/cultists = list()
+1 -1
View File
@@ -538,7 +538,7 @@ structure_check() searches for nearby cultist structures required for the invoca
mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
else
mob_to_revive = potential_revive_mobs[1]
if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user))
if(QDELETED(src) || !validness_checks(mob_to_revive, user))
rune_in_use = FALSE
return
if(user.name == "Herbert West")
-1
View File
@@ -29,7 +29,6 @@
return 0
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
world.log << "[usr], [href], [href_list]"
if(QDELETED(src) || usr.incapacitated() || !in_range(src, usr))
return
+2 -2
View File
@@ -270,7 +270,7 @@
if(target.use(25))
new /obj/structure/constructshell(T)
to_chat(user, "<span class='warning'>The talisman clings to the metal and twists it into a construct shell!</span>")
user << sound('sound/effects/magic.ogg',0,1,25)
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
invoke(user, 1)
qdel(src)
else
@@ -281,7 +281,7 @@
new /obj/item/stack/sheet/runed_metal(T,quantity)
target.use(quantity)
to_chat(user, "<span class='warning'>The talisman clings to the plasteel, transforming it into runed metal!</span>")
user << sound('sound/effects/magic.ogg',0,1,25)
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
invoke(user, 1)
if(uses <= 0)
qdel(src)
@@ -61,15 +61,15 @@
/mob/living/carbon/true_devil/examine(mob/user)
var/msg = "<span class='info'>*---------*\nThis is [bicon(src)] <b>[src]</b>!\n"
var/msg = "<span class='info'>*---------*\nThis is [icon2html(src, user)] <b>[src]</b>!\n"
//Left hand items
for(var/obj/item/I in held_items)
if(!(I.flags & ABSTRACT))
if(I.blood_DNA)
msg += "<span class='warning'>It is holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
msg += "<span class='warning'>It is holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
else
msg += "It is holding [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n"
msg += "It is holding [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n"
//Braindead
if(!client && stat != DEAD)
+1 -1
View File
@@ -120,7 +120,7 @@
var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len)
var/list/datum/game_mode/usable_modes = list()
for(var/datum/game_mode/G in runnable_modes)
if(G.reroll_friendly)
if(G.reroll_friendly && living_crew >= G.required_players)
usable_modes += G
else
qdel(G)
+1 -1
View File
@@ -191,7 +191,7 @@
var/mob/living/mob = get(tool.loc, /mob/living)
if(mob && mob.mind && mob.stat == CONSCIOUS)
if(mob.mind.gang_datum == src)
to_chat(mob, "<span class='[warning ? "warning" : "notice"]'>[bicon(tool)] [message]</span>")
to_chat(mob, "<span class='[warning ? "warning" : "notice"]'>[icon2html(tool, mob)] [message]</span>")
return
+1 -1
View File
@@ -66,4 +66,4 @@
cooldown = 0
icon_state = "pen"
var/mob/M = get(src, /mob)
to_chat(M, "<span class='notice'>[bicon(src)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.</span>")
to_chat(M, "<span class='notice'>[icon2html(src, M)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.</span>")
+9 -9
View File
@@ -110,7 +110,7 @@
if(!message || !can_use(user))
return
if(user.z > 2)
to_chat(user, "<span class='info'>[bicon(src)]Error: Station out of range.</span>")
to_chat(user, "<span class='info'>[icon2html(src, user)]Error: Station out of range.</span>")
return
var/list/members = list()
members += gang.gangsters
@@ -179,35 +179,35 @@
gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.")
recalling = 1
to_chat(loc, "<span class='info'>[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal...</span>")
to_chat(loc, "<span class='info'>[icon2html(src, loc)]Generating shuttle recall order with codes retrieved from last call signal...</span>")
sleep(rand(100,300))
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
to_chat(user, "<span class='warning'>[bicon(src)]Emergency shuttle cannot be recalled at this time.</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)]Emergency shuttle cannot be recalled at this time.</span>")
recalling = 0
return 0
to_chat(loc, "<span class='info'>[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays...</span>")
to_chat(loc, "<span class='info'>[icon2html(src, loc)]Shuttle recall order generated. Accessing station long-range communication arrays...</span>")
sleep(rand(100,300))
if(!gang.dom_attempts)
to_chat(user, "<span class='warning'>[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.</span>")
recalling = 0
return 0
var/turf/userturf = get_turf(user)
if(userturf.z != ZLEVEL_STATION) //Shuttle can only be recalled while on station
to_chat(user, "<span class='warning'>[\bicon(src)]Error: Device out of range of station communication arrays.</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)]Error: Device out of range of station communication arrays.</span>")
recalling = 0
return 0
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
if((100 * GLOB.start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged
to_chat(user, "<span class='warning'>[bicon(src)]Error: Station communication systems compromised. Unable to establish connection.</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)]Error: Station communication systems compromised. Unable to establish connection.</span>")
recalling = 0
return 0
to_chat(loc, "<span class='info'>[bicon(src)]Comm arrays accessed. Broadcasting recall signal...</span>")
to_chat(loc, "<span class='info'>[icon2html(src, loc)]Comm arrays accessed. Broadcasting recall signal...</span>")
sleep(rand(100,300))
@@ -220,7 +220,7 @@
gang.recalls -= 1
return 1
to_chat(loc, "<span class='info'>[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
to_chat(loc, "<span class='info'>[icon2html(src, loc)]No response recieved. Emergency shuttle cannot be recalled at this time.</span>")
return 0
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
@@ -375,8 +375,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
minor_announce("[key] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", TRUE)
/obj/machinery/doomsday_device/proc/detonate(z_level = ZLEVEL_STATION)
for(var/mob/M in GLOB.player_list)
M << 'sound/machines/alarm.ogg'
sound_to_playing_players('sound/machines/alarm.ogg')
sleep(100)
for(var/mob/living/L in GLOB.mob_list)
var/turf/T = get_turf(L)
@@ -654,7 +654,7 @@
to_chat(M, "[link] [rendered]")
/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()
var/message = input(src, "Announce to other swarmers", "Swarmer contact")
var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact")
// TODO get swarmers their own colour rather than just boldtext
if(message)
swarmer_chat(message)
@@ -224,7 +224,7 @@
player_mind.special_role = "Morph"
SSticker.mode.traitors |= player_mind
to_chat(S, S.playstyle_string)
S << 'sound/magic/mutate.ogg'
SEND_SOUND(S, sound('sound/magic/mutate.ogg'))
message_admins("[key_name_admin(S)] has been made into a morph by an event.")
log_game("[key_name(S)] was spawned as a morph by an event.")
spawned_mobs += S
@@ -74,7 +74,7 @@
generated_objectives_and_spells = TRUE
mind.remove_all_antag()
mind.wipe_memory()
src << 'sound/effects/ghost.ogg'
SEND_SOUND(src, sound('sound/effects/ghost.ogg'))
var/datum/objective/revenant/objective = new
objective.owner = mind
mind.objectives += objective
@@ -42,7 +42,7 @@
SSticker.mode.traitors |= player_mind
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
S << 'sound/magic/demon_dies.ogg'
SEND_SOUND(S, 'sound/magic/demon_dies.ogg')
message_admins("[key_name_admin(S)] has been made into a slaughter demon by an event.")
log_game("[key_name(S)] was spawned as a slaughter demon by an event.")
spawned_mobs += S
+1 -1
View File
@@ -288,7 +288,7 @@
text += "<br>"
text += "(Syndicates used [TC_uses] TC) [purchases]"
if(TC_uses == 0 && station_was_nuked && !are_operatives_dead())
text += "<BIG>[bicon(icon('icons/badass.dmi', "badass"))]</BIG>"
text += "<BIG>[icon2html('icons/badass.dmi', world, "badass")]</BIG>"
to_chat(world, text)
return 1
+1 -2
View File
@@ -421,8 +421,7 @@
yes_code = FALSE
safety = TRUE
update_icon()
for(var/mob/M in GLOB.player_list)
M << 'sound/machines/alarm.ogg'
sound_to_playing_players('sound/machines/alarm.ogg')
if(SSticker && SSticker.mode)
SSticker.mode.explosion_in_progress = 1
sleep(100)
+1 -1
View File
@@ -124,7 +124,7 @@
text += " (used [TC_uses] TC) [purchases]"
if(TC_uses==0 && traitorwin)
var/static/icon/badass = icon('icons/badass.dmi', "badass")
text += "<BIG>[bicon(badass)]</BIG>"
text += "<BIG>[icon2html(badass, world)]</BIG>"
text += objectives
+1 -1
View File
@@ -476,7 +476,7 @@
GiveHint(target)
else if(istype(I, /obj/item/weapon/bikehorn))
to_chat(target, "<span class='userdanger'>HONK</span>")
target << 'sound/items/airhorn.ogg'
SEND_SOUND(target, 'sound/items/airhorn.ogg')
target.adjustEarDamage(0,3)
GiveHint(target)
cooldown = world.time +cooldown_time
+10 -13
View File
@@ -2,7 +2,7 @@
name = "cell charger"
desc = "It charges power cells."
icon = 'icons/obj/power.dmi'
icon_state = "ccharger0"
icon_state = "ccharger"
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 5
@@ -12,19 +12,16 @@
var/chargelevel = -1
/obj/machinery/cell_charger/proc/updateicon()
icon_state = "ccharger[charging ? 1 : 0]"
cut_overlays()
if(charging && !(stat & (BROKEN|NOPOWER)))
var/newlevel = round(charging.percent() * 4 / 100)
if(chargelevel != newlevel)
chargelevel = newlevel
cut_overlays()
add_overlay("ccharger-o[newlevel]")
else
cut_overlays()
if(charging)
add_overlay(image(charging.icon, charging.icon_state))
add_overlay("ccharger-on")
if(!(stat & (BROKEN|NOPOWER)))
var/newlevel = round(charging.percent() * 4 / 100)
if(chargelevel != newlevel)
chargelevel = newlevel
add_overlay("ccharger-o[newlevel]")
/obj/machinery/cell_charger/examine(mob/user)
..()
+1 -1
View File
@@ -403,7 +403,7 @@
flash_color(mob_occupant, flash_color="#960000", flash_time=100)
to_chat(mob_occupant, "<span class='warning'><b>Agony blazes across your consciousness as your body is torn apart.</b><br><i>Is this what dying is like? Yes it is.</i></span>")
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
mob_occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)
SEND_SOUND(mob_occupant, sound('sound/hallucinations/veryfar_noise.ogg',0,1,50))
QDEL_IN(mob_occupant, 40)
/obj/machinery/clonepod/relaymove(mob/user)
+4 -4
View File
@@ -116,24 +116,24 @@
authenticated = FALSE
auth_id = "\[NULL\]"
if(href_list["restore_logging"])
to_chat(usr, "<span class='robot notice'>[bicon(src)] Logging functionality restored from backup data.</span>")
to_chat(usr, "<span class='robot notice'>[icon2html(src, usr)] Logging functionality restored from backup data.</span>")
emagged = FALSE
LAZYADD(logs, "<b>-=- Logging restored to full functionality at this point -=-</b>")
if(href_list["access_apc"])
playsound(src, "terminal_type", 50, 0)
var/obj/machinery/power/apc/APC = locate(href_list["access_apc"]) in GLOB.apcs_list
if(!APC || APC.aidisabled || APC.panel_open || QDELETED(APC))
to_chat(usr, "<span class='robot danger'>[bicon(src)] APC does not return interface request. Remote access may be disabled.</span>")
to_chat(usr, "<span class='robot danger'>[icon2html(src, usr)] APC does not return interface request. Remote access may be disabled.</span>")
return
if(active_apc)
to_chat(usr, "<span class='robot danger'>[bicon(src)] Disconnected from [active_apc].</span>")
to_chat(usr, "<span class='robot danger'>[icon2html(src, usr)] Disconnected from [active_apc].</span>")
active_apc.say("Remote access canceled. Interface locked.")
playsound(active_apc, 'sound/machines/boltsdown.ogg', 25, 0)
playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0)
active_apc.locked = TRUE
active_apc.update_icon()
active_apc = null
to_chat(usr, "<span class='robot notice'>[bicon(src)] Connected to APC in [APC.area]. Interface request sent.</span>")
to_chat(usr, "<span class='robot notice'>[icon2html(src, usr)] Connected to APC in [APC.area]. Interface request sent.</span>")
log_activity("remotely accessed APC in [APC.area]")
APC.interact(usr, GLOB.not_incapacitated_state)
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
-1
View File
@@ -473,7 +473,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if ("reg")
if (authenticated)
var/t2 = modify
//var/t1 = input(usr, "What name?", "ID computer", null) as text
if ((authenticated && modify == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc)))
var/newName = reject_bad_name(href_list["reg"])
if(newName)
@@ -89,7 +89,7 @@
playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0)
if(prob(25))
for(var/mob/living/silicon/ai/AI in active_ais())
AI << sound('sound/machines/terminal_alert.ogg', volume = 10) //Very quiet for balance reasons
SEND_SOUND(AI, sound('sound/machines/terminal_alert.ogg', volume = 10)) //Very quiet for balance reasons
if("logout")
authenticated = 0
playsound(src, 'sound/machines/terminal_off.ogg', 50, 0)
+5 -5
View File
@@ -309,7 +309,7 @@
message = noserver
else
if(auth)
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
var/dkey = trim(stripped_input(usr, "Please enter the decryption key."))
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
@@ -414,10 +414,10 @@
customrecepient.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[customrecepient];choice=Message;target=\ref[src]'>[customsender]</a> ([customjob]):</b></i><br>[custommessage]<br>"
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3)
customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3)
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
to_chat(H, "[bicon(customrecepient)] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)")
to_chat(H, "[icon2html(customrecepient, viewers(H))] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)")
log_talk(usr,"[key_name(usr)] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA)
customrecepient.cut_overlays()
customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
@@ -427,10 +427,10 @@
customrecepient.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[customrecepient];choice=Message;target=\ref[PDARec]'>[PDARec.owner]</a> ([customjob]):</b></i><br>[custommessage]<br>"
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3)
customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3)
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
to_chat(H, "[bicon(customrecepient)] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)")
to_chat(H, "[icon2html(customrecepient, H)] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=\ref[customrecepient];choice=Message;skiprefresh=1;target=\ref[PDARec]'>Reply</a>)")
log_talk(usr,"[key_name(usr)] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA)
customrecepient.cut_overlays()
customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
+1 -1
View File
@@ -21,7 +21,7 @@
return
if(!connected)
viewers(null, null) << "Cannot locate mass driver connector. Cancelling firing sequence!"
say("Cannot locate mass driver connector. Cancelling firing sequence!")
return
for(var/obj/machinery/door/poddoor/M in range(range, src))
+7 -3
View File
@@ -233,9 +233,13 @@
return
else /*if(src.justzap)*/
return
else if(user.hallucination > 50 && ishuman(user) && prob(10) && src.operating == FALSE)
hallucinate_shock(user)
return
else if(user.hallucinating() && ishuman(user) && prob(4) && !operating)
var/mob/living/carbon/human/H = user
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient)//not insulated
hallucinate_shock(H)
return
if (cyclelinkedairlock)
if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user))
if(cyclelinkedairlock.operating)
+1 -1
View File
@@ -390,7 +390,7 @@
new /obj/effect/temp_visual/cult/sac(loc)
var/atom/throwtarget
throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
L << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50))
SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50))
flash_color(L, flash_color="#960000", flash_time=20)
L.Knockdown(40)
L.throw_at(throwtarget, 5, 1,src)
+1 -1
View File
@@ -439,7 +439,7 @@ Class Procs:
/obj/machinery/proc/display_parts(mob/user)
to_chat(user, "<span class='notice'>Following parts detected in the machine:</span>")
for(var/obj/item/C in component_parts)
to_chat(user, "<span class='notice'>[bicon(C)] [C.name]</span>")
to_chat(user, "<span class='notice'>[icon2html(C, user)] [C.name]</span>")
/obj/machinery/examine(mob/user)
..()
+8 -6
View File
@@ -96,7 +96,8 @@
colour2 = rgb(255,128,0)
if(ismob(AM))
if(AM:client)
var/mob/M = AM
if(M.client)
colour = rgb(255,0,0)
else
colour = rgb(255,128,128)
@@ -146,7 +147,7 @@
var/icon/I2 = imap[2+(ix + icx*iy)*2]
//to_chat(world, "icon: [bicon(I)]")
//to_chat(world, "icon: [icon2html(I, world)]")
I.DrawBox(colour, rx, ry, rx+1, ry+1)
@@ -163,7 +164,7 @@
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
//to_chat(world, "[bicon(I)] at [H.screen_loc]")
//to_chat(world, "[icon2html(I, world)] at [H.screen_loc]")
H.name = (i==0)?"maprefresh":"map"
@@ -242,7 +243,8 @@
colour = rgb(255,255,0)
if(ismob(AM))
if(AM:client)
var/mob/M = AM
if(M.client)
colour = rgb(255,0,0)
else
colour = rgb(255,128,128)
@@ -274,7 +276,7 @@
var/icon/I = imap[1+(ix + icx*iy)]
//to_chat(world, "icon: [bicon(I)]")
//to_chat(world, "icon: [icon2html(I, world)]")
I.DrawBox(colour, rx, ry, rx, ry)
@@ -289,7 +291,7 @@
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
//to_chat(world, "[bicon(I)] at [H.screen_loc]")
//to_chat(world, "[icon2html(I, world)] at [H.screen_loc]")
H.name = (i==0)?"maprefresh":"map"
+17 -19
View File
@@ -11,31 +11,29 @@
idle_power_usage = 20
active_power_usage = 5000
/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/user, params)
/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/living/user, params)
if (istype(O, /obj/item/stack/sheet/metal))
if (src.metal_amount < 150000)
var/count = 0
src.add_overlay("fab-load-metal")
spawn(15)
if(O)
if(!O:amount)
return
while(metal_amount < 150000 && O:amount)
src.metal_amount += O:materials[MAT_METAL] /*O:height * O:width * O:length * 100000*/
O:amount--
count++
if (O:amount < 1)
qdel(O)
to_chat(user, "<span class='notice'>You insert [count] metal sheet\s into \the [src].</span>")
cut_overlay("fab-load-metal")
updateDialog()
if (metal_amount < 150000)
add_overlay("fab-load-metal")
addtimer(CALLBACK(src, .proc/FinishLoadingMetal, O, user), 15)
else
to_chat(user, "\The [src] is full.")
else
return ..()
/obj/machinery/robotic_fabricator/proc/FinishLoadingMetal(obj/item/stack/sheet/metal/M, mob/living/user)
cut_overlay("fab-load-metal")
if(QDELETED(M) || QDELETED(user))
return
var/count = 0
while(metal_amount < 150000 && !QDELETED(M))
metal_amount += M.materials[MAT_METAL]
M.use(1)
count++
to_chat(user, "<span class='notice'>You insert [count] metal sheet\s into \the [src].</span>")
updateDialog()
/obj/machinery/robotic_fabricator/power_change()
if (powered())
stat &= ~NOPOWER
+3 -3
View File
@@ -10,9 +10,9 @@
max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons)
CanAtmosPass = ATMOS_PASS_DENSITY
/obj/structure/emergency_shield/New()
src.setDir(pick(1,2,3,4))
..()
/obj/structure/emergency_shield/Initialize()
. = ..()
setDir(pick(GLOB.cardinals))
air_update_turf(1)
/obj/structure/emergency_shield/Destroy()
+10
View File
@@ -0,0 +1,10 @@
diff a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm (rejected hunks)
@@ -12,7 +12,7 @@
/obj/structure/emergency_shield/Initialize()
. = ..()
- setDir(pick(1,2,3,4))
+ setDir(pick(GLOB.cardinals))
air_update_turf(1)
/obj/structure/emergency_shield/Destroy()
+5 -5
View File
@@ -210,14 +210,14 @@
var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num
if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station
timer_set = Clamp(new_timer, minimum_timer, maximum_timer)
src.loc.visible_message("<span class='notice'>[bicon(src)] timer set for [timer_set] seconds.</span>")
src.loc.visible_message("<span class='notice'>[icon2html(src, viewers(src))] timer set for [timer_set] seconds.</span>")
if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user))
if(defused || active)
if(defused)
src.loc.visible_message("<span class='warning'>[bicon(src)] Device error: User intervention required.</span>")
src.loc.visible_message("<span class='warning'>[icon2html(src, viewers(src))] Device error: User intervention required.</span>")
return
else
src.loc.visible_message("<span class='danger'>[bicon(src)] [timer_set] seconds until detonation, please clear the area.</span>")
src.loc.visible_message("<span class='danger'>[icon2html(src, viewers(loc))] [timer_set] seconds until detonation, please clear the area.</span>")
activate()
update_icon()
add_fingerprint(user)
@@ -333,7 +333,7 @@
var/obj/machinery/syndicatebomb/holder = loc
if(istype(holder))
attempts++
holder.loc.visible_message("<span class='danger'>[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...</span>")
holder.loc.visible_message("<span class='danger'>[icon2html(holder, viewers(holder))] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...</span>")
reset()
else
qdel(src)
@@ -343,7 +343,7 @@
if(istype(holder))
attempts++
defusals++
holder.loc.visible_message("<span class='notice'>[bicon(holder)] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...</span>")
holder.loc.visible_message("<span class='notice'>[icon2html(holder, viewers(holder))] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...</span>")
sleep(50) //Just in case someone is trying to remove the bomb core this gives them a little window to crowbar it out
if(istype(holder))
reset()
+2 -5
View File
@@ -37,10 +37,7 @@
src.update_chassis_page()
chassis.occupant_message("<span class='danger'>The [src] is destroyed!</span>")
chassis.log_append_to_last("[src] is destroyed.",1)
if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon))
chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50)
else
chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50)
SEND_SOUND(chassis.occupant, sound(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon) ? 'sound/mecha/weapdestr.ogg' : 'sound/mecha/critdestr.ogg', volume=50))
chassis = null
return ..()
@@ -139,7 +136,7 @@
/obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message)
if(chassis)
chassis.occupant_message("[bicon(src)] [message]")
chassis.occupant_message("[icon2html(src, chassis.occupant)] [message]")
return
/obj/item/mecha_parts/mecha_equipment/proc/log_message(message)
+9 -9
View File
@@ -262,7 +262,7 @@
if(equipment && equipment.len)
to_chat(user, "It's equipped with:")
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
to_chat(user, "[bicon(ME)] [ME]")
to_chat(user, "[icon2html(ME, user)] [ME]")
//processing internal damage, temperature, air regulation, alert updates, lights power use.
/obj/mecha/process()
@@ -596,7 +596,7 @@
/obj/mecha/proc/setInternalDamage(int_dam_flag)
internal_damage |= int_dam_flag
log_append_to_last("Internal damage of type [int_dam_flag].",1)
occupant << sound('sound/machines/warning-buzzer.ogg',wait=0)
SEND_SOUND(occupant, sound('sound/machines/warning-buzzer.ogg',wait=0))
diag_hud_set_mechstat()
return
@@ -636,7 +636,7 @@
var/can_control_mech = 0
for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers)
can_control_mech = 1
to_chat(user, "<span class='notice'>[bicon(src)] Status of [name]:</span>\n[A.get_mecha_info()]")
to_chat(user, "<span class='notice'>[icon2html(src, user)] Status of [name]:</span>\n[A.get_mecha_info()]")
break
if(!can_control_mech)
to_chat(user, "<span class='warning'>You cannot control exosuits without AI control beacons installed.</span>")
@@ -707,14 +707,14 @@
icon_state = initial(icon_state)
playsound(src, 'sound/machines/windowdoor.ogg', 50, 1)
if(!internal_damage)
occupant << sound('sound/mecha/nominal.ogg',volume=50)
SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50))
AI.cancel_camera()
AI.controlled_mech = src
AI.remote_control = src
AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES.
to_chat(AI, "[AI.can_dominate_mechs ? "<span class='announce'>Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!</span>" \
: "<span class='notice'>You have been uploaded to a mech's onboard computer."]")
to_chat(AI, AI.can_dominate_mechs ? "<span class='announce'>Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!</span>" :\
"<span class='notice'>You have been uploaded to a mech's onboard computer.</span>")
to_chat(AI, "<span class='reallybig boldnotice'>Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.</span>")
if(interaction == AI_TRANS_FROM_CARD)
GrantActions(AI, FALSE) //No eject/return to core action for AI uploaded by card
@@ -860,7 +860,7 @@
setDir(dir_in)
playsound(src, 'sound/machines/windowdoor.ogg', 50, 1)
if(!internal_damage)
occupant << sound('sound/mecha/nominal.ogg',volume=50)
SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50))
return 1
else
return 0
@@ -914,7 +914,7 @@
setDir(dir_in)
log_message("[mmi_as_oc] moved in as pilot.")
if(!internal_damage)
occupant << sound('sound/mecha/nominal.ogg',volume=50)
SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50))
GrantActions(brainmob)
return TRUE
@@ -1004,7 +1004,7 @@
/obj/mecha/proc/occupant_message(message as text)
if(message)
if(occupant && occupant.client)
to_chat(occupant, "[bicon(src)] [message]")
to_chat(occupant, "[icon2html(src, occupant)] [message]")
return
/obj/mecha/proc/log_message(message as text,red=null)
+1 -1
View File
@@ -242,7 +242,7 @@
chassis.occupant_message("<font color='[chassis.zoom_mode?"blue":"red"]'>Zoom mode [chassis.zoom_mode?"en":"dis"]abled.</font>")
if(chassis.zoom_mode)
owner.client.change_view(12)
owner << sound('sound/mecha/imag_enh.ogg',volume=50)
SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50))
else
owner.client.change_view(world.view) //world.view - default mob view size
UpdateButtonIcon()
@@ -169,7 +169,7 @@
. += "You recognise the footprints as belonging to:\n"
for(var/shoe in shoe_types)
var/obj/item/clothing/shoes/S = shoe
. += "some <B>[initial(S.name)]</B> [bicon(initial(S.icon))]\n"
. += "some <B>[initial(S.name)]</B> [icon2html(initial(S.icon), user)]\n"
to_chat(user, .)
+3 -3
View File
@@ -22,7 +22,7 @@
/obj/effect/mine/proc/triggermine(mob/victim)
if(triggered)
return
visible_message("<span class='danger'>[victim] sets off [bicon(src)] [src]!</span>")
visible_message("<span class='danger'>[victim] sets off [icon2html(src, viewers(src))] [src]!</span>")
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -121,13 +121,13 @@
if(!victim.client || !istype(victim))
return
to_chat(victim, "<span class='reallybig redtext'>RIP AND TEAR</span>")
victim << 'sound/misc/e1m1.ogg'
SEND_SOUND(victim, sound('sound/misc/e1m1.ogg'))
var/old_color = victim.client.color
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
spawn(0)
new /obj/effect/hallucination/delusion(victim.loc,victim,"demon",duration,0)
new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0)
var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
chainsaw.flags |= NODROP
+2 -2
View File
@@ -558,7 +558,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if (!silent)
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
audible_message("[bicon(src)] *[ttone]*", null, 3)
audible_message("[icon2html(src, hearers(src))] *[ttone]*", null, 3)
//Search for holder of the PDA.
var/mob/living/L = null
if(loc && isliving(loc))
@@ -575,7 +575,7 @@ GLOBAL_LIST_EMPTY(PDAs)
hrefstart = "<a href='?src=\ref[L];track=[html_encode(source.owner)]'>"
hrefend = "</a>"
to_chat(L, "[\bicon(src)] <b>Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], </b>\"[msg.message]\"[msg.get_photo_ref()] (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[source]'>Reply</a>)")
to_chat(L, "[icon2html(src)] <b>Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], </b>\"[msg.message]\"[msg.get_photo_ref()] (<a href='byond://?src=\ref[src];choice=Message;skiprefresh=1;target=\ref[source]'>Reply</a>)")
update_icon()
add_overlay(icon_alert)
@@ -88,27 +88,27 @@
if(isliving(loc))
var/mob/living/M = loc
if(!emagged)
to_chat(M, "<span class='boldannounce'>[bicon(src)] RADIATION PULSE DETECTED.</span>")
to_chat(M, "<span class='boldannounce'>[bicon(src)] Severity: [amount]</span>")
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] RADIATION PULSE DETECTED.</span>")
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] Severity: [amount]</span>")
else
to_chat(M, "<span class='boldannounce'>[bicon(src)] !@%$AT!(N P!LS! D/TEC?ED.</span>")
to_chat(M, "<span class='boldannounce'>[bicon(src)] &!F2rity: <=[amount]#1</span>")
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] !@%$AT!(N P!LS! D/TEC?ED.</span>")
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] &!F2rity: <=[amount]#1</span>")
update_icon()
/obj/item/device/geiger_counter/attack_self(mob/user)
scanning = !scanning
update_icon()
to_chat(user, "<span class='notice'>[bicon(src)] You switch [scanning ? "on" : "off"] [src].</span>")
to_chat(user, "<span class='notice'>[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].</span>")
/obj/item/device/geiger_counter/attack(mob/living/M, mob/user)
if(user.a_intent == INTENT_HELP)
if(!emagged)
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='notice'>You scan [M]'s radiation levels with [src]...</span>")
if(!M.radiation)
to_chat(user, "<span class='notice'>[bicon(src)] Radiation levels within normal boundaries.</span>")
to_chat(user, "<span class='notice'>[icon2html(src, user)] Radiation levels within normal boundaries.</span>")
return 1
else
to_chat(user, "<span class='boldannounce'>[bicon(src)] Subject is irradiated. Radiation levels: [M.radiation].</span>")
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].</span>")
return 1
else
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='danger'>You project [src]'s stored radiation into [M]'s body!</span>")
+1 -1
View File
@@ -147,7 +147,7 @@ MASS SPECTROMETER
if (M.getCloneLoss())
to_chat(user, "\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
to_chat(user, "\t<span class='info'>Bloodstream analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.</span>")
to_chat(user, "\t<span class='info'>Bloodstream analysis located [M.reagents.get_reagent_amount("epinephrine")] units of rejuvenation chemicals.</span>")
if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain))
to_chat(user, "\t<span class='alert'>Subject brain function is non-existent.</span>")
else if (M.getBrainLoss() >= 60)
@@ -8,7 +8,7 @@
desc = "Regulates the transfer of air between two tanks"
var/obj/item/weapon/tank/tank_one
var/obj/item/weapon/tank/tank_two
var/obj/item/device/attached_device
var/obj/item/device/assembly/attached_device
var/mob/attacher = null
var/valve_open = FALSE
var/toggle = 1
@@ -99,8 +99,8 @@
toggle_valve()
else if(attached_device)
if(href_list["rem_device"])
attached_device.loc = get_turf(src)
attached_device:holder = null
attached_device.forceMove(get_turf(src))
attached_device.holder = null
attached_device = null
update_icon()
if(href_list["device"])
@@ -12,7 +12,7 @@
novariants = FALSE
GLOBAL_LIST_INIT(human_recipes, list( \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \
))
/obj/item/stack/sheet/animalhide/human/Initialize(mapload, new_amount, merge = TRUE)
@@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \
icon_state = "sheet-corgi"
GLOBAL_LIST_INIT(corgi_recipes, list ( \
new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, on_floor = 1), \
new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3), \
))
/obj/item/stack/sheet/animalhide/corgi/Initialize(mapload, new_amount, merge = TRUE)
@@ -53,8 +53,8 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \
icon_state = "sheet-monkey"
GLOBAL_LIST_INIT(monkey_recipes, list ( \
new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, on_floor = 1), \
new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2, on_floor = 1), \
new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1), \
new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2), \
))
/obj/item/stack/sheet/animalhide/monkey/Initialize(mapload, new_amount, merge = TRUE)
@@ -74,8 +74,8 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \
icon_state = "sheet-xeno"
GLOBAL_LIST_INIT(xeno_recipes, list ( \
new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1, on_floor = 1), \
new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2, on_floor = 1), \
new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \
new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \
))
/obj/item/stack/sheet/animalhide/xeno/Initialize(mapload, new_amount, merge = TRUE)
@@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
GLOBAL_LIST_INIT(sinew_recipes, list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \
new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1), \
))
/obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge = TRUE)
+2 -2
View File
@@ -527,7 +527,7 @@
return list(pick(messages))
/obj/item/toy/talking/proc/toy_talk(mob/user, message)
user.loc.visible_message("<span class='[span]'>[bicon(src)] [message]</span>")
user.loc.visible_message("<span class='[span]'>[icon2html(src, viewers(user.loc))] [message]</span>")
if(chattering)
chatter(message, phomeme, user)
@@ -1082,7 +1082,7 @@
user.visible_message("<span class='notice'>[user] pulls back the string on [src].</span>")
icon_state = "[initial(icon_state)]_used"
sleep(5)
audible_message("<span class='danger'>[bicon(src)] Hiss!</span>")
audible_message("<span class='danger'>[icon2html(src, viewers(src))] Hiss!</span>")
var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
var/chosen_sound = pick(possible_sounds)
playsound(get_turf(src), chosen_sound, 50, 1)
@@ -525,7 +525,7 @@ AI MODULES
laws[1] = generate_ion_law()
to_chat(user, "<span class='notice'>You press the button on [src].</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
src.loc.visible_message("<span class='warning'>[bicon(src)] [laws[1]]</span>")
src.loc.visible_message("<span class='warning'>[icon2html(src, viewers(loc))] [laws[1]]</span>")
/******************** Mother Drone ******************/
+1 -1
View File
@@ -106,7 +106,7 @@
update_label()
/obj/item/weapon/card/id/attack_self(mob/user)
user.visible_message("<span class='notice'>[user] shows you: [bicon(src)] [src.name].</span>", \
user.visible_message("<span class='notice'>[user] shows you: [icon2html(src, viewers(user))] [src.name].</span>", \
"<span class='notice'>You show \the [src.name].</span>")
src.add_fingerprint(user)
return
@@ -26,6 +26,7 @@
var/create_full = FALSE
var/create_with_tank = FALSE
var/igniter_type = /obj/item/device/assembly/igniter
trigger_guard = TRIGGER_GUARD_NORMAL
/obj/item/weapon/flamethrower/Destroy()
if(weldtool)
@@ -69,12 +70,7 @@
if(flag)
return // too close
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna.check_mutation(HULK))
to_chat(user, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
return
if(NOGUNS in H.dna.species.species_traits)
to_chat(user, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
if(!can_trigger_gun(user))
return
if(user && user.get_active_held_item() == src) // Make sure our user is still holding us
var/turf/target_turf = get_turf(target)
@@ -320,6 +320,8 @@
desc = "Particularly twisted dieties grant gifts of dubious value."
icon_state = "arm_blade"
item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
flags = ABSTRACT | NODROP
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
@@ -26,6 +26,7 @@
var/fire_mode = PCANNON_FIREALL
var/automatic = FALSE
var/clumsyCheck = TRUE
trigger_guard = TRIGGER_GUARD_NORMAL
/obj/item/weapon/pneumatic_cannon/CanItemAutoclick()
return automatic
@@ -37,10 +38,10 @@
out += "<span class='notice'>You'll need to get closer to see any more.</span>"
return
for(var/obj/item/I in loadedItems)
out += "<span class='info'>[bicon(I)] It has \the [I] loaded.</span>"
out += "<span class='info'>[icon2html(I, user)] It has \the [I] loaded.</span>"
CHECK_TICK
if(tank)
out += "<span class='notice'>[bicon(tank)] It has \the [tank] mounted onto it.</span>"
out += "<span class='notice'>[icon2html(tank, user)] It has \the [tank] mounted onto it.</span>"
to_chat(user, out.Join("<br>"))
/obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params)
@@ -108,11 +109,7 @@
if(!istype(user) && !target)
return
var/discharge = 0
if(user.dna.check_mutation(HULK))
to_chat(user, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
return
if(NOGUNS in user.dna.species.species_traits)
to_chat(user, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
if(!can_trigger_gun(user))
return
if(!loadedItems || !loadedWeightClass)
to_chat(user, "<span class='warning'>\The [src] has nothing loaded.</span>")
+1 -1
View File
@@ -26,7 +26,7 @@
to_chat(user, "<span class='notice'>You'll need to get closer to see any more.</span>")
return
if(tank)
to_chat(user, "<span class='notice'>[bicon(tank)] It has \the [tank] mounted onto it.</span>")
to_chat(user, "<span class='notice'>[icon2html(tank, user)] It has \the [tank] mounted onto it.</span>")
/obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params)
+9 -8
View File
@@ -12,31 +12,31 @@
/obj/item/weapon/sharpener/attackby(obj/item/I, mob/user, params)
if(used)
to_chat(user, "<span class='notice'>The sharpening block is too worn to use again.</span>")
to_chat(user, "<span class='warning'>The sharpening block is too worn to use again!</span>")
return
if(I.force >= max || I.throwforce >= max)//no esword sharpening
to_chat(user, "<span class='notice'>[I] is much too powerful to sharpen further.</span>")
to_chat(user, "<span class='warning'>[I] is much too powerful to sharpen further!</span>")
return
if(requires_sharpness && !I.sharpness)
to_chat(user, "<span class='notice'>You can only sharpen items that are already sharp, such as knives.</span>")
to_chat(user, "<span class='warning'>You can only sharpen items that are already sharp, such as knives!</span>")
return
if(istype(I, /obj/item/weapon/melee/transforming/energy))
to_chat(user, "<span class='notice'>You don't think \the [I] will be the thing getting modified if you use it on \the [src].</span>")
to_chat(user, "<span class='warning'>You don't think \the [I] will be the thing getting modified if you use it on \the [src]!</span>")
return
if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff
var/obj/item/weapon/twohanded/TH = I
if(TH.force_wielded >= max)
to_chat(user, "<span class='notice'>[TH] is much too powerful to sharpen further.</span>")
to_chat(user, "<span class='warning'>[TH] is much too powerful to sharpen further!</span>")
return
if(TH.wielded)
to_chat(user, "<span class='notice'>[TH] must be unwielded before it can be sharpened.</span>")
to_chat(user, "<span class='warning'>[TH] must be unwielded before it can be sharpened!</span>")
return
if(TH.force_wielded > initial(TH.force_wielded))
to_chat(user, "<span class='notice'>[TH] has already been refined before. It cannot be sharpened further.</span>")
to_chat(user, "<span class='warning'>[TH] has already been refined before. It cannot be sharpened further!</span>")
return
TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
if(I.force > initial(I.force))
to_chat(user, "<span class='notice'>[I] has already been refined before. It cannot be sharpened further.</span>")
to_chat(user, "<span class='warning'>[I] has already been refined before. It cannot be sharpened further!</span>")
return
user.visible_message("<span class='notice'>[user] sharpens [I] with [src]!</span>", "<span class='notice'>You sharpen [I], making it much more deadly than before.</span>")
I.sharpness = IS_SHARP_ACCURATE
@@ -46,6 +46,7 @@
name = "worn out [name]"
desc = "[desc] At least, it used to."
used = 1
update_icon()
/obj/item/weapon/sharpener/super
name = "super whetstone"
@@ -1,4 +1,5 @@
/obj/item/weapon
var/trigger_guard = TRIGGER_GUARD_NONE
/obj/item/weapon/banhammer
desc = "A banhammer"
@@ -584,3 +585,8 @@
throwforce = 0
flags = DROPDEL | ABSTRACT
attack_verb = list("bopped")
/obj/item/weapon/proc/can_trigger_gun(mob/living/user)
if(!user.can_use_guns(src))
return FALSE
return TRUE
+2 -2
View File
@@ -12,8 +12,8 @@
max_integrity = 150
integrity_failure = 50
/obj/structure/fireaxecabinet/New()
..()
/obj/structure/fireaxecabinet/Initialize()
. = ..()
update_icon()
/obj/structure/fireaxecabinet/Destroy()
+36 -40
View File
@@ -1,12 +1,13 @@
/obj/structure/flora
resistance_flags = FLAMMABLE
obj_integrity = 150
max_integrity = 150
anchored = TRUE
anchored = 1
//trees
/obj/structure/flora/tree
name = "tree"
density = TRUE
density = 1
pixel_x = -16
layer = FLY_LAYER
var/cut = FALSE
@@ -25,7 +26,7 @@
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0)
icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "tree_stump"
density = FALSE
density = 0
pixel_x = -16
name += " stump"
cut = TRUE
@@ -45,14 +46,14 @@
/obj/structure/flora/tree/pine/Initialize()
icon_state = "pine_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/tree/pine/xmas
name = "xmas tree"
icon_state = "pine_c"
/obj/structure/flora/tree/pine/xmas/Initialize()
..()
. = ..()
icon_state = "pine_c"
/obj/structure/flora/tree/dead
@@ -64,7 +65,7 @@
icon_state = "palm1"
/obj/structure/flora/tree/palm/Initialize()
..()
. = ..()
icon_state = pick("palm1","palm2")
pixel_x = 0
@@ -76,7 +77,7 @@
/obj/structure/flora/tree/dead/Initialize()
icon_state = "tree_[rand(1, 6)]"
..()
. = ..()
/obj/structure/flora/tree/jungle
name = "tree"
@@ -88,12 +89,7 @@
/obj/structure/flora/tree/jungle/Initialize()
icon_state = "[icon_state][rand(1, 6)]"
..()
/obj/structure/flora/tree/jungle/small
pixel_y = 0
pixel_x = -32
icon = 'icons/obj/flora/jungletreesmall.dmi'
. = ..()
//grass
/obj/structure/flora/grass
@@ -106,7 +102,7 @@
/obj/structure/flora/grass/brown/Initialize()
icon_state = "snowgrass[rand(1, 3)]bb"
..()
. = ..()
/obj/structure/flora/grass/green
@@ -114,14 +110,14 @@
/obj/structure/flora/grass/green/Initialize()
icon_state = "snowgrass[rand(1, 3)]gb"
..()
. = ..()
/obj/structure/flora/grass/both
icon_state = "snowgrassall1"
/obj/structure/flora/grass/both/Initialize()
icon_state = "snowgrassall[rand(1, 3)]"
..()
. = ..()
//bushes
@@ -129,11 +125,11 @@
name = "bush"
icon = 'icons/obj/flora/snowflora.dmi'
icon_state = "snowbush1"
anchored = TRUE
anchored = 1
/obj/structure/flora/bush/Initialize()
icon_state = "snowbush[rand(1, 6)]"
..()
. = ..()
//newbushes
@@ -145,112 +141,112 @@
/obj/structure/flora/ausbushes/Initialize()
if(icon_state == "firstbush_1")
icon_state = "firstbush_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/reedbush
icon_state = "reedbush_1"
/obj/structure/flora/ausbushes/reedbush/Initialize()
icon_state = "reedbush_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/leafybush
icon_state = "leafybush_1"
/obj/structure/flora/ausbushes/leafybush/Initialize()
icon_state = "leafybush_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/palebush
icon_state = "palebush_1"
/obj/structure/flora/ausbushes/palebush/Initialize()
icon_state = "palebush_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/stalkybush
icon_state = "stalkybush_1"
/obj/structure/flora/ausbushes/stalkybush/Initialize()
icon_state = "stalkybush_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/grassybush
icon_state = "grassybush_1"
/obj/structure/flora/ausbushes/grassybush/Initialize()
icon_state = "grassybush_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/fernybush
icon_state = "fernybush_1"
/obj/structure/flora/ausbushes/fernybush/Initialize()
icon_state = "fernybush_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/sunnybush
icon_state = "sunnybush_1"
/obj/structure/flora/ausbushes/sunnybush/Initialize()
icon_state = "sunnybush_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/genericbush
icon_state = "genericbush_1"
/obj/structure/flora/ausbushes/genericbush/Initialize()
icon_state = "genericbush_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/pointybush
icon_state = "pointybush_1"
/obj/structure/flora/ausbushes/pointybush/Initialize()
icon_state = "pointybush_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/lavendergrass
icon_state = "lavendergrass_1"
/obj/structure/flora/ausbushes/lavendergrass/Initialize()
icon_state = "lavendergrass_[rand(1, 4)]"
..()
. = ..()
/obj/structure/flora/ausbushes/ywflowers
icon_state = "ywflowers_1"
/obj/structure/flora/ausbushes/ywflowers/Initialize()
icon_state = "ywflowers_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/brflowers
icon_state = "brflowers_1"
/obj/structure/flora/ausbushes/brflowers/Initialize()
icon_state = "brflowers_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/ppflowers
icon_state = "ppflowers_1"
/obj/structure/flora/ausbushes/ppflowers/Initialize()
icon_state = "ppflowers_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/sparsegrass
icon_state = "sparsegrass_1"
/obj/structure/flora/ausbushes/sparsegrass/Initialize()
icon_state = "sparsegrass_[rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/ausbushes/fullgrass
icon_state = "fullgrass_1"
/obj/structure/flora/ausbushes/fullgrass/Initialize()
icon_state = "fullgrass_[rand(1, 3)]"
..()
. = ..()
/obj/item/weapon/twohanded/required/kirbyplants
name = "potted plant"
@@ -308,10 +304,10 @@
desc = "A volcanic rock"
icon = 'icons/obj/flora/rocks.dmi'
resistance_flags = FIRE_PROOF
density = TRUE
density = 1
/obj/structure/flora/rock/Initialize()
..()
. = ..()
icon_state = "[icon_state][rand(1,3)]"
/obj/structure/flora/rock/pile
@@ -319,7 +315,7 @@
desc = "A pile of rocks"
/obj/structure/flora/rock/pile/Initialize()
..()
. = ..()
icon_state = "[icon_state][rand(1,3)]"
//Jungle grass
@@ -333,7 +329,7 @@
/obj/structure/flora/grass/jungle/Initialize()
icon_state = "[icon_state][rand(1, 5)]"
..()
. = ..()
/obj/structure/flora/grass/jungle/b
icon_state = "grassb"
@@ -348,7 +344,7 @@
density = FALSE
/obj/structure/flora/rock/jungle/Initialize()
..()
. = ..()
icon_state = "[initial(icon_state)][rand(1,5)]"
@@ -361,7 +357,7 @@
/obj/structure/flora/junglebush/Initialize()
icon_state = "[icon_state][rand(1, 3)]"
..()
. = ..()
/obj/structure/flora/junglebush/b
icon_state = "bushb"
+28
View File
@@ -0,0 +1,28 @@
diff a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm (rejected hunks)
@@ -89,7 +89,7 @@
/obj/structure/flora/tree/jungle/Initialize()
icon_state = "[icon_state][rand(1, 6)]"
- ..()
+ . = ..()
//grass
/obj/structure/flora/grass
@@ -307,7 +307,7 @@
density = 1
/obj/structure/flora/rock/Initialize()
- ..()
+ . = ..()
icon_state = "[icon_state][rand(1,3)]"
/obj/structure/flora/rock/pile
@@ -381,5 +381,5 @@
pixel_y = -16
/obj/structure/flora/rock/pile/largejungle/Initialize()
- ..()
- icon_state = "[initial(icon_state)][rand(1,3)]"
\ No newline at end of file
+ . = ..()
+ icon_state = "[initial(icon_state)][rand(1,3)]"

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