Merge branch 'master' into itriedlookingupwhatpromptedthischangebutsadlythelogswerelostwhentheroundended

This commit is contained in:
Jordie
2017-05-02 18:49:06 +10:00
committed by GitHub
337 changed files with 24814 additions and 13144 deletions
+4 -2
View File
@@ -9,6 +9,7 @@
icon_state = "sleeper"
state_open = TRUE
anchored = TRUE
occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize
var/you_die_in_the_game_you_die_for_real = FALSE
var/datum/effect_system/spark_spread/sparks
var/mob/living/carbon/human/virtual_reality/vr_human
@@ -92,11 +93,12 @@
return
switch(action)
if("vr_connect")
if(ishuman(occupant) && occupant.mind)
var/mob/living/carbon/human/human_occupant = occupant
if(human_occupant && human_occupant.mind)
to_chat(occupant, "<span class='warning'>Transfering to virtual reality...</span>")
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
occupant.mind.transfer_to(vr_human)
human_occupant.mind.transfer_to(vr_human)
vr_human.real_me = occupant
to_chat(vr_human, "<span class='notice'>Transfer successful! you are now playing as [vr_human] in VR!</span>")
SStgui.close_user_uis(vr_human, src)
+23 -2
View File
@@ -610,20 +610,41 @@
set desc = "(atom path) Spawn an atom"
set name = "Spawn"
return usr.client.spawn_atom_impl(object, FALSE)
/datum/admins/proc/spawn_atom_adv(object as text)
set category = "Debug"
set desc = "(atom path) Spawn an atom with New() parameters"
set name = "Advanced Spawn"
return usr.client.spawn_atom_impl(object, TRUE)
/client/proc/spawn_atom_impl(object, params)
if(!check_rights(R_SPAWN))
return
var/chosen = pick_closest_path(object)
if(!chosen)
return
var/list/arguments
if(ispath(chosen,/turf))
var/turf/T = get_turf(usr.loc)
T.ChangeTurf(chosen)
else
var/atom/A = new chosen(usr.loc)
if(params)
arguments = usr.client.get_callproc_args(TRUE)
if(!usr)
return
arguments = list(usr.loc) + arguments
var/atom/A = new chosen(arglist(arguments))
A.admin_spawned = TRUE
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] spawned [chosen] at [COORD(usr)][LAZYLEN(arguments) > 1 ? " with parameters [print_single_line(arguments)]": ""]")
SSblackbox.add_details("admin_verb","Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+2 -1
View File
@@ -4,7 +4,8 @@ atom/proc/investigate_log(message, subject)
var/F = file("[GLOB.log_directory]/[subject].html")
F << "<small>[time_stamp()] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "kudzu") )
/client/proc/investigate_show( subject in list("hrefs","notes, memos, watchlist","singulo","wires","telesci", "gravity", "records", "cargo", "supermatter", "atmos", "experimentor", "botany") )
set name = "Investigate"
set category = "Admin"
if(!holder)
+14 -17
View File
@@ -1,7 +1,8 @@
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
//the procs are cause you can't put the comments in the GLOB var define
GLOBAL_PROTECT(admin_verbs_default)
GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
/proc/AVerbsDefault()
GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
/world/proc/AVerbsDefault()
return list(
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/toggleannouncelogin, /*toggles if an admin's login is announced during a round*/
@@ -25,8 +26,8 @@ GLOBAL_LIST_INIT(admin_verbs_default, AVerbsDefault())
/client/proc/stop_sounds
)
GLOBAL_PROTECT(admin_verbs_admin)
GLOBAL_LIST_INIT(admin_verbs_admin, AVerbsAdmin())
/proc/AVerbsAdmin()
GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/world/proc/AVerbsAdmin()
return list(
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
@@ -76,9 +77,7 @@ GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_
GLOBAL_PROTECT(admin_verbs_sounds)
GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound,/client/proc/play_sound,/client/proc/set_round_end_sound))
GLOBAL_PROTECT(admin_verbs_fun)
GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
/proc/AVerbsFun()
return list(
GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
@@ -100,12 +99,12 @@ GLOBAL_LIST_INIT(admin_verbs_fun, AVerbsFun())
/client/proc/polymorph_all,
/client/proc/show_tip,
/client/proc/smite
)
))
GLOBAL_PROTECT(admin_verbs_spawn)
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/client/proc/respawn_character))
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom,/datum/admins/proc/spawn_atom_adv,/client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_server)
GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
/proc/AVerbsServer()
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/world/proc/AVerbsServer()
return list(
/datum/admins/proc/startnow,
/datum/admins/proc/restart,
@@ -123,8 +122,8 @@ GLOBAL_LIST_INIT(admin_verbs_server, AVerbsServer())
/client/proc/toggle_hub
)
GLOBAL_PROTECT(admin_verbs_debug)
GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug())
/proc/AVerbsDebug()
GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
/world/proc/AVerbsDebug()
return list(
/client/proc/restart_controller,
/client/proc/cmd_admin_list_open_jobs,
@@ -169,9 +168,7 @@ GLOBAL_LIST_INIT(admin_verbs_rejuv, list(/client/proc/respawn_character))
//verbs which can be hidden - needs work
GLOBAL_PROTECT(admin_verbs_hideable)
GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
/proc/AVerbsHideable()
return list(
GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/set_ooc,
/client/proc/reset_ooc,
/client/proc/deadmin,
@@ -240,7 +237,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, AVerbsHideable())
/client/proc/debug_huds,
/client/proc/customiseSNPC,
/client/proc/resetSNPC,
)
))
/client/proc/add_admin_verbs()
if(holder)
+2 -2
View File
@@ -238,7 +238,7 @@
if("showgm")
if(!check_rights(R_ADMIN))
return
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
else if (SSticker.mode)
alert("The game mode is [SSticker.mode.name]")
@@ -327,7 +327,7 @@
if("traitor_all")
if(!check_rights(R_FUN))
return
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
+6 -6
View File
@@ -8,7 +8,7 @@
if(href_list["ahelp"])
if(!check_rights(R_ADMIN))
return
var/ahelp_ref = href_list["ahelp"]
var/datum/admin_help/AH = locate(ahelp_ref)
if(AH)
@@ -1170,7 +1170,7 @@
if(!check_rights(R_ADMIN))
return
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
var/dat = {"<B>What mode do you wish to play?</B><HR>"}
for(var/mode in config.modes)
@@ -1184,7 +1184,7 @@
if(!check_rights(R_ADMIN))
return
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1199,7 +1199,7 @@
if(!check_rights(R_ADMIN|R_SERVER))
return
if (SSticker && SSticker.mode)
if (SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
GLOB.master_mode = href_list["c_mode2"]
log_admin("[key_name(usr)] set the mode as [GLOB.master_mode].")
@@ -1213,7 +1213,7 @@
if(!check_rights(R_ADMIN|R_SERVER))
return
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1810,7 +1810,7 @@
if(!check_rights(R_ADMIN))
return
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
+12 -2
View File
@@ -251,6 +251,11 @@
/proc/SDQL_from_objs(list/tree)
if("world" in tree)
if(IsAdminAdvancedProcCall())
var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
log_admin(msg)
message_admins(msg)
return
return world
return SDQL_expression(world, tree)
@@ -451,12 +456,17 @@
else
return null
if("world")
if(IsAdminAdvancedProcCall())
var/msg = "WARNING: Attempt to retrieve world reference made by [usr]!"
log_admin(msg)
message_admins(msg)
return
v = world
if("global")
v = GLOB
else
return null
else if(object == world) // Shitty ass hack kill me.
else if(object == GLOB) // Shitty ass hack kill me.
v = expression[start]
if(long)
if(expression[start + 1] == ".")
@@ -477,7 +487,7 @@
var/list/new_args = list()
for(var/arg in arguments)
new_args += SDQL_expression(source, arg)
if(object == world) // Global proc.
if(object == GLOB) // Global proc.
procname = "/proc/[procname]"
return WrapAdminProcCall(GLOBAL_PROC, procname, new_args)
return WrapAdminProcCall(object, procname, new_args)
+8 -8
View File
@@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
for(var/I in l2b)
var/datum/admin_help/AH = I
dat += "<span class='adminnotice'><span class='adminhelp'>Ticket #[AH.id]</span>: <A HREF='?_src_=holder;ahelp=\ref[AH];ahelp_action=ticket'>[AH.initiator_key_name]: [AH.name]</A></span><br>"
usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480")
//Tickets statpanel
@@ -253,7 +253,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(state == AHELP_ACTIVE)
to_chat(usr, "<span class='warning'>This ticket is already open.</span>")
return
if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey))
to_chat(usr, "<span class='warning'>This user already has an active ticket, cannot reopen this one.</span>")
return
@@ -310,7 +310,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
RemoveActive()
state = AHELP_RESOLVED
GLOB.ahelp_tickets.ListInsert(src)
if(initiator)
initiator.giveadminhelpverb()
@@ -325,7 +325,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/datum/admin_help/proc/Reject(key_name = key_name_admin(usr))
if(state != AHELP_ACTIVE)
return
if(initiator)
initiator.giveadminhelpverb()
@@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
current_ticket.MessageNoRecipient(msg)
current_ticket.TimeoutVerb()
return
else
else
to_chat(usr, "<span class='warning'>Ticket not found, creating new one...</span>")
else
current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
@@ -494,7 +494,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(!check_rights(R_ADMIN, TRUE))
return
var/browse_to
switch(input("Display which ticket list?") as null|anything in list("Active Tickets", "Closed Tickets", "Resolved Tickets"))
@@ -506,7 +506,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
browse_to = AHELP_RESOLVED
else
return
GLOB.ahelp_tickets.BrowseTickets(browse_to)
//
@@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
for(var/admin in admin_keys)
if(LAZYLEN(admin_keys) > 1)
if(LAZYLEN(message) > 1)
message += ", [admin]"
else
message += "[admin]"
+2 -2
View File
@@ -19,7 +19,7 @@
if (!msg)
return
var/nicknames = world.file2list("config/admin_nicknames.txt")
var/static/nicknames = world.file2list("config/admin_nicknames.txt")
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>ADMIN([src.holder.fakekey ? pick(nicknames) : src.key])</span> says, <span class='message'>\"[msg]\"</span></span>"
@@ -29,4 +29,4 @@
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
M.show_message(rendered, 2)
SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+8 -8
View File
@@ -145,8 +145,8 @@ GLOBAL_PROTECT(AdminProcCallCount)
/client/proc/get_callproc_args()
var/argnum = input("Number of arguments","Number:",0) as num|null
/client/proc/get_callproc_args(is_atom_new = FALSE)
var/argnum = input("Number of arguments[is_atom_new ? " (Excluding loc)" : ""]","Number:",0) as num|null
if(isnull(argnum))
return
@@ -213,7 +213,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Robot"
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -229,7 +229,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Blob"
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -247,7 +247,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Simple Animal"
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
@@ -295,7 +295,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make Alien"
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -312,7 +312,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Fun"
set name = "Make slime"
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -423,7 +423,7 @@ GLOBAL_PROTECT(AdminProcCallCount)
set category = "Admin"
set name = "Grant Full Access"
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -19,7 +19,7 @@
usr.client.images += preview
if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes")
if(template.load(T, centered = TRUE))
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>(JMP)</a></span>")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]</span>")
else
to_chat(usr, "Failed to place map")
usr.client.images -= preview
+24 -3
View File
@@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
/client/proc/disable_communication,
/client/proc/print_pointers,
/client/proc/cmd_show_at_list,
/client/proc/cmd_show_at_list,
/client/proc/cmd_show_at_markers,
/client/proc/manipulate_organs
))
@@ -154,14 +154,35 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
var/dat = {"<b>Coordinate list of Active Turfs at Roundstart</b>
<br>Real-time Active Turfs list you can see in Air Subsystem at active_turfs var<br>"}
for(var/i=1; i<=GLOB.active_turfs_startlist.len; i++)
dat += GLOB.active_turfs_startlist[i]
for(var/t in GLOB.active_turfs_startlist)
var/turf/T = t
dat += "[ADMIN_COORDJMP(T)]\n"
dat += "<br>"
usr << browse(dat, "window=at_list")
SSblackbox.add_details("admin_verb","Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_show_at_markers()
set category = "Mapping"
set name = "Show roundstart AT markers"
set desc = "Places a marker on all active-at-roundstart turfs"
var/count = 0
for(var/obj/effect/abstract/marker/at/AT in GLOB.all_abstract_markers)
qdel(AT)
count++
if(count)
to_chat(usr, "[count] AT markers removed.")
else
for(var/t in GLOB.active_turfs_startlist)
new /obj/effect/abstract/marker/at(t)
count++
to_chat(usr, "[count] AT markers placed.")
SSblackbox.add_details("admin_verb","Show Roundstart Active Turf Markers")
/client/proc/enable_debug_verbs()
set category = "Debug"
set name = "Debug verbs - Enable"
+23 -3
View File
@@ -213,7 +213,14 @@ GLOBAL_PROTECT(VVpixelmovement)
.["class"] = null
return
.["type"] = type
.["value"] = new type()
var/list/arguments
if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
arguments = get_callproc_args(FALSE)
else
arguments = list()
.["value"] = new type(arglist(arguments))
if (VV_NEW_DATUM)
var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
@@ -221,7 +228,13 @@ GLOBAL_PROTECT(VVpixelmovement)
.["class"] = null
return
.["type"] = type
.["value"] = new type()
var/list/arguments
if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
arguments = get_callproc_args(FALSE)
else
arguments = list()
.["value"] = new type(arglist(arguments))
if (VV_NEW_TYPE)
var/type = current_value
@@ -237,7 +250,14 @@ GLOBAL_PROTECT(VVpixelmovement)
.["class"] = null
return
.["type"] = type
.["value"] = new type()
var/list/arguments
if(alert(usr, "Would you like to add arguments?", "New Atom", "No", "Yes") == "Yes")
arguments = get_callproc_args(FALSE);
else
arguments = list()
.["value"] = new type(arglist(arguments))
if (VV_NEW_LIST)
+2 -2
View File
@@ -1,6 +1,6 @@
GLOBAL_VAR_INIT(highlander, FALSE)
/client/proc/only_one() //Gives everyone kilts, berets, claymores, and pinpointers, with the objective to hijack the emergency shuttle.
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
GLOB.highlander = TRUE
@@ -79,7 +79,7 @@ GLOBAL_VAR_INIT(highlander, FALSE)
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>")
/proc/only_me()
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
+10 -3
View File
@@ -4,9 +4,6 @@
if(!check_rights(R_SOUNDS))
return
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]")
var/freq = 1
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
freq = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
@@ -20,6 +17,16 @@
admin_sound.wait = 1
admin_sound.repeat = 0
admin_sound.status = SOUND_STREAM
var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel")
switch(res)
if("Yes")
to_chat(world, "<span class='boldannounce'>An admin played: [S]</span>")
if("Cancel")
return
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]")
for(var/mob/M in GLOB.player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
+15 -10
View File
@@ -108,8 +108,8 @@
for(var/mob/M in view(range,A))
to_chat(M, msg)
log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]")
message_admins("<span class='adminnotice'><b> LocalNarrate: [key_name_admin(usr)] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>[get_area(A)]</a>):</b> [msg]<BR></span>")
log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]")
message_admins("<span class='adminnotice'><b> LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]:</b> [msg]<BR></span>")
SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list)
@@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
set category = "Admin"
set name = "Delete"
@@ -513,15 +513,20 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(src, "Only administrators may use this command.")
return
if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
admin_delete(A)
/client/proc/admin_delete(datum/D)
var/atom/A = D
var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : ""
if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes")
log_admin("[key_name(usr)] deleted [D][coords]")
message_admins("[key_name_admin(usr)] deleted [D][coords]")
SSblackbox.add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(isturf(O))
var/turf/T = O
if(isturf(D))
var/turf/T = D
T.ChangeTurf(T.baseturf)
else
qdel(O)
qdel(D)
/client/proc/cmd_admin_list_open_jobs()
set category = "Admin"
@@ -696,7 +701,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Make Everyone Random"
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
return
+2 -2
View File
@@ -93,10 +93,10 @@
if(href_list["time"])
timing = text2num(href_list["time"])
if(timing && istype(holder, /obj/item/device/transfer_valve))
var/timer_message = "[key_name_admin(usr)](<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) activated [src] attachment on [holder]."
var/timer_message = "[ADMIN_LOOKUPFLW(usr)] activated [src] attachment on [holder]."
message_admins(timer_message)
GLOB.bombers += timer_message
log_game("[key_name(usr)] activated [src] attachment for [loc]")
log_game("[key_name(usr)] activated [src] attachment on [holder]")
update_icon()
if(href_list["repeat"])
loop = text2num(href_list["repeat"])
@@ -64,6 +64,8 @@
setDir(pick(GLOB.cardinal))
air_update_turf()
/obj/effect/hotspot/make_frozen_visual()
return //you take my fun i take yours
/obj/effect/hotspot/proc/perform_exposure()
var/turf/open/location = loc
@@ -662,7 +662,7 @@
playsound(src.loc, W.usesound, 50, 1)
if (do_after(user, 20*W.toolspeed, target = src))
if (buildstage == 1)
user <<"<span class='notice'>You remove the air alarm electronics.</span>"
to_chat(user, "<span class='notice'>You remove the air alarm electronics.</span>")
new /obj/item/weapon/electronics/airalarm( src.loc )
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
buildstage = 0
@@ -111,7 +111,8 @@
var/datum/gas_mixture/air1 = AIR1
var/turf/T = get_turf(src)
if(occupant)
if(occupant.health >= 100) // Don't bother with fully healed people.
var/mob/living/mob_occupant = occupant
if(mob_occupant.health >= 100) // Don't bother with fully healed people.
on = FALSE
update_icon()
playsound(T, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
@@ -120,15 +121,15 @@
radio.talk_into(src, "Auto ejecting patient now", radio_channel, get_spans(), get_default_language())
open_machine()
return
else if(occupant.stat == DEAD) // We don't bother with dead people.
else if(mob_occupant.stat == DEAD) // We don't bother with dead people.
return
if(autoeject) // Eject if configured.
open_machine()
return
if(air1.gases.len)
if(occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
occupant.Sleeping((occupant.bodytemperature / sleep_factor) * 100)
occupant.Paralyse((occupant.bodytemperature / paralyze_factor) * 100)
if(mob_occupant.bodytemperature < T0C) // Sleepytime. Why? More cryo magic.
mob_occupant.Sleeping((mob_occupant.bodytemperature / sleep_factor) * 100)
mob_occupant.Paralyse((mob_occupant.bodytemperature / paralyze_factor) * 100)
if(beaker)
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
@@ -149,19 +150,20 @@
update_icon()
return
if(occupant)
var/mob/living/mob_occupant = occupant
var/cold_protection = 0
var/mob/living/carbon/human/H = occupant
if(istype(H))
cold_protection = H.get_cold_protection(air1.temperature)
var/temperature_delta = air1.temperature - occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant.
if(abs(temperature_delta) > 1)
var/air_heat_capacity = air1.heat_capacity()
var/heat = ((1 - cold_protection) / 10 + conduction_coefficient) \
* temperature_delta * \
(air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity))
air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
occupant.bodytemperature = max(occupant.bodytemperature + heat / heat_capacity, TCMB)
mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB)
air1.gases["o2"][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
@@ -254,16 +256,17 @@
var/list/occupantData = list()
if(occupant)
occupantData["name"] = occupant.name
occupantData["stat"] = occupant.stat
occupantData["health"] = occupant.health
occupantData["maxHealth"] = occupant.maxHealth
var/mob/living/mob_occupant = occupant
occupantData["name"] = mob_occupant.name
occupantData["stat"] = mob_occupant.stat
occupantData["health"] = mob_occupant.health
occupantData["maxHealth"] = mob_occupant.maxHealth
occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD
occupantData["bruteLoss"] = occupant.getBruteLoss()
occupantData["oxyLoss"] = occupant.getOxyLoss()
occupantData["toxLoss"] = occupant.getToxLoss()
occupantData["fireLoss"] = occupant.getFireLoss()
occupantData["bodyTemperature"] = occupant.bodytemperature
occupantData["bruteLoss"] = mob_occupant.getBruteLoss()
occupantData["oxyLoss"] = mob_occupant.getOxyLoss()
occupantData["toxLoss"] = mob_occupant.getToxLoss()
occupantData["fireLoss"] = mob_occupant.getFireLoss()
occupantData["bodyTemperature"] = mob_occupant.bodytemperature
data["occupant"] = occupantData
@@ -400,8 +400,8 @@
var/bz = air_contents.gases["bz"]
var/freon = air_contents.gases["freon"]
if(n2o || plasma || bz || freon)
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) opened a canister that contains the following: (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains the following at [x], [y], [z]:")
message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following: [ADMIN_JMP(src)]")
log_admin("[key_name(usr)] opened a canister that contains the following at [COORD(src)]:")
if(plasma)
log_admin("Plasma")
message_admins("Plasma")
@@ -103,8 +103,9 @@
var/plasma = air_contents.gases["plasma"]
var/n2o = air_contents.gases["n2o"]
if(n2o || plasma)
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [x], [y], [z]")
var/area/A = get_area(src)
message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][ADMIN_JMP(src)]")
log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [A][COORD(src)]")
. = TRUE
if("direction")
if(direction == PUMP_OUT)
+1 -6
View File
@@ -50,11 +50,6 @@
material_id = MAT_PLASMA
message = "cm3 of plasma"
/datum/export/material/plasma/get_cost(obj/O, contr = 0, emag = 0)
. = ..()
if(emag) // Syndicate pays you more for the plasma.
. = round(. * 1.5)
// Uranium. Still useful for both power generation and nuclear annihilation.
/datum/export/material/uranium
cost = 400
@@ -98,4 +93,4 @@
message = "cm3 of glass"
material_id = MAT_GLASS
export_types = list(/obj/item/stack/sheet/glass, /obj/item/weapon/ore,
/obj/item/weapon/shard)
/obj/item/weapon/shard)
+2 -2
View File
@@ -182,14 +182,14 @@
/datum/supply_pack/emergency/syndicate
name = "NULL_ENTRY"
hidden = TRUE
cost = 14000
cost = 20000
contains = list()
crate_name = "emergency crate"
crate_type = /obj/structure/closet/crate/internals
dangerous = TRUE
/datum/supply_pack/emergency/syndicate/fill(obj/structure/closet/crate/C)
var/crate_value = 50
var/crate_value = 30
var/list/uplink_items = get_uplink_items(SSticker.mode)
while(crate_value)
var/category = pick(uplink_items)
+20 -8
View File
@@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
//DEFINITIONS FOR ASSET DATUMS START HERE.
/datum/asset/simple/tgui
assets = list(
"tgui.css" = 'tgui/assets/tgui.css',
@@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
"sig_none.gif" = 'icons/program_icons/sig_none.gif',
)
/datum/asset/simple/pda
assets = list(
"pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
@@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums)
"jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
)
/datum/asset/simple/changelog
assets = list(
"88x31.png" = 'html/88x31.png',
"bug-minus.png" = 'html/bug-minus.png',
"cross-circle.png" = 'html/cross-circle.png',
"hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png',
"image-minus.png" = 'html/image-minus.png',
"image-plus.png" = 'html/image-plus.png',
"music-minus.png" = 'html/music-minus.png',
"music-plus.png" = 'html/music-plus.png',
"tick-circle.png" = 'html/tick-circle.png',
"wrench-screwdriver.png" = 'html/wrench-screwdriver.png',
"spell-check.png" = 'html/spell-check.png',
"burn-exclamation.png" = 'html/burn-exclamation.png',
"chevron.png" = 'html/chevron.png',
"chevron-expand.png" = 'html/chevron-expand.png',
"scales.png" = 'html/scales.png',
"changelog.css" = 'html/changelog.css'
)
//Registers HTML Interface assets.
/datum/asset/HTML_interface/register()
for(var/path in typesof(/datum/html_interface))
+1 -1
View File
@@ -33,7 +33,7 @@
entry += " - <font color='black'><b>DEAD</b></font>"
if(is_special_character(C.mob))
entry += " - <b><font color='red'>Antagonist</font></b>"
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
entry += " [ADMIN_QUE(C.mob)]"
entry += " ([round(C.avgping, 1)]ms)"
Lines += entry
else//If they don't have +ADMIN, only show hidden admins
+1 -1
View File
@@ -202,7 +202,7 @@
item_color = "black"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
origin_tech = "syndicate=2"
sensor_mode = 0 //Hey who's this guy on the Syndicate Shuttle??
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
random_sensor = 0
resistance_flags = 0
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
+32 -16
View File
@@ -83,7 +83,7 @@
C.use(1)
update_clothes_damaged_state(FALSE)
obj_integrity = max_integrity
to_chat(user, "<span class='notice'>You fix the damages on [src] with [C].</span>")
to_chat(user, "<span class='notice'>You fix the damage on [src] with [C].</span>")
return 1
if(pockets)
var/i = pockets.attackby(W, user, params)
@@ -161,7 +161,7 @@
/obj/item/clothing/obj_break(damage_flag)
if(!damaged_clothes)
update_clothes_damaged_state(TRUE)
to_chat(usr, "<span class='notice'>Your [src] starts to fall apart!")
/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
var/index = "\ref[initial(icon)]-[initial(icon_state)]"
@@ -519,9 +519,9 @@ BLIND // can't see anything
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
var/has_sensor = 1//For the crew computer 2 = unable to change mode
var/has_sensor = HAS_SENSORS // For the crew computer
var/random_sensor = 1
var/sensor_mode = 0 /* 1 = Report living/dead, 2 = Report detailed damages, 3 = Report location */
var/sensor_mode = NO_SENSORS
var/can_adjust = 1
var/adjusted = NORMAL_STYLE
var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only
@@ -546,16 +546,26 @@ BLIND // can't see anything
tie.color = hastie.color
. += tie
/obj/item/clothing/under/attackby(obj/item/W, mob/user, params)
if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
C.use(1)
has_sensor = HAS_SENSORS
to_chat(user,"<span class='notice'>You repair the suit sensors on [src] with [C].</span>")
return 1
/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE)
..()
if(ismob(loc))
var/mob/M = loc
M.update_inv_w_uniform()
if(has_sensor > NO_SENSORS)
has_sensor = BROKEN_SENSORS
/obj/item/clothing/under/New()
if(random_sensor)
//make the sensor mode favor higher levels, except coords.
sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3)
sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS)
adjusted = NORMAL_STYLE
..()
@@ -633,15 +643,18 @@ BLIND // can't see anything
to_chat(user, "Alt-click on [src] to wear it normally.")
else
to_chat(user, "Alt-click on [src] to wear it casually.")
switch(sensor_mode)
if(0)
to_chat(user, "Its sensors appear to be disabled.")
if(1)
to_chat(user, "Its binary life sensors appear to be enabled.")
if(2)
to_chat(user, "Its vital tracker appears to be enabled.")
if(3)
to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
if (has_sensor == BROKEN_SENSORS)
to_chat(user, "Its sensors appear to be shorted out.")
else if(has_sensor > NO_SENSORS)
switch(sensor_mode)
if(SENSOR_OFF)
to_chat(user, "Its sensors appear to be disabled.")
if(SENSOR_LIVING)
to_chat(user, "Its binary life sensors appear to be enabled.")
if(SENSOR_VITALS)
to_chat(user, "Its vital tracker appears to be enabled.")
if(SENSOR_COORDS)
to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
if(hastie)
to_chat(user, "\A [hastie] is attached to it.")
@@ -661,10 +674,13 @@ BLIND // can't see anything
return
if (!can_use(M))
return
if(src.has_sensor >= 2)
if(src.has_sensor == LOCKED_SENSORS)
to_chat(usr, "The controls are locked.")
return 0
if(src.has_sensor <= 0)
if(src.has_sensor == BROKEN_SENSORS)
to_chat(usr, "The sensors have shorted out!")
return 0
if(src.has_sensor <= NO_SENSORS)
to_chat(usr, "This suit does not have any sensors.")
return 0
+3 -2
View File
@@ -178,6 +178,7 @@
pockets = /obj/item/weapon/storage/internal/pocket/shoes
actions_types = list(/datum/action/item_action/bhop)
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
var/jumpspeed = 3
var/recharging_rate = 60 //default 6 seconds between each dash
var/recharging_time = 0 //time until next dash
var/jumping = FALSE //are we mid-jump?
@@ -198,7 +199,7 @@
jumping = TRUE
playsound(src.loc, 'sound/effects/stealthoff.ogg', 50, 1, 1)
usr.visible_message("<span class='warning'>[usr] dashes foward into the air!</span>")
usr.throw_at(target, jumpdistance, 1, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
usr.throw_at(target, jumpdistance, jumpspeed, spin=0, diagonals_first = 1, callback = CALLBACK(src, .proc/hop_end))
/obj/item/clothing/shoes/bhop/proc/hop_end()
jumping = FALSE
@@ -214,4 +215,4 @@
name = "blue performer's boots"
desc = "These boots were made for dancing."
icon_state = "bsing"
put_on_delay = 50
put_on_delay = 50
+2 -2
View File
@@ -13,7 +13,7 @@
armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/armor/vest
name = "armor"
name = "armor vest"
desc = "A slim armored vest that protects against most types of damage."
icon_state = "armoralt"
item_state = "armoralt"
@@ -140,7 +140,7 @@
return 1
/obj/item/clothing/suit/armor/vest/det_suit
name = "armor"
name = "detective's armor vest"
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/ballistic,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/weapon/melee/classic_baton)
+1 -1
View File
@@ -335,7 +335,7 @@
/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
name = "Vape Naysh shirt"
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironicly?"
desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
icon_state = "vapeshirt"
item_state = "vapeshirt"
+1 -1
View File
@@ -224,5 +224,5 @@
to_chat(user, "<span class='warning'>The rune can only be used on battlemage armour!</span>")
return
W.current_charges += 8
user <<"<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>"
to_chat(user, "<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>")
qdel(src)
+1 -1
View File
@@ -14,7 +14,7 @@
icon_state = "captain"
item_state = "b_suit"
item_color = "captain"
sensor_mode = 3
sensor_mode = SENSOR_COORDS
random_sensor = 0
/obj/item/clothing/under/rank/cargo
+2 -2
View File
@@ -18,7 +18,7 @@
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 30)
strip_delay = 50
alt_covers_chest = 1
sensor_mode = 3
sensor_mode = SENSOR_COORDS
random_sensor = 0
/obj/item/clothing/under/rank/security/grey
@@ -27,7 +27,7 @@
icon_state = "security"
item_state = "gy_suit"
item_color = "security"
/obj/item/clothing/under/rank/warden
name = "security suit"
+3 -3
View File
@@ -61,8 +61,8 @@
icon_state = "prisoner"
item_state = "o_suit"
item_color = "prisoner"
has_sensor = 2
sensor_mode = 3
has_sensor = LOCKED_SENSORS
sensor_mode = SENSOR_COORDS
random_sensor = 0
/obj/item/clothing/under/rank/mailman
@@ -404,7 +404,7 @@
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
has_sensor = 0
has_sensor = NO_SENSORS
/obj/item/clothing/under/sundress
name = "sundress"
+6
View File
@@ -8,25 +8,31 @@
can_adjust = 0
/obj/item/clothing/under/shorts/red
name = "red athletic shorts"
icon_state = "redshorts"
item_color = "redshorts"
/obj/item/clothing/under/shorts/green
name = "green athletic shorts"
icon_state = "greenshorts"
item_color = "greenshorts"
/obj/item/clothing/under/shorts/blue
name = "blue athletic shorts"
icon_state = "blueshorts"
item_color = "blueshorts"
/obj/item/clothing/under/shorts/black
name = "black athletic shorts"
icon_state = "blackshorts"
item_color = "blackshorts"
/obj/item/clothing/under/shorts/grey
name = "grey athletic shorts"
icon_state = "greyshorts"
item_color = "greyshorts"
/obj/item/clothing/under/shorts/purple
name = "purple athletic shorts"
icon_state = "purpleshorts"
item_color = "purpleshorts"
+1 -1
View File
@@ -4,7 +4,7 @@
icon_state = "syndicate"
item_state = "bl_suit"
item_color = "syndicate"
has_sensor = 0
has_sensor = NO_SENSORS
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 40)
alt_covers_chest = 1
+6 -6
View File
@@ -178,7 +178,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/xeno/throw_impact(A)
update_icon("alienh_pounce")
if(A == target)
if(A == target && target.stat!=DEAD)
target.Weaken(5)
target.visible_message("<span class='danger'>[target] flails around wildly.</span>","<span class ='userdanger'>[name] pounces on you!</span>")
@@ -286,7 +286,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
bubblegum = new(wall, target)
sleep(10) //ominous wait
var/charged = FALSE //only get hit once
while(get_turf(bubblegum) != landing && target)
while(get_turf(bubblegum) != landing && target && target.stat != DEAD)
bubblegum.forceMove(get_step_towards(bubblegum, landing))
bubblegum.setDir(get_dir(bubblegum, landing))
target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1)
@@ -356,9 +356,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/i=0,i<hits,i++)
target.playsound_local(null, 'sound/weapons/Laser.ogg', 25, 1)
if(prob(75))
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
else
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
if(2) //Esword fight
@@ -372,9 +372,9 @@ Gunshots/explosions/opening doors/less rare audio (done)
for(var/i=0,i<hits,i++)
target.playsound_local(null, get_sfx("gunshot"), 25)
if(prob(75))
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20))
else
addtimer(CALLBACK(target, /atom/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8))
target.playsound_local(null, get_sfx("bodyfall"), 25, 1)
if(4) //Stunprod + cablecuff
@@ -168,13 +168,14 @@
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
var/sourcename = src.occupant.real_name
var/mob/living/mob_occupant = occupant
var/sourcename = mob_occupant.real_name
var/sourcejob
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
sourcejob = gibee.job
var/sourcenutriment = src.occupant.nutrition / 15
var/sourcetotalreagents = src.occupant.reagents.total_volume
var/sourcenutriment = mob_occupant.nutrition / 15
var/sourcetotalreagents = mob_occupant.reagents.total_volume
var/gibtype = /obj/effect/decal/cleanable/blood/gibs
var/typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
var/typeofskin = /obj/item/stack/sheet/animalhide/human
@@ -212,8 +213,8 @@
allskin = newskin
add_logs(user, occupant, "gibbed")
src.occupant.death(1)
src.occupant.ghostize()
mob_occupant.death(1)
mob_occupant.ghostize()
qdel(src.occupant)
spawn(src.gibtime)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
@@ -416,8 +416,8 @@
/datum/chemical_reaction/bananahonk
name = "Banana Honk"
id = "bananahonk"
results = list("bananahonk" = 3)
required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1)
results = list("bananahonk" = 2)
required_reagents = list("laughter" = 1, "cream" = 1)
/datum/chemical_reaction/silencer
name = "Silencer"
@@ -542,9 +542,9 @@
results = list("chocolate_milk" = 2)
required_reagents = list("milk" = 1, "cocoa" = 1)
mix_message = "The color changes as the mixture blends smoothly."
/datum/chemical_reaction/eggnog
name = "eggnog"
id = "eggnog"
results = list("eggnog" = 15)
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
@@ -264,7 +264,7 @@
time = 40
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath = 1,
/obj/item/weapon/legion_skull = 1,
/obj/item/organ/hivelord_core/legion = 1,
/datum/reagent/consumable/ketchup = 2,
/datum/reagent/consumable/capsaicin = 2
)
+1
View File
@@ -111,6 +111,7 @@
for(var/datum/plant_gene/trait/trait in seed.genes)
trait.on_squash(src, target)
reagents.reaction(T)
for(var/A in T)
reagents.reaction(A)
+2 -2
View File
@@ -123,8 +123,8 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/attack_self(mob/living/user)
var/area/A = get_area(user)
user.visible_message("<span class='warning'>[user] plucks the stem from [src]!</span>", "<span class='userdanger'>You pluck the stem from [src], which begins to hiss loudly!</span>")
message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>(JMP)</a>")
log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).")
message_admins("[ADMIN_LOOKUPFLW(user)] primed a cherry bomb for detonation at [A] [ADMIN_COORDJMP(user)]")
log_game("[key_name(user)] primed a cherry bomb for detonation at [A] [COORD(user)].")
prime()
/obj/item/weapon/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE)
+16 -16
View File
@@ -28,8 +28,8 @@
throw_speed = 3
throw_range = 10
/obj/item/weapon/reagent_containers/spray/weedspray/New()
..()
/obj/item/weapon/reagent_containers/spray/weedspray/Initialize()
. = ..()
reagents.add_reagent("weedkiller", 100)
/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
@@ -50,8 +50,8 @@
throw_speed = 3
throw_range = 10
/obj/item/weapon/reagent_containers/spray/pestspray/New()
..()
/obj/item/weapon/reagent_containers/spray/pestspray/Initialize()
. = ..()
reagents.add_reagent("pestkiller", 100)
/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
@@ -135,8 +135,8 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(1,2,5,10,15,25,50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/New()
..()
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/Initialize()
. = ..()
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
@@ -147,8 +147,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/New()
..()
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez/Initialize()
. = ..()
reagents.add_reagent("eznutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z
@@ -157,8 +157,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle18"
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/New()
..()
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z/Initialize()
. = ..()
reagents.add_reagent("left4zednutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh
@@ -167,8 +167,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle15"
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/New()
..()
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh/Initialize()
. = ..()
reagents.add_reagent("robustharvestnutriment", 50)
/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty
@@ -191,8 +191,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/New()
..()
/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller/Initialize()
. = ..()
reagents.add_reagent("weedkiller", 50)
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller
@@ -201,6 +201,6 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/New()
..()
/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller/Initialize()
. = ..()
reagents.add_reagent("pestkiller", 50)
+9
View File
@@ -143,6 +143,15 @@ Librarian
/obj/item/soapstone = 1
)
/datum/outfit/job/librarian/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
return
H.grant_all_languages(omnitongue=TRUE)
/*
Lawyer
*/
+3 -1
View File
@@ -5,9 +5,11 @@
speech_verb = "says"
whisper_verb = "whispers"
key = "0"
flags = TONGUELESS_SPEECH
flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD
default_priority = 100
icon_state = "galcom"
//Syllable Lists
/*
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
+3 -1
View File
@@ -4,7 +4,7 @@
speech_verb = "chitters"
ask_verb = "chitters inquisitively"
exclaim_verb = "chitters loudly"
spans = list(SPAN_ROBOT, "drone")
spans = list(SPAN_ROBOT)
key = "d"
flags = NO_STUTTER
syllables = list(".", "|")
@@ -12,3 +12,5 @@
space_chance = 0
sentence_chance = 0
default_priority = 20
icon_state = "drone"
+25
View File
@@ -21,6 +21,21 @@
var/static/list/scramble_cache = list()
var/default_priority = 0 // the language that an atom knows with the highest "default_priority" is selected by default.
// if you are seeing someone speak popcorn language, then something is wrong.
var/icon = 'icons/misc/language.dmi'
var/icon_state = "popcorn"
/datum/language/proc/display_icon(atom/movable/hearer)
var/understands = hearer.has_language(src.type)
if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands)
return FALSE
if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands)
return FALSE
return TRUE
/datum/language/proc/get_icon()
return "<img class=icon src=\ref[icon] iconstate='[icon_state]'>"
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
if(!syllables || !syllables.len)
if(gender==FEMALE)
@@ -93,3 +108,13 @@
return speech_verb
#undef SCRAMBLE_CACHE_LEN
/proc/get_language_instance(langtype)
if(!ispath(langtype, /datum/language))
return
if(!GLOB.language_datums[langtype])
var/datum/language/langdatum = new langtype
GLOB.language_datums[langtype] = langdatum
. = GLOB.language_datums[langtype]
+3 -1
View File
@@ -4,13 +4,15 @@
speech_verb = "whistles"
ask_verb = "chirps"
exclaim_verb = "whistles loudly"
spans = list(SPAN_ROBOT, "changeling")
spans = list(SPAN_ROBOT)
key = "6"
flags = NO_STUTTER
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
space_chance = 10
default_priority = 90
icon_state = "eal"
/datum/language/machine/get_random_name()
if(prob(70))
return "[pick(GLOB.posibrain_names)]-[rand(100, 999)]"
+2 -1
View File
@@ -4,8 +4,9 @@
speech_verb = "chimpers"
ask_verb = "chimpers"
exclaim_verb = "screeches"
spans = list("monkey")
key = "1"
space_chance = 100
syllables = list("oop", "aak", "chee", "eek")
default_priority = 80
icon_state = "animal"
+3 -1
View File
@@ -6,7 +6,9 @@
exclaim_verb = "clanks"
key = "r"
default_priority = 10
spans = list(SPAN_ROBOT, "brass")
spans = list(SPAN_ROBOT)
icon_state = "ratvar"
/datum/language/ratvar/scramble(var/input)
. = text2ratvar(input)
+2 -1
View File
@@ -4,7 +4,8 @@
speech_verb = "warbles"
ask_verb = "warbles"
exclaim_verb = "warbles"
spans = list("slime")
key = "k"
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
default_priority = 70
icon_state = "slime"
+4 -1
View File
@@ -4,12 +4,15 @@
speech_verb = "tones"
ask_verb = "tones inquisitively"
exclaim_verb = "tones loudly"
spans = list(SPAN_ROBOT, "swarmer")
spans = list(SPAN_ROBOT)
key = "s"
flags = NO_STUTTER
space_chance = 100
sentence_chance = 0
default_priority = 60
icon_state = "swarmer"
// since various flats and sharps are the same,
// all non-accidental notes are doubled in the list
/* The list with unicode symbols for the accents.
+2 -1
View File
@@ -4,7 +4,8 @@
speech_verb = "hisses"
ask_verb = "hisses"
exclaim_verb = "hisses"
spans = list("alien")
key = "4"
syllables = list("sss","sSs","SSS")
default_priority = 50
icon_state = "xeno"
+4 -1
View File
@@ -51,7 +51,7 @@
return FALSE
smooth_zlevel(world.maxz)
SortAreas()
repopulate_sorted_areas()
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
@@ -74,6 +74,9 @@
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init
repopulate_sorted_areas()
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
return TRUE
@@ -25,7 +25,7 @@
var/output_dir = SOUTH
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
S.loc = loc
S.forceMove(loc)
var/turf/T = get_step(src,output_dir)
if(T)
S.loc = T
S.forceMove(T)
+157 -367
View File
@@ -1,3 +1,5 @@
#define SMELT_AMOUNT 10
/**********************Mineral processing unit console**************************/
/obj/machinery/mineral/processing_unit_console
@@ -10,182 +12,50 @@
var/machinedir = EAST
speed_process = 1
/obj/machinery/mineral/processing_unit_console/New()
..()
spawn(7)
src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
if (machine)
machine.CONSOLE = src
else
qdel(src)
/obj/machinery/mineral/processing_unit_console/Initialize()
. = ..()
machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
if (machine)
machine.CONSOLE = src
else
qdel(src)
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
var/dat = "<b>Smelter control console</b><br><br>"
//iron
if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine)
if(machine.ore_iron)
if (machine.selected_iron==1)
dat += "<A href='?src=\ref[src];sel_iron=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_iron=yes'><font color='red'>Not smelting</font></A> "
dat += "Iron: [machine.ore_iron]<br>"
else
machine.selected_iron = 0
//sand - glass
if(machine.ore_glass)
if (machine.selected_glass==1)
dat += "<A href='?src=\ref[src];sel_glass=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_glass=yes'><font color='red'>Not smelting</font></A> "
dat += "Sand: [machine.ore_glass]<br>"
else
machine.selected_glass = 0
//plasma
if(machine.ore_plasma)
if (machine.selected_plasma==1)
dat += "<A href='?src=\ref[src];sel_plasma=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_plasma=yes'><font color='red'>Not smelting</font></A> "
dat += "Plasma: [machine.ore_plasma]<br>"
else
machine.selected_plasma = 0
//uranium
if(machine.ore_uranium)
if (machine.selected_uranium==1)
dat += "<A href='?src=\ref[src];sel_uranium=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_uranium=yes'><font color='red'>Not smelting</font></A> "
dat += "Uranium: [machine.ore_uranium]<br>"
else
machine.selected_uranium = 0
//gold
if(machine.ore_gold)
if (machine.selected_gold==1)
dat += "<A href='?src=\ref[src];sel_gold=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_gold=yes'><font color='red'>Not smelting</font></A> "
dat += "Gold: [machine.ore_gold]<br>"
else
machine.selected_gold = 0
//silver
if(machine.ore_silver)
if (machine.selected_silver==1)
dat += "<A href='?src=\ref[src];sel_silver=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_silver=yes'><font color='red'>Not smelting</font></A> "
dat += "Silver: [machine.ore_silver]<br>"
else
machine.selected_silver = 0
//diamond
if(machine.ore_diamond)
if (machine.selected_diamond==1)
dat += "<A href='?src=\ref[src];sel_diamond=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_diamond=yes'><font color='red'>Not smelting</font></A> "
dat += "Diamond: [machine.ore_diamond]<br>"
else
machine.selected_diamond = 0
//bananium
if(machine.ore_clown)
if (machine.selected_clown==1)
dat += "<A href='?src=\ref[src];sel_clown=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_clown=yes'><font color='red'>Not smelting</font></A> "
dat += "Bananium: [machine.ore_clown]<br>"
else
machine.selected_clown = 0
//titanium
if(machine.ore_titanium)
if (machine.selected_titanium==1)
dat += "<A href='?src=\ref[src];sel_titanium=no'><font color='green'>Smelting</font></A> "
else
dat += "<A href='?src=\ref[src];sel_titanium=yes'><font color='red'>Not smelting</font></A> "
dat += "Titanium: [machine.ore_titanium]<br>"
else
machine.selected_titanium = 0
//On or off
dat += text("Machine is currently ")
if (machine.on==1)
dat += text("<A href='?src=\ref[src];set_on=off'>On</A> ")
else
dat += text("<A href='?src=\ref[src];set_on=on'>Off</A> ")
else
dat+="---No Materials Loaded---"
user << browse(dat, "window=console_processing_unit")
if(!machine)
return
var/dat = machine.get_machine_data()
var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500)
popup.set_content(dat)
popup.open()
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["sel_iron"])
if (href_list["sel_iron"] == "yes")
machine.selected_iron = 1
else
machine.selected_iron = 0
if(href_list["sel_glass"])
if (href_list["sel_glass"] == "yes")
machine.selected_glass = 1
else
machine.selected_glass = 0
if(href_list["sel_plasma"])
if (href_list["sel_plasma"] == "yes")
machine.selected_plasma = 1
else
machine.selected_plasma = 0
if(href_list["sel_uranium"])
if (href_list["sel_uranium"] == "yes")
machine.selected_uranium = 1
else
machine.selected_uranium = 0
if(href_list["sel_gold"])
if (href_list["sel_gold"] == "yes")
machine.selected_gold = 1
else
machine.selected_gold = 0
if(href_list["sel_silver"])
if (href_list["sel_silver"] == "yes")
machine.selected_silver = 1
else
machine.selected_silver = 0
if(href_list["sel_diamond"])
if (href_list["sel_diamond"] == "yes")
machine.selected_diamond = 1
else
machine.selected_diamond = 0
if(href_list["sel_clown"])
if (href_list["sel_clown"] == "yes")
machine.selected_clown = 1
else
machine.selected_clown = 0
if(href_list["sel_titanium"])
if (href_list["sel_titanium"] == "yes")
machine.selected_titanium = 1
else
machine.selected_titanium = 0
add_fingerprint(usr)
if(href_list["material"])
machine.selected_material = href_list["material"]
machine.selected_alloy = null
if(href_list["alloy"])
machine.selected_material = null
machine.selected_alloy = href_list["alloy"]
if(href_list["set_on"])
if (href_list["set_on"] == "on")
machine.on = 1
else
machine.on = 0
src.updateUsrDialog()
machine.on = (href_list["set_on"] == "on")
updateUsrDialog()
return
/obj/machinery/mineral/processing_unit_console/Destroy()
machine = null
return ..()
/**********************Mineral processing unit**************************/
@@ -196,117 +66,84 @@
density = 1
anchored = 1
var/obj/machinery/mineral/CONSOLE = null
var/ore_gold = 0;
var/ore_silver = 0;
var/ore_diamond = 0;
var/ore_glass = 0;
var/ore_plasma = 0;
var/ore_uranium = 0;
var/ore_iron = 0;
var/ore_clown = 0;
var/ore_adamantine = 0;
var/ore_titanium = 0;
var/selected_gold = 0
var/selected_silver = 0
var/selected_diamond = 0
var/selected_glass = 0
var/selected_plasma = 0
var/selected_uranium = 0
var/selected_iron = 0
var/selected_clown = 0
var/selected_titanium = 0
var/on = 0 //0 = off, 1 =... oh you know!
var/datum/material_container/materials
var/on = FALSE
var/selected_material = MAT_METAL
var/selected_alloy = null
var/datum/research/files
/obj/machinery/mineral/processing_unit/Initialize()
. = ..()
proximity_monitor = new(src, 1)
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
files = new /datum/research/smelter(src)
/obj/machinery/mineral/processing_unit/Destroy()
CONSOLE = null
QDEL_NULL(materials)
QDEL_NULL(files)
return ..()
/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM)
if(istype(AM, /obj/item/weapon/ore) && AM.loc == get_step(src, input_dir))
process_ore(AM)
/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/weapon/ore/O)
var/material_amount = materials.get_item_material_amount(O)
if(!materials.has_space(material_amount))
unload_mineral(O)
else
materials.insert_item(O)
qdel(O)
if(CONSOLE)
CONSOLE.updateUsrDialog()
/obj/machinery/mineral/processing_unit/proc/get_machine_data()
var/dat = "<b>Smelter control console</b><br><br>"
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
dat += "<span class=\"res_name\">[M.name]: </span>[M.amount] cm&sup3;"
if (selected_material == mat_id)
dat += " <i>Smelting</i>"
else
dat += " <A href='?src=\ref[CONSOLE];material=[mat_id]'><b>Not Smelting</b></A> "
dat += "<br>"
dat += "<br><br>"
dat += "<b>Smelt Alloys</b><br>"
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
dat += "<span class=\"res_name\">[D.name] "
if (selected_alloy == D.id)
dat += " <i>Smelting</i>"
else
dat += " <A href='?src=\ref[CONSOLE];alloy=[D.id]'><b>Not Smelting</b></A> "
dat += "<br>"
dat += "<br><br>"
//On or off
dat += "Machine is currently "
if (on)
dat += "<A href='?src=\ref[CONSOLE];set_on=off'>On</A> "
else
dat += "<A href='?src=\ref[CONSOLE];set_on=on'>Off</A> "
return dat
/obj/machinery/mineral/processing_unit/process()
for(var/i in 1 to 10)
if (on)
if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
if (ore_glass > 0)
ore_glass--
generate_mineral(/obj/item/stack/sheet/glass)
else
on = 0
continue
if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
if (ore_glass > 0 && ore_iron > 0)
ore_glass--
ore_iron--
generate_mineral(/obj/item/stack/sheet/rglass)
else
on = 0
continue
if (!selected_glass && selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
if (ore_gold > 0)
ore_gold--
generate_mineral(/obj/item/stack/sheet/mineral/gold)
else
on = 0
continue
if (!selected_glass && !selected_gold && selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
if (ore_silver > 0)
ore_silver--
generate_mineral(/obj/item/stack/sheet/mineral/silver)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
if (ore_diamond > 0)
ore_diamond--
generate_mineral(/obj/item/stack/sheet/mineral/diamond)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
if (ore_plasma > 0)
ore_plasma--
generate_mineral(/obj/item/stack/sheet/mineral/plasma)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
if (ore_uranium > 0)
ore_uranium--
generate_mineral(/obj/item/stack/sheet/mineral/uranium)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
if (ore_iron > 0)
ore_iron--
generate_mineral(/obj/item/stack/sheet/metal)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
if (ore_iron > 0 && ore_plasma > 0)
ore_iron--
ore_plasma--
generate_mineral(/obj/item/stack/sheet/plasteel)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && selected_clown && !selected_titanium)
if (ore_clown > 0)
ore_clown--
generate_mineral(/obj/item/stack/sheet/mineral/bananium)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
if (ore_titanium > 0)
ore_titanium--
generate_mineral(/obj/item/stack/sheet/mineral/titanium)
else
on = 0
continue
if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
if (ore_titanium > 0)
ore_titanium--
ore_plasma--
generate_mineral(/obj/item/stack/sheet/mineral/plastitanium)
else
on = 0
continue
if (on)
if(selected_material)
smelt_ore()
else if(selected_alloy)
smelt_alloy()
if(CONSOLE)
CONSOLE.updateUsrDialog()
//THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
//They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
//Even in the dark year of 2016, where /tg/ is dead, Urist still hasn't finished this -Bawhoppennn
@@ -327,104 +164,57 @@
on = 0
continue*/
//if a non valid combination is selected
var/b = 1 //this part checks if all required ores are available
if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
b = 0
if (selected_gold == 1)
if (ore_gold <= 0)
b = 0
if (selected_silver == 1)
if (ore_silver <= 0)
b = 0
if (selected_diamond == 1)
if (ore_diamond <= 0)
b = 0
if (selected_uranium == 1)
if (ore_uranium <= 0)
b = 0
if (selected_plasma == 1)
if (ore_plasma <= 0)
b = 0
if (selected_iron == 1)
if (ore_iron <= 0)
b = 0
if (selected_glass == 1)
if (ore_glass <= 0)
b = 0
if (selected_clown == 1)
if (ore_clown <= 0)
b = 0
if (b) //if they are, deduct one from each, produce slag and shut the machine off
if (selected_gold == 1)
ore_gold--
if (selected_silver == 1)
ore_silver--
if (selected_diamond == 1)
ore_diamond--
if (selected_uranium == 1)
ore_uranium--
if (selected_plasma == 1)
ore_plasma--
if (selected_iron == 1)
ore_iron--
if (selected_clown == 1)
ore_clown--
generate_mineral(/obj/item/weapon/ore/slag)
on = 0
else
on = 0
break
break
/obj/machinery/mineral/processing_unit/proc/smelt_ore()
var/datum/material/mat = materials.materials[selected_material]
if(mat)
var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT)
if(!sheets_to_remove)
on = FALSE
else
break
var/turf/T = get_step(src,input_dir)
if(T)
var/n = 0
for(var/obj/item/O in T)
n++
if(n>10)
break
if (istype(O,/obj/item/weapon/ore/iron))
ore_iron++;
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/glass))
ore_glass++;
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/diamond))
ore_diamond++;
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/plasma))
ore_plasma++
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/gold))
ore_gold++
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/silver))
ore_silver++
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/uranium))
ore_uranium++
O.loc = null
continue
if (istype(O,/obj/item/weapon/ore/bananium))
ore_clown++
O.loc = null
continue
unload_mineral(O)
var/out = get_step(src, output_dir)
materials.retrieve_sheets(sheets_to_remove, selected_material, out)
/obj/machinery/mineral/processing_unit/proc/smelt_alloy()
var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design
if(!alloy)
on = FALSE
return
var/amount = can_smelt(alloy)
if(!amount)
on = FALSE
return
materials.use_amount(alloy.materials, amount)
generate_mineral(alloy.build_path)
/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D)
if(D.make_reagents.len)
return 0
var/build_amount = SMELT_AMOUNT
for(var/mat_id in D.materials)
var/M = D.materials[mat_id]
var/datum/material/smelter_mat = materials.materials[mat_id]
if(!M || !smelter_mat)
return 0
build_amount = min(build_amount, round(smelter_mat.amount / M))
return build_amount
/obj/machinery/mineral/processing_unit/proc/generate_mineral(P)
var/O = new P(src)
unload_mineral(O)
/obj/machinery/mineral/processing_unit/on_deconstruction()
materials.retrieve_all()
..()
#undef SMELT_AMOUNT
+112 -102
View File
@@ -12,9 +12,6 @@
output_dir = SOUTH
req_access = list(GLOB.access_mineral_storeroom)
var/req_access_reclaim = GLOB.access_mining_station
var/stk_types = list()
var/stk_amt = list()
var/stack_list = list() //Key: Type. Value: Instance of type.
var/obj/item/weapon/card/id/inserted_id
var/points = 0
var/ore_pickup_rate = 15
@@ -24,11 +21,20 @@
speed_process = 1
var/message_sent = FALSE
var/list/ore_buffer = list()
var/datum/material_container/materials
var/datum/research/files
/obj/machinery/mineral/ore_redemption/New()
..()
/obj/machinery/mineral/ore_redemption/Initialize()
. = ..()
var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new
B.apply_default_parts(src)
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
files = new /datum/research/smelter(src)
/obj/machinery/mineral/ore_redemption/Destroy()
QDEL_NULL(materials)
QDEL_NULL(files)
return ..()
/obj/item/weapon/circuitboard/machine/ore_redemption
name = "Ore Redemption (Machine Board)"
@@ -55,35 +61,67 @@
point_upgrade = point_upgrade_temp
sheet_per_ore = sheet_per_ore_temp
/obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O)
var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O)
if(processed_sheet)
var/obj/item/stack/sheet/s
if(!stack_list[processed_sheet])
s = new processed_sheet(src, FALSE)
s.amount = 0
stack_list[processed_sheet] = s
s = stack_list[processed_sheet]
s.amount += sheet_per_ore //Stack the sheets
ore_buffer -= O
qdel(O) //... garbage collect
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/weapon/ore/O)
ore_buffer -= O
if(O && O.refined_type)
points += O.points * point_upgrade
var/material_amount = materials.get_item_material_amount(O)
if(!material_amount)
qdel(O) //no materials, incinerate it
else if(!materials.has_space(material_amount)) //if there is no space, eject it
unload_mineral(O)
else
materials.insert_item(O) //insert it
qdel(O)
/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
if(D.make_reagents.len)
return 0
var/build_amount = 1
for(var/mat_id in D.materials)
var/M = D.materials[mat_id]
var/datum/material/redemption_mat = materials.materials[mat_id]
if(!M || !redemption_mat)
return 0
build_amount = min(build_amount, round(redemption_mat.amount / M))
return build_amount
/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
var/current_amount = 0
for(var/ore in ores_to_process)
if(current_amount >= ore_pickup_rate)
break
process_sheet(ore)
smelt_ore(ore)
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
if(z != ZLEVEL_STATION || !LAZYLEN(stack_list))
if(z != ZLEVEL_STATION)
return
message_sent = TRUE
var/area/A = get_area(src)
var/msg = "Now available in [A]:<br>"
for(var/s in stack_list)
var/obj/item/stack/sheet/sheet = stack_list[s]
msg += "[capitalize(sheet.name)]: [sheet.amount] sheets<br>"
var/has_minerals = FALSE
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
if(mineral_amount)
has_minerals = TRUE
msg += "[capitalize(M.name)]: [mineral_amount] sheets<br>"
if(!has_minerals)
return
for(var/obj/machinery/requests_console/D in GLOB.allConsoles)
if(D.receive_ore_updates)
@@ -144,15 +182,8 @@
return ..()
/obj/machinery/mineral/ore_redemption/on_deconstruction()
empty_content()
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O)
if(O && O.refined_type)
var/obj/item/stack/sheet/M = O.refined_type
points += O.points * point_upgrade
return M
qdel(O)//No refined type? Purge it.
return
materials.retrieve_all()
..()
/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
if(..())
@@ -169,30 +200,26 @@
else
dat += "No ID inserted. <A href='?src=\ref[src];insert_id=1'>Insert ID.</A><br><br>"
for(var/O in stack_list)
var/obj/item/stack/sheet/s = stack_list[O]
if(s.amount)
dat += "[capitalize(s.name)]: [s.amount] <A href='?src=\ref[src];release=[s.type]'>Release</A><br>"
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
if(M.amount)
var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
dat += "[capitalize(M.name)]: [sheet_amount] "
if(sheet_amount >= 1)
dat += "<A href='?src=\ref[src];release=[mat_id]'>Release</A><br>"
else
dat += "<span class='linkOff'>Release</span><br>"
var/obj/item/stack/sheet/metalstack
if(/obj/item/stack/sheet/metal in stack_list)
metalstack = stack_list[/obj/item/stack/sheet/metal]
for(var/v in files.known_designs)
var/datum/design/D = files.known_designs[v]
if(can_smelt_alloy(D))
dat += "[D.name]: <A href='?src=\ref[src];alloy=[D.id]'>Smelt</A><br>"
else
dat += "[D.name]: <span class='linkOff'>Smelt</span><br>"
var/obj/item/stack/sheet/plasmastack
if((/obj/item/stack/sheet/mineral/plasma in stack_list))
plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma]
dat += "<br><div class='statusDisplay'><b>Mineral Value List:</b><br>[get_ore_values()]</div>"
var/obj/item/stack/sheet/mineral/titaniumstack
if((/obj/item/stack/sheet/mineral/titanium in stack_list))
titaniumstack = stack_list[/obj/item/stack/sheet/mineral/titanium]
if(metalstack && plasmastack && min(metalstack.amount, plasmastack.amount))
dat += "Plasteel Alloy (Metal + Plasma): <A href='?src=\ref[src];alloytype1=/obj/item/stack/sheet/metal;alloytype2=/obj/item/stack/sheet/mineral/plasma;alloytypeout=/obj/item/stack/sheet/plasteel'>Smelt</A><BR>"
if(titaniumstack && plasmastack && min(titaniumstack.amount, plasmastack.amount))
dat += "Plastitanium Alloy (Titanium + Plasma): <A href='?src=\ref[src];alloytype1=/obj/item/stack/sheet/mineral/titanium;alloytype2=/obj/item/stack/sheet/mineral/plasma;alloytypeout=/obj/item/stack/sheet/mineral/plastitanium'>Smelt</A><BR>"
dat += "<br><div class='statusDisplay'><b>Mineral Value List:</b><BR>[get_ore_values()]</div>"
var/datum/browser/popup = new(user, "console_stacking_machine", "Ore Redemption Machine", 400, 500)
var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
popup.set_content(dat)
popup.open()
return
@@ -228,69 +255,52 @@
else
to_chat(usr, "<span class='warning'>Not a valid ID!</span>")
if(href_list["release"])
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user.
if(!(text2path(href_list["release"]) in stack_list))
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
var/mat_id = href_list["release"]
if(!materials.materials[mat_id])
return
var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])]
var/obj/item/stack/sheet/out = new inp.type(src, 0, FALSE)
var/datum/material/mat = materials.materials[mat_id]
var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
if(!stored_amount)
return
var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
out.amount = round(min(desired,50,inp.amount))
if(out.amount >= 1)
inp.amount -= out.amount
unload_mineral(out)
if(inp.amount < 1)
stack_list -= text2path(href_list["release"])
qdel(inp)
var/sheets_to_remove = round(min(desired,50,stored_amount))
var/out = get_step(src, output_dir)
materials.retrieve_sheets(sheets_to_remove, mat_id, out)
else
to_chat(usr, "<span class='warning'>Required access not found.</span>")
if(href_list["alloytype1"] && href_list["alloytype2"] && href_list["alloytypeout"])
var/alloytype1 = text2path(href_list["alloytype1"])
var/alloytype2 = text2path(href_list["alloytype2"])
var/alloytypeout = text2path(href_list["alloytypeout"])
if(check_access(inserted_id) || allowed(usr))
if(!(alloytype1 in stack_list))
return
if(!(alloytype2 in stack_list))
return
var/obj/item/stack/sheet/stack1 = stack_list[alloytype1]
var/obj/item/stack/sheet/stack2 = stack_list[alloytype2]
if(href_list["alloy"])
var/alloy_id = href_list["alloy"]
var/datum/design/alloy = files.FindDesignByID(alloy_id)
if((check_access(inserted_id) || allowed(usr)) && alloy)
var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
var/obj/item/stack/sheet/alloyout = new alloytypeout
alloyout.amount = round(min(desired,50,stack1.amount,stack2.amount))
if(alloyout.amount >= 1)
stack1.amount -= alloyout.amount
stack2.amount -= alloyout.amount
unload_mineral(alloyout)
if(stack1.amount < 1)
stack_list -= stack1
qdel(stack1)
if(stack2.amount < 1)
stack_list -= stack2
qdel(stack2)
var/smelt_amount = can_smelt_alloy(alloy)
var/amount = round(min(desired,50,smelt_amount))
materials.use_amount(alloy.materials, amount)
var/output = new alloy.build_path(src)
if(istype(output, /obj/item/stack/sheet))
var/obj/item/stack/sheet/mineral/produced_alloy = output
produced_alloy.amount = amount
unload_mineral(produced_alloy)
else
unload_mineral(output)
else
to_chat(usr, "<span class='warning'>Required access not found.</span>")
updateUsrDialog()
return
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
..()
//empty the redemption machine by stacks of at most max_amount (50 at this time) size
/obj/machinery/mineral/ore_redemption/proc/empty_content()
var/obj/item/stack/sheet/s
for(var/O in stack_list)
s = stack_list[O]
while(s.amount > s.max_amount)
new s.type(loc,s.max_amount)
s.use(s.max_amount)
s.forceMove(get_turf(src))
s.layer = initial(s.layer)
s.plane = initial(s.plane)
/obj/machinery/mineral/ore_redemption/power_change()
..()
update_icon()
+1 -3
View File
@@ -193,9 +193,7 @@
qdel(voucher)
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
if(prob(50 / severity) && severity < 3)
qdel(src)
+2 -2
View File
@@ -278,8 +278,8 @@
var/turf/T = deploy_location
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) activated a bluespace capsule away from the mining level! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]")
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]")
template.load(deploy_location, centered = TRUE)
new /obj/effect/particle_effect/smoke(get_turf(src))
qdel(src)
+6 -6
View File
@@ -248,18 +248,18 @@
if(notify_admins)
if(triggered_by == 1)
message_admins("An explosion has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
message_admins("An explosion has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
else if(triggered_by == 2)
message_admins("A signal has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>. Igniter attacher: [key_name_admin(attacher)]<A HREF='?_src_=holder;adminmoreinfo=\ref[attacher]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[attacher]'>FLW</A>)")
message_admins("A signal has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)]. Igniter attacher: [ADMIN_LOOKUPFLW(attacher)]")
else
message_admins("[key_name_admin(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has triggered a [name] to detonate at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
message_admins("[ADMIN_LOOKUPFLW(attacher)] has triggered a [name] to detonate at [ADMIN_COORDJMP(bombturf)].")
if(triggered_by == 1)
log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
log_game("An explosion has primed a [name] for detonation at [A][COORD(bombturf)]")
else if(triggered_by == 2)
log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [key_name(attacher)].")
log_game("A signal has primed a [name] for detonation at [A][COORD(bombturf)]. Igniter attacher: [key_name(attacher)].")
else
user.visible_message("<span class='warning'>[user] strikes \the [src], causing a chain reaction!</span>", "<span class='danger'>You strike \the [src], causing a chain reaction.</span>")
log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]")
spawn(det_time)
if(primed)
if(quality == 3)
+31 -1
View File
@@ -2,6 +2,11 @@
INITIALIZE_IMMEDIATE(/mob/dead)
/mob/dead/Initialize()
. = ..()
if(config.cross_allowed)
verbs += /mob/dead/proc/server_hop
/mob/dead/dust() //ghosts can't be vaporised.
return
@@ -9,4 +14,29 @@ INITIALIZE_IMMEDIATE(/mob/dead)
return
/mob/dead/ConveyorMove() //lol
return
return
/mob/dead/proc/server_hop()
set category = "OOC"
set name = "Server Hop!"
set desc= "Jump to the other server"
if(notransform)
return
if(!config.cross_allowed)
verbs -= /mob/dead/proc/server_hop
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
return
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
return 0
if (client && config.cross_allowed)
to_chat(src, "<span class='notice'>Sending you to [config.cross_address].</span>")
new /obj/screen/splash(client)
notransform = TRUE
sleep(29) //let the animation play
notransform = FALSE
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
client << link(config.cross_address + "?server_hop=[key]")
else
to_chat(src, "<span class='error'>There is no other server configured!</span>")
+8 -30
View File
@@ -58,9 +58,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
verbs += /mob/dead/observer/proc/dead_tele
if(config.cross_allowed)
verbs += /mob/dead/observer/proc/server_hop
if(icon_state in GLOB.ghost_forms_with_directions_list)
ghostimage_default = image(src.icon,src,src.icon_state + "_nodir")
else
@@ -297,7 +294,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/Stat()
..()
if(statpanel("Status"))
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
for(var/datum/gang/G in SSticker.mode.gangs)
if(G.is_dominating)
stat(null, "[G.name] Gang Takeover: [max(G.domination_time_remaining(), 0)]")
@@ -354,9 +351,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!isobserver(usr))
to_chat(usr, "Not when you're not dead!")
return
var/A
A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas
var/area/thearea = A
var/list/filtered = list()
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(!A.hidden)
filtered += A
var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered
if(!thearea)
return
@@ -585,29 +586,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
target.faction = list("neutral")
return 1
/mob/dead/observer/proc/server_hop()
set category = "Ghost"
set name = "Server Hop!"
set desc= "Jump to the other server"
if(notransform)
return
if(!config.cross_allowed)
verbs -= /mob/dead/observer/proc/server_hop
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
return
if (alert(src, "Jump to server running at [config.cross_address]?", "Server Hop", "Yes", "No") != "Yes")
return 0
if (client && config.cross_allowed)
to_chat(src, "<span class='notice'>Sending you to [config.cross_address].</span>")
new /obj/screen/splash(client)
notransform = TRUE
sleep(29) //let the animation play
notransform = FALSE
winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources
client << link(config.cross_address + "?server_hop=[key]")
else
to_chat(src, "<span class='error'>There is no other server configured!</span>")
/proc/show_server_hop_transfer_screen(expected_key)
//only show it to incoming ghosts
for(var/mob/dead/observer/O in GLOB.player_list)
+4 -1
View File
@@ -50,7 +50,8 @@
if(C.has_brain_worms())
var/mob/living/simple_animal/borer/B = C.has_brain_worms()
B.leave_victim() //Should remove borer if the brain is removed - RR
transfer_identity(C)
if(!gc_destroyed || (owner && !owner.gc_destroyed))
transfer_identity(C)
C.update_hair()
/obj/item/organ/brain/prepare_eat()
@@ -60,6 +61,8 @@
name = "[L.name]'s brain"
if(brainmob || decoy_override)
return
if(!L.mind)
return
brainmob = new(src)
brainmob.name = L.real_name
brainmob.real_name = L.real_name
+1 -1
View File
@@ -728,7 +728,7 @@
/mob/living/carbon/can_be_revived()
. = ..()
if(!getorgan(/obj/item/organ/brain))
if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.changeling))
return 0
/mob/living/carbon/harvest(mob/living/user)
@@ -119,9 +119,7 @@
visible_message("<span class='danger'>The [M.name] has shocked [src]!</span>", \
"<span class='userdanger'>The [M.name] has shocked [src]!</span>")
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
var/power = M.powerlevel + rand(0,3)
Weaken(power)
if(stuttering < power)
+5 -1
View File
@@ -24,7 +24,8 @@
if(!no_bodyparts)
if(no_organs)//so the organs don't get transfered inside the bodyparts we'll drop.
for(var/X in internal_organs)
qdel(X)
if(no_brain || !istype(X, /obj/item/organ/brain))
qdel(X)
else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it.
for(var/X in internal_organs)
var/obj/item/organ/O = X
@@ -42,6 +43,9 @@
if(no_brain && istype(I, /obj/item/organ/brain))
qdel(I)
continue
if(no_organs && !istype(I, /obj/item/organ/brain))
qdel(I)
continue
I.Remove(src)
I.forceMove(get_turf(src))
I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
@@ -32,7 +32,7 @@
dna.species.spec_death(gibbed, src)
if(SSticker && SSticker.mode)
if(SSticker.HasRoundStarted())
SSblackbox.ReportDeath(src)
if(mind && mind.devilinfo)
INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src)
@@ -142,10 +142,12 @@
return not_handled //For future deeper overrides
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
if(index && dna.species.mutanthands)
put_in_hand(new dna.species.mutanthands(), index)
if(I == wear_suit)
if(s_store && invdrop)
dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit.
+5 -6
View File
@@ -1,10 +1,9 @@
/mob/living/carbon/human/say_quote(input, spans, message_mode)
/mob/living/carbon/human/say_mod(input, message_mode)
verb_say = dna.species.say_mod
. = ..()
if(src.slurring)
input = attach_spans(input, spans)
return "slurs, \"[input]\""
if(slurring)
return "slurs"
else
. = ..()
/mob/living/carbon/human/treat_message(message)
message = dna.species.handle_speech(message,src)
@@ -73,6 +73,9 @@
//Ears
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
//Hands
var/obj/item/mutanthands = null
///////////
// PROCS //
///////////
@@ -139,15 +142,16 @@
qdel(lungs)
lungs = null
if(eyes)
qdel(eyes)
eyes = new mutanteyes
eyes.Insert(C)
if(C.get_bodypart("head"))
if(eyes)
qdel(eyes)
eyes = new mutanteyes
eyes.Insert(C)
if(ears)
qdel(ears)
ears = new mutantears
ears.Insert(C)
if(ears)
qdel(ears)
ears = new mutantears
ears.Insert(C)
if((!(NOBREATH in species_traits)) && !lungs)
if(mutantlungs)
@@ -169,6 +173,21 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
if(old_species.mutanthands)
for(var/obj/item/I in C.held_items)
if(istype(I, old_species.mutanthands))
qdel(I)
if(mutanthands)
// Drop items in hands
// If you're lucky enough to have a NODROP item, then it stays.
for(var/V in C.held_items)
var/obj/item/I = V
if(istype(I))
C.dropItemToGround(I)
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
C.put_in_hands(new mutanthands())
/datum/species/proc/on_species_loss(mob/living/carbon/C)
if(C.dna.species.exotic_bloodtype)
C.dna.blood_type = random_blood_type()
@@ -13,6 +13,7 @@
name = "Infectious Zombie"
id = "memezombies"
limbs_id = "zombie"
mutanthands = /obj/item/zombie_hand
no_equip = list(slot_wear_mask, slot_head)
armor = 20 // 120 damage to KO a zombie, which kills it
speedmod = 2
@@ -27,29 +28,15 @@
/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
// Drop items in hands
// If you're a zombie lucky enough to have a NODROP item, then it stays.
for(var/V in C.held_items)
var/obj/item/I = V
if(istype(I))
if(C.dropItemToGround(I))
var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
C.put_in_hands(zh)
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
var/obj/item/zombie_hand/zh = new /obj/item/zombie_hand()
C.put_in_hands(zh)
// Next, deal with the source of this zombie corruption
// Deal with the source of this zombie corruption
// Infection organ needs to be handled separately from mutant_organs
// because it persists through species transitions
var/obj/item/organ/zombie_infection/infection
infection = C.getorganslot("zombie_infection")
if(!infection)
infection = new(C)
/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/C)
. = ..()
for(var/obj/item/I in C.held_items)
if(istype(I, /obj/item/zombie_hand))
qdel(I)
infection = new()
infection.Insert(C)
// Your skin falls off
+8 -1
View File
@@ -29,6 +29,13 @@
med_hud_set_status()
/mob/living/Destroy()
if(LAZYLEN(status_effects))
for(var/s in status_effects)
var/datum/status_effect/S = s
if(S.on_remove_on_mob_delete) //the status effect calls on_remove when its mob is deleted
qdel(S)
else
S.be_replaced()
if(ranged_ability)
ranged_ability.remove_ranged_ability(src)
if(buckled)
@@ -597,7 +604,7 @@
return name
/mob/living/update_gravity(has_gravity,override = 0)
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
return
if(has_gravity)
clear_alert("weightless")
+1 -1
View File
@@ -172,7 +172,7 @@
/mob/living/attack_slime(mob/living/simple_animal/slime/M)
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
to_chat(M, "You cannot attack people before the game has started.")
return
+12 -13
View File
@@ -423,18 +423,17 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return 3
return 0
/mob/living/say_quote(input, list/spans, message_mode)
var/tempinput = attach_spans(input, spans)
/mob/living/say_mod(input, message_mode)
if(message_mode == MODE_WHISPER)
return "[verb_whisper], \"[tempinput]\""
if(message_mode == MODE_WHISPER_CRIT)
return "[verb_whisper] in [p_their()] last breath, \"[tempinput]\""
if (stuttering)
return "stammers, \"[tempinput]\""
if (getBrainLoss() >= 60)
return "gibbers, \"[tempinput]\""
return ..()
. = verb_whisper
else if(message_mode == MODE_WHISPER_CRIT)
. = "[verb_whisper] in [p_their()] last breath"
else if(stuttering)
. = "stammers"
else if(getBrainLoss() >= 60)
. = "gibbers"
else
. = ..()
/mob/living/get_default_language()
if(selected_default_language)
@@ -448,5 +447,5 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/mob/living/proc/open_language_menu(mob/user)
language_menu.ui_interact(user)
/mob/living/whisper(message as text)
say("#[message]")
/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
say("#[message]", bubble_type, spans, sanitize, language)
+2 -2
View File
@@ -238,7 +238,7 @@
else if(icontype == "Angel")
icon_state = "ai-angel"
//else
//usr <<"You can only change your display once!"
//to_chat(usr, "You can only change your display once!")
//return
/mob/living/silicon/ai/Stat()
@@ -351,7 +351,7 @@
if(isAI(usr))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
src << "Wireless control is disabled!"
to_chat(src, "Wireless control is disabled!")
return
SSshuttle.cancelEvac(src)
return
@@ -6,7 +6,7 @@
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M)
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
to_chat(M, "You cannot attack people before the game has started.")
return
..()
@@ -28,7 +28,7 @@
//Holopad
if(istype(ai.current, /obj/machinery/holopad))
var/obj/machinery/holopad/H = ai.current
H.move_hologram(ai)
H.move_hologram(ai, T)
/mob/camera/aiEye/Move()
return 0
@@ -271,6 +271,7 @@
/obj/item/roller/robo,
/obj/item/borg/cyborghug/medical,
/obj/item/stack/medical/gauze/cyborg,
/obj/item/weapon/organ_storage,
/obj/item/borg/lollipop)
emag_modules = list(/obj/item/weapon/reagent_containers/borghypo/hacked)
ratvar_modules = list(
@@ -287,17 +287,13 @@
to_chat(user, "<span class='warning'>The welder must be on for this task!</span>")
else
if(W.force) //if force is non-zero
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
..()
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
if(prob(75) && Proj.damage > 0)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
return ..()
/mob/living/simple_animal/bot/emp_act(severity)
@@ -259,9 +259,7 @@
if(prob(50))
new /obj/item/bodypart/l_arm/robot(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
..()
/obj/machinery/bot_core/cleanbot
@@ -390,9 +390,7 @@ Auto Patrol[]"},
if(lasercolor == "r")
new /obj/item/clothing/suit/redtag(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
new /obj/effect/decal/cleanable/oil(loc)
..()
@@ -381,9 +381,7 @@
var/obj/item/stack/tile/plasteel/T = new (Tsec)
T.amount = 1
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
..()
/obj/machinery/bot_core/floorbot
@@ -530,9 +530,7 @@
if(emagged && prob(25))
playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
..()
/mob/living/simple_animal/bot/medbot/proc/declare(crit_patient)
@@ -719,9 +719,7 @@
cell.update_icon()
cell = null
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
new /obj/effect/decal/cleanable/oil(loc)
..()
@@ -397,9 +397,7 @@ Auto Patrol: []"},
if(prob(50))
new /obj/item/bodypart/l_arm/robot(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
new /obj/effect/decal/cleanable/oil(loc)
..()
@@ -15,6 +15,7 @@
status_flags = CANPUSH
attack_sound = 'sound/weapons/punch1.ogg'
see_in_dark = 7
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -31,11 +32,14 @@
var/list/construct_spells = list()
var/playstyle_string = "<b>You are a generic construct! Your job is to not exist, and you should probably adminhelp this.</b>"
/mob/living/simple_animal/hostile/construct/Initialize()
. = ..()
update_health_hud()
for(var/spell in construct_spells)
AddSpell(new spell(null))
/mob/living/simple_animal/hostile/construct/Login()
..()
to_chat(src, playstyle_string)
@@ -84,6 +88,10 @@
/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
return 0
/mob/living/simple_animal/hostile/construct/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
if(updating_health)
update_health_hud()
/////////////////Juggernaut///////////////
/mob/living/simple_animal/hostile/construct/armored
@@ -268,3 +276,22 @@
/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
/////////////////////////////ui stuff/////////////////////////////
/mob/living/simple_animal/hostile/construct/update_health_hud()
if(hud_used)
if(health >= maxHealth)
hud_used.healths.icon_state = "[icon_state]_health0"
else if(health > maxHealth*0.8)
hud_used.healths.icon_state = "[icon_state]_health2"
else if(health > maxHealth*0.6)
hud_used.healths.icon_state = "[icon_state]_health3"
else if(health > maxHealth*0.4)
hud_used.healths.icon_state = "[icon_state]_health4"
else if(health > maxHealth*0.2)
hud_used.healths.icon_state = "[icon_state]_health5"
else
hud_used.healths.icon_state = "[icon_state]_health6"
@@ -53,7 +53,5 @@
ranged = 1
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
do_sparks(3, TRUE, src)
..(1)
@@ -187,8 +187,9 @@ Difficulty: Medium
animate(src, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING)
for(var/i in 1 to 3)
sleep(1)
if(QDELETED(src)) //we got hit and died, rip us
if(QDELETED(src) || stat == DEAD) //we got hit and died, rip us
qdel(F)
swooping &= ~SWOOP_DAMAGEABLE
return
animate(src, transform = matrix()*0.7, time = 7)
swooping |= SWOOP_INVULNERABLE
@@ -220,7 +220,7 @@
else
target.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
name = "Toggle Nightvision \[ON]"
target.update_sight()
target.update_sight()
/mob/living/simple_animal/hostile/statue/sentience_act()
faction -= "neutral"
@@ -254,10 +254,10 @@
if(icon_gib)
new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
/mob/living/simple_animal/say_quote(input, list/spans)
/mob/living/simple_animal/say_mod(input, message_mode)
if(speak_emote && speak_emote.len)
verb_say = pick(speak_emote)
return ..()
. = ..()
/mob/living/simple_animal/emote(act, m_type=1, message = null)
if(stat)
+2
View File
@@ -3,6 +3,7 @@
GLOB.dead_mob_list -= src
GLOB.living_mob_list -= src
GLOB.all_clockwork_mobs -= src
GLOB.mob_directory -= tag
if(observers && observers.len)
for(var/M in observers)
var/mob/dead/observe = M
@@ -22,6 +23,7 @@
/mob/Initialize()
tag = "mob_[next_mob_id++]"
GLOB.mob_list += src
GLOB.mob_directory[tag] = src
if(stat == DEAD)
GLOB.dead_mob_list += src
else
+2 -2
View File
@@ -326,7 +326,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return 0
/proc/is_special_character(mob/M) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this.
if(!SSticker || !SSticker.mode)
if(!SSticker.HasRoundStarted())
return 0
if(!istype(M))
return 0
@@ -396,7 +396,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
A.action = action
A.target = source
if(!alert_overlay)
alert_overlay = new(src)
alert_overlay = new(source)
alert_overlay.layer = FLOAT_LAYER
alert_overlay.plane = FLOAT_PLANE
A.add_overlay(alert_overlay)
+27 -16
View File
@@ -13,12 +13,6 @@
stored_implants += IMP
IMP.removed(src, 1, 1)
if (tr_flags & TR_KEEPORGANS)
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
I.Remove(src, 1)
var/list/missing_bodyparts_zones = get_missing_limbs()
var/obj/item/cavity_object
@@ -92,10 +86,21 @@
var/obj/item/weapon/implant/IMP = Y
IMP.implant(O, null, 1)
//re-add organs to new mob
//re-add organs to new mob. this order prevents moving the mind to a brain at any point
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
qdel(X)
var/obj/item/organ/I = X
I.Remove(O, 1)
if(mind)
mind.transfer_to(O)
if(O.mind.changeling)
O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
I.Remove(src, 1)
for(var/X in int_organs)
var/obj/item/organ/I = X
@@ -118,7 +123,7 @@
qdel(G) //we lose the organs in the missing limbs
qdel(BP)
//transfer mind and delete old mob
//transfer mind if we didn't yet
if(mind)
mind.transfer_to(O)
if(O.mind.changeling)
@@ -154,12 +159,6 @@
stored_implants += IMP
IMP.removed(src, 1, 1)
if (tr_flags & TR_KEEPORGANS)
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
I.Remove(src, 1)
var/list/missing_bodyparts_zones = get_missing_limbs()
var/obj/item/cavity_object
@@ -244,7 +243,19 @@
if(tr_flags & TR_KEEPORGANS)
for(var/X in O.internal_organs)
qdel(X)
var/obj/item/organ/I = X
I.Remove(O, 1)
if(mind)
mind.transfer_to(O)
if(O.mind.changeling)
for(var/obj/effect/proc_holder/changeling/humanform/HF in O.mind.changeling.purchasedpowers)
mind.changeling.purchasedpowers -= HF
for(var/X in internal_organs)
var/obj/item/organ/I = X
int_organs += I
I.Remove(src, 1)
for(var/X in int_organs)
var/obj/item/organ/I = X
@@ -3,7 +3,7 @@
filedesc = "ID card modification program"
program_icon_state = "id"
extended_desc = "Program for programming employee ID cards to access parts of the station."
transfer_access = GLOB.access_change_ids
transfer_access = GLOB.access_heads
requires_ntnet = 0
size = 8
var/mod_mode = 1
@@ -452,7 +452,7 @@
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
if(auth_card)
region_access = list()
if(transfer_access in auth_card.GetAccess())
if(GLOB.access_change_ids in auth_card.GetAccess())
minor = 0
authenticated = 1
return 1
+2 -6
View File
@@ -497,9 +497,7 @@
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
return
C.use(10)
to_chat(user, "<span class='notice'>You add cables to the APC frame.</span>")
@@ -1181,9 +1179,7 @@
/obj/machinery/power/apc/proc/shock(mob/user, prb)
if(!prob(prb))
return 0
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
if(isalien(user))
return 0
if(electrocute_mob(user, src, src, 1, TRUE))
+1 -3
View File
@@ -156,9 +156,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(!prob(prb))
return 0
if (electrocute_mob(user, powernet, src, siemens_coeff))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_sparks(5, TRUE, src)
return 1
else
return 0
+31 -14
View File
@@ -33,6 +33,7 @@
cold_circ = locate(circpath) in get_step(src, cold_dir)
hot_circ = locate(circpath) in get_step(src, hot_dir)
connect_to_network()
SSair.atmos_machinery += src
if(cold_circ)
switch(cold_dir)
@@ -54,7 +55,10 @@
stat |= BROKEN
update_icon()
/obj/machinery/power/generator/Destroy()
SSair.atmos_machinery -= src
return ..()
/obj/machinery/power/generator/update_icon()
@@ -63,21 +67,20 @@
else
cut_overlays()
if(lastgenlev != 0)
add_overlay("teg-op[lastgenlev]")
var/L = min(round(lastgenlev/100000),11)
if(L != 0)
add_overlay(image('icons/obj/power.dmi', "teg-op[L]"))
add_overlay("teg-oc[lastcirc]")
#define GENRATE 800 // generator output coefficient from Q
/obj/machinery/power/generator/process()
/obj/machinery/power/generator/process_atmos()
if(!cold_circ || !hot_circ)
return
lastgen = 0
if(powernet)
//to_chat(world, "cold_circ and hot_circ pass")
@@ -104,7 +107,7 @@
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
var/heat = energy_transfer*(1-efficiency)
lastgen = energy_transfer*efficiency
lastgen += energy_transfer*efficiency
//to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];")
@@ -113,7 +116,7 @@
//to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
add_avail(lastgen)
//add_avail(lastgen) This is done in process now
// update icon overlays only if displayed level has changed
if(hot_air)
@@ -123,15 +126,23 @@
if(cold_air)
var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1
cold_circ_air1.merge(cold_air)
update_icon()
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]"
if((genlev != lastgenlev) || (circ != lastcirc))
lastgenlev = genlev
if(circ != lastcirc)
lastcirc = circ
update_icon()
src.updateDialog()
/obj/machinery/power/generator/process()
//Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math**
var/power_output = round(lastgen / 10)
add_avail(power_output)
lastgenlev = power_output
lastgen -= power_output
..()
/obj/machinery/power/generator/attack_hand(mob/user)
if(..())
@@ -150,9 +161,15 @@
var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2
t += "<div class='statusDisplay'>"
t += "Output: [round(lastgen)] W"
var/displaygen = lastgenlev
if(displaygen < 1000000) //less than a MW
displaygen /= 1000
t += "Output: [round(displaygen,0.01)] kW"
else
displaygen /= 1000000
t += "Output: [round(displaygen,0.01)] MW"
t += "<BR>"
t += "<B><font color='blue'>Cold loop</font></B><BR>"
+3 -3
View File
@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
use_power = on ? 2 : 1
// Sound the alert if gravity was just enabled or disabled.
var/alert = 0
var/area/area = get_area(src)
var/area/A = get_area(src)
if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
if(gravity_in_level() == 0)
alert = 1
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
message_admins("The gravity generator was brought online. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>[area.name]</a>)")
message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
else
if(gravity_in_level() == 1)
alert = 1
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
message_admins("The gravity generator was brought offline with no backup generator. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>[area.name]</a>)")
message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
update_icon()
update_list()
+7 -5
View File
@@ -93,13 +93,15 @@
connect_to_network()
sparks = new
sparks.attach(src)
sparks.set_up(5, TRUE, src)
/obj/machinery/power/emitter/Destroy()
if(SSticker && SSticker.IsRoundInProgress())
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter deleted at ([x],[y],[z])")
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z]) at [get_area(src)]","singulo")
var/turf/T = get_turf(src)
message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1)
log_game("Emitter deleted at [COORD(T)]")
investigate_log("<font color='red'>deleted</font> at [get_area(src)] [COORD(T)]","singulo")
QDEL_NULL(sparks)
return ..()
@@ -120,8 +122,8 @@
if(src.active==1)
src.active = 0
to_chat(user, "<span class='notice'>You turn off \the [src].</span>")
message_admins("Emitter turned off by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])")
message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
investigate_log("turned <font color='red'>off</font> by [key_name(user)] at [get_area(src)]","singulo")
else
src.active = 1

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