This commit is contained in:
Dax Dupont
2018-06-14 13:47:34 +02:00
152 changed files with 1062 additions and 749 deletions
+3 -3
View File
@@ -651,7 +651,7 @@
var/atom/A = new chosen(usr.loc)
A.flags_1 |= ADMIN_SPAWNED_1
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] spawned [chosen] at [AREACOORD(usr)]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/spawn_cargo(object as text)
@@ -669,7 +669,7 @@
S.admin_spawned = TRUE
S.generate(get_turf(usr))
log_admin("[key_name(usr)] spawned cargo pack [chosen] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] spawned cargo pack [chosen] at [AREACOORD(usr)]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Cargo") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -725,7 +725,7 @@
to_chat(usr, "<b>AI [key_name(S, usr)]'s laws:</b>")
else if(iscyborg(S))
var/mob/living/silicon/robot/R = S
to_chat(usr, "<b>CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"]: laws:</b>")
to_chat(usr, "<b>CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [key_name(R.connected_ai)])":"(Independent)"]: laws:</b>")
else if (ispAI(S))
to_chat(usr, "<b>pAI [key_name(S, usr)]'s laws:</b>")
else
+3 -3
View File
@@ -594,8 +594,8 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
if(!message)
return
O.say(message)
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say \"[message]\"")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say \"[message]\"</span>")
log_admin("[key_name(usr)] made [O] at [AREACOORD(O)] say \"[message]\"")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] made [O] at [AREACOORD(O)]. say \"[message]\"</span>")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/togglebuildmodeself()
set name = "Toggle Build Mode Self"
@@ -686,7 +686,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
if (tile)
var/mob/living/carbon/human/hooman = new(tile)
hooman.equipOutfit(pick(subtypesof(/datum/outfit)))
testing("Spawned test mob at [tile.x],[tile.y],[tile.z]")
testing("Spawned test mob at [COORD(tile)]")
while (!area && --j > 0)
/client/proc/toggle_AI_interact()
+7 -8
View File
@@ -146,9 +146,9 @@
if(!SSdbcore.Connect())
to_chat(usr, "<span class='danger'>Failed to establish database connection.</span>")
return
var/output
var/list/output = list()
var/ruler = "<hr style='background:#000000; border:0; height:3px'>"
var/navbar = "<a href='?_src_=holder;[HrefToken()];nonalpha=1'>\[All\]</a>|<a href='?_src_=holder;[HrefToken()];nonalpha=2'>\[#\]</a>"
var/list/navbar = list("<a href='?_src_=holder;[HrefToken()];nonalpha=1'>\[All\]</a>|<a href='?_src_=holder;[HrefToken()];nonalpha=2'>\[#\]</a>")
for(var/letter in GLOB.alphabet)
navbar += "|<a href='?_src_=holder;[HrefToken()];showmessages=[letter]'>\[[letter]\]</a>"
navbar += "|<a href='?_src_=holder;[HrefToken()];showmemo=1'>\[Memos\]</a>|<a href='?_src_=holder;[HrefToken()];showwatch=1'>\[Watchlist\]</a>"
@@ -198,9 +198,9 @@
var/datum/DBQuery/query_get_messages = SSdbcore.NewQuery("SELECT type, secret, id, adminckey, text, timestamp, server, lasteditor, DATEDIFF(NOW(), timestamp) AS `age` FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey = '[target_ckey]' AND deleted = 0 ORDER BY timestamp DESC")
if(!query_get_messages.warn_execute())
return
var/messagedata
var/watchdata
var/notedata
var/list/messagedata = list()
var/list/watchdata = list()
var/list/notedata = list()
var/skipped = 0
while(query_get_messages.NextRow())
type = query_get_messages.item[1]
@@ -230,8 +230,7 @@
skipped = TRUE
alphatext = "filter: alpha(opacity=[alpha]); opacity: [alpha/100];"
var/data
data += "<p style='margin:0px;[alphatext]'> <b>[timestamp] | [server] | [admin_ckey]</b>"
var/list/data = list("<p style='margin:0px;[alphatext]'> <b>[timestamp] | [server] | [admin_ckey]</b>")
if(!linkless)
data += " <a href='?_src_=holder;[HrefToken()];deletemessage=[id]'>\[Delete\]</a>"
if(type == "note")
@@ -304,7 +303,7 @@
else if(!type && !target_ckey && !index)
output += "<center></a> <a href='?_src_=holder;[HrefToken()];addmessageempty=1'>\[Add message\]</a><a href='?_src_=holder;[HrefToken()];addwatchempty=1'>\[Add watchlist entry\]</a><a href='?_src_=holder;[HrefToken()];addnoteempty=1'>\[Add note\]</a></center>"
output += ruler
usr << browse({"<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /></head><body>[output]</body></html>"}, "window=browse_messages;size=900x500")
usr << browse({"<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /></head><body>[jointext(output, "")]</body></html>"}, "window=browse_messages;size=900x500")
proc/get_message_output(type, target_ckey)
if(!SSdbcore.Connect())
+8 -8
View File
@@ -278,10 +278,10 @@
T.PlaceOnTop(/turf/closed/wall)
else if(iswallturf(object))
T.PlaceOnTop(/turf/closed/wall/r_wall)
log_admin("Build Mode: [key_name(user)] built [T] at ([T.x],[T.y],[T.z])")
log_admin("Build Mode: [key_name(user)] built [T] at [AREACOORD(T)]")
return
else if(right_click)
log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])")
log_admin("Build Mode: [key_name(user)] deleted [object] at [AREACOORD(object)]")
if(isturf(object))
var/turf/T = object
T.ScrapeAway()
@@ -289,7 +289,7 @@
qdel(object)
return
else if(isturf(object) && alt_click && left_click)
log_admin("Build Mode: [key_name(user)] built an airlock at ([object.x],[object.y],[object.z])")
log_admin("Build Mode: [key_name(user)] built an airlock at [AREACOORD(object)]")
new/obj/machinery/door/airlock(get_turf(object))
else if(isturf(object) && ctrl_click && left_click)
var/obj/structure/window/reinforced/window
@@ -298,7 +298,7 @@
else
window = new /obj/structure/window/reinforced(get_turf(object))
window.setDir(build_dir)
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
log_admin("Build Mode: [key_name(user)] built a window at [AREACOORD(object)]")
if(ADV_BUILDMODE)
if(left_click && alt_click)
objholder = object.type
@@ -306,15 +306,15 @@
else if(left_click)
if(ispath(objholder, /turf))
var/turf/T = get_turf(object)
log_admin("Build Mode: [key_name(user)] modified [T] ([T.x],[T.y],[T.z]) to [objholder]")
log_admin("Build Mode: [key_name(user)] modified [T] in [AREACOORD(object)] to [objholder]")
T.PlaceOnTop(objholder)
else
var/obj/A = new objholder (get_turf(object))
A.setDir(build_dir)
log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [build_dir]")
log_admin("Build Mode: [key_name(user)] modified [A]'s [COORD(A)] dir to [build_dir]")
else if(right_click)
if(isobj(object))
log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])")
log_admin("Build Mode: [key_name(user)] deleted [object] at [AREACOORD(object)]")
qdel(object)
if(VAR_BUILDMODE)
@@ -343,7 +343,7 @@
if(right_click)
if(throw_atom)
throw_atom.throw_at(object, 10, 1,user)
log_admin("Build Mode: [key_name(user)] threw [throw_atom] at [object] ([object.x],[object.y],[object.z])")
log_admin("Build Mode: [key_name(user)] threw [throw_atom] at [object] in [AREACOORD(object)]")
if(AREA_BUILDMODE)
if(left_click) //rectangular
if(!cornerA)
+1 -1
View File
@@ -75,7 +75,7 @@
for (var/device in f)
if (istype(device, /atom))
var/atom/A = device
output += "&nbsp;&nbsp;&nbsp;&nbsp;[device] ([A.x],[A.y],[A.z] in area [get_area(device)])<br>"
output += "&nbsp;&nbsp;&nbsp;&nbsp;[device] ([AREACOORD(A)])<br>"
else
output += "&nbsp;&nbsp;&nbsp;&nbsp;[device]<br>"
+2 -2
View File
@@ -9,8 +9,8 @@
var/turf/T = get_turf(O)
if(T)
log_admin("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])")
message_admins("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])")
log_admin("[key_name(usr)] has possessed [O] ([O.type]) at [AREACOORD(T)]")
message_admins("[key_name(usr)] has possessed [O] ([O.type]) at [AREACOORD(T)]")
else
log_admin("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location")
message_admins("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location")
+3 -3
View File
@@ -28,11 +28,11 @@
if(!check_rights(R_ADMIN))
return
message_admins("[key_name_admin(src)] has started answering [key_name(M.key, 0, 0)]'s prayer.")
message_admins("[key_name_admin(src)] has started answering [ADMIN_LOOKUPFLW(M)]'s prayer.")
var/msg = input("Message:", text("Subtle PM to [M.key]")) as text|null
if (!msg)
message_admins("[key_name_admin(src)] decided not to answer [key_name(M.key, 0, 0)]'s prayer")
message_admins("[key_name_admin(src)] decided not to answer [ADMIN_LOOKUPFLW(M)]'s prayer")
return
if(usr)
if (usr.client)
@@ -856,7 +856,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
N.set_safety()
N.set_active()
log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z]).")
log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [AREACOORD(N)].")
message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_VERBOSEJMP(N)].")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Nuke", "[N.timing]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -66,5 +66,5 @@
basemob.ckey = mainsettings["ckey"]["value"]
log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at [AREACOORD(usr)]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn object-mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -359,7 +359,7 @@
to_chat(L, "<span class='italics'>You hear a voice in your head saying: </span><span class='abductor'>[message]</span>")
to_chat(user, "<span class='notice'>You send the message to your target.</span>")
log_talk(user,"[key_name(user)] sent an abductor mind message to [L]/[L.ckey]: '[message]'", LOGSAY)
log_talk(user,"[key_name(user)] sent an abductor mind message to [key_name(L)]: '[message]'", LOGSAY)
/obj/item/firing_pin/abductor
+2 -2
View File
@@ -496,12 +496,12 @@ structure_check() searches for nearby cultist structures required for the invoca
if((istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user)))
user.visible_message("<span class='warning'>[user.name] begins erasing [src]...</span>", "<span class='notice'>You begin erasing [src]...</span>")
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with [I.name]")
log_game("Summon Narsie rune erased by [key_name(user)] with [I.name]")
message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with [I.name]")
..()
else
if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
log_game("Summon Narsie rune erased by [key_name(user)] using a null rod")
message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with a null rod")
..()
@@ -81,7 +81,7 @@ the new instance inside the host to be updated to the template's stats.
/mob/camera/disease/Login()
..()
if(freemove)
to_chat(src, "<span class='warning'>You have [round((freemove_end - world.time)/10)] seconds to select your first host. Click on a human to select your host.</span>")
to_chat(src, "<span class='warning'>You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.</span>")
/mob/camera/disease/Stat()
@@ -285,7 +285,7 @@ the new instance inside the host to be updated to the template's stats.
..()
/mob/camera/disease/proc/adapt_cooldown()
to_chat(src, "<span class='notice'>You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.</span>")
to_chat(src, "<span class='notice'>You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].</span>")
next_adaptation_time = world.time + adaptation_cooldown
addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown)
@@ -371,11 +371,11 @@
if(timing)
previous_level = get_security_level()
bomb_set = TRUE
set_security_level("delta")
detonation_timer = world.time + (timer_set * 10)
for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list)
S.switch_mode_to(TRACK_INFILTRATOR)
countdown.start()
set_security_level("delta")
else
bomb_set = FALSE
detonation_timer = null
@@ -4,11 +4,6 @@
#define PROB_ACTUAL_TRAITOR 20
#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent"
/datum/antagonist/traitor/internal_affairs
name = "Internal Affairs Agent"
antagpanel_category = "IAA"
/datum/antagonist/traitor/internal_affairs
name = "Internal Affairs Agent"
employer = "Nanotrasen"
@@ -283,7 +283,7 @@
if(BODY_ZONE_PRECISE_MOUTH)
var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
target.say(wgw)
log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.")
log_game("[key_name(user)] made [key_name(target)] say [wgw] with a voodoo doll.")
if(BODY_ZONE_PRECISE_EYES)
user.set_machine(src)
user.reset_perspective(target)
@@ -100,13 +100,13 @@
if (atmos_overlay_types)
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
vars["vis_contents"] -= overlay
vis_contents -= overlay
if (new_overlay_types.len)
if (atmos_overlay_types)
vars["vis_contents"] += new_overlay_types - atmos_overlay_types //don't add overlays that already exist
vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist
else
vars["vis_contents"] += new_overlay_types
vis_contents += new_overlay_types
UNSETEMPTY(new_overlay_types)
src.atmos_overlay_types = new_overlay_types
@@ -1,23 +1,40 @@
//node2, air2, network2 correspond to input
//node1, air1, network1 correspond to output
#define CIRCULATOR_COLD 0
#define CIRCULATOR_HOT 1
/obj/machinery/atmospherics/components/binary/circulator
name = "circulator/heat exchanger"
desc = "A gas circulator pump and heat exchanger."
icon_state = "circ1-off"
icon_state = "circ-off"
var/side = CIRC_LEFT
var/status = 0
var/active = FALSE
var/last_pressure_delta = 0
pipe_flags = PIPING_ONE_PER_TURF
density = TRUE
var/global/const/CIRC_LEFT = 1
var/global/const/CIRC_RIGHT = 2
var/mode = CIRCULATOR_HOT
var/obj/machinery/power/generator/generator
//default cold circ for mappers
/obj/machinery/atmospherics/components/binary/circulator/cold
mode = CIRCULATOR_COLD
/obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload)
.=..()
component_parts = list(new /obj/item/circuitboard/machine/circulator)
/obj/machinery/atmospherics/components/binary/circulator/ComponentInitialize()
. = ..()
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS )
/obj/machinery/atmospherics/components/binary/circulator/Destroy()
if(generator)
disconnectFromGenerator()
..()
/obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air()
@@ -56,11 +73,55 @@
/obj/machinery/atmospherics/components/binary/circulator/update_icon()
if(!is_operational())
icon_state = "circ[side]-p"
icon_state = "circ-p"
else if(last_pressure_delta > 0)
if(last_pressure_delta > ONE_ATMOSPHERE)
icon_state = "circ[side]-run"
icon_state = "circ-run"
else
icon_state = "circ[side]-slow"
icon_state = "circ-slow"
else
icon_state = "circ[side]-off"
icon_state = "circ-off"
/obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I)
if(!panel_open)
return
anchored = !anchored
I.play_tool_sound(src)
if(generator)
disconnectFromGenerator()
to_chat(user, "<span class='notice'>You [anchored?"secure":"unsecure"] [src].</span>")
return TRUE
/obj/machinery/atmospherics/components/binary/circulator/multitool_act(mob/living/user, obj/item/I)
if(generator)
disconnectFromGenerator()
mode = !mode
to_chat(user, "<span class='notice'>You set [src] to [mode?"cold":"hot"] mode.</span>")
return TRUE
/obj/machinery/atmospherics/components/binary/circulator/screwdriver_act(mob/user, obj/item/I)
panel_open = !panel_open
I.play_tool_sound(src)
to_chat(user, "<span class='notice'>You [panel_open?"open":"close"] the panel on [src].</span>")
return TRUE
/obj/machinery/atmospherics/components/binary/circulator/crowbar_act(mob/user, obj/item/I)
default_deconstruction_crowbar(I)
return TRUE
/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction()
if(generator)
disconnectFromGenerator()
/obj/machinery/atmospherics/components/binary/circulator/proc/disconnectFromGenerator()
if(mode)
generator.cold_circ = null
else
generator.hot_circ = null
generator.update_icon()
generator = null
/obj/machinery/atmospherics/components/binary/circulator/setPipingLayer(new_layer)
..()
pixel_x = 0
pixel_y = 0
+1 -1
View File
@@ -40,7 +40,7 @@
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
if(ghost_role == "No" || !loc)
return
log_game("[user.ckey] became [mob_name]")
log_game("[key_name(user)] became [mob_name]")
create(ckey = user.ckey)
/obj/effect/mob_spawn/Initialize(mapload)
+5 -4
View File
@@ -1123,18 +1123,19 @@
/datum/supply_pack/medical/virus
name = "Virus Crate"
desc = "Contains twelve different bottles, each filled with a different chemical compound, each useful for virology. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open."
desc = "Contains twelve different bottles, containing several viral samples for virology research. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open."
cost = 2500
access = ACCESS_CMO
contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion,
/obj/item/reagent_containers/glass/bottle/cold,
/obj/item/reagent_containers/glass/bottle/epiglottis_virion,
/obj/item/reagent_containers/glass/bottle/liver_enhance_virion,
/obj/item/reagent_containers/glass/bottle/random_virus,
/obj/item/reagent_containers/glass/bottle/random_virus,
/obj/item/reagent_containers/glass/bottle/random_virus,
/obj/item/reagent_containers/glass/bottle/random_virus,
/obj/item/reagent_containers/glass/bottle/fake_gbs,
/obj/item/reagent_containers/glass/bottle/magnitis,
/obj/item/reagent_containers/glass/bottle/pierrot_throat,
/obj/item/reagent_containers/glass/bottle/brainrot,
/obj/item/reagent_containers/glass/bottle/hallucigen_virion,
/obj/item/reagent_containers/glass/bottle/anxiety,
/obj/item/reagent_containers/glass/bottle/beesease,
/obj/item/storage/box/syringes,
+2
View File
@@ -773,6 +773,8 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if (isliving(mob))
var/mob/living/M = mob
M.update_damage_hud()
if (prefs.auto_fit_viewport)
fit_viewport()
/client/proc/generate_clickcatcher()
if(!void)
+9 -2
View File
@@ -114,6 +114,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/parallax
var/ambientocclusion = TRUE
var/auto_fit_viewport = FALSE
var/uplink_spawn_loc = UPLINK_PDA
@@ -157,7 +158,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return
update_preview_icon()
user << browse_rsc(preview_icon, "previewicon.png")
var/dat = "<center>"
var/list/dat = list("<center>")
dat += "<a href='?_src_=prefs;preference=tab;tab=0' [current_tab == 0 ? "class='linkOn'" : ""]>Character Settings</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
@@ -512,6 +513,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</a><br>"
dat += "<b>Ambient Occlusion:</b> <a href='?_src_=prefs;preference=ambientocclusion'>[ambientocclusion ? "Enabled" : "Disabled"]</a><br>"
dat += "<b>Fit Viewport:</b> <a href='?_src_=prefs;preference=auto_fit_viewport'>[auto_fit_viewport ? "Auto" : "Manual"]</a><br>"
if (CONFIG_GET(flag/maprotation))
var/p_map = preferred_map
@@ -604,7 +606,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</center>"
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 640, 770)
popup.set_content(dat)
popup.set_content(dat.Join())
popup.open(0)
#undef APPEARANCE_CATEGORY_COLUMN
@@ -1495,6 +1497,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen
PM.backdrop(parent.mob)
if("auto_fit_viewport")
auto_fit_viewport = !auto_fit_viewport
if(auto_fit_viewport && parent)
parent.fit_viewport()
if("save")
save_preferences()
save_character()
@@ -98,6 +98,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["clientfps"] >> clientfps
S["parallax"] >> parallax
S["ambientocclusion"] >> ambientocclusion
S["auto_fit_viewport"] >> auto_fit_viewport
S["menuoptions"] >> menuoptions
S["enable_tips"] >> enable_tips
S["tip_delay"] >> tip_delay
@@ -122,6 +123,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport))
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
@@ -168,6 +170,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["clientfps"], clientfps)
WRITE_FILE(S["parallax"], parallax)
WRITE_FILE(S["ambientocclusion"], ambientocclusion)
WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport)
WRITE_FILE(S["menuoptions"], menuoptions)
WRITE_FILE(S["enable_tips"], enable_tips)
WRITE_FILE(S["tip_delay"], tip_delay)
+46
View File
@@ -298,3 +298,49 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR)
set desc = "View the last round end report you've seen"
SSticker.show_roundend_report(src, TRUE)
/client/verb/fit_viewport()
set name = "Fit Viewport"
set category = "OOC"
set desc = "Fit the width of the map window to match the viewport"
// Fetch aspect ratio
var/view_size = getviewsize(view)
var/aspect_ratio = view_size[1] / view_size[2]
// Calculate desired pixel width using window size and aspect ratio
var/sizes = params2list(winget(src, "mainwindow.split;mapwindow", "size"))
var/map_size = splittext(sizes["mapwindow.size"], "x")
var/height = text2num(map_size[2])
var/desired_width = round(height * aspect_ratio)
if (text2num(map_size[1]) == desired_width)
// Nothing to do
return
var/split_size = splittext(sizes["mainwindow.split.size"], "x")
var/split_width = text2num(split_size[1])
// Calculate and apply a best estimate
// +4 pixels are for the width of the splitter's handle
var/pct = 100 * (desired_width + 4) / split_width
winset(src, "mainwindow.split", "splitter=[pct]")
// Apply an ever-lowering offset until we finish or fail
var/delta
for(var/safety in 1 to 10)
var/after_size = winget(src, "mapwindow", "size")
map_size = splittext(after_size, "x")
var/got_width = text2num(map_size[1])
if (got_width == desired_width)
// success
return
else if (isnull(delta))
// calculate a probable delta value based on the difference
delta = 100 * (desired_width - got_width) / split_width
else if ((delta > 0 && got_width > desired_width) || (delta < 0 && got_width < desired_width))
// if we overshot, halve the delta and reverse direction
delta = -delta/2
pct += delta
winset(src, "mainwindow.split", "splitter=[pct]")
+5 -3
View File
@@ -5,11 +5,13 @@
ears = /obj/item/radio/headset
id = /obj/item/card/id
/datum/outfit/vr/pre_equip(mob/living/carbon/human/H)
H.dna.species.before_equip_job(null, H)
/datum/outfit/vr/post_equip(mob/living/carbon/human/H)
var/datum/job/captain/J = new/datum/job/captain
var/obj/item/card/id/id = H.wear_id
if (id)
id.access |= J.get_access()
if (istype(id))
id.access |= get_all_accesses()
/datum/outfit/vr/syndicate
name = "Syndicate VR Operative - Basic"
@@ -732,35 +732,3 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
/obj/item/clothing/under/swimsuit
name = "black swimsuit"
desc = "Perfect for the beach episode."
icon_state = "swim_black"
item_state = "bl_suit"
item_color = "swim_black"
can_adjust = FALSE
/obj/item/clothing/under/swimsuit/blue
name = "blue swimsuit"
icon_state = "swim_blue"
item_state = "b_suit"
item_color = "swim_blue"
/obj/item/clothing/under/swimsuit/green
name = "green swimsuit"
icon_state = "swim_green"
item_state = "g_suit"
item_color = "swim_green"
/obj/item/clothing/under/swimsuit/purple
name = "purple swimsuit"
icon_state = "swim_purple"
item_state = "p_suit"
item_color = "swim_purple"
/obj/item/clothing/under/swimsuit/red
name = "red swimsuit"
icon_state = "swim_red"
item_state = "r_suit"
item_color = "swim_red"
+3 -3
View File
@@ -23,9 +23,9 @@
var/datum/team/abductor_team/T = new
if(T.team_number > ABDUCTOR_MAX_TEAMS)
return MAP_ERROR
log_game("[scientist.mind.key] (ckey) has been selected as [T.name] abductor scientist.")
log_game("[agent.mind.key] (ckey) has been selected as [T.name] abductor agent.")
log_game("[key_name(scientist)] has been selected as [T.name] abductor scientist.")
log_game("[key_name(agent)] has been selected as [T.name] abductor agent.")
scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, T)
agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, T)
+1 -21
View File
@@ -61,7 +61,7 @@
else
D = new virus_type()
else
D = make_virus(max_severity, max_severity)
D = new /datum/disease/advance/random(max_severity, max_severity)
D.carrier = TRUE
H.ForceContractDisease(D, FALSE, TRUE)
@@ -73,23 +73,3 @@
message_admins("An event has triggered a random advanced virus outbreak on [ADMIN_LOOKUPFLW(H)]! It has these symptoms: [english_list(name_symptoms)]")
log_game("An event has triggered a random advanced virus outbreak on [key_name(H)]! It has these symptoms: [english_list(name_symptoms)]")
break
/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level)
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
max_symptoms = VIRUS_SYMPTOM_LIMIT
var/datum/disease/advance/A = new /datum/disease/advance()
var/list/datum/symptom/possible_symptoms = list()
for(var/symptom in subtypesof(/datum/symptom))
var/datum/symptom/S = symptom
if(initial(S.level) > max_level)
continue
if(initial(S.level) <= 0) //unobtainable symptoms
continue
possible_symptoms += S
for(var/i in 1 to max_symptoms)
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
if(chosen_symptom)
var/datum/symptom/S = new chosen_symptom
A.symptoms += S
A.Refresh() //just in case someone already made and named the same disease
return A
@@ -35,7 +35,7 @@
return 0
if(M == user)
to_chat(M, "<span class='notice'>You swallow a gulp of [src].</span>")
user.visible_message("<span class='notice'>[user] swallows a gulp of [src].</span>", "<span class='notice'>You swallow a gulp of [src].</span>")
if(M.has_trait(TRAIT_VORACIOUS))
M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug!
@@ -51,6 +51,9 @@
if(user.a_intent != INTENT_HARM || !isGlass)
return ..()
if(user.has_trait(TRAIT_PACIFISM))
to_chat(user, "<span class='warning'>You don't want to harm [target]!</span>")
return
force = 15 //Smashing bottles over someoen's head hurts.
@@ -16,8 +16,9 @@
cut_overlays()
if(reagents.reagent_list.len)
var/datum/reagent/R = reagents.get_master_reagent()
name = R.glass_name
desc = R.glass_desc
if(!renamedByPlayer)
name = R.glass_name
desc = R.glass_desc
if(R.glass_icon_state)
icon_state = R.glass_icon_state
else
@@ -26,8 +27,7 @@
add_overlay(reagent_overlay)
else
icon_state = "glass_empty"
name = "drinking glass"
desc = "Your standard drinking glass."
renamedByPlayer = FALSE //so new drinks can rename the glass
//Shot glasses!//
// This lets us add shots in here instead of lumping them in with drinks because >logic //
@@ -41,7 +41,7 @@
return 0
if(M == user)
to_chat(M, "<span class='notice'>You swallow some of contents of \the [src].</span>")
user.visible_message("<span class='notice'>[user] swallows some of contents of \the [src].</span>", "<span class='notice'>You swallow some of contents of \the [src].</span>")
else
user.visible_message("<span class='warning'>[user] attempts to feed [M] from [src].</span>")
if(!do_mob(user, M))
+5 -5
View File
@@ -72,15 +72,15 @@
to_chat(M, "<span class='notice'>You don't feel like eating any more junk food at the moment.</span>")
return 0
else if(fullness <= 50)
to_chat(M, "<span class='notice'>You hungrily [eatverb] some of \the [src] and gobble it down!</span>")
user.visible_message("<span class='notice'>[user] hungrily takes a [eatverb] from \the [src], gobbling it down!</span>", "<span class='notice'>You hungrily take a [eatverb] from \the [src], gobbling it down!</span>")
else if(fullness > 50 && fullness < 150)
to_chat(M, "<span class='notice'>You hungrily begin to [eatverb] \the [src].</span>")
user.visible_message("<span class='notice'>[user] hungrily takes a [eatverb] from \the [src].</span>", "<span class='notice'>You hungrily take a [eatverb] from \the [src].</span>")
else if(fullness > 150 && fullness < 500)
to_chat(M, "<span class='notice'>You [eatverb] \the [src].</span>")
user.visible_message("<span class='notice'>[user] takes a [eatverb] from \the [src].</span>", "<span class='notice'>You take a [eatverb] from \the [src].</span>")
else if(fullness > 500 && fullness < 600)
to_chat(M, "<span class='notice'>You unwillingly [eatverb] a bit of \the [src].</span>")
user.visible_message("<span class='notice'>[user] unwillingly takes a [eatverb] of a bit of \the [src].</span>", "<span class='notice'>You unwillingly take a [eatverb] of a bit of \the [src].</span>")
else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
to_chat(M, "<span class='warning'>You cannot force any more of \the [src] to go down your throat!</span>")
user.visible_message("<span class='warning'>[user] cannot force any more of \the [src] to go down [user.p_their()] throat!</span>", "<span class='warning'>You cannot force any more of \the [src] to go down your throat!</span>")
return 0
if(M.has_trait(TRAIT_VORACIOUS))
M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom
@@ -633,6 +633,13 @@
required_catalysts = list("enzyme" = 5)
mix_message = "The rice grains ferment into a clear, sweet-smelling liquid."
/datum/chemical_reaction/peppermint_patty
name = "Peppermint Patty"
id = "peppermint_patty"
results = list("peppermint_patty" = 10)
required_reagents = list("hot_coco" = 6, "creme_de_cacao" = 1, "creme_de_menthe" = 1, "vodka" = 1, "menthol" = 1)
mix_message = "The coco turns mint green just as the strong scent hits your nose."
/datum/chemical_reaction/alexander
name = "Alexander"
id = "alexander"
@@ -198,7 +198,7 @@ function output(message, flag) {
if (flag !== 'internal')
opts.lastPang = Date.now();
message = byondDecode(message)
message = byondDecode(message).trim();
//The behemoth of filter-code (for Admin message filters)
//Note: This is proooobably hella inefficient
@@ -296,27 +296,30 @@ function output(message, flag) {
opts.messageCount--; //I guess the count should only ever equal the limit
}
// Create the element - if combining is off, we use it, and if it's on, we
// might discard it bug need to check its text content. Some messages vary
// only in HTML markup, have the same text content, and should combine.
var entry = document.createElement('div');
entry.innerHTML = message;
var trimmed_message = entry.textContent || entry.innerText || "";
var handled = false;
var trimmed_message = message.trim()
var lastmessages = $messages.children('div.entry:last-child');
if (opts.messageCombining && lastmessages.length && $last_message)
{
if($last_message == trimmed_message)
{
if(lastmessages.children('span.r').length)
{
var current_value = parseInt(lastmessages.children('span.r').text())
lastmessages.children('span.r').text(current_value+1)
if (opts.messageCombining) {
var lastmessages = $messages.children('div.entry:last-child').last();
if (lastmessages.length && $last_message && $last_message == trimmed_message) {
var badge = lastmessages.children('.r').last();
if (badge.length) {
badge = badge.detach();
badge.text(parseInt(badge.text()) + 1);
} else {
badge = $('<span/>', {'class': 'r', 'text': 2});
}
else
{
lastmessages.append($('<span/>', { 'class': 'r', 'text': 2}));
}
var insertedBadge = $(lastmessages).find('.r');
insertedBadge.animate({
lastmessages.html(message);
lastmessages.append(badge);
badge.animate({
"font-size": "0.9em"
}, 100, function() {
insertedBadge.animate({
badge.animate({
"font-size": "0.7em"
}, 100);
});
@@ -325,10 +328,8 @@ function output(message, flag) {
}
}
if(!handled)
{
if (!handled) {
//Actually append the message
var entry = document.createElement('div');
entry.className = 'entry';
if (filteredOut) {
@@ -337,7 +338,6 @@ function output(message, flag) {
}
$last_message = trimmed_message;
entry.innerHTML = trimmed_message;
$messages[0].appendChild(entry);
$(entry).find("img.icon").error(iconError);
//Actually do the snap
+8 -2
View File
@@ -30,16 +30,19 @@
bullet_bounce_sound = null
/turf/open/floor/holofloor/beach
gender = PLURAL
name = "sand"
icon = 'icons/misc/beach.dmi'
icon_state = "sand"
bullet_bounce_sound = null
/turf/open/floor/holofloor/beach/coast_t
gender = NEUTER
name = "coastline"
icon_state = "sandwater_t"
/turf/open/floor/holofloor/beach/coast_b
gender = NEUTER
name = "coastline"
icon_state = "sandwater_b"
@@ -57,6 +60,7 @@
. = ..()
/turf/open/floor/holofloor/basalt
gender = PLURAL
name = "basalt"
icon_state = "basalt0"
@@ -67,7 +71,7 @@
set_basalt_light(src)
/turf/open/floor/holofloor/space
name = "Space"
name = "\proper space"
icon = 'icons/turf/space.dmi'
icon_state = "0"
@@ -76,7 +80,7 @@
. = ..()
/turf/open/floor/holofloor/hyperspace
name = "hyperspace"
name = "\proper hyperspace"
icon = 'icons/turf/space.dmi'
icon_state = "speedspace_ns_1"
bullet_bounce_sound = null
@@ -110,6 +114,7 @@
queue_smooth(src)
/turf/open/floor/holofloor/snow
gender = PLURAL
name = "snow"
desc = "Looks cold."
icon = 'icons/turf/snow.dmi'
@@ -122,6 +127,7 @@
initial_gas_mix = "nob=7500;TEMP=2.7"
/turf/open/floor/holofloor/asteroid
gender = PLURAL
name = "asteroid sand"
icon = 'icons/turf/floors.dmi'
icon_state = "asteroid"
+1 -3
View File
@@ -45,8 +45,6 @@
rating = M.rating
maxwater = tmp_capacity * 50 // Up to 300
maxnutri = tmp_capacity * 5 // Up to 30
waterlevel = maxwater
nutrilevel = 3
/obj/machinery/hydroponics/Destroy()
if(myseed)
@@ -741,7 +739,7 @@
else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample))
if(!myseed)
if(istype(O, /obj/item/seeds/kudzu))
investigate_log("had Kudzu planted in it by [user.ckey]([user]) at ([x],[y],[z])","kudzu")
investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)]","kudzu")
if(!user.transferItemToLoc(O, src))
return
to_chat(user, "<span class='notice'>You plant [O].</span>")
@@ -306,7 +306,7 @@
else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample))
if(!TR.myseed)
if(istype(O, /obj/item/seeds/kudzu))
investigate_log("had Kudzu planted in it by [acting_object] at ([x],[y],[z])","kudzu")
investigate_log("had Kudzu planted in it by [acting_object] at [AREACOORD(src)]","kudzu")
acting_object.visible_message("<span class='notice'>[acting_object] plants [O].</span>")
TR.dead = 0
TR.myseed = O
+1 -1
View File
@@ -222,7 +222,7 @@
if(ACCESS_ENGINE)
return "Engineering"
if(ACCESS_ENGINE_EQUIP)
return "Power Equipment"
return "Power and Engineering Equipment"
if(ACCESS_MAINT_TUNNELS)
return "Maintenance"
if(ACCESS_EXTERNAL_AIRLOCKS)
+1 -1
View File
@@ -419,7 +419,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
alert("Database error encountered uploading to Archive")
return
else
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
log_game("[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
alert("Upload Complete. Uploaded title will be unavailable for printing for a short period")
if(href_list["newspost"])
if(!GLOB.news_network)
@@ -34,7 +34,7 @@
H.robust_searching = 1
H.friends += user
H.attack_same = 1
log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector")
log_game("[key_name(user)] has revived hostile mob [key_name(target)] with a malfunctioning lazarus injector")
else
H.attack_same = 0
loaded = 0
@@ -1231,7 +1231,7 @@
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_off"
return
add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to")
add_logs(user, beacon, "teleported self from [AREACOORD(source)] to")
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
for(var/t in RANGE_TURFS(1, T))
@@ -1278,7 +1278,7 @@
return
M.visible_message("<span class='hierophant_warning'>[M] fades in!</span>")
if(user != M)
add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])")
add_logs(user, M, "teleported", null, "from [AREACOORD(source)]")
/obj/item/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
if(!T)
@@ -777,6 +777,32 @@
icon_state = "female_commie"
gender = FEMALE
/datum/sprite_accessory/underwear/swimsuit
name = "Ladies Black Swimsuit"
icon_state = "swim_black"
gender = FEMALE
/datum/sprite_accessory/underwear/swimsuit_blue
name = "Ladies Blue Swimsuit"
icon_state = "swim_blue"
gender = FEMALE
/datum/sprite_accessory/underwear/swimsuit_green
name = "Ladies Green Swimsuit"
icon_state = "swim_green"
gender = FEMALE
/datum/sprite_accessory/underwear/swimsuit_purple
name = "Ladies Purple Swimsuit"
icon_state = "swim_purple"
gender = FEMALE
/datum/sprite_accessory/underwear/swimsuit_red
name = "Ladies Red Swimsuit"
icon_state = "swim_red"
gender = FEMALE
////////////////////////////
// Undershirt Definitions //
////////////////////////////
@@ -97,7 +97,7 @@ Doesn't work on other aliens/AI.*/
return 0
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
if(msg)
log_talk(user,"AlienWhisper: [key_name(user)]->[M.key] : [msg]",LOGSAY)
log_talk(user,"AlienWhisper: [key_name(user)]->[key_name(M)] : [msg]",LOGSAY)
to_chat(M, "<span class='noticealien'>You hear a strange, alien voice in your head...</span>[msg]")
to_chat(user, "<span class='noticealien'>You said: \"[msg]\" to [M]</span>")
for(var/ded in GLOB.dead_mob_list)
+2 -5
View File
@@ -224,9 +224,6 @@
return thermal_protection_flags
/mob/living/carbon/human/proc/get_cold_protection(temperature)
if(has_trait(TRAIT_RESISTCOLD))
return TRUE
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
var/thermal_protection_flags = get_cold_protection_flags(temperature)
@@ -378,10 +375,10 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
ballmer_percent = (-abs(drunkenness - 13.35) / 0.9) + 1
if(prob(5))
say(pick(GLOB.ballmer_good_msg))
SSresearch.science_tech.add_points_all(TECHWEB_POINT_TYPE_DEFAULT, (BALLMER_POINTS * ballmer_percent))
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS * ballmer_percent))
if(drunkenness > 26) // by this point you're into windows ME territory
if(prob(5))
SSresearch.science_tech.remove_points_all(TECHWEB_POINT_TYPE_DEFAULT, BALLMER_POINTS)
SSresearch.science_tech.remove_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS))
say(pick(GLOB.ballmer_windows_me_msg))
if(drunkenness >= 41)
@@ -951,7 +951,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration > 500)
if(H.overeatduration >= 100)
to_chat(H, "<span class='danger'>You suddenly feel blubbery!</span>")
H.add_trait(TRAIT_FAT, OBESITY)
H.update_inv_w_uniform()
@@ -1143,7 +1143,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.has_trait(TRAIT_FAT))
. += (1.5 - flight)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD))
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
return .
@@ -1535,7 +1535,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.emote("scream")
H.apply_damage(burn_damage, BURN)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(GLOB.mutations_list[COLDRES] in H.dna.mutations))
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD))
H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hot")
H.SendSignal(COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
switch(H.bodytemperature)
@@ -3,7 +3,7 @@
id = "android"
say_mod = "states"
species_traits = list(NOBLOOD)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
meat = null
damage_overlay_type = "synth"
@@ -675,7 +675,7 @@
var/msg = sanitize(input("Message:", "Telepathy") as text|null)
if(msg)
log_talk(H,"SlimeTelepathy: [key_name(H)]->[M.key] : [msg]",LOGSAY)
log_talk(H,"SlimeTelepathy: [key_name(H)]->[key_name(M)] : [msg]",LOGSAY)
to_chat(M, "<span class='notice'>You hear an alien voice in your head... </span><font color=#008CA2>[msg]</font>")
to_chat(H, "<span class='notice'>You telepathically said: \"[msg]\" to [M]</span>")
for(var/dead in GLOB.dead_mob_list)
@@ -81,7 +81,7 @@
adjust_bodytemperature(min((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !has_trait(TRAIT_RESISTHEAT))
switch(bodytemperature)
if(360 to 400)
throw_alert("temp", /obj/screen/alert/hot, 1)
@@ -96,7 +96,7 @@
else
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !has_trait(TRAIT_RESISTCOLD))
if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
switch(bodytemperature)
if(200 to 260)
+1 -1
View File
@@ -60,7 +60,7 @@
/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE)
. = ..()
if(user.reagents.get_reagent("menthol"))
if(user.reagents.get_reagent("menthol") || user.reagents.get_reagent("peppermint_patty"))
return FALSE
/datum/emote/living/dance
+1
View File
@@ -428,6 +428,7 @@
heal_overall_damage(INFINITY, INFINITY, INFINITY, FALSE, FALSE, TRUE) //heal brute and burn dmg on both organic and robotic limbs, and update health right away.
ExtinguishMob()
fire_stacks = 0
confused = 0
update_canmove()
GET_COMPONENT(mood, /datum/component/mood)
if (mood)
@@ -857,14 +857,17 @@
if(health < maxHealth*0.5) //Gradual break down of modules as more damage is sustained
if(uneq_module(held_items[3]))
playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1)
visible_message("<span class='warning'>[src] sounds an alarm! \"SYSTEM ERROR: Module 3 OFFLINE.\"</span>", "<span class='userdanger'>SYSTEM ERROR: Module 3 OFFLINE.</span>")
audible_message("<span class='warning'>[src] sounds an alarm! \"SYSTEM ERROR: Module 3 OFFLINE.\"</span>")
to_chat(src, "<span class='userdanger'>SYSTEM ERROR: Module 3 OFFLINE.</span>")
if(health < 0)
if(uneq_module(held_items[2]))
visible_message("<span class='warning'>[src] sounds an alarm! \"SYSTEM ERROR: Module 2 OFFLINE.\"</span>", "<span class='userdanger'>SYSTEM ERROR: Module 2 OFFLINE.</span>")
audible_message("<span class='warning'>[src] sounds an alarm! \"SYSTEM ERROR: Module 2 OFFLINE.\"</span>")
to_chat(src, "<span class='userdanger'>SYSTEM ERROR: Module 2 OFFLINE.</span>")
playsound(loc, 'sound/machines/warning-buzzer.ogg', 60, 1, 1)
if(health < -maxHealth*0.5)
if(uneq_module(held_items[1]))
visible_message("<span class='warning'>[src] sounds an alarm! \"CRITICAL ERROR: All modules OFFLINE.\"</span>", "<span class='userdanger'>CRITICAL ERROR: All modules OFFLINE.</span>")
audible_message("<span class='warning'>[src] sounds an alarm! \"CRITICAL ERROR: All modules OFFLINE.\"</span>")
to_chat(src, "<span class='userdanger'>CRITICAL ERROR: All modules OFFLINE.</span>")
playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1, 1)
/mob/living/silicon/robot/update_sight()
+4 -4
View File
@@ -395,22 +395,22 @@
to_chat(usr, "<span class='boldnotice'>You must be dead to use this!</span>")
return
log_game("[usr.name]/[usr.key] used abandon mob.")
log_game("[key_name(usr)] used abandon mob.")
to_chat(usr, "<span class='boldnotice'>Please roleplay correctly!</span>")
if(!client)
log_game("[usr.key] AM failed due to disconnect.")
log_game("[key_name(usr)] AM failed due to disconnect.")
return
client.screen.Cut()
client.screen += client.void
if(!client)
log_game("[usr.key] AM failed due to disconnect.")
log_game("[key_name(usr)] AM failed due to disconnect.")
return
var/mob/dead/new_player/M = new /mob/dead/new_player()
if(!client)
log_game("[usr.key] AM failed due to disconnect.")
log_game("[key_name(usr)] AM failed due to disconnect.")
qdel(M)
return
+1
View File
@@ -143,6 +143,7 @@
else
O.name = input
to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].")
O.renamedByPlayer = TRUE
if(penchoice == "Change description")
var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100)
+1 -1
View File
@@ -140,7 +140,7 @@ By design, d1 is the smallest direction and d2 is the highest
return
user.visible_message("[user] cuts the cable.", "<span class='notice'>You cut the cable.</span>")
stored.add_fingerprint(user)
investigate_log("was cut by [key_name(usr, usr.client)] in [AREACOORD(src)]", INVESTIGATE_WIRES)
investigate_log("was cut by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES)
deconstruct()
return
+87 -32
View File
@@ -8,10 +8,6 @@
var/obj/machinery/atmospherics/components/binary/circulator/cold_circ
var/obj/machinery/atmospherics/components/binary/circulator/hot_circ
//note: these currently only support EAST and WEST
var/cold_dir = WEST
var/hot_dir = EAST
var/lastgen = 0
var/lastgenlev = -1
var/lastcirc = "00"
@@ -19,34 +15,18 @@
/obj/machinery/power/generator/Initialize(mapload)
. = ..()
var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator
cold_circ = locate(circpath) in get_step(src, cold_dir)
hot_circ = locate(circpath) in get_step(src, hot_dir)
find_circs()
connect_to_network()
SSair.atmos_machinery += src
if(cold_circ)
switch(cold_dir)
if(EAST)
cold_circ.side = circpath.CIRC_RIGHT
if(WEST)
cold_circ.side = circpath.CIRC_LEFT
cold_circ.update_icon()
if(hot_circ)
switch(hot_dir)
if(EAST)
hot_circ.side = circpath.CIRC_RIGHT
if(WEST)
hot_circ.side = circpath.CIRC_LEFT
hot_circ.update_icon()
if(!cold_circ || !hot_circ)
stat |= BROKEN
update_icon()
component_parts = list(new /obj/item/circuitboard/machine/generator)
/obj/machinery/power/generator/ComponentInitialize()
. = ..()
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS )
/obj/machinery/power/generator/Destroy()
kill_circs()
SSair.atmos_machinery -= src
return ..()
@@ -61,7 +41,8 @@
if(L != 0)
add_overlay(image('icons/obj/power.dmi', "teg-op[L]"))
add_overlay("teg-oc[lastcirc]")
if(hot_circ && cold_circ)
add_overlay("teg-oc[lastcirc]")
#define GENRATE 800 // generator output coefficient from Q
@@ -122,7 +103,7 @@
lastgen -= power_output
..()
/obj/machinery/power/generator/proc/get_menu(include_link = 1)
/obj/machinery/power/generator/proc/get_menu(include_link = TRUE)
var/t = ""
if(!powernet)
t += "<span class='bad'>Unable to connect to the power network!</span>"
@@ -147,8 +128,12 @@
t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa<BR>"
t += "</div>"
else if(!hot_circ && cold_circ)
t += "<span class='bad'>Unable to locate hot circulator!</span>"
else if(hot_circ && !cold_circ)
t += "<span class='bad'>Unable to locate cold circulator!</span>"
else
t += "<span class='bad'>Unable to locate all parts!</span>"
t += "<span class='bad'>Unable to locate any parts!</span>"
if(include_link)
t += "<BR><A href='?src=[REF(src)];close=1'>Close</A>"
@@ -167,10 +152,80 @@
if( href_list["close"] )
usr << browse(null, "window=teg")
usr.unset_machine()
return 0
return 1
return FALSE
return TRUE
/obj/machinery/power/generator/power_change()
..()
update_icon()
/obj/machinery/power/generator/proc/find_circs()
kill_circs()
var/list/circs = list()
var/obj/machinery/atmospherics/components/binary/circulator/C
var/circpath = /obj/machinery/atmospherics/components/binary/circulator
if(dir == NORTH || dir == SOUTH)
C = locate(circpath) in get_step(src, EAST)
if(C && C.dir == WEST)
circs += C
C = locate(circpath) in get_step(src, WEST)
if(C && C.dir == EAST)
circs += C
else
C = locate(circpath) in get_step(src, NORTH)
if(C && C.dir == SOUTH)
circs += C
C = locate(circpath) in get_step(src, SOUTH)
if(C && C.dir == NORTH)
circs += C
if(circs.len)
for(C in circs)
if(C.mode == CIRCULATOR_COLD && !cold_circ)
cold_circ = C
C.generator = src
else if(C.mode == CIRCULATOR_HOT && !hot_circ)
hot_circ = C
C.generator = src
/obj/machinery/power/generator/wrench_act(mob/living/user, obj/item/I)
if(!panel_open)
return
anchored = !anchored
I.play_tool_sound(src)
if(!anchored)
kill_circs()
to_chat(user, "<span class='notice'>You [anchored?"secure":"unsecure"] [src].</span>")
return TRUE
/obj/machinery/power/generator/multitool_act(mob/living/user, obj/item/I)
if(!anchored)
return
find_circs()
to_chat(user, "<span class='notice'>You update [src]'s circulator links.</span>")
return TRUE
/obj/machinery/power/generator/screwdriver_act(mob/user, obj/item/I)
panel_open = !panel_open
I.play_tool_sound(src)
to_chat(user, "<span class='notice'>You [panel_open?"open":"close"] the panel on [src].</span>")
return TRUE
/obj/machinery/power/generator/crowbar_act(mob/user, obj/item/I)
default_deconstruction_crowbar(I)
return TRUE
/obj/machinery/power/generator/on_deconstruction()
kill_circs()
/obj/machinery/power/generator/proc/kill_circs()
if(hot_circ)
hot_circ.generator = null
hot_circ = null
if(cold_circ)
cold_circ.generator = null
cold_circ = null
+1 -1
View File
@@ -250,7 +250,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
if(href_list["gentoggle"])
breaker = !breaker
investigate_log("was toggled [breaker ? "<font color='green'>ON</font>" : "<font color='red'>OFF</font>"] by [usr.key].", INVESTIGATE_GRAVITY)
investigate_log("was toggled [breaker ? "<font color='green'>ON</font>" : "<font color='red'>OFF</font>"] by [key_name(usr)].", INVESTIGATE_GRAVITY)
set_power()
src.updateUsrDialog()
+12 -4
View File
@@ -296,7 +296,8 @@
cut_overlays()
switch(status) // set icon_states
if(LIGHT_OK)
if(emergency_mode)
var/area/A = get_area(src)
if(emergency_mode || (A && A.fire))
icon_state = "[base_state]_emergency"
else
icon_state = "[base_state]"
@@ -319,9 +320,16 @@
on = FALSE
emergency_mode = FALSE
if(on)
var/BR = nightshift_enabled? nightshift_brightness : brightness
var/PO = nightshift_enabled? nightshift_light_power : bulb_power
var/CO = nightshift_enabled? nightshift_light_color : bulb_colour
var/BR = brightness
var/PO = bulb_power
var/CO = bulb_colour
var/area/A = get_area(src)
if (A && A.fire)
CO = bulb_emergency_colour
else if (nightshift_enabled)
BR = nightshift_brightness
PO = nightshift_light_power
CO = nightshift_light_color
var/matching = light && BR == light.light_range && PO == light.light_power && CO == light.light_color
if(!matching)
switchcount++
+1 -1
View File
@@ -80,7 +80,7 @@
if(loaded_tank)
fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
fuel = fuel ? fuel[MOLES] : 0
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"<font color='red'>It is empty</font>"].", INVESTIGATE_SINGULO)
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"<font color='red'>It is empty</font>"].", INVESTIGATE_SINGULO)
return
else
to_chat(user, "<span class='warning'>The controls are locked!</span>")
@@ -78,7 +78,7 @@ field_generator power level display
"<span class='notice'>You turn on [src].</span>", \
"<span class='italics'>You hear heavy droning.</span>")
turn_on()
investigate_log("<font color='green'>activated</font> by [user.key].", INVESTIGATE_SINGULO)
investigate_log("<font color='green'>activated</font> by [key_name(user)].", INVESTIGATE_SINGULO)
add_fingerprint(user)
else
+7 -7
View File
@@ -348,12 +348,12 @@
switch(action)
if("tryinput")
input_attempt = !input_attempt
log_smes(usr.ckey)
log_smes(usr)
update_icon()
. = TRUE
if("tryoutput")
output_attempt = !output_attempt
log_smes(usr.ckey)
log_smes(usr)
update_icon()
. = TRUE
if("input")
@@ -377,7 +377,7 @@
. = TRUE
if(.)
input_level = CLAMP(target, 0, input_level_max)
log_smes(usr.ckey)
log_smes(usr)
if("output")
var/target = params["target"]
var/adjust = text2num(params["adjust"])
@@ -399,10 +399,10 @@
. = TRUE
if(.)
output_level = CLAMP(target, 0, output_level_max)
log_smes(usr.ckey)
log_smes(usr)
/obj/machinery/power/smes/proc/log_smes(user = "")
investigate_log("input/output; [input_level>output_level?"<font color='green'>":"<font color='red'>"][input_level]/[output_level]</font> | Charge: [charge] | Output-mode: [output_attempt?"<font color='green'>on</font>":"<font color='red'>off</font>"] | Input-mode: [input_attempt?"<font color='green'>auto</font>":"<font color='red'>off</font>"] by [user]", INVESTIGATE_SINGULO)
/obj/machinery/power/smes/proc/log_smes(mob/user)
investigate_log("input/output; [input_level>output_level?"<font color='green'>":"<font color='red'>"][input_level]/[output_level]</font> | Charge: [charge] | Output-mode: [output_attempt?"<font color='green'>on</font>":"<font color='red'>off</font>"] | Input-mode: [input_attempt?"<font color='green'>auto</font>":"<font color='red'>off</font>"] by [user ? key_name(user) : "outside forces"]", INVESTIGATE_SINGULO)
/obj/machinery/power/smes/emp_act(severity)
@@ -419,7 +419,7 @@
if (charge < 0)
charge = 0
update_icon()
log_smes("an emp")
log_smes()
/obj/machinery/power/smes/engineering
charge = 1.5e6 // Engineering starts with some charge for singulo
@@ -255,9 +255,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
sleep(10)
continue
else if(i > 50)
speaking = "[i/10] seconds remain before causality stabilization."
speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization."
else
speaking = "[i/10]..."
speaking = "[i*0.1]..."
radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language())
sleep(10)
@@ -480,7 +480,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(!istype(L))
return FALSE
if(!istype(Proj.firer, /obj/machinery/power/emitter))
investigate_log("has been hit by [Proj] fired by [Proj.firer]", INVESTIGATE_SUPERMATTER)
investigate_log("has been hit by [Proj] fired by [key_name(Proj.firer)]", INVESTIGATE_SUPERMATTER)
if(Proj.flag != "bullet")
power += Proj.damage * config_bullet_energy
if(!has_been_powered)
@@ -563,7 +563,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(!cause)
cause = "contact"
nom.visible_message(vis_msg, mob_msg, "<span class='italics'>You hear an unearthly noise as a wave of heat washes over you.</span>")
investigate_log("has been attacked ([cause]) by [nom]", INVESTIGATE_SUPERMATTER)
investigate_log("has been attacked ([cause]) by [key_name(nom)]", INVESTIGATE_SUPERMATTER)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
Consume(nom)
@@ -582,7 +582,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
user.visible_message("<span class='danger'>As [user] touches \the [src] with \a [W], silence fills the room...</span>",\
"<span class='userdanger'>You touch \the [src] with \the [W], and everything suddenly goes silent.</span>\n<span class='notice'>\The [W] flashes into dust as you flinch away from \the [src].</span>",\
"<span class='italics'>Everything suddenly goes silent.</span>")
investigate_log("has been attacked ([W]) by [user]", INVESTIGATE_SUPERMATTER)
investigate_log("has been attacked ([W]) by [key_name(user)]", INVESTIGATE_SUPERMATTER)
Consume(W)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
@@ -629,7 +629,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
//Some poor sod got eaten, go ahead and irradiate people nearby.
radiation_pulse(src, 3000, 2, TRUE)
for(var/mob/living/L in range(10))
investigate_log("has irradiated [L] after consuming [AM].", INVESTIGATE_SUPERMATTER)
investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_SUPERMATTER)
if(L in view())
L.show_message("<span class='danger'>As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.</span>", 1,\
"<span class='danger'>The unearthly ringing subsides and you notice you have new radiation burns.</span>", 2)
@@ -131,4 +131,8 @@
var/turf_mag = get_turf(src)
for(var/obj/item/ammo in stored_ammo)
ammo.forceMove(turf_mag)
stored_ammo -= ammo
stored_ammo -= ammo
/obj/item/ammo_box/magazine/handle_atom_del(atom/A)
stored_ammo -= A
update_icon()
+6 -1
View File
@@ -342,7 +342,7 @@
var/state = "bayonet" //Generic state.
if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
state = bayonet.icon_state
var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
knife_overlay = mutable_appearance(bayonet_icons, state)
knife_overlay.pixel_x = knife_x_offset
knife_overlay.pixel_y = knife_y_offset
@@ -522,3 +522,8 @@
if(zoomable)
azoom = new()
azoom.gun = src
/obj/item/gun/handle_atom_del(atom/A)
if(A == chambered)
chambered = null
update_icon()
@@ -46,7 +46,7 @@
if(stat & NOPOWER)
return
if(on)
if(beaker)
if(beaker && beaker.reagents.total_volume)
beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume)
beaker.reagents.handle_reactions()
@@ -1559,6 +1559,21 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "cup of sake"
glass_desc = "A traditional cup of sake."
/datum/reagent/consumable/ethanol/peppermint_patty
name = "Peppermint Patty"
id = "peppermint_patty"
description = "This lightly alcoholic drink combines the benefits of menthol and cocoa."
color = "#45ca7a"
taste_description = "mint and chocolate"
boozepwr = 25
glass_icon_state = "peppermint_patty"
glass_name = "Peppermint Patty"
glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night."
/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/M)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
..()
/datum/reagent/consumable/ethanol/alexander
name = "Alexander"
id = "alexander"
@@ -1591,7 +1606,6 @@ All effects don't start immediately, but rather get worse over time; the rate is
to_chat(L,"<span class='notice'>You notice [mighty_shield] looks worn again. Weird.</span>")
..()
/datum/reagent/consumable/ethanol/sidecar
name = "Sidecar"
id = "sidecar"
@@ -1648,7 +1662,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "mojito"
glass_name = "Mojito"
glass_desc = "A drink that looks as refreshing as it tastes."
/datum/reagent/consumable/ethanol/fernet
name = "Fernet"
id = "fernet"
@@ -1697,9 +1711,9 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_icon_state = "fanciulli"
glass_name = "glass of fanciulli"
glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet."
/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/M)
M.nutrition = max(M.nutrition - 5, 0)
M.overeatduration = 0
return ..()
@@ -180,7 +180,7 @@ Borg Shaker
recharge_time = 3
accepts_reagent_upgrades = FALSE
reagent_ids = list("beer", "orangejuice", "grenadine" ,"limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "fernet")
reagent_ids = list("beer", "orangejuice", "grenadine", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "fernet", "milk", "coffee", "banana", "lemonjuice")
/obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user)
return //Can't inject stuff with a shaker, can we? //not with that attitude
@@ -226,25 +226,10 @@
desc = "A small bottle of Romerol. The REAL zombie powder."
list_reagents = list("romerol" = 30)
/obj/item/reagent_containers/glass/bottle/flu_virion
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
spawned_disease = /datum/disease/advance/flu
/obj/item/reagent_containers/glass/bottle/epiglottis_virion
name = "Epiglottis virion culture bottle"
desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
spawned_disease = /datum/disease/advance/voice_change
/obj/item/reagent_containers/glass/bottle/liver_enhance_virion
name = "Liver enhancement virion culture bottle"
desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
spawned_disease = /datum/disease/advance/heal
/obj/item/reagent_containers/glass/bottle/hallucigen_virion
name = "Hallucigen virion culture bottle"
desc = "A small bottle. Contains hallucigen virion culture in synthblood medium."
spawned_disease = /datum/disease/advance/hallucigen
/obj/item/reagent_containers/glass/bottle/random_virus
name = "Experimental disease culture bottle"
desc = "A small bottle. Contains an untested viral culture in synthblood medium."
spawned_disease = /datum/disease/advance/random
/obj/item/reagent_containers/glass/bottle/pierrot_throat
name = "Pierrot's Throat culture bottle"
@@ -255,6 +240,11 @@
name = "Rhinovirus culture bottle"
desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
spawned_disease = /datum/disease/advance/cold
/obj/item/reagent_containers/glass/bottle/flu_virion
name = "Flu virion culture bottle"
desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
spawned_disease = /datum/disease/advance/flu
/obj/item/reagent_containers/glass/bottle/retrovirus
name = "Retrovirus culture bottle"
+2 -2
View File
@@ -249,7 +249,7 @@
var/mob/living/target = locate(/mob/living) in oview(7,src)
if(target)
var/obj/item/throwing = loaded_item
investigate_log("Experimentor has thrown [loaded_item] at [target]", INVESTIGATE_EXPERIMENTOR)
investigate_log("Experimentor has thrown [loaded_item] at [key_name(target)]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
if(throwing)
throwing.throw_at(target, 10, 1)
@@ -371,7 +371,7 @@
throwSmoke(loc)
for(var/mob/living/m in oview(1, src))
m.apply_damage(5, BURN, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
investigate_log("Experimentor has dealt minor burn damage to [m]", INVESTIGATE_EXPERIMENTOR)
investigate_log("Experimentor has dealt minor burn damage to [key_name(m)]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_COLD)
@@ -762,9 +762,11 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/gold/tick()
var/obj/item/slimecross/stabilized/gold/linked = linked_extract
if(!familiar)
if(QDELETED(familiar))
familiar = new linked.mob_type(get_turf(owner.loc))
familiar.name = linked.mob_name
familiar.del_on_death = TRUE
familiar.copy_known_languages_from(owner, FALSE)
if(linked.saved_mind)
linked.saved_mind.transfer_to(familiar)
familiar.ckey = linked.saved_mind.key
@@ -98,6 +98,7 @@ Stabilized extracts:
colour = "gold"
var/mob_type
var/datum/mind/saved_mind
var/mob_name = "Familiar"
/obj/item/slimecross/stabilized/gold/proc/generate_mobtype()
var/static/list/mob_spawn_pets = list()
@@ -114,20 +115,30 @@ Stabilized extracts:
generate_mobtype()
/obj/item/slimecross/stabilized/gold/attack_self(mob/user)
var/choice = input(user, "Which do you want to reset?", "Familiar Adjustment") as null|anything in list("Familiar Species", "Familiar Sentience")
var/choice = input(user, "Which do you want to reset?", "Familiar Adjustment") as null|anything in list("Familiar Location", "Familiar Species", "Familiar Sentience", "Familiar Name")
if(!user.canUseTopic(src, BE_CLOSE))
return
if(isliving(user))
var/mob/living/L = user
if(L.has_status_effect(/datum/status_effect/stabilized/gold))
L.remove_status_effect(/datum/status_effect/stabilized/gold)
START_PROCESSING(SSobj, src)
if(choice == "Familiar Location")
to_chat(user, "<span class='notice'>You prod [src], and it shudders slightly.</span>")
START_PROCESSING(SSobj, src)
if(choice == "Familiar Species")
to_chat(user, "<span class='notice'>You squeeze [src], and a shape seems to shift around inside.</span>")
generate_mobtype()
START_PROCESSING(SSobj, src)
if(choice == "Familiar Sentience")
to_chat(user, "<span class='notice'>You poke [src], and it lets out a glowing pulse.</span>")
saved_mind = null
START_PROCESSING(SSobj, src)
if(choice == "Familiar Name")
var/newname = copytext(sanitize(input(user, "Would you like to change the name of [mob_name]", "Name change", mob_name) as null|text),1,MAX_NAME_LEN)
if(newname)
mob_name = newname
to_chat(user, "<span class='notice'>You speak softly into [src], and it shakes slightly in response.</span>")
START_PROCESSING(SSobj, src)
/obj/item/slimecross/stabilized/oil
colour = "oil"
@@ -177,7 +177,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
log_game("Legion took damage while the necropolis gate was closed and released itself.")
else
message_admins("[user ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!")
log_game("[user ? key_name(user):"Unknown"] released Legion.")
log_game("[user ? key_name(user) : "Unknown"] released Legion.")
var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg')
for(var/mob/M in GLOB.player_list)
+1 -1
View File
@@ -434,7 +434,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
else if (!(R in product_records))
vend_ready = 1
message_admins("Vending machine exploit attempted by [key_name(usr, usr.client)]!")
message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!")
return
if (R.amount <= 0)