everything but mob stuff
This commit is contained in:
@@ -43,7 +43,6 @@
|
||||
body += "<br><br><b>Show related accounts by:</b> "
|
||||
body += "\[ <a href='?_src_=holder;[HrefToken()];showrelatedacc=cid;client=[REF(M.client)]'>CID</a> | "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];showrelatedacc=ip;client=[REF(M.client)]'>IP</a> \]"
|
||||
|
||||
var/rep = 0
|
||||
rep += SSpersistence.antag_rep[M.ckey]
|
||||
body += "<br><br>Antagonist reputation: [rep]"
|
||||
@@ -52,12 +51,15 @@
|
||||
body += "<a href='?_src_=holder;[HrefToken()];modantagrep=set;mob=[REF(M)]'>\[set\]</a> "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];modantagrep=zero;mob=[REF(M)]'>\[zero\]</a>"
|
||||
|
||||
|
||||
body += "<br><br>\[ "
|
||||
body += "<a href='?_src_=vars;[HrefToken()];Vars=[REF(M)]'>VV</a> - "
|
||||
if(M.mind)
|
||||
body += "<a href='?_src_=holder;[HrefToken()];traitor=[REF(M)]'>TP</a> - "
|
||||
else
|
||||
body += "<a href='?_src_=holder;[HrefToken()];initmind=[REF(M)]'>Init Mind</a> - "
|
||||
if (iscyborg(M))
|
||||
body += "<a href='?_src_=holder;[HrefToken()];borgpanel=[REF(M)]'>BP</a> - "
|
||||
body += "<a href='?priv_msg=[M.ckey]'>PM</a> - "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];subtlemessage=[REF(M)]'>SM</a> - "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];adminplayerobservefollow=[REF(M)]'>FLW</a> - "
|
||||
@@ -177,9 +179,9 @@
|
||||
body += "<A href='?_src_=holder;[HrefToken()];tdome2=[REF(M)]'>Thunderdome 2</A> | "
|
||||
body += "<A href='?_src_=holder;[HrefToken()];tdomeadmin=[REF(M)]'>Thunderdome Admin</A> | "
|
||||
body += "<A href='?_src_=holder;[HrefToken()];tdomeobserve=[REF(M)]'>Thunderdome Observer</A> | "
|
||||
|
||||
|
||||
body += usr.client.citaPPoptions(M) // CITADEL
|
||||
|
||||
|
||||
body += "<br>"
|
||||
body += "</body></html>"
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
|
||||
//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, world.AVerbsDefault())
|
||||
@@ -6,7 +7,6 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault())
|
||||
return list(
|
||||
/client/proc/deadmin, /*destroys our own admin datum so we can play as a regular player*/
|
||||
/client/proc/cmd_admin_say, /*admin-only ooc chat*/
|
||||
/client/proc/cmd_admin_ticket_panel,
|
||||
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
|
||||
/client/proc/deadchat,
|
||||
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
|
||||
@@ -39,6 +39,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
|
||||
/client/proc/check_antagonists, /*shows all antags*/
|
||||
/datum/admins/proc/access_news_network, /*allows access of newscasters*/
|
||||
/client/proc/jumptocoord, /*we ghost and jump to a coordinate*/
|
||||
/client/proc/getcurrentlogs, /*for accessing server logs for the current round*/
|
||||
/client/proc/Getmob, /*teleports a mob to our location*/
|
||||
/client/proc/Getkey, /*teleports a mob with a certain ckey to our location*/
|
||||
// /client/proc/sendmob, /*sends a mob somewhere*/ -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage
|
||||
@@ -56,7 +57,6 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
|
||||
/client/proc/cmd_admin_create_centcom_report,
|
||||
/client/proc/cmd_change_command_name,
|
||||
/client/proc/cmd_admin_check_player_exp, /* shows players by playtime */
|
||||
/client/proc/toggle_antag_hud, /*toggle display of the admin antag hud*/
|
||||
/client/proc/toggle_combo_hud, // toggle display of the combination pizza antag and taco sci/med/eng hud
|
||||
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
|
||||
/client/proc/open_shuttle_manipulator, /* Opens shuttle manipulator UI */
|
||||
@@ -228,7 +228,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
|
||||
/client/proc/admin_change_sec_level,
|
||||
/client/proc/toggle_nuke,
|
||||
/client/proc/cmd_display_del_log,
|
||||
/client/proc/toggle_antag_hud,
|
||||
/client/proc/toggle_combo_hud,
|
||||
/client/proc/debug_huds,
|
||||
/client/proc/cmd_admin_man_up, //CIT CHANGE - adds man up verb
|
||||
@@ -622,7 +621,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
|
||||
return
|
||||
|
||||
if(has_antag_hud())
|
||||
toggle_antag_hud()
|
||||
toggle_combo_hud()
|
||||
|
||||
holder.deactivate()
|
||||
|
||||
|
||||
@@ -119,21 +119,13 @@
|
||||
|
||||
/obj/effect/forcefield/arena_shuttle
|
||||
name = "portal"
|
||||
timeleft = 0
|
||||
var/list/warp_points
|
||||
|
||||
/obj/effect/forcefield/arena_shuttle/Initialize()
|
||||
. = ..()
|
||||
warp_points = get_area_turfs(/area/shuttle/escape)
|
||||
for(var/thing in warp_points)
|
||||
CHECK_TICK
|
||||
var/turf/T = thing
|
||||
if(istype(T.loc, /area/shuttle/escape/backup))
|
||||
warp_points -= T
|
||||
continue
|
||||
for(var/atom/movable/TAM in T)
|
||||
if(TAM.density && TAM.anchored)
|
||||
warp_points -= T
|
||||
break
|
||||
for(var/obj/effect/landmark/shuttle_arena_safe/exit in GLOB.landmarks_list)
|
||||
warp_points += exit
|
||||
|
||||
/obj/effect/forcefield/arena_shuttle/CollidedWith(atom/movable/AM)
|
||||
if(!isliving(AM))
|
||||
@@ -143,7 +135,7 @@
|
||||
if(L.pulling && istype(L.pulling, /obj/item/bodypart/head))
|
||||
to_chat(L, "Your offering is accepted. You may pass.")
|
||||
qdel(L.pulling)
|
||||
var/turf/LA = pick(warp_points)
|
||||
var/turf/LA = get_turf(pick(warp_points))
|
||||
L.forceMove(LA)
|
||||
L.hallucination = 0
|
||||
to_chat(L, "<span class='reallybig redtext'>The battle is won. Your bloodlust subsides.</span>")
|
||||
@@ -163,6 +155,7 @@
|
||||
|
||||
/obj/effect/forcefield/arena_shuttle_entrance
|
||||
name = "portal"
|
||||
timeleft = 0
|
||||
var/list/warp_points = list()
|
||||
|
||||
/obj/effect/forcefield/arena_shuttle_entrance/CollidedWith(atom/movable/AM)
|
||||
|
||||
@@ -80,6 +80,8 @@
|
||||
body += "<a href='?_src_=holder;[HrefToken()];showmessageckey="+ckey+"'>N</a> - "
|
||||
body += "<a href='?_src_=vars;[HrefToken()];Vars="+ref+"'>VV</a> - "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];traitor="+ref+"'>TP</a> - "
|
||||
if (job == "Cyborg")
|
||||
body += "<a href='?_src_=holder;[HrefToken()];borgpanel="+ref+"'>BP</a> - "
|
||||
body += "<a href='?priv_msg="+ckey+"'>PM</a> - "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];subtlemessage="+ref+"'>SM</a> - "
|
||||
body += "<a href='?_src_=holder;[HrefToken()];adminplayerobservefollow="+ref+"'>FLW</a> - "
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
|
||||
if(!CheckAdminHref(href, href_list))
|
||||
return
|
||||
|
||||
|
||||
citaTopic(href, href_list) //CITADEL EDIT, MENTORS
|
||||
|
||||
|
||||
if(href_list["ahelp"])
|
||||
if(!check_rights(R_ADMIN, TRUE))
|
||||
return
|
||||
@@ -1921,6 +1921,16 @@
|
||||
else
|
||||
show_traitor_panel(M)
|
||||
|
||||
else if(href_list["borgpanel"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/mob/M = locate(href_list["borgpanel"])
|
||||
if(!iscyborg(M))
|
||||
to_chat(usr, "This can only be used on cyborgs")
|
||||
else
|
||||
open_borgopanel(M)
|
||||
|
||||
else if(href_list["initmind"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -398,7 +398,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
message_admins(msg)
|
||||
log_admin_private(msg)
|
||||
AddInteraction("Being handled by [key_name]")
|
||||
|
||||
|
||||
//Show the ticket panel
|
||||
/datum/admin_help/proc/TicketPanel()
|
||||
var/list/dat = list("<html><head><title>Ticket #[id]</title></head>")
|
||||
@@ -534,28 +534,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
|
||||
new /datum/admin_help(msg, src, FALSE)
|
||||
|
||||
//admin proc
|
||||
/client/proc/cmd_admin_ticket_panel()
|
||||
set name = "Show Ticket List"
|
||||
set category = "Admin"
|
||||
|
||||
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"))
|
||||
if("Active Tickets")
|
||||
browse_to = AHELP_ACTIVE
|
||||
if("Closed Tickets")
|
||||
browse_to = AHELP_CLOSED
|
||||
if("Resolved Tickets")
|
||||
browse_to = AHELP_RESOLVED
|
||||
else
|
||||
return
|
||||
|
||||
GLOB.ahelp_tickets.BrowseTickets(browse_to)
|
||||
|
||||
//
|
||||
// LOGGING
|
||||
//
|
||||
|
||||
@@ -10,11 +10,10 @@
|
||||
return
|
||||
|
||||
var/list/turfs = list()
|
||||
for(var/area/Ar in A.related)
|
||||
for(var/turf/T in Ar)
|
||||
if(T.density)
|
||||
continue
|
||||
turfs.Add(T)
|
||||
for(var/turf/T in A)
|
||||
if(T.density)
|
||||
continue
|
||||
turfs.Add(T)
|
||||
|
||||
var/turf/T = safepick(turfs)
|
||||
if(!T)
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
/datum/admins/proc/open_borgopanel(borgo in GLOB.silicon_mobs)
|
||||
set category = "Admin"
|
||||
set name = "Show Borg Panel"
|
||||
set desc = "Show borg panel"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if (!istype(borgo, /mob/living/silicon/robot))
|
||||
borgo = input("Select a borg", "Select a borg", null, null) as null|anything in GLOB.silicon_mobs
|
||||
if (!istype(borgo, /mob/living/silicon/robot))
|
||||
to_chat(usr, "<span class='warning'>Borg is required for borgpanel</span>")
|
||||
|
||||
var/datum/borgpanel/borgpanel = new(usr, borgo)
|
||||
|
||||
borgpanel.ui_interact(usr)
|
||||
|
||||
|
||||
|
||||
/datum/borgpanel
|
||||
var/mob/living/silicon/robot/borg
|
||||
var/user
|
||||
|
||||
/datum/borgpanel/New(user, mob/living/silicon/robot/borg)
|
||||
if(!istype(borg))
|
||||
CRASH("Borg panel is only available for borgs")
|
||||
qdel(src)
|
||||
if (istype(user, /mob))
|
||||
var/mob/M = user
|
||||
if (!M.client)
|
||||
CRASH("Borg panel attempted to open to a mob without a client")
|
||||
src.user = M.client
|
||||
else
|
||||
src.user = user
|
||||
src.borg = borg
|
||||
|
||||
/datum/borgpanel/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "borgopanel", "Borg Panel", 700, 700, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/datum/borgpanel/ui_data(mob/user)
|
||||
. = list()
|
||||
.["borg"] = list(
|
||||
"ref" = REF(borg),
|
||||
"name" = "[borg]",
|
||||
"emagged" = borg.emagged,
|
||||
"active_module" = "[borg.module.type]",
|
||||
"lawupdate" = borg.lawupdate,
|
||||
"lockdown" = borg.lockcharge,
|
||||
"scrambledcodes" = borg.scrambledcodes
|
||||
)
|
||||
.["upgrades"] = list()
|
||||
for (var/upgradetype in subtypesof(/obj/item/borg/upgrade)-/obj/item/borg/upgrade/hypospray) //hypospray is a dummy parent for hypospray upgrades
|
||||
var/obj/item/borg/upgrade/upgrade = upgradetype
|
||||
if (initial(upgrade.module_type) && !istype(borg.module, initial(upgrade.module_type))) // Upgrade requires a different module
|
||||
continue
|
||||
var/installed = FALSE
|
||||
if (locate(upgradetype) in borg)
|
||||
installed = TRUE
|
||||
.["upgrades"] += list(list("name" = initial(upgrade.name), "installed" = installed, "type" = upgradetype))
|
||||
.["laws"] = borg.laws ? borg.laws.get_law_list(include_zeroth = TRUE) : list()
|
||||
.["channels"] = list()
|
||||
for (var/k in GLOB.radiochannels)
|
||||
if (k == "Common")
|
||||
continue
|
||||
.["channels"] += list(list("name" = k, "installed" = (k in borg.radio.channels)))
|
||||
.["cell"] = borg.cell ? list("missing" = FALSE, "maxcharge" = borg.cell.maxcharge, "charge" = borg.cell.charge) : list("missing" = TRUE, "maxcharge" = 1, "charge" = 0)
|
||||
.["modules"] = list()
|
||||
for(var/moduletype in typesof(/obj/item/robot_module))
|
||||
var/obj/item/robot_module/module = moduletype
|
||||
.["modules"] += list(list(
|
||||
"name" = initial(module.name),
|
||||
"type" = "[module]"
|
||||
))
|
||||
.["ais"] = list(list("name" = "None", "ref" = "null", "connected" = isnull(borg.connected_ai)))
|
||||
for(var/mob/living/silicon/ai/ai in GLOB.ai_list)
|
||||
.["ais"] += list(list("name" = ai.name, "ref" = REF(ai), "connected" = (borg.connected_ai == ai)))
|
||||
|
||||
|
||||
/datum/borgpanel/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch (action)
|
||||
if ("set_charge")
|
||||
var/newcharge = input("New charge (0-[borg.cell.maxcharge]):", borg.name, borg.cell.charge) as num|null
|
||||
if (newcharge)
|
||||
borg.cell.charge = CLAMP(newcharge, 0, borg.cell.maxcharge)
|
||||
message_admins("[key_name_admin(user)] set the charge of [key_name_admin(borg)][ADMIN_FLW(borg)] to [borg.cell.charge].")
|
||||
log_admin("[key_name(user)] set the charge of [key_name(borg)] to [borg.cell.charge].")
|
||||
if ("remove_cell")
|
||||
QDEL_NULL(borg.cell)
|
||||
message_admins("[key_name_admin(user)] deleted the cell of [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] deleted the cell of [key_name(borg)].")
|
||||
if ("change_cell")
|
||||
var/chosen = pick_closest_path(null, make_types_fancy(typesof(/obj/item/stock_parts/cell)))
|
||||
if (!ispath(chosen))
|
||||
chosen = text2path(chosen)
|
||||
if (chosen)
|
||||
if (borg.cell)
|
||||
QDEL_NULL(borg.cell)
|
||||
var/new_cell = new chosen(borg)
|
||||
borg.cell = new_cell
|
||||
borg.cell.charge = borg.cell.maxcharge
|
||||
borg.diag_hud_set_borgcell()
|
||||
message_admins("[key_name_admin(user)] changed the cell of [key_name_admin(borg)][ADMIN_FLW(borg)] to [new_cell].")
|
||||
log_admin("[key_name(user)] changed the cell of [key_name(borg)] to [new_cell].")
|
||||
if ("toggle_emagged")
|
||||
borg.SetEmagged(!borg.emagged)
|
||||
if (borg.emagged)
|
||||
message_admins("[key_name_admin(user)] emagged [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] emagged [key_name(borg)].")
|
||||
else
|
||||
message_admins("[key_name_admin(user)] un-emagged [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] un-emagged [key_name(borg)].")
|
||||
if ("toggle_lawupdate")
|
||||
borg.lawupdate = !borg.lawupdate
|
||||
if (borg.lawupdate)
|
||||
message_admins("[key_name_admin(user)] enabled lawsync on [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] enabled lawsync on [key_name(borg)].")
|
||||
else
|
||||
message_admins("[key_name_admin(user)] disabled lawsync on [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] disabled lawsync on [key_name(borg)].")
|
||||
if ("toggle_lockdown")
|
||||
borg.SetLockdown(!borg.lockcharge)
|
||||
if (borg.lockcharge)
|
||||
message_admins("[key_name_admin(user)] locked down [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] locked down [key_name(borg)].")
|
||||
else
|
||||
message_admins("[key_name_admin(user)] released [key_name_admin(borg)][ADMIN_FLW(borg)] from lockdown.")
|
||||
log_admin("[key_name(user)] released [key_name(borg)] from lockdown.")
|
||||
if ("toggle_scrambledcodes")
|
||||
borg.scrambledcodes = !borg.scrambledcodes
|
||||
if (borg.scrambledcodes)
|
||||
message_admins("[key_name_admin(user)] enabled scrambled codes on [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] enabled scrambled codes on [key_name(borg)].")
|
||||
else
|
||||
message_admins("[key_name_admin(user)] disabled scrambled codes on [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] disabled scrambled codes on [key_name(borg)].")
|
||||
if ("rename")
|
||||
var/new_name = stripped_input(user,"What would you like to name this cyborg?","Input a name",borg.real_name,MAX_NAME_LEN)
|
||||
if(!new_name)
|
||||
return
|
||||
message_admins("[key_name_admin(user)] renamed [key_name_admin(borg)][ADMIN_FLW(borg)] to [new_name].")
|
||||
log_admin("[key_name(user)] renamed [key_name(borg)] to [new_name].")
|
||||
borg.fully_replace_character_name(borg.real_name,new_name)
|
||||
if ("toggle_upgrade")
|
||||
var/upgradepath = text2path(params["upgrade"])
|
||||
var/obj/item/borg/upgrade/installedupgrade = locate(upgradepath) in borg
|
||||
if (installedupgrade)
|
||||
installedupgrade.deactivate(borg, user)
|
||||
borg.upgrades -= installedupgrade
|
||||
message_admins("[key_name_admin(user)] removed the [installedupgrade] upgrade from [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] removed the [installedupgrade] upgrade from [key_name(borg)].")
|
||||
qdel(installedupgrade)
|
||||
else
|
||||
var/obj/item/borg/upgrade/upgrade = new upgradepath(borg)
|
||||
upgrade.action(borg, user)
|
||||
borg.upgrades += upgrade
|
||||
message_admins("[key_name_admin(user)] added the [upgrade] borg upgrade to [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] added the [upgrade] borg upgrade to [key_name(borg)].")
|
||||
if ("toggle_radio")
|
||||
var/channel = params["channel"]
|
||||
if (channel in borg.radio.channels) // We're removing a channel
|
||||
if (!borg.radio.keyslot) // There's no encryption key. This shouldn't happen but we can cope
|
||||
borg.radio.channels -= channel
|
||||
if (channel == "Syndicate")
|
||||
borg.radio.syndie = FALSE
|
||||
else if (channel == "CentCom")
|
||||
borg.radio.independent = FALSE
|
||||
else
|
||||
borg.radio.keyslot.channels -= channel
|
||||
if (channel == "Syndicate")
|
||||
borg.radio.keyslot.syndie = FALSE
|
||||
else if (channel == "CentCom")
|
||||
borg.radio.keyslot.independent = FALSE
|
||||
message_admins("[key_name_admin(user)] removed the [channel] radio channel from [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] removed the [channel] radio channel from [key_name(borg)].")
|
||||
else // We're adding a channel
|
||||
if (!borg.radio.keyslot) // Assert that an encryption key exists
|
||||
borg.radio.keyslot = new (borg.radio)
|
||||
borg.radio.keyslot.channels[channel] = 1
|
||||
if (channel == "Syndicate")
|
||||
borg.radio.keyslot.syndie = TRUE
|
||||
else if (channel == "CentCom")
|
||||
borg.radio.keyslot.independent = TRUE
|
||||
message_admins("[key_name_admin(user)] added the [channel] radio channel to [key_name_admin(borg)][ADMIN_FLW(borg)].")
|
||||
log_admin("[key_name(user)] added the [channel] radio channel to [key_name(borg)].")
|
||||
borg.radio.recalculateChannels()
|
||||
if ("setmodule")
|
||||
var/newmodulepath = text2path(params["module"])
|
||||
if (ispath(newmodulepath))
|
||||
borg.module.transform_to(newmodulepath)
|
||||
message_admins("[key_name_admin(user)] changed the module of [key_name_admin(borg)][ADMIN_FLW(borg)] to [newmodulepath].")
|
||||
log_admin("[key_name(user)] changed the module of [key_name(borg)] to [newmodulepath].")
|
||||
if ("slavetoai")
|
||||
var/mob/living/silicon/ai/newai = locate(params["slavetoai"]) in GLOB.ai_list
|
||||
if (newai && newai != borg.connected_ai)
|
||||
borg.notify_ai(DISCONNECT)
|
||||
if(borg.shell)
|
||||
borg.undeploy()
|
||||
borg.connected_ai = newai
|
||||
borg.notify_ai(TRUE)
|
||||
message_admins("[key_name_admin(user)] slaved [key_name_admin(borg)][ADMIN_FLW(borg)] to the AI [key_name_admin(newai)][ADMIN_FLW(newai)].")
|
||||
log_admin("[key_name(user)] slaved [key_name(borg)] to the AI [key_name(newai)].")
|
||||
else if (params["slavetoai"] == "null")
|
||||
borg.notify_ai(DISCONNECT)
|
||||
if(borg.shell)
|
||||
borg.undeploy()
|
||||
borg.connected_ai = null
|
||||
message_admins("[key_name_admin(user)] freed [key_name_admin(borg)][ADMIN_FLW(borg)] from being slaved to an AI.")
|
||||
log_admin("[key_name(user)] freed [key_name(borg)] from being slaved to an AI.")
|
||||
if (borg.lawupdate)
|
||||
borg.lawsync()
|
||||
|
||||
. = TRUE
|
||||
@@ -270,25 +270,20 @@
|
||||
if(isturf(object) && left_click && !alt_click && !ctrl_click)
|
||||
var/turf/T = object
|
||||
if(isspaceturf(object))
|
||||
T.ChangeTurf(/turf/open/floor/plasteel)
|
||||
T.PlaceOnTop(/turf/open/floor/plating)
|
||||
else if(isplatingturf(object))
|
||||
T.PlaceOnTop(/turf/open/floor/plasteel)
|
||||
else if(isfloorturf(object))
|
||||
T.ChangeTurf(/turf/closed/wall)
|
||||
T.PlaceOnTop(/turf/closed/wall)
|
||||
else if(iswallturf(object))
|
||||
T.ChangeTurf(/turf/closed/wall/r_wall)
|
||||
T.assemble_baseturfs(initial(T.baseturfs))
|
||||
T.PlaceOnTop(/turf/closed/wall/r_wall)
|
||||
log_admin("Build Mode: [key_name(user)] built [T] at ([T.x],[T.y],[T.z])")
|
||||
return
|
||||
else if(right_click)
|
||||
log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])")
|
||||
if(iswallturf(object))
|
||||
if(isturf(object))
|
||||
var/turf/T = object
|
||||
T.ChangeTurf(/turf/open/floor/plasteel)
|
||||
else if(isfloorturf(object))
|
||||
var/turf/T = object
|
||||
T.ChangeTurf(/turf/open/space)
|
||||
else if(istype(object, /turf/closed/wall/r_wall))
|
||||
var/turf/T = object
|
||||
T.ChangeTurf(/turf/closed/wall)
|
||||
T.ScrapeAway()
|
||||
else if(isobj(object))
|
||||
qdel(object)
|
||||
return
|
||||
@@ -296,29 +291,19 @@
|
||||
log_admin("Build Mode: [key_name(user)] built an airlock at ([object.x],[object.y],[object.z])")
|
||||
new/obj/machinery/door/airlock(get_turf(object))
|
||||
else if(isturf(object) && ctrl_click && left_click)
|
||||
switch(build_dir)
|
||||
if(NORTH)
|
||||
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
|
||||
WIN.setDir(NORTH)
|
||||
if(SOUTH)
|
||||
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
|
||||
WIN.setDir(SOUTH)
|
||||
if(EAST)
|
||||
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
|
||||
WIN.setDir(EAST)
|
||||
if(WEST)
|
||||
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
|
||||
WIN.setDir(WEST)
|
||||
if(NORTHWEST)
|
||||
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced/fulltile(get_turf(object))
|
||||
WIN.setDir(NORTHWEST)
|
||||
var/obj/structure/window/reinforced/window
|
||||
if(build_dir == NORTHWEST)
|
||||
window = new /obj/structure/window/reinforced/fulltile(get_turf(object))
|
||||
else
|
||||
window = new /obj/structure/window/reinforced(get_turf(object))
|
||||
window.setDir(build_dir)
|
||||
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
|
||||
if(ADV_BUILDMODE)
|
||||
if(left_click)
|
||||
if(ispath(objholder, /turf))
|
||||
var/turf/T = get_turf(object)
|
||||
log_admin("Build Mode: [key_name(user)] modified [T] ([T.x],[T.y],[T.z]) to [objholder]")
|
||||
T.ChangeTurf(objholder)
|
||||
T.PlaceOnTop(objholder)
|
||||
else
|
||||
var/obj/A = new objholder (get_turf(object))
|
||||
A.setDir(build_dir)
|
||||
|
||||
@@ -4,7 +4,17 @@
|
||||
set desc = "View/retrieve logfiles."
|
||||
set category = "Admin"
|
||||
|
||||
var/path = browse_files("data/logs/")
|
||||
browseserverlogs()
|
||||
|
||||
/client/proc/getcurrentlogs()
|
||||
set name = "Get Current Logs"
|
||||
set desc = "View/retrieve logfiles for the current round."
|
||||
set category = "Admin"
|
||||
|
||||
browseserverlogs("[GLOB.log_directory]/")
|
||||
|
||||
/client/proc/browseserverlogs(path = "data/logs/")
|
||||
path = browse_files(path)
|
||||
if(!path)
|
||||
return
|
||||
|
||||
@@ -22,4 +32,4 @@
|
||||
else
|
||||
return
|
||||
to_chat(src, "Attempting to send [path], this may take a fair few minutes if the file is very large.")
|
||||
return
|
||||
return
|
||||
@@ -1001,25 +1001,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
"}
|
||||
usr << browse(dat, "window=dressup;size=550x600")
|
||||
|
||||
/client/proc/toggle_antag_hud()
|
||||
set category = "Admin"
|
||||
set name = "Toggle AntagHUD"
|
||||
set desc = "Toggles the Admin AntagHUD"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/adding_hud = !has_antag_hud()
|
||||
|
||||
for(var/datum/atom_hud/H in GLOB.huds)
|
||||
if(istype(H, /datum/atom_hud/antag))
|
||||
(adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr)
|
||||
|
||||
to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].")
|
||||
message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].")
|
||||
log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].")
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Antag HUD", "[adding_hud ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/toggle_combo_hud()
|
||||
set category = "Admin"
|
||||
set name = "Toggle Combo HUD"
|
||||
|
||||
@@ -120,6 +120,7 @@
|
||||
health = maxHealth
|
||||
name = "blob zombie"
|
||||
desc = "A shambling corpse animated by the blob."
|
||||
mob_biotypes += MOB_HUMANOID
|
||||
melee_damage_lower += 8
|
||||
melee_damage_upper += 11
|
||||
movement_type = GROUND
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,82 +0,0 @@
|
||||
/datum/borer_chem
|
||||
var/chemname
|
||||
var/chem_desc = "This is a chemical"
|
||||
var/chem_message //Text sent to the host when injecting chemicals
|
||||
var/chemuse = 30
|
||||
var/quantity = 10
|
||||
|
||||
/datum/borer_chem/epinephrine
|
||||
chemname = "epinephrine"
|
||||
chem_desc = "Stabilizes critical condition and slowly restores oxygen damage. If overdosed, it will deal toxin and oxyloss damage."
|
||||
chem_message = "<span class='notice'>You feel your energy being replenished and it becomes easier to breathe!</span>"
|
||||
|
||||
/datum/borer_chem/leporazine
|
||||
chemname = "leporazine"
|
||||
chem_desc = "This keeps a patient's body temperature stable. High doses can allow short periods of unprotected EVA."
|
||||
chemuse = 75
|
||||
chem_message = "<span class='notice'>You no longer feel heat or cold, as leporazine floods your system.</span>"
|
||||
|
||||
/datum/borer_chem/mannitol
|
||||
chemname = "mannitol"
|
||||
chem_desc = "Heals brain damage."
|
||||
chem_message = "<span class='notice'>You feel your mind focus more easily, as your system is flooded with mannitol.</span>"
|
||||
|
||||
/datum/borer_chem/bicaridine
|
||||
chemname = "bicaridine"
|
||||
chem_desc = "Heals brute damage."
|
||||
chem_message = "<span class='notice'>A wave of flesh-knitting bicaridine flows through your bloodstream.</span>"
|
||||
|
||||
/datum/borer_chem/kelotane
|
||||
chemname = "kelotane"
|
||||
chem_desc = "Heals burn damage."
|
||||
chem_message = "<span class='notice'>A stream of burn-healing kelotane spreads throughout your body.</span>"
|
||||
|
||||
/datum/borer_chem/charcoal
|
||||
chemname = "charcoal"
|
||||
chem_desc = "Slowly heals toxin damage, will also slowly remove any other chemicals."
|
||||
chem_message = "<span class='notice'>A measure of toxin-purging charcoal cleanses your bloodstream.</span>"
|
||||
|
||||
/datum/borer_chem/methamphetamine
|
||||
chemname = "methamphetamine"
|
||||
chem_desc = "Reduces stun times, increases stamina and run speed while dealing brain damage. If overdosed it will deal toxin and brain damage."
|
||||
chemuse = 50
|
||||
quantity = 9
|
||||
chem_message = "<span class='notice'>Your mind races, your heartrate skyrockets as methamphetamines enters your bloodstream!</span>"
|
||||
|
||||
/datum/borer_chem/salbutamol
|
||||
chemname = "salbutamol"
|
||||
chem_desc = "Heals suffocation damage."
|
||||
chem_message = "<span class='notice'>Your breathing becomes lighter, as oxygen fills your lungs from the inside.</span>"
|
||||
|
||||
/datum/borer_chem/spacedrugs
|
||||
chemname = "space_drugs"
|
||||
chem_desc = "Get your host high as a kite."
|
||||
chemuse = 75
|
||||
chem_message = "<span class='notice'>You feel like you can taste the colours of the wind.</span>"
|
||||
|
||||
/*/datum/borer_chem/creagent
|
||||
chemname = "colorful_reagent"
|
||||
chem_desc = "Change the colour of your host."
|
||||
chemuse = 50
|
||||
chem_message = "<span class='notice'>Your body suddenly changes colour from the inside out.</span>"*/
|
||||
|
||||
/datum/borer_chem/ethanol
|
||||
chemname = "ethanol"
|
||||
chem_desc = "The most potent alcoholic 'beverage', with the fastest toxicity."
|
||||
chemuse = 50
|
||||
chem_message = "<span class='notice'>You feel like you've downed a shot of 200 proof vodka.</span>"
|
||||
|
||||
/datum/borer_chem/rezadone
|
||||
chemname = "rezadone"
|
||||
chem_desc = "Heals cellular damage."
|
||||
chem_message = "<span class='notice'>You feel a warmth spread throughout your body as rezadone repairs corrupted DNA.</span>"
|
||||
|
||||
/datum/borer_chem/crocin
|
||||
chemname = "aphro"
|
||||
chem_desc = "Increases host arousal without overdosing."
|
||||
chem_message = "<span class='notice'>You feel your pulse quicken and your body begins to feel warmer.</span>"
|
||||
|
||||
/datum/borer_chem/camphor
|
||||
chemname = "anaphro"
|
||||
chem_desc = "Decreases host arousal without overdosing."
|
||||
chem_message = "<span class='notice'>Your pulse calms down and you feel more focused as the fog of lust clears.</span>"
|
||||
@@ -1,49 +0,0 @@
|
||||
/datum/round_event_control/borer
|
||||
name = "Borer"
|
||||
typepath = /datum/round_event/borer
|
||||
weight = 0
|
||||
max_occurrences = 0
|
||||
min_players = 20 //10 is MINIMUM needed, but this is not a gamemode that does well in lowpop
|
||||
earliest_start = 24000 //40 min, double default timer
|
||||
|
||||
/datum/round_event/borer
|
||||
announceWhen = 2400 //Borers get 4 minutes till the crew tries to murder them.
|
||||
var/successSpawn = 0
|
||||
|
||||
var/spawncount = 2
|
||||
|
||||
/datum/round_event/borer/setup()
|
||||
spawncount = rand(2, 4)
|
||||
|
||||
/datum/round_event/borer/announce()
|
||||
if(successSpawn)
|
||||
priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/AI/aliens.ogg') //Borers seem like normal xenomorphs.
|
||||
|
||||
|
||||
/datum/round_event/borer/start()
|
||||
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines)
|
||||
if(QDELETED(temp_vent))
|
||||
continue
|
||||
if(temp_vent.loc.z == SSmapping.station_start && !temp_vent.welded)
|
||||
var/datum/pipeline/temp_vent_parent = temp_vent.parents[1]
|
||||
if(temp_vent_parent.other_atmosmch.len > 20)
|
||||
vents += temp_vent
|
||||
|
||||
if(!vents.len)
|
||||
message_admins("An event attempted to spawn a borer but no suitable vents were found. Shutting down.")
|
||||
return kill()
|
||||
|
||||
var/total_humans = 0
|
||||
for(var/mob/living/carbon/human/H in GLOB.mob_list)
|
||||
if(H.stat != DEAD)
|
||||
total_humans++
|
||||
|
||||
GLOB.total_borer_hosts_needed = round(1 + total_humans/6)
|
||||
|
||||
while(spawncount >= 1 && vents.len)
|
||||
var/obj/vent = pick_n_take(vents)
|
||||
new /mob/living/simple_animal/borer(vent.loc)
|
||||
successSpawn = TRUE
|
||||
spawncount--
|
||||
@@ -1,125 +0,0 @@
|
||||
|
||||
/mob/living/simple_animal/borer/proc/get_html_template(content)
|
||||
var/html = {"<!DOCTYPE html">
|
||||
<html>
|
||||
<head>
|
||||
<title>Borer Chemicals</title>
|
||||
<link rel='stylesheet' type='text/css' href='icons.css'>
|
||||
<link rel='stylesheet' type='text/css' href='shared.css'>
|
||||
<style type='text/css'>
|
||||
|
||||
body {
|
||||
padding: 10;
|
||||
margin: 0;
|
||||
font-size: 12px;
|
||||
color: #ffffff;
|
||||
line-height: 170%;
|
||||
font-family: Verdana, Geneva, sans-serif;
|
||||
background: #272727 url(uiBackground.png) 50% 0 repeat-x;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
a, a:link, a:visited, a:active, .link, .linkOn, .linkOff, .selected, .disabled {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
background: #40628a;
|
||||
border: 1px solid #161616;
|
||||
padding: 2px 2px 2px 2px;
|
||||
margin: 2px 2px 2px 2px;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
a:hover, .linkActive:hover {
|
||||
background: #507aac;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 4px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin: 0;
|
||||
padding: 16px 0 8px 0;
|
||||
color: #517087;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#header {
|
||||
margin: 3px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 570px;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
td {
|
||||
border: solid 1px #000;
|
||||
width: 560px;
|
||||
}
|
||||
|
||||
.chem-select {
|
||||
width: 560px;
|
||||
margin: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.enabled {
|
||||
background-color: #0a0;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
background-color: #a00;
|
||||
}
|
||||
|
||||
.shown {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="jquery.min.js"></script>
|
||||
<script type='text/javascript'>
|
||||
function update_chemicals(chemicals) {
|
||||
$('#chemicals').text(chemicals);
|
||||
}
|
||||
|
||||
$(function() {
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body scroll='yes'><div id='content'>
|
||||
<h1 id='header'>Borer Chemicals</h1>
|
||||
<br />
|
||||
|
||||
[content]
|
||||
|
||||
</div></body></html>"}
|
||||
return html
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
/mob/living/simple_animal/borer/Topic(href, href_list, hsrc)
|
||||
if(href_list["borer_use_chem"])
|
||||
locate(href_list["src"])
|
||||
if(!istype(src, /mob/living/simple_animal/borer))
|
||||
return
|
||||
|
||||
var/topic_chem = href_list["borer_use_chem"]
|
||||
var/datum/borer_chem/C
|
||||
|
||||
for(var/datum in typesof(/datum/borer_chem))
|
||||
var/datum/borer_chem/test = new datum()
|
||||
if(test.chemname == topic_chem)
|
||||
C = test
|
||||
break
|
||||
|
||||
if(!istype(C, /datum/borer_chem))
|
||||
return
|
||||
|
||||
if(!C || !victim || controlling || !src || stat)
|
||||
return
|
||||
|
||||
if(!istype(C, /datum/borer_chem))
|
||||
return
|
||||
|
||||
if(chemicals < C.chemuse)
|
||||
to_chat(src, "<span class='boldnotice'>You need [C.chemuse] chemicals stored to use this chemical!</span>")
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='userdanger'>You squirt a measure of [C.chemname] from your reservoirs into [victim]'s bloodstream.</span>")
|
||||
if(C.chemname=="aphro" || C.chemname=="anaphro")
|
||||
if(victim.canbearoused) //snowflake exception as these chems interact with client-specific optional stuff :S
|
||||
to_chat(victim,C.chem_message)
|
||||
else
|
||||
to_chat(victim,C.chem_message)
|
||||
victim.reagents.add_reagent(C.chemname, C.quantity)
|
||||
chemicals -= C.chemuse
|
||||
log_game("[src]/([src.ckey]) has injected [C.chemname] into their host [victim]/([victim.ckey])")
|
||||
|
||||
src << output(chemicals, "ViewBorer\ref[src]Chems.browser:update_chemicals")
|
||||
|
||||
..()
|
||||
@@ -1,34 +0,0 @@
|
||||
/mob/living/simple_animal/borer/syndi_borer
|
||||
var/mob/owner = null
|
||||
is_team_borer = FALSE
|
||||
borer_alert = "Serve as a syndicate cortical borer? (Warning, You can no longer be cloned!)"
|
||||
|
||||
/mob/living/simple_animal/borer/syndi_borer/Initialize(mapload, gen=1)
|
||||
..()
|
||||
real_name = "Syndicate Borer [rand(1000,9999)]"
|
||||
truename = "[borer_names[min(generation, borer_names.len)]] [rand(1000,9999)]"
|
||||
|
||||
GrantBorerActions()
|
||||
make_larvae_action.Remove(src)
|
||||
|
||||
/mob/living/simple_animal/borer/syndi_borer/GrantControlActions()
|
||||
talk_to_brain_action.Grant(victim)
|
||||
give_back_control_action.Grant(victim)
|
||||
|
||||
/mob/living/simple_animal/borer/syndi_borer/RemoveControlActions()
|
||||
talk_to_brain_action.Remove(victim)
|
||||
give_back_control_action.Remove(victim)
|
||||
|
||||
//Syndicate borer objective, relies on their owner getting a greentext, no matter if they themselves did anything really.
|
||||
/datum/objective/syndi_borer
|
||||
explanation_text = "You are a modified syndicate cortical borer, assist your owner with their objectives."
|
||||
martyr_compatible = 1
|
||||
|
||||
/datum/objective/syndi_borer/check_completion()
|
||||
if(target)
|
||||
for(var/datum/objective/objective in target.objectives)
|
||||
if(!objective.check_completion())
|
||||
return 0
|
||||
return 1
|
||||
else
|
||||
return 1 //Not sure if we should greentext if we somehow don't even have an owner.
|
||||
@@ -367,11 +367,21 @@
|
||||
if(!CTO.escape_objective_compatible)
|
||||
escape_objective_possible = FALSE
|
||||
break
|
||||
|
||||
var/datum/objective/absorb/absorb_objective = new
|
||||
absorb_objective.owner = owner
|
||||
absorb_objective.gen_amount_goal(6, 8)
|
||||
objectives += absorb_objective
|
||||
var/changeling_objective = rand(1,3)
|
||||
switch(changeling_objective)
|
||||
if(1)
|
||||
var/datum/objective/absorb/absorb_objective = new
|
||||
absorb_objective.owner = owner
|
||||
absorb_objective.gen_amount_goal(6, 8)
|
||||
objectives += absorb_objective
|
||||
if(2)
|
||||
var/datum/objective/absorb_changeling/ac = new
|
||||
ac.owner = owner
|
||||
objectives += ac
|
||||
if(3)
|
||||
var/datum/objective/absorb_most/ac = new
|
||||
ac.owner = owner
|
||||
objectives += ac
|
||||
|
||||
if(prob(60))
|
||||
if(prob(85))
|
||||
|
||||
@@ -89,9 +89,16 @@
|
||||
|
||||
var/datum/antagonist/changeling/target_ling = target.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(target_ling)//If the target was a changeling, suck out their extra juice and objective points!
|
||||
to_chat(user, "<span class='boldnotice'>[target] was one of us. We have absorbed their power.</span>")
|
||||
target_ling.remove_changeling_powers()
|
||||
changeling.geneticpoints += round(target_ling.geneticpoints/2)
|
||||
target_ling.geneticpoints = 0
|
||||
target_ling.canrespec = 0
|
||||
changeling.chem_storage += round(target_ling.chem_storage/2)
|
||||
changeling.chem_charges += min(target_ling.chem_charges, changeling.chem_storage)
|
||||
target_ling.chem_charges = 0
|
||||
target_ling.chem_storage = 0
|
||||
changeling.absorbedcount += (target_ling.absorbedcount)
|
||||
|
||||
target_ling.stored_profiles.len = 1
|
||||
target_ling.absorbedcount = 0
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
chemical_cost = 10
|
||||
dna_cost = 0
|
||||
req_stat = UNCONSCIOUS
|
||||
always_keep = TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/regenerate/sting_action(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You feel an itching, both inside and \
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/revive/can_be_used_by(mob/living/user)
|
||||
if((user.stat != DEAD) && !(user.has_trait(TRAIT_FAKEDEATH)))
|
||||
if(user.has_trait(CHANGELING_DRAIN) || ((user.stat != DEAD) && !(user.has_trait(TRAIT_FAKEDEATH))))
|
||||
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
changeling.purchasedpowers -= src
|
||||
return 0
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
name = "clockwork marauder"
|
||||
desc = "The stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield."
|
||||
icon_state = "clockwork_marauder"
|
||||
mob_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
force_threshold = 8
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
#define STARGAZER_RANGE 3 //How many tiles the stargazer can see out to
|
||||
#define STARGAZER_POWER 20 //How many watts will be produced per second when the stargazer sees starlight
|
||||
|
||||
//Stargazer: A very fragile but cheap generator that creates power from starlight.
|
||||
/obj/structure/destructible/clockwork/stargazer
|
||||
name = "stargazer"
|
||||
desc = "A large lantern-shaped machine made of thin brass. It looks fragile."
|
||||
clockwork_desc = "A lantern-shaped generator that produces power when near starlight."
|
||||
icon_state = "stargazer"
|
||||
unanchored_icon = "stargazer_unwrenched"
|
||||
max_integrity = 40
|
||||
construction_value = 5
|
||||
layer = WALL_OBJ_LAYER
|
||||
break_message = "<span class='warning'>The stargazer's fragile body shatters into pieces!</span>"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
light_color = "#DAAA18"
|
||||
var/star_light_star_bright = FALSE //If this stargazer can see starlight
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/Destroy()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user))
|
||||
to_chat(user, "<span class='nzcrentr_small'>Generates <b>[DisplayPower(STARGAZER_POWER)]</b> per second while viewing starlight within [STARGAZER_RANGE] tiles.</span>")
|
||||
if(star_light_star_bright)
|
||||
to_chat(user, "[is_servant_of_ratvar(user) ? "<span class='nzcrentr_small'>It can see starlight!</span>" : "It's shining brilliantly!"]")
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/process()
|
||||
star_light_star_bright = check_starlight()
|
||||
if(star_light_star_bright)
|
||||
adjust_clockwork_power(STARGAZER_POWER)
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/update_anchored(mob/living/user, damage)
|
||||
. = ..()
|
||||
star_light_star_bright = check_starlight()
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/proc/check_starlight()
|
||||
var/old_status = star_light_star_bright
|
||||
var/has_starlight
|
||||
if(!anchored)
|
||||
has_starlight = FALSE
|
||||
else
|
||||
for(var/turf/T in view(3, src))
|
||||
if(isspaceturf(T))
|
||||
has_starlight = TRUE
|
||||
break
|
||||
if(has_starlight && anchored)
|
||||
var/area/A = get_area(src)
|
||||
if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
|
||||
has_starlight = FALSE
|
||||
if(old_status != has_starlight)
|
||||
if(has_starlight)
|
||||
visible_message("<span class='nzcrentr_small'>[src] hums and shines brilliantly!</span>")
|
||||
playsound(src, 'sound/machines/clockcult/stargazer_activate.ogg', 50, TRUE)
|
||||
add_overlay("stargazer_light")
|
||||
set_light(1.5, 5)
|
||||
else
|
||||
if(anchored) //We lost visibility somehow
|
||||
visible_message("<span class='danger'>[src] flickers, and falls dark.</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[src] whooshes quietly as it slides into a less bulky form.</span>")
|
||||
cut_overlays()
|
||||
set_light(0)
|
||||
return has_starlight
|
||||
@@ -95,10 +95,8 @@
|
||||
else
|
||||
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].</span>")
|
||||
if(where == "backpack")
|
||||
var/obj/item/storage/B = mob.back
|
||||
B.orient2hud(mob)
|
||||
B.show_to(mob)
|
||||
return 1
|
||||
mob.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, mob)
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
|
||||
. = ..()
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "imp"
|
||||
icon_living = "imp"
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
speed = 1
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/icon_stun = "revenant_stun"
|
||||
var/icon_drain = "revenant_draining"
|
||||
var/stasis = FALSE
|
||||
mob_biotypes = list(MOB_SPIRIT)
|
||||
incorporeal_move = INCORPOREAL_MOVE_JAUNT
|
||||
invisibility = INVISIBILITY_REVENANT
|
||||
health = INFINITY //Revenants don't use health, they use essence instead
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "daemon"
|
||||
icon_living = "daemon"
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
speed = 1
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
speak_emote = list("tones")
|
||||
initial_language_holder = /datum/language_holder/swarmer
|
||||
bubble_icon = "swarmer"
|
||||
mob_biotypes = list(MOB_ROBOTIC)
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
status_flags = CANPUSH
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
/obj/machinery/field/containment,
|
||||
/obj/machinery/power/supermatter_shard,
|
||||
/obj/machinery/power/supermatter_crystal,
|
||||
/obj/machinery/doomsday_device,
|
||||
/obj/machinery/nuclearbomb,
|
||||
/obj/machinery/nuclearbomb/selfdestruct,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#define WIRE_RECEIVE 1
|
||||
#define WIRE_PULSE 2
|
||||
#define WIRE_PULSE_SPECIAL 4
|
||||
#define WIRE_RADIO_RECEIVE 8
|
||||
#define WIRE_RADIO_PULSE 16
|
||||
#define WIRE_RECEIVE (1<<0)
|
||||
#define WIRE_PULSE (1<<1)
|
||||
#define WIRE_PULSE_SPECIAL (1<<2)
|
||||
#define WIRE_RADIO_RECEIVE (1<<3)
|
||||
#define WIRE_RADIO_PULSE (1<<4)
|
||||
|
||||
/obj/item/device/assembly
|
||||
name = "assembly"
|
||||
|
||||
@@ -643,10 +643,9 @@
|
||||
var/area/A = get_area(src)
|
||||
|
||||
var/new_area_danger_level = 0
|
||||
for(var/area/R in A.related)
|
||||
for(var/obj/machinery/airalarm/AA in R)
|
||||
if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
|
||||
new_area_danger_level = max(new_area_danger_level,AA.danger_level)
|
||||
for(var/obj/machinery/airalarm/AA in A)
|
||||
if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
|
||||
new_area_danger_level = max(new_area_danger_level,AA.danger_level)
|
||||
if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state
|
||||
post_alert(new_area_danger_level)
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
state_open = FALSE
|
||||
circuit = /obj/item/circuitboard/machine/cryo_tube
|
||||
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
|
||||
occupant_typecache = list(/mob/living/carbon, /mob/living/simple_animal)
|
||||
|
||||
var/on = FALSE
|
||||
var/autoeject = FALSE
|
||||
@@ -276,7 +277,12 @@
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
|
||||
return
|
||||
close_machine(target)
|
||||
if (target.IsKnockdown() || target.IsStun() || target.IsSleeping() || target.IsUnconscious())
|
||||
close_machine(target)
|
||||
else
|
||||
user.visible_message("<b>[user]</b> starts shoving [target] inside [src].", "<span class='notice'>You start shoving [target] inside [src].</span>")
|
||||
if (do_after(user, 25, target=target))
|
||||
close_machine(target)
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/reagent_containers/glass))
|
||||
|
||||
@@ -207,13 +207,13 @@
|
||||
air_contents.gases[/datum/gas/oxygen][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
|
||||
air_contents.gases[/datum/gas/nitrogen][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
|
||||
|
||||
#define HOLDING 1
|
||||
#define CONNECTED 2
|
||||
#define EMPTY 4
|
||||
#define LOW 8
|
||||
#define MEDIUM 16
|
||||
#define FULL 32
|
||||
#define DANGER 64
|
||||
#define HOLDING (1<<0)
|
||||
#define CONNECTED (1<<1)
|
||||
#define EMPTY (1<<2)
|
||||
#define LOW (1<<3)
|
||||
#define MEDIUM (1<<4)
|
||||
#define FULL (1<<5)
|
||||
#define DANGER (1<<6)
|
||||
/obj/machinery/portable_atmospherics/canister/update_icon()
|
||||
if(stat & BROKEN)
|
||||
cut_overlays()
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
/datum/export/large/supermatter
|
||||
cost = 9000
|
||||
unit_name = "supermatter shard"
|
||||
export_types = list(/obj/machinery/power/supermatter_shard)
|
||||
export_types = list(/obj/machinery/power/supermatter_crystal/shard)
|
||||
|
||||
// Misc
|
||||
/datum/export/large/iv
|
||||
|
||||
@@ -756,12 +756,12 @@
|
||||
crate_name = "solar panel crate"
|
||||
crate_type = /obj/structure/closet/crate/engineering/electrical
|
||||
|
||||
/datum/supply_pack/engineering/engine/supermatter_shard
|
||||
/datum/supply_pack/engineering/engine/supermatter_crystal
|
||||
name = "Supermatter Shard Crate"
|
||||
desc = "The power of the heavens condensed into a single crystal. Requires CE access to open."
|
||||
cost = 10000
|
||||
access = ACCESS_CE
|
||||
contains = list(/obj/machinery/power/supermatter_shard)
|
||||
contains = list(/obj/machinery/power/supermatter_crystal/shard)
|
||||
crate_name = "supermatter shard crate"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
dangerous = TRUE
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
/* // Can't be bothered to maintain this, mostly just memes anyway.
|
||||
/datum/supply_pack/misc/vidyacon
|
||||
name = "Vidya-Con Surplus Crate"
|
||||
cost = 3250
|
||||
contains = list(/obj/item/clothing/shoes/megaboots,/obj/item/clothing/gloves/megagloves,/obj/item/clothing/head/helmet/megahelmet, /obj/item/clothing/under/mega,
|
||||
/obj/item/clothing/shoes/protoboots,/obj/item/clothing/gloves/protogloves,/obj/item/clothing/head/helmet/protohelmet,/obj/item/clothing/under/proto,
|
||||
/obj/item/clothing/shoes/megaxboots,/obj/item/clothing/gloves/megaxgloves,/obj/item/clothing/head/helmet/megaxhelmet,/obj/item/clothing/under/megax,
|
||||
/obj/item/clothing/shoes/joeboots,/obj/item/clothing/gloves/joegloves,/obj/item/clothing/head/helmet/joehelmet,/obj/item/clothing/under/joe,
|
||||
/obj/item/clothing/under/roll,
|
||||
/obj/item/clothing/head/helmet/biker,/obj/item/clothing/under/bikersuit,/obj/item/clothing/gloves/bikergloves,
|
||||
/obj/item/clothing/under/jacketsuit,/obj/item/clothing/head/helmet/richard,
|
||||
/obj/item/clothing/under/vault13)
|
||||
crate_name = "vidya-con surplus crate"
|
||||
|
||||
|
||||
datum/supply_pack/misc/memes
|
||||
name = "Nanotrasen Approved Internet Humor Crate"
|
||||
cost = 5000
|
||||
contains = list(/obj/item/clothing/suit/doshjacket,
|
||||
/obj/item/clothing/under/squatter_outfit,/obj/item/clothing/head/squatter_hat,
|
||||
/obj/item/clothing/under/cia,
|
||||
/obj/item/clothing/under/russobluecamooutfit,/obj/item/clothing/head/russobluecamohat,
|
||||
/obj/item/clothing/under/rottensuit,/obj/item/clothing/shoes/rottenshoes,
|
||||
/obj/item/clothing/suit/raincoat)
|
||||
crate_name = "nanotrasen internet humor crate"
|
||||
|
||||
datum/supply_pack/misc/reenactor
|
||||
name = "Historical Reanactor Crate"
|
||||
cost = 17500
|
||||
contains = list(/obj/item/clothing/under/soldieruniform,/obj/item/clothing/head/stalhelm,/obj/item/clothing/suit/soldiercoat,
|
||||
/obj/item/clothing/under/officeruniform,/obj/item/clothing/head/naziofficer,/obj/item/clothing/suit/officercoat,
|
||||
/obj/item/clothing/head/panzer,
|
||||
/obj/item/clothing/suit/russofurcoat,/obj/item/clothing/head/russofurhat,/obj/item/clothing/under/soviet)
|
||||
crate_name = "historical reanactor crate" */
|
||||
@@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
|
||||
if (citadel_client_procs(href_list))
|
||||
return
|
||||
// CITADEL End
|
||||
|
||||
|
||||
switch(href_list["_src_"])
|
||||
if("holder")
|
||||
hsrc = holder
|
||||
@@ -391,9 +391,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
var/datum/verbs/menu/menuitem = GLOB.menulist[thing]
|
||||
if (menuitem)
|
||||
menuitem.Load_checked(src)
|
||||
|
||||
|
||||
hook_vr("client_new",list(src)) // CIT CHANGE - hook for client/New() changes
|
||||
|
||||
|
||||
Master.UpdateTickRate()
|
||||
|
||||
//////////////
|
||||
@@ -638,50 +638,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
return
|
||||
create_message("note", ckey, system_ckey, message, null, null, 0, 0)
|
||||
|
||||
/client/Click(atom/object, atom/location, control, params)
|
||||
var/ab = FALSE
|
||||
var/list/L = params2list(params)
|
||||
if (object && object == middragatom && L["left"])
|
||||
ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1)
|
||||
var/mcl = CONFIG_GET(number/minute_click_limit)
|
||||
if (!holder && mcl)
|
||||
var/minute = round(world.time, 600)
|
||||
if (!clicklimiter)
|
||||
clicklimiter = new(LIMITER_SIZE)
|
||||
if (minute != clicklimiter[CURRENT_MINUTE])
|
||||
clicklimiter[CURRENT_MINUTE] = minute
|
||||
clicklimiter[MINUTE_COUNT] = 0
|
||||
clicklimiter[MINUTE_COUNT] += 1+(ab)
|
||||
if (clicklimiter[MINUTE_COUNT] > mcl)
|
||||
var/msg = "Your previous click was ignored because you've done too many in a minute."
|
||||
if (minute != clicklimiter[ADMINSWARNED_AT]) //only one admin message per-minute. (if they spam the admins can just boot/ban them)
|
||||
clicklimiter[ADMINSWARNED_AT] = minute
|
||||
|
||||
msg += " Administrators have been informed."
|
||||
if (ab)
|
||||
log_game("[key_name(src)] is using the middle click aimbot exploit")
|
||||
message_admins("[key_name_admin(src)] [ADMIN_FLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit</span>")
|
||||
add_system_note("aimbot", "Is using the middle click aimbot exploit")
|
||||
|
||||
log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
|
||||
message_admins("[key_name_admin(src)] [ADMIN_FLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute")
|
||||
to_chat(src, "<span class='danger'>[msg]</span>")
|
||||
return
|
||||
|
||||
var/scl = CONFIG_GET(number/second_click_limit)
|
||||
if (!holder && scl)
|
||||
var/second = round(world.time, 10)
|
||||
if (!clicklimiter)
|
||||
clicklimiter = new(LIMITER_SIZE)
|
||||
if (second != clicklimiter[CURRENT_SECOND])
|
||||
clicklimiter[CURRENT_SECOND] = second
|
||||
clicklimiter[SECOND_COUNT] = 0
|
||||
clicklimiter[SECOND_COUNT] += 1+(!!ab)
|
||||
if (clicklimiter[SECOND_COUNT] > scl)
|
||||
to_chat(src, "<span class='danger'>Your previous click was ignored because you've done too many in a second</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
/client/proc/check_ip_intel()
|
||||
set waitfor = 0 //we sleep when getting the intel, no need to hold up the client connection while we sleep
|
||||
@@ -742,9 +698,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
verbs += /client/proc/self_playtime
|
||||
|
||||
|
||||
#undef TOPIC_SPAM_DELAY
|
||||
#undef UPLOAD_LIMIT
|
||||
#undef MIN_CLIENT_VERSION
|
||||
|
||||
//checks if a client is afk
|
||||
//3000 frames = 5 minutes
|
||||
@@ -753,17 +707,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
return inactivity
|
||||
return FALSE
|
||||
|
||||
// Byond seemingly calls stat, each tick.
|
||||
// Calling things each tick can get expensive real quick.
|
||||
// So we slow this down a little.
|
||||
// See: http://www.byond.com/docs/ref/info.html#/client/proc/Stat
|
||||
/client/Stat()
|
||||
. = ..()
|
||||
if (holder)
|
||||
stoplag(1)
|
||||
else
|
||||
stoplag(5)
|
||||
|
||||
//send resources to the client. It's here in its own proc so we can move it around easiliy if need be
|
||||
/client/proc/send_resources()
|
||||
#if (PRELOAD_RSC == 0)
|
||||
@@ -820,7 +763,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
/client/proc/change_view(new_size)
|
||||
if (isnull(new_size))
|
||||
CRASH("change_view called without argument.")
|
||||
|
||||
//CIT CHANGES START HERE - makes change_view change DEFAULT_VIEW to 15x15 depending on preferences
|
||||
if(prefs && CONFIG_GET(string/default_view))
|
||||
if(!prefs.widescreenpref && new_size == CONFIG_GET(string/default_view))
|
||||
|
||||
@@ -387,8 +387,8 @@
|
||||
desc = "A pair of black shoes."
|
||||
permeability_coefficient = 0.05
|
||||
resistance_flags = NONE
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
@@ -579,16 +579,21 @@
|
||||
/obj/item/storage/belt/chameleon
|
||||
name = "toolbelt"
|
||||
desc = "Holds tools."
|
||||
silent = TRUE
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/storage/belt/chameleon/Initialize()
|
||||
. = ..()
|
||||
|
||||
chameleon_action = new(src)
|
||||
chameleon_action.chameleon_type = /obj/item/storage/belt
|
||||
chameleon_action.chameleon_name = "Belt"
|
||||
chameleon_action.initialize_disguises()
|
||||
|
||||
/obj/item/storage/belt/chameleon/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.silent = TRUE
|
||||
|
||||
/obj/item/storage/belt/chameleon/emp_act(severity)
|
||||
chameleon_action.emp_randomise()
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
var/list/user_vars_to_edit = list() //VARNAME = VARVALUE eg: "name" = "butts"
|
||||
var/list/user_vars_remembered = list() //Auto built by the above + dropped() + equipped()
|
||||
|
||||
var/obj/item/storage/internal/pocket/pockets = null
|
||||
var/pocket_storage_component_path
|
||||
|
||||
//These allow head/mask items to dynamically alter the user's hair
|
||||
// and facial hair, checking hair_extensions.dmi and facialhair_extensions.dmi
|
||||
@@ -37,17 +37,15 @@
|
||||
var/dynamic_hair_suffix = ""//head > mask for head hair
|
||||
var/dynamic_fhair_suffix = ""//mask > head for facial hair
|
||||
|
||||
/obj/item/clothing/New()
|
||||
..()
|
||||
if(ispath(pockets))
|
||||
pockets = new pockets(src)
|
||||
/obj/item/clothing/Initialize()
|
||||
. = ..()
|
||||
if(ispath(pocket_storage_component_path))
|
||||
LoadComponent(pocket_storage_component_path)
|
||||
|
||||
/obj/item/clothing/MouseDrop(atom/over_object)
|
||||
. = ..()
|
||||
var/mob/M = usr
|
||||
|
||||
if(pockets && over_object == M)
|
||||
return pockets.MouseDrop(over_object)
|
||||
|
||||
if(ismecha(M.loc)) // stops inventory actions in a mech
|
||||
return
|
||||
|
||||
@@ -56,25 +54,6 @@
|
||||
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/item/clothing/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
|
||||
if(pockets)
|
||||
pockets.close_all()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/attack_hand(mob/user)
|
||||
if(pockets && pockets.priority && ismob(loc))
|
||||
//If we already have the pockets open, close them.
|
||||
if (user.s_active == pockets)
|
||||
pockets.close(user)
|
||||
//Close whatever the user has open and show them the pockets.
|
||||
else
|
||||
if (user.s_active)
|
||||
user.s_active.close(user)
|
||||
pockets.orient2hud(user)
|
||||
pockets.show_to(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/attackby(obj/item/W, mob/user, params)
|
||||
if(damaged_clothes && istype(W, /obj/item/stack/sheet/cloth))
|
||||
var/obj/item/stack/sheet/cloth/C = W
|
||||
@@ -83,36 +62,12 @@
|
||||
obj_integrity = max_integrity
|
||||
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)
|
||||
if(i)
|
||||
return i
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/AltClick(mob/user)
|
||||
if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)) && pockets && pockets.quickdraw && pockets.contents.len)
|
||||
var/obj/item/I = pockets.contents[1]
|
||||
if(!I)
|
||||
return
|
||||
pockets.remove_from_storage(I, get_turf(src))
|
||||
|
||||
if(!user.put_in_hands(I))
|
||||
to_chat(user, "<span class='notice'>You fumble for [I] and it falls on the floor.</span>")
|
||||
return 1
|
||||
user.visible_message("<span class='warning'>[user] draws [I] from [src]!</span>", "<span class='notice'>You draw [I] from [src].</span>")
|
||||
return 1
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/clothing/Destroy()
|
||||
if(pockets)
|
||||
qdel(pockets)
|
||||
pockets = null
|
||||
user_vars_remembered = null //Oh god somebody put REFERENCES in here? not to worry, we'll clean it up
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/clothing/dropped(mob/user)
|
||||
..()
|
||||
if(!istype(user))
|
||||
@@ -124,7 +79,6 @@
|
||||
user.vars[variable] = user_vars_remembered[variable]
|
||||
user_vars_remembered = list()
|
||||
|
||||
|
||||
/obj/item/clothing/equipped(mob/user, slot)
|
||||
..()
|
||||
|
||||
@@ -134,18 +88,18 @@
|
||||
user_vars_remembered[variable] = user.vars[variable]
|
||||
user.vars[variable] = user_vars_to_edit[variable]
|
||||
|
||||
|
||||
/obj/item/clothing/examine(mob/user)
|
||||
..()
|
||||
if(damaged_clothes)
|
||||
to_chat(user, "<span class='warning'>It looks damaged!</span>")
|
||||
GET_COMPONENT(pockets, /datum/component/storage)
|
||||
if(pockets)
|
||||
var/list/how_cool_are_your_threads = list("<span class='notice'>")
|
||||
if(pockets.priority)
|
||||
if(pockets.attack_hand_interact)
|
||||
how_cool_are_your_threads += "[src]'s storage opens when clicked.\n"
|
||||
else
|
||||
how_cool_are_your_threads += "[src]'s storage opens when dragged to yourself.\n"
|
||||
how_cool_are_your_threads += "[src] can store [pockets.storage_slots] item\s.\n"
|
||||
how_cool_are_your_threads += "[src] can store [pockets.max_items] item\s.\n"
|
||||
how_cool_are_your_threads += "[src] can store items that are [weightclass2text(pockets.max_w_class)] or smaller.\n"
|
||||
if(pockets.quickdraw)
|
||||
how_cool_are_your_threads += "You can quickly remove an item from [src] using Alt-Click.\n"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#define MODE_MESON "meson"
|
||||
#define MODE_TRAY "t-ray"
|
||||
#define MODE_RAD "radiation"
|
||||
#define MODE_SHUTTLE "shuttle"
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine
|
||||
name = "engineering scanner goggles"
|
||||
@@ -63,10 +64,13 @@
|
||||
var/mob/living/carbon/human/user = loc
|
||||
if(user.glasses != src || !user.client)
|
||||
return
|
||||
if(mode == MODE_TRAY)
|
||||
t_ray_scan(user, 8, range)
|
||||
else if(mode == MODE_RAD)
|
||||
show_rads()
|
||||
switch(mode)
|
||||
if(MODE_TRAY)
|
||||
t_ray_scan(user, 8, range)
|
||||
if(MODE_RAD)
|
||||
show_rads()
|
||||
if(MODE_SHUTTLE)
|
||||
show_shuttle()
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/proc/show_rads()
|
||||
var/mob/living/carbon/human/user = loc
|
||||
@@ -93,6 +97,24 @@
|
||||
pic.appearance = MA
|
||||
flick_overlay(pic, list(user.client), 8)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/proc/show_shuttle()
|
||||
var/mob/living/carbon/human/user = loc
|
||||
var/obj/docking_port/mobile/port = SSshuttle.get_containing_shuttle(user)
|
||||
if(!port)
|
||||
return
|
||||
var/list/shuttle_areas = port.shuttle_areas
|
||||
for(var/r in shuttle_areas)
|
||||
var/area/region = r
|
||||
for(var/turf/place in region.contents)
|
||||
if(get_dist(user, place) > 7)
|
||||
continue
|
||||
var/image/pic
|
||||
if(isshuttleturf(place))
|
||||
pic = new('icons/turf/overlays.dmi', place, "greenOverlay", AREA_LAYER)
|
||||
else
|
||||
pic = new('icons/turf/overlays.dmi', place, "redOverlay", AREA_LAYER)
|
||||
flick_overlay(pic, list(user.client), 8)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/update_icon()
|
||||
icon_state = "trayson-[mode]"
|
||||
update_mob()
|
||||
@@ -115,7 +137,16 @@
|
||||
|
||||
modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_NONE)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/shuttle
|
||||
name = "shuttle region scanner"
|
||||
icon_state = "trayson-shuttle"
|
||||
item_state = "trayson-shuttle"
|
||||
desc = "Used to see the boundaries of shuttle regions."
|
||||
|
||||
modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE)
|
||||
|
||||
#undef MODE_NONE
|
||||
#undef MODE_MESON
|
||||
#undef MODE_TRAY
|
||||
#undef MODE_RAD
|
||||
#undef MODE_SHUTTLE
|
||||
|
||||
@@ -79,9 +79,13 @@
|
||||
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
|
||||
icon_state = "detective"
|
||||
var/candy_cooldown = 0
|
||||
pockets = /obj/item/storage/internal/pocket/small/detective
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/detective
|
||||
dog_fashion = /datum/dog_fashion/head/detective
|
||||
|
||||
/obj/item/clothing/head/fedora/Initialize()
|
||||
. = ..()
|
||||
new /obj/item/reagent_containers/food/drinks/flask/det(src)
|
||||
|
||||
/obj/item/clothing/head/fedora/det_hat/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to take a candy corn.</span>")
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
item_state = "fedora"
|
||||
armor = list("melee" = 25, "bullet" = 5, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50)
|
||||
desc = "A really cool hat if you're a mobster. A really lame hat if you're not."
|
||||
pockets = /obj/item/storage/internal/pocket/small
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small
|
||||
|
||||
/obj/item/clothing/head/fedora/suicide_act(mob/user)
|
||||
if(user.gender == FEMALE)
|
||||
|
||||
@@ -26,6 +26,5 @@
|
||||
|
||||
var/obj/item/storage/backpack/bag = H.back
|
||||
var/obj/item/a_gift/gift = new(H)
|
||||
while(bag.can_be_inserted(gift, 1))
|
||||
bag.handle_item_insertion(gift, 1)
|
||||
while(bag.SendSignal(COMSIG_TRY_STORAGE_INSERT, gift, null, TRUE, FALSE))
|
||||
gift = new(H)
|
||||
|
||||
@@ -182,11 +182,11 @@
|
||||
for(var/obj/item/briefcase_item in sec_briefcase)
|
||||
qdel(briefcase_item)
|
||||
for(var/i = 3 to 0 step -1)
|
||||
sec_briefcase.handle_item_insertion(new /obj/item/stack/spacecash/c1000,1)
|
||||
sec_briefcase.handle_item_insertion(new /obj/item/gun/energy/kinetic_accelerator/crossbow,1)
|
||||
sec_briefcase.handle_item_insertion(new /obj/item/gun/ballistic/revolver/mateba,1)
|
||||
sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357,1)
|
||||
sec_briefcase.handle_item_insertion(new /obj/item/grenade/plastic/x4,1)
|
||||
sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/stack/spacecash/c1000, null, TRUE, TRUE)
|
||||
sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/gun/energy/kinetic_accelerator/crossbow, null, TRUE, TRUE)
|
||||
sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/gun/ballistic/revolver/mateba, null, TRUE, TRUE)
|
||||
sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/ammo_box/a357, null, TRUE, TRUE)
|
||||
sec_briefcase.SendSignal(COMSIG_TRY_STORAGE_INSERT, new /obj/item/grenade/plastic/x4, null, TRUE, TRUE)
|
||||
|
||||
var/obj/item/device/pda/heads/pda = H.belt
|
||||
pda.owner = H.real_name
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
strip_delay = 70
|
||||
resistance_flags = NONE
|
||||
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
|
||||
name = "\improper SWAT boots"
|
||||
@@ -73,7 +73,7 @@
|
||||
item_state = "clown_shoes"
|
||||
slowdown = SHOES_SLOWDOWN+1
|
||||
item_color = "clown"
|
||||
pockets = /obj/item/storage/internal/pocket/shoes/clown
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/Initialize()
|
||||
. = ..()
|
||||
@@ -106,7 +106,7 @@
|
||||
equip_delay_other = 50
|
||||
resistance_flags = NONE
|
||||
permeability_coefficient = 0.05 //Thick soles, and covers the ankle
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/fast
|
||||
slowdown = -1
|
||||
@@ -121,7 +121,7 @@
|
||||
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
|
||||
heat_protection = FEET|LEGS
|
||||
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
/obj/item/clothing/shoes/workboots
|
||||
name = "work boots"
|
||||
@@ -133,7 +133,7 @@
|
||||
permeability_coefficient = 0.15
|
||||
strip_delay = 40
|
||||
equip_delay_other = 40
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
/obj/item/clothing/shoes/workboots/mining
|
||||
name = "mining boots"
|
||||
@@ -184,7 +184,7 @@
|
||||
desc = "A pair of costume boots fashioned after bird talons."
|
||||
icon_state = "griffinboots"
|
||||
item_state = "griffinboots"
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
|
||||
/obj/item/clothing/shoes/bhop
|
||||
name = "jump boots"
|
||||
@@ -193,7 +193,7 @@
|
||||
item_state = "jetboots"
|
||||
item_color = "hosred"
|
||||
resistance_flags = FIRE_PROOF
|
||||
pockets = /obj/item/storage/internal/pocket/shoes
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
|
||||
actions_types = list(/datum/action/item_action/bhop)
|
||||
permeability_coefficient = 0.05
|
||||
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
|
||||
|
||||
@@ -823,13 +823,13 @@
|
||||
if(shoes)
|
||||
shoes.relink_suit(src)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/attack_hand(mob/user)
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/allow_attack_hand_drop(user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(src == H.wear_suit && locked)
|
||||
usermessage("You can not take a locked hardsuit off! Unlock it first!", "boldwarning")
|
||||
return
|
||||
..()
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/flightsuit/dropped()
|
||||
if(deployedpack)
|
||||
|
||||
@@ -9,15 +9,15 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/above_suit = FALSE
|
||||
var/minimize_when_attached = TRUE // TRUE if shown as a small icon in corner, FALSE if overlayed
|
||||
var/datum/component/storage/detached_pockets
|
||||
|
||||
/obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/U, user)
|
||||
if(pockets) // Attach storage to jumpsuit
|
||||
if(U.pockets) // storage items conflict
|
||||
GET_COMPONENT(storage, /datum/component/storage)
|
||||
if(storage)
|
||||
if(U.SendSignal(COMSIG_CONTAINS_STORAGE))
|
||||
return FALSE
|
||||
|
||||
pockets.forceMove(U)
|
||||
U.pockets = pockets
|
||||
|
||||
U.TakeComponent(storage)
|
||||
detached_pockets = storage
|
||||
U.attached_accessory = src
|
||||
forceMove(U)
|
||||
layer = FLOAT_LAYER
|
||||
@@ -41,11 +41,9 @@
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/proc/detach(obj/item/clothing/under/U, user)
|
||||
if(pockets && pockets == U.pockets)
|
||||
pockets.forceMove(src)
|
||||
U.pockets = null
|
||||
if(detached_pockets && detached_pockets.parent == U)
|
||||
TakeComponent(detached_pockets)
|
||||
|
||||
U.armor = U.armor.detachArmor(armor)
|
||||
|
||||
@@ -301,14 +299,18 @@
|
||||
desc = "Can protect your clothing from ink stains, but you'll look like a nerd if you're using one."
|
||||
icon_state = "pocketprotector"
|
||||
item_color = "pocketprotector"
|
||||
pockets = /obj/item/storage/internal/pocket/pocketprotector
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/pocketprotector
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/full
|
||||
pockets = /obj/item/storage/internal/pocket/pocketprotector/full
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/cosmetology
|
||||
pockets = /obj/item/storage/internal/pocket/pocketprotector/cosmetology
|
||||
/obj/item/clothing/accessory/pocketprotector/full/Initialize()
|
||||
. = ..()
|
||||
new /obj/item/pen/red(src)
|
||||
new /obj/item/pen(src)
|
||||
new /obj/item/pen/blue(src)
|
||||
|
||||
/obj/item/clothing/accessory/pocketprotector/cosmetology/Initialize()
|
||||
. = ..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/lipstick/random(src)
|
||||
|
||||
////////////////
|
||||
//OONGA BOONGA//
|
||||
@@ -321,7 +323,6 @@
|
||||
item_color = "talisman"
|
||||
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/skullcodpiece
|
||||
name = "skull codpiece"
|
||||
desc = "A skull shaped ornament, intended to protect the important things in life."
|
||||
|
||||
@@ -40,9 +40,8 @@
|
||||
return
|
||||
|
||||
if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
|
||||
if(istype(I.loc, /obj/item/storage)) //in a container.
|
||||
var/obj/item/storage/U = I.loc
|
||||
U.remove_from_storage(I, src)
|
||||
if(I.loc.SendSignal(COMSIG_CONTAINS_STORAGE)) //in a container.
|
||||
I.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, I, src)
|
||||
if(!user.dropItemToGround(I))
|
||||
return
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
/datum/round_event/pirates/announce()
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
|
||||
|
||||
if(!control) //Means this is false alarm, todo : explicit checks instead of using announceWhen
|
||||
return
|
||||
threat = new
|
||||
@@ -63,7 +63,7 @@
|
||||
var/list/candidates = pollGhostCandidates("Do you wish to be considered for pirate crew ?", ROLE_TRAITOR)
|
||||
shuffle_inplace(candidates)
|
||||
|
||||
var/datum/map_template/pirate_event_ship/ship = new
|
||||
var/datum/map_template/shuttle/pirate/default/ship = new
|
||||
var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width)
|
||||
var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height)
|
||||
var/z = SSmapping.empty_space.z_value
|
||||
@@ -84,7 +84,6 @@
|
||||
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') //CITADEL EDIT also metabreak here too
|
||||
|
||||
|
||||
//Shuttle equipment
|
||||
|
||||
/obj/machinery/shuttle_scrambler
|
||||
@@ -175,10 +174,6 @@
|
||||
QDEL_NULL(gps)
|
||||
return ..()
|
||||
|
||||
/datum/map_template/pirate_event_ship
|
||||
name = "Pirate Ship"
|
||||
mappath = "_maps/templates/pirate_ship.dmm"
|
||||
|
||||
/obj/item/device/gps/internal/pirate
|
||||
gpstag = "Nautical Signal"
|
||||
desc = "You can hear shanties over the static."
|
||||
|
||||
@@ -13,9 +13,10 @@
|
||||
|
||||
if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
if(prob(upgrade_scroll_chance) && S.contents.len < S.storage_slots && !S.invisibility)
|
||||
GET_COMPONENT_FROM(STR, /datum/component/storage, S)
|
||||
if(prob(upgrade_scroll_chance) && S.contents.len < STR.max_items && !S.invisibility)
|
||||
var/obj/item/upgradescroll/scroll = new
|
||||
S.handle_item_insertion(scroll,1)
|
||||
S.SendSignal(COMSIG_TRY_STORAGE_INSERT, scroll, null, TRUE, TRUE)
|
||||
upgrade_scroll_chance = max(0,upgrade_scroll_chance-100)
|
||||
upgrade_scroll_chance += 25
|
||||
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
|
||||
|
||||
//is this shit even used at all
|
||||
/proc/NewStutter(phrase,stun)
|
||||
phrase = html_decode(phrase)
|
||||
|
||||
var/list/split_phrase = splittext(phrase," ") //Split it up into words.
|
||||
|
||||
var/list/unstuttered_words = split_phrase.Copy()
|
||||
var/i = rand(1,3)
|
||||
if(stun) i = split_phrase.len
|
||||
for(,i > 0,i--) //Pick a few words to stutter on.
|
||||
|
||||
if (!unstuttered_words.len)
|
||||
break
|
||||
var/word = pick(unstuttered_words)
|
||||
unstuttered_words -= word //Remove from unstuttered words so we don't stutter it again.
|
||||
var/index = split_phrase.Find(word) //Find the word in the split phrase so we can replace it.
|
||||
|
||||
//Search for dipthongs (two letters that make one sound.)
|
||||
var/first_sound = copytext(word,1,3)
|
||||
var/first_letter = copytext(word,1,2)
|
||||
if(lowertext(first_sound) in list("ch","th","sh"))
|
||||
first_letter = first_sound
|
||||
|
||||
//Repeat the first letter to create a stutter.
|
||||
var/rnum = rand(1,3)
|
||||
switch(rnum)
|
||||
if(1)
|
||||
word = "[first_letter]-[word]"
|
||||
if(2)
|
||||
word = "[first_letter]-[first_letter]-[word]"
|
||||
if(3)
|
||||
word = "[first_letter]-[word]"
|
||||
|
||||
split_phrase[index] = word
|
||||
|
||||
return sanitize(jointext(split_phrase," "))
|
||||
|
||||
/proc/Stagger(mob/M,d) //Technically not a filter, but it relates to drunkenness.
|
||||
step(M, pick(d,turn(d,90),turn(d,-90)))
|
||||
|
||||
/proc/Ellipsis(original_msg, chance = 50, keep_words)
|
||||
if(chance <= 0)
|
||||
return "..."
|
||||
if(chance >= 100)
|
||||
return original_msg
|
||||
|
||||
var/list
|
||||
words = splittext(original_msg," ")
|
||||
new_words = list()
|
||||
|
||||
var/new_msg = ""
|
||||
|
||||
for(var/w in words)
|
||||
if(prob(chance))
|
||||
new_words += "..."
|
||||
if(!keep_words)
|
||||
continue
|
||||
new_words += w
|
||||
|
||||
new_msg = jointext(new_words," ")
|
||||
|
||||
return new_msg
|
||||
@@ -30,6 +30,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/food_cart/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/dat
|
||||
dat += "<br><b>STORED INGREDIENTS AND DRINKS</b><br><div class='statusDisplay'>"
|
||||
dat += "Remaining glasses: [glasses]<br>"
|
||||
@@ -91,11 +92,11 @@
|
||||
to_chat(user, "<span class='warning'>[src] is at full capacity.</span>")
|
||||
break
|
||||
else
|
||||
T.remove_from_storage(S, src)
|
||||
if(stored_food[sanitize(S.name)])
|
||||
stored_food[sanitize(S.name)]++
|
||||
else
|
||||
stored_food[sanitize(S.name)] = 1
|
||||
if(T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src))
|
||||
if(stored_food[sanitize(S.name)])
|
||||
stored_food[sanitize(S.name)]++
|
||||
else
|
||||
stored_food[sanitize(S.name)] = 1
|
||||
else if(O.is_drainable())
|
||||
return
|
||||
else
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
if (contents.len>=max_n_of_items)
|
||||
to_chat(user, "<span class='warning'>[src] is full, you can't put anything in!</span>")
|
||||
return 1
|
||||
T.remove_from_storage(S, src)
|
||||
loaded++
|
||||
if(T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src))
|
||||
loaded++
|
||||
|
||||
if(loaded)
|
||||
to_chat(user, "<span class='notice'>You insert [loaded] items into [src].</span>")
|
||||
@@ -165,6 +165,7 @@
|
||||
********************/
|
||||
|
||||
/obj/machinery/microwave/ui_interact(mob/user) // The microwave Menu
|
||||
. = ..()
|
||||
if(panel_open || !anchored)
|
||||
return
|
||||
var/dat = "<div class='statusDisplay'>"
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/monkey/target, mob/living/user)
|
||||
if(!istype(target))
|
||||
return
|
||||
if(target.stat == 0)
|
||||
if(target.stat == CONSCIOUS)
|
||||
to_chat(user, "<span class='warning'>The monkey is struggling far too much to put it in the recycler.</span>")
|
||||
return
|
||||
if(target.buckled || target.has_buckled_mobs())
|
||||
@@ -69,17 +69,10 @@
|
||||
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
|
||||
use_power(500)
|
||||
grinded++
|
||||
sleep(50)
|
||||
pixel_x = initial(pixel_x) //return to its spot after shaking
|
||||
to_chat(user, "<span class='notice'>The machine now has [grinded] monkey\s worth of material stored.</span>")
|
||||
addtimer(VARSET_CALLBACK(src, pixel_x, initial(pixel_x)))
|
||||
addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "<span class='notice'>The machine now has [grinded] monkey\s worth of material stored.</span>"))
|
||||
|
||||
|
||||
/obj/machinery/monkey_recycler/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(stat != 0) //NOPOWER etc
|
||||
return
|
||||
/obj/machinery/monkey_recycler/interact(mob/user)
|
||||
if(grinded >= required_grind)
|
||||
to_chat(user, "<span class='notice'>The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube.</span>")
|
||||
playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1)
|
||||
@@ -89,4 +82,3 @@
|
||||
to_chat(user, "<span class='notice'>The machine's display flashes that it has [grinded] monkeys worth of material left.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>The machine needs at least [required_grind] monkey(s) worth of material to produce a monkey cube. It only has [grinded].</span>")
|
||||
return
|
||||
|
||||
@@ -22,27 +22,6 @@
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
rating_speed = M.rating
|
||||
|
||||
/obj/machinery/processor/process()
|
||||
..()
|
||||
if(processing)
|
||||
return
|
||||
var/mob/living/simple_animal/slime/picked_slime
|
||||
for(var/mob/living/simple_animal/slime/slime in range(1,src))
|
||||
if(slime.loc == src)
|
||||
continue
|
||||
if(istype(slime, /mob/living/simple_animal/slime))
|
||||
if(slime.stat)
|
||||
picked_slime = slime
|
||||
break
|
||||
if(!picked_slime)
|
||||
return
|
||||
var/datum/food_processor_process/P = select_recipe(picked_slime)
|
||||
if (!P)
|
||||
return
|
||||
|
||||
src.visible_message("[picked_slime] is sucked into [src].")
|
||||
picked_slime.forceMove(src)
|
||||
|
||||
/obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what)
|
||||
if (recipe.output && loc && !QDELETED(src))
|
||||
for(var/i = 0, i < rating_amount, i++)
|
||||
@@ -53,22 +32,6 @@
|
||||
else
|
||||
qdel(what)
|
||||
|
||||
|
||||
/obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what)
|
||||
var/mob/living/simple_animal/slime/S = what
|
||||
if (istype(S))
|
||||
var/C = S.cores
|
||||
if(S.stat != DEAD)
|
||||
S.forceMove(drop_location())
|
||||
S.visible_message("<span class='notice'>[C] crawls free of the processor!</span>")
|
||||
return
|
||||
for(var/i in 1 to (C+rating_amount-1))
|
||||
var/atom/movable/item = new S.coretype(drop_location())
|
||||
adjust_item_drop_location(item)
|
||||
SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour)
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/processor/proc/select_recipe(X)
|
||||
for (var/type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob)
|
||||
var/datum/food_processor_process/recipe = new type()
|
||||
@@ -77,9 +40,9 @@
|
||||
return recipe
|
||||
|
||||
/obj/machinery/processor/attackby(obj/item/O, mob/user, params)
|
||||
if(src.processing)
|
||||
if(processing)
|
||||
to_chat(user, "<span class='warning'>[src] is in the process of processing!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
if(default_deconstruction_screwdriver(user, "processor", "processor1", O))
|
||||
return
|
||||
|
||||
@@ -101,8 +64,8 @@
|
||||
for(var/obj/item/reagent_containers/food/snacks/S in T.contents)
|
||||
var/datum/food_processor_process/P = select_recipe(S)
|
||||
if(P)
|
||||
T.remove_from_storage(S, src)
|
||||
loaded++
|
||||
if(T.SendSignal(COMSIG_TRY_STORAGE_TAKE, S, src))
|
||||
loaded++
|
||||
|
||||
if(loaded)
|
||||
to_chat(user, "<span class='notice'>You insert [loaded] items into [src].</span>")
|
||||
@@ -121,16 +84,11 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/processor/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(src.processing)
|
||||
/obj/machinery/processor/interact(mob/user)
|
||||
if(processing)
|
||||
to_chat(user, "<span class='warning'>[src] is in the process of processing!</span>")
|
||||
return 1
|
||||
if(user.a_intent == INTENT_GRAB && user.pulling && select_recipe(user.pulling))
|
||||
return TRUE
|
||||
if(user.a_intent == INTENT_GRAB && ismob(user.pulling) && select_recipe(user.pulling))
|
||||
if(user.grab_state < GRAB_AGGRESSIVE)
|
||||
to_chat(user, "<span class='warning'>You need a better grip to do that!</span>")
|
||||
return
|
||||
@@ -139,9 +97,9 @@
|
||||
pushed_mob.forceMove(src)
|
||||
user.stop_pulling()
|
||||
return
|
||||
if(src.contents.len == 0)
|
||||
if(contents.len == 0)
|
||||
to_chat(user, "<span class='warning'>[src] is empty!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
processing = TRUE
|
||||
user.visible_message("[user] turns on [src].", \
|
||||
"<span class='notice'>You turn on [src].</span>", \
|
||||
@@ -166,7 +124,7 @@
|
||||
process_food(P, O)
|
||||
pixel_x = initial(pixel_x) //return to its spot after shaking
|
||||
processing = FALSE
|
||||
src.visible_message("\The [src] finishes processing.")
|
||||
visible_message("\The [src] finishes processing.")
|
||||
|
||||
/obj/machinery/processor/verb/eject()
|
||||
set category = "Object"
|
||||
@@ -175,16 +133,14 @@
|
||||
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
src.empty()
|
||||
empty()
|
||||
add_fingerprint(usr)
|
||||
return
|
||||
|
||||
/obj/machinery/processor/proc/empty()
|
||||
for (var/obj/O in src)
|
||||
O.forceMove(drop_location())
|
||||
for (var/mob/M in src)
|
||||
M.forceMove(drop_location())
|
||||
return
|
||||
|
||||
/obj/machinery/processor/slime
|
||||
name = "slime processor"
|
||||
@@ -208,3 +164,37 @@
|
||||
AM.pixel_x = -8 + ((ii%3)*8)
|
||||
AM.pixel_y = -8 + (round(ii/3)*8)
|
||||
return i
|
||||
|
||||
/obj/machinery/processor/slime/process()
|
||||
if(processing)
|
||||
return
|
||||
var/mob/living/simple_animal/slime/picked_slime
|
||||
for(var/mob/living/simple_animal/slime/slime in range(1,src))
|
||||
if(slime.loc == src)
|
||||
continue
|
||||
if(istype(slime, /mob/living/simple_animal/slime))
|
||||
if(slime.stat)
|
||||
picked_slime = slime
|
||||
break
|
||||
if(!picked_slime)
|
||||
return
|
||||
var/datum/food_processor_process/P = select_recipe(picked_slime)
|
||||
if (!P)
|
||||
return
|
||||
|
||||
visible_message("[picked_slime] is sucked into [src].")
|
||||
picked_slime.forceMove(src)
|
||||
|
||||
/obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what)
|
||||
var/mob/living/simple_animal/slime/S = what
|
||||
if (istype(S))
|
||||
var/C = S.cores
|
||||
if(S.stat != DEAD)
|
||||
S.forceMove(drop_location())
|
||||
S.visible_message("<span class='notice'>[C] crawls free of the processor!</span>")
|
||||
return
|
||||
for(var/i in 1 to (C+rating_amount-1))
|
||||
var/atom/movable/item = new S.coretype(drop_location())
|
||||
adjust_item_drop_location(item)
|
||||
SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour)
|
||||
..()
|
||||
|
||||
@@ -125,12 +125,15 @@
|
||||
var/mob/M = O.loc
|
||||
if(!M.transferItemToLoc(O, src))
|
||||
to_chat(usr, "<span class='warning'>\the [O] is stuck to your hand, you cannot put it in \the [src]!</span>")
|
||||
return
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
else
|
||||
if(istype(O.loc, /obj/item/storage))
|
||||
var/obj/item/storage/S = O.loc
|
||||
S.remove_from_storage(O,src)
|
||||
O.forceMove(src)
|
||||
if(O.loc.SendSignal(COMSIG_CONTAINS_STORAGE))
|
||||
return O.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, O, src)
|
||||
else
|
||||
O.forceMove(src)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/smartfridge/attack_ai(mob/user)
|
||||
return FALSE
|
||||
|
||||
@@ -65,18 +65,22 @@
|
||||
name = "Easter Basket"
|
||||
icon = 'icons/mob/easter.dmi'
|
||||
icon_state = "basket"
|
||||
can_hold = list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg)
|
||||
|
||||
/obj/item/storage/bag/easterbasket/Initialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg))
|
||||
|
||||
/obj/item/storage/bag/easterbasket/proc/countEggs()
|
||||
cut_overlays()
|
||||
add_overlay("basket-grass")
|
||||
add_overlay("basket-egg[min(contents.len, 5)]")
|
||||
|
||||
/obj/item/storage/bag/easterbasket/remove_from_storage(obj/item/W as obj, atom/new_location)
|
||||
..()
|
||||
/obj/item/storage/bag/easterbasket/Exited()
|
||||
. = ..()
|
||||
countEggs()
|
||||
|
||||
/obj/item/storage/bag/easterbasket/handle_item_insertion(obj/item/I, prevent_warning = 0)
|
||||
/obj/item/storage/bag/easterbasket/Entered()
|
||||
. = ..()
|
||||
countEggs()
|
||||
|
||||
|
||||
@@ -116,8 +116,8 @@
|
||||
for(var/obj/item/reagent_containers/food/snacks/grown/G in PB.contents)
|
||||
if(i >= max_items)
|
||||
break
|
||||
PB.remove_from_storage(G, src)
|
||||
i++
|
||||
if(PB.SendSignal(COMSIG_TRY_STORAGE_TAKE, G, src))
|
||||
i++
|
||||
if(i<max_items)
|
||||
to_chat(user, "<span class='info'>You empty the plant bag into the biogenerator.</span>")
|
||||
else if(PB.contents.len == 0)
|
||||
|
||||
@@ -787,11 +787,8 @@
|
||||
|
||||
else if(istype(O, /obj/item/storage/bag/plants))
|
||||
attack_hand(user)
|
||||
var/obj/item/storage/bag/plants/S = O
|
||||
for(var/obj/item/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
|
||||
if(!S.can_be_inserted(G))
|
||||
return
|
||||
S.handle_item_insertion(G, 1)
|
||||
O.SendSignal(COMSIG_TRY_STORAGE_INSERT, G, user, TRUE)
|
||||
|
||||
else if(istype(O, /obj/item/wrench) && unwrenchable)
|
||||
if(using_irrigation)
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
if(default_deconstruction_crowbar(O))
|
||||
return
|
||||
|
||||
if (istype(O, /obj/item/storage/bag/plants))
|
||||
if(istype(O, /obj/item/storage/bag/plants))
|
||||
var/obj/item/storage/P = O
|
||||
var/loaded = 0
|
||||
for(var/obj/item/seeds/G in P.contents)
|
||||
@@ -83,7 +83,7 @@
|
||||
++loaded
|
||||
add_seed(G)
|
||||
if (loaded)
|
||||
to_chat(user, "<span class='notice'>You put the seeds from \the [O.name] into [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You put as many seeds from \the [O.name] into [src] as you can.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There are no seeds in \the [O.name].</span>")
|
||||
return
|
||||
@@ -122,6 +122,7 @@
|
||||
src.amount = am
|
||||
|
||||
/obj/machinery/seed_extractor/ui_interact(mob/user)
|
||||
. = ..()
|
||||
if (stat)
|
||||
return FALSE
|
||||
|
||||
@@ -175,21 +176,21 @@
|
||||
/obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/O)
|
||||
if(contents.len >= 999)
|
||||
to_chat(usr, "<span class='notice'>\The [src] is full.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(ismob(O.loc))
|
||||
GET_COMPONENT_FROM(STR, /datum/component/storage, O.loc)
|
||||
if(STR)
|
||||
if(!STR.remove_from_storage(O,src))
|
||||
return FALSE
|
||||
else if(ismob(O.loc))
|
||||
var/mob/M = O.loc
|
||||
if(!M.transferItemToLoc(O, src))
|
||||
return 0
|
||||
else if(istype(O.loc, /obj/item/storage))
|
||||
var/obj/item/storage/S = O.loc
|
||||
S.remove_from_storage(O,src)
|
||||
return FALSE
|
||||
|
||||
. = 1
|
||||
. = TRUE
|
||||
for (var/datum/seed_pile/N in piles)
|
||||
if (O.plantname == N.name && O.lifespan == N.lifespan && O.endurance == N.endurance && O.maturation == N.maturation && O.production == N.production && O.yield == N.yield && O.potency == N.potency)
|
||||
++N.amount
|
||||
return
|
||||
|
||||
piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency)
|
||||
return
|
||||
|
||||
@@ -817,7 +817,8 @@
|
||||
return FALSE
|
||||
var/ignore_bags = get_pin_data(IC_INPUT, 1)
|
||||
if(ignore_bags)
|
||||
if(istype(A, /obj/item/storage))
|
||||
GET_COMPONENT_FROM(STR, /datum/component/storage, A)
|
||||
if(STR)
|
||||
return FALSE
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(A))
|
||||
push_data()
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
to_chat(user, "<span class='notice'>You can't fit anything in.</span>")
|
||||
return
|
||||
if(thing) // put thing in belt
|
||||
if(equipped_belt.can_be_inserted(thing))
|
||||
equipped_belt.handle_item_insertion(thing)
|
||||
else
|
||||
if(!equipped_belt.SendSignal(COMSIG_TRY_STORAGE_INSERT, thing, user.mob))
|
||||
to_chat(user, "<span class='notice'>You can't fit anything in.</span>")
|
||||
return
|
||||
if(!equipped_belt.contents.len) // nothing to take out
|
||||
@@ -47,9 +45,7 @@
|
||||
to_chat(user, "<span class='notice'>You can't fit anything in.</span>")
|
||||
return
|
||||
if(thing) // put thing in backpack
|
||||
if(equipped_backpack.can_be_inserted(thing))
|
||||
equipped_backpack.handle_item_insertion(thing)
|
||||
else
|
||||
if(!equipped_backpack.SendSignal(COMSIG_TRY_STORAGE_INSERT, thing, user.mob))
|
||||
to_chat(user, "<span class='notice'>You can't fit anything in.</span>")
|
||||
return
|
||||
if(!equipped_backpack.contents.len) // nothing to take out
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
var/state = 0
|
||||
var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase
|
||||
|
||||
|
||||
/obj/structure/bookcase/examine(mob/user)
|
||||
..()
|
||||
if(!anchored)
|
||||
@@ -39,7 +38,6 @@
|
||||
if(2)
|
||||
to_chat(user, "<span class='notice'>There's a <b>small crack</b> visible on the shelf.</span>")
|
||||
|
||||
|
||||
/obj/structure/bookcase/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
@@ -52,7 +50,6 @@
|
||||
I.forceMove(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/structure/bookcase/attackby(obj/item/I, mob/user, params)
|
||||
switch(state)
|
||||
if(0)
|
||||
@@ -81,15 +78,15 @@
|
||||
state = 0
|
||||
|
||||
if(2)
|
||||
GET_COMPONENT_FROM(STR, /datum/component/storage, I)
|
||||
if(is_type_in_list(I, allowed_books))
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
update_icon()
|
||||
else if(istype(I, /obj/item/storage/bag/books))
|
||||
var/obj/item/storage/bag/books/B = I
|
||||
for(var/obj/item/T in B.contents)
|
||||
else if(STR)
|
||||
for(var/obj/item/T in I.contents)
|
||||
if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook))
|
||||
B.remove_from_storage(T, src)
|
||||
STR.remove_from_storage(T, src)
|
||||
to_chat(user, "<span class='notice'>You empty \the [I] into \the [src].</span>")
|
||||
update_icon()
|
||||
else if(istype(I, /obj/item/pen))
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
|
||||
if (IS_DYNAMIC_LIGHTING(src))
|
||||
cut_overlay(/obj/effect/fullbright)
|
||||
for (var/turf/T in area_contents(src))
|
||||
for (var/turf/T in src)
|
||||
if (IS_DYNAMIC_LIGHTING(T))
|
||||
T.lighting_build_overlay()
|
||||
|
||||
else
|
||||
add_overlay(/obj/effect/fullbright)
|
||||
for (var/turf/T in area_contents(src))
|
||||
for (var/turf/T in src)
|
||||
if (T.lighting_object)
|
||||
T.lighting_clear_overlay()
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
initTemplateBounds(bounds)
|
||||
|
||||
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
|
||||
return TRUE
|
||||
return bounds
|
||||
|
||||
/datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE)
|
||||
var/turf/placement = T
|
||||
|
||||
@@ -174,7 +174,6 @@ interface with the mining shuttle at the landing site if a mobile beacon is also
|
||||
landing_zone.width = base_dock.width
|
||||
landing_zone.height = base_dock.height
|
||||
landing_zone.setDir(base_dock.dir)
|
||||
landing_zone.turf_type = T.type
|
||||
landing_zone.area_type = A.type
|
||||
|
||||
possible_destinations += "[landing_zone.id];"
|
||||
@@ -320,7 +319,6 @@ obj/docking_port/stationary/public_mining_dock
|
||||
Mport.width = SM.width
|
||||
Mport.height = SM.height
|
||||
Mport.setDir(dir)
|
||||
Mport.turf_type = landing_spot.type
|
||||
Mport.area_type = A.type
|
||||
|
||||
break
|
||||
|
||||
@@ -63,8 +63,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
|
||||
to_chat(user, "<span class='notice'>You attach the pack to [A] and activate it.</span>")
|
||||
if(loc == user && istype(user.back, /obj/item/storage/backpack))
|
||||
var/obj/item/storage/backpack/B = user.back
|
||||
if(B.can_be_inserted(src,stop_messages = 1))
|
||||
B.handle_item_insertion(src)
|
||||
B.SendSignal(COMSIG_TRY_STORAGE_INSERT, src, user, FALSE, FALSE)
|
||||
uses_left--
|
||||
if(uses_left <= 0)
|
||||
user.transferItemToLoc(src, A, TRUE)
|
||||
|
||||
@@ -433,25 +433,13 @@
|
||||
|
||||
//Shared Bag
|
||||
|
||||
//Internal
|
||||
|
||||
/obj/item/storage/backpack/shared
|
||||
name = "paradox bag"
|
||||
desc = "Somehow, it's in two places at once."
|
||||
max_combined_w_class = 60
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
|
||||
//External
|
||||
|
||||
/obj/item/device/shared_storage
|
||||
name = "paradox bag"
|
||||
desc = "Somehow, it's in two places at once."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "cultpack"
|
||||
slot_flags = SLOT_BACK
|
||||
var/obj/item/storage/backpack/shared/bag
|
||||
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
|
||||
/obj/item/device/shared_storage/red
|
||||
name = "paradox bag"
|
||||
@@ -459,53 +447,20 @@
|
||||
|
||||
/obj/item/device/shared_storage/red/Initialize()
|
||||
. = ..()
|
||||
if(!bag)
|
||||
var/obj/item/storage/backpack/shared/S = new(src)
|
||||
var/obj/item/device/shared_storage/blue = new(src.loc)
|
||||
|
||||
src.bag = S
|
||||
blue.bag = S
|
||||
|
||||
|
||||
/obj/item/device/shared_storage/attackby(obj/item/W, mob/user, params)
|
||||
if(bag)
|
||||
bag.forceMove(user)
|
||||
bag.attackby(W, user, params)
|
||||
|
||||
|
||||
/obj/item/device/shared_storage/attack_hand(mob/living/carbon/user)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
if(loc == user && user.back && user.back == src)
|
||||
if(bag)
|
||||
bag.forceMove(user)
|
||||
bag.attack_hand(user)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/device/shared_storage/MouseDrop(atom/over_object)
|
||||
if(iscarbon(usr) || isdrone(usr))
|
||||
var/mob/M = usr
|
||||
|
||||
if(!over_object)
|
||||
return
|
||||
|
||||
if(ismecha(usr.loc))
|
||||
return
|
||||
|
||||
if(!M.incapacitated())
|
||||
playsound(loc, "rustle", 50, 1, -5)
|
||||
|
||||
|
||||
if(istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
|
||||
var/datum/component/storage/STR = AddComponent(/datum/component/storage/concrete)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
||||
STR.max_combined_w_class = 60
|
||||
STR.max_items = 21
|
||||
new /obj/item/device/shared_storage/blue(drop_location(), STR)
|
||||
|
||||
/obj/item/device/shared_storage/blue/Initialize(mapload, datum/component/storage/concrete/master)
|
||||
. = ..()
|
||||
if(!istype(master))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
var/datum/component/storage/STR = AddComponent(/datum/component/storage, master)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
||||
STR.max_combined_w_class = 60
|
||||
STR.max_items = 21
|
||||
|
||||
//Book of Babel
|
||||
|
||||
|
||||
@@ -8,14 +8,16 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 100
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
storage_slots = 80
|
||||
max_combined_w_class = 40
|
||||
can_hold = list(/obj/item/coin, /obj/item/stack/spacecash)
|
||||
|
||||
|
||||
/obj/item/storage/bag/money/vault/Initialize()
|
||||
/obj/item/storage/bag/money/Initialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
||||
STR.max_items = 40
|
||||
STR.max_combined_w_class = 40
|
||||
STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash))
|
||||
|
||||
/obj/item/storage/bag/money/vault/PopulateContents()
|
||||
new /obj/item/coin/silver(src)
|
||||
new /obj/item/coin/silver(src)
|
||||
new /obj/item/coin/silver(src)
|
||||
|
||||
@@ -9,14 +9,12 @@
|
||||
density = TRUE
|
||||
pressure_resistance = 5*ONE_ATMOSPHERE
|
||||
|
||||
/obj/structure/ore_box/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/ore))
|
||||
user.transferItemToLoc(I, src)
|
||||
else if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
for(var/obj/item/stack/ore/O in S.contents)
|
||||
S.remove_from_storage(O, src) //This will move the item to this item's contents
|
||||
to_chat(user, "<span class='notice'>You empty the ore in [S] into \the [src].</span>")
|
||||
/obj/structure/ore_box/attackby(obj/item/W, mob/user, params)
|
||||
if (istype(W, /obj/item/stack/ore))
|
||||
user.transferItemToLoc(W, src)
|
||||
else if(W.SendSignal(COMSIG_CONTAINS_STORAGE))
|
||||
W.SendSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/stack/ore, src)
|
||||
to_chat(user, "<span class='notice'>You empty the ore in [W] into \the [src].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
|
||||
Ok. so a quick rundown on how to make a program. This is kind of a shitty documentation, but oh well I was asked to.
|
||||
|
||||
|
||||
This is how the base program is setup. the rest is mostly tgui stuff. I'll use the ntnetmonitor as a base
|
||||
|
||||
/datum/computer_file/program/ntnetmonitor
|
||||
filename = "ntmonitor" <- This is obviously the name of the file itself. not much to be said
|
||||
filedesc = "NTNet Diagnostics and Monitoring" <- This sort of the official name. it's what shows up on the main menu
|
||||
program_icon_state = "comm_monitor" <- This is what the screen will look like when the program is active
|
||||
extended_desc = "This program is a dummy. <- This is a sort of description, visible when looking on the ntnet
|
||||
size = 12 <- size of the program. Big programs need more hard drive space. Don't make it too big though.
|
||||
requires_ntnet = 1 <- if this is set, the program will not run and will close if ntnet connection is lost. mainly for primarily online programs.
|
||||
required_access = access_network <- This is access required to run the program itself. ONLY SET THIS FOR SUPER SECURE SHIT. This also acts as transfer_access as well.
|
||||
transfer_access = access_change_ids <- this is the access needed to download from ntnet or host on the ptp program. This is what you want to use most of the time.
|
||||
available_on_ntnet = 1 <- If it's available to download on ntnet. pretty self explanatory.
|
||||
available_on_syndinet = 0 <- ditto but on emagged syndie net. Use this for antag programs
|
||||
usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
|
||||
^^- The comment above sorta explains it. Use this to limit what kind of machines can run the program. For example, comms program should be limited to consoles and laptops.
|
||||
var/ui_header = "downloader_finished.gif" <- this one is kinda cool. If you have the program minimized, this will show up in the header of the computer screen.
|
||||
you can even have the program change what the header is based on the situation! see alarm.dm for an example.
|
||||
|
||||
|
||||
Now. for pre-installing stuff.
|
||||
|
||||
Primarily done for consoles, there's an install_programs() proc in the console presets file in the machines folder.
|
||||
|
||||
for example, the command console one.
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/command/install_programs()
|
||||
cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient())
|
||||
cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod())
|
||||
|
||||
Basically, you want to do cpu.hard_drive.store_file(new/*program path here*()) and put it in the subtype's install_programs().
|
||||
Probably pretty self explanatory, but just in case.
|
||||
|
||||
Will probably be expanded when new features come around or I get asked to mention something.
|
||||
|
||||
*/
|
||||
@@ -13,7 +13,7 @@
|
||||
ui_y = 400
|
||||
var/last_status = SUPERMATTER_INACTIVE
|
||||
var/list/supermatters
|
||||
var/obj/machinery/power/supermatter_shard/active // Currently selected supermatter crystal.
|
||||
var/obj/machinery/power/supermatter_crystal/active // Currently selected supermatter crystal.
|
||||
|
||||
|
||||
/datum/computer_file/program/supermatter_monitor/process_tick()
|
||||
@@ -41,7 +41,7 @@
|
||||
var/turf/T = get_turf(ui_host())
|
||||
if(!T)
|
||||
return
|
||||
for(var/obj/machinery/power/supermatter_shard/S in GLOB.machines)
|
||||
for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines)
|
||||
// Delaminating, not within coverage, not on a tile.
|
||||
if (!isturf(S.loc) || !(is_station_level(S.z) || is_mining_level(S.z) || S.z == T.z))
|
||||
continue
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
/datum/computer_file/program/supermatter_monitor/proc/get_status()
|
||||
. = SUPERMATTER_INACTIVE
|
||||
for(var/obj/machinery/power/supermatter_shard/S in supermatters)
|
||||
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
|
||||
. = max(., S.get_status())
|
||||
|
||||
/datum/computer_file/program/supermatter_monitor/ui_data()
|
||||
@@ -93,7 +93,7 @@
|
||||
data["gases"] = gasdata
|
||||
else
|
||||
var/list/SMS = list()
|
||||
for(var/obj/machinery/power/supermatter_shard/S in supermatters)
|
||||
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
|
||||
var/area/A = get_area(S)
|
||||
if(A)
|
||||
SMS.Add(list(list(
|
||||
@@ -120,7 +120,7 @@
|
||||
return TRUE
|
||||
if("PRG_set")
|
||||
var/newuid = text2num(params["target"])
|
||||
for(var/obj/machinery/power/supermatter_shard/S in supermatters)
|
||||
for(var/obj/machinery/power/supermatter_crystal/S in supermatters)
|
||||
if(S.uid == newuid)
|
||||
active = S
|
||||
return TRUE
|
||||
@@ -11,13 +11,13 @@ Contents:
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!U)
|
||||
return
|
||||
if(s_active)
|
||||
if(stealth)
|
||||
cancel_stealth()
|
||||
else
|
||||
if(cell.charge <= 0)
|
||||
to_chat(U, "<span class='warning'>You don't have enough power to enable Stealth!</span>")
|
||||
return
|
||||
s_active=!s_active
|
||||
stealth = !stealth
|
||||
animate(U, alpha = 50,time = 15)
|
||||
U.visible_message("<span class='warning'>[U.name] vanishes into thin air!</span>", \
|
||||
"<span class='notice'>You are now mostly invisible to normal detection.</span>")
|
||||
@@ -27,8 +27,8 @@ Contents:
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!U)
|
||||
return 0
|
||||
if(s_active)
|
||||
s_active=!s_active
|
||||
if(stealth)
|
||||
stealth = !stealth
|
||||
animate(U, alpha = 255, time = 15)
|
||||
U.visible_message("<span class='warning'>[U.name] appears from thin air!</span>", \
|
||||
"<span class='notice'>You are now visible.</span>")
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Contents:
|
||||
- Proc for handling teleporting while grabbing someone
|
||||
- Telport Ability
|
||||
- Right-Click Teleport Ability
|
||||
|
||||
*/
|
||||
|
||||
|
||||
//Handles elporting while grabbing someone
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/H)
|
||||
if(H.pulling && (isliving(H.pulling)))
|
||||
var/mob/living/victim = H.pulling
|
||||
if(!victim.anchored)
|
||||
victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
|
||||
|
||||
|
||||
//Jaunt
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
|
||||
if(!ninjacost(100,N_STEALTH_CANCEL))
|
||||
var/mob/living/carbon/human/H = affecting
|
||||
var/turf/destination = get_teleport_loc(H.loc,H,9,1,3,1,0,1)
|
||||
var/turf/mobloc = get_turf(H.loc)//Safety
|
||||
|
||||
if(destination && isturf(mobloc))//So we don't teleport out of containers
|
||||
playsound(H.loc, "sparks", 50, 1)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
|
||||
|
||||
handle_teleport_grab(destination, H)
|
||||
H.loc = destination
|
||||
|
||||
spark_system.start()
|
||||
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(H.loc, "sparks", 50, 1)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
|
||||
|
||||
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
|
||||
s_coold = 1
|
||||
else
|
||||
to_chat(H, "<span class='danger'>The VOID-shift device is malfunctioning, <B>teleportation failed</B>.</span>")
|
||||
|
||||
|
||||
//Right-Click teleport: It's basically admin "jump to turf"
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
|
||||
set name = "Phase Shift (20E)"
|
||||
set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
|
||||
set category = null//So it does not show up on the panel but can still be right-clicked.
|
||||
set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
|
||||
|
||||
if(!ninjacost(200,N_STEALTH_CANCEL))
|
||||
var/mob/living/carbon/human/H = affecting
|
||||
var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below.
|
||||
if(!T.density && isturf(mobloc))
|
||||
playsound(H.loc, "sparks", 50, 1)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
|
||||
|
||||
handle_teleport_grab(T, H)
|
||||
H.forceMove(T)
|
||||
|
||||
spark_system.start()
|
||||
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(H.loc, "sparks", 50, 1)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
|
||||
|
||||
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
|
||||
s_coold = 1
|
||||
else
|
||||
to_chat(H, "<span class='danger'>You cannot teleport into solid walls or from solid matter</span>")
|
||||
@@ -48,7 +48,7 @@ Contents:
|
||||
var/s_maxamount = 20//Maximum number of smoke bombs.
|
||||
|
||||
//Support function variables.
|
||||
var/s_active = 0//Stealth off.
|
||||
var/stealth = FALSE//Stealth off.
|
||||
var/s_busy = FALSE//Is the suit busy with a process? Like AI hacking. Used for safety functions.
|
||||
|
||||
//Ability function variables.
|
||||
@@ -152,7 +152,7 @@ Contents:
|
||||
if(s_initialized)
|
||||
if(user == affecting)
|
||||
to_chat(user, "All systems operational. Current energy capacity: <B>[DisplayEnergy(cell.charge)]</B>.")
|
||||
to_chat(user, "The CLOAK-tech device is <B>[s_active?"active":"inactive"]</B>.")
|
||||
to_chat(user, "The CLOAK-tech device is <B>[stealth?"active":"inactive"]</B>.")
|
||||
to_chat(user, "There are <B>[s_bombs]</B> smoke bomb\s remaining.")
|
||||
to_chat(user, "There are <B>[a_boost]</B> adrenaline booster\s remaining.")
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
s_coold--//Checks for ability s_cooldown first.
|
||||
|
||||
cell.charge -= s_cost//s_cost is the default energy cost each ntick, usually 5.
|
||||
if(s_active)//If stealth is active.
|
||||
if(stealth)//If stealth is active.
|
||||
cell.charge -= s_acost
|
||||
|
||||
else
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
|
||||
Contents:
|
||||
- Procs that add ninja verbs to ninjas
|
||||
- Procs that remove ninja verbs from ninjas
|
||||
- Procs that add ninjasuit verbs to ninjas
|
||||
- Procs that remove ninjasuit verbs from ninjas
|
||||
|
||||
*/
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
|
||||
n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggledrain
|
||||
|
||||
s_initialized = 1
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
|
||||
if(n_gloves)
|
||||
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggledrain
|
||||
|
||||
s_initialized = 0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
|
||||
s_initialized=1
|
||||
slowdown=0
|
||||
@@ -110,9 +110,13 @@
|
||||
item_state = "briefcase"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
|
||||
can_hold = list(/obj/item/photo)
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
/obj/item/storage/photo_album/Initialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.can_hold = typecacheof(list(/obj/item/photo))
|
||||
|
||||
/*
|
||||
* Camera
|
||||
*/
|
||||
|
||||
+37
-42
@@ -1,30 +1,30 @@
|
||||
//update_state
|
||||
#define UPSTATE_CELL_IN 1
|
||||
#define UPSTATE_OPENED1 2
|
||||
#define UPSTATE_OPENED2 4
|
||||
#define UPSTATE_MAINT 8
|
||||
#define UPSTATE_BROKE 16
|
||||
#define UPSTATE_BLUESCREEN 32
|
||||
#define UPSTATE_WIREEXP 64
|
||||
#define UPSTATE_ALLGOOD 128
|
||||
#define UPSTATE_CELL_IN (1<<0)
|
||||
#define UPSTATE_OPENED1 (1<<1)
|
||||
#define UPSTATE_OPENED2 (1<<2)
|
||||
#define UPSTATE_MAINT (1<<3)
|
||||
#define UPSTATE_BROKE (1<<4)
|
||||
#define UPSTATE_BLUESCREEN (1<<5)
|
||||
#define UPSTATE_WIREEXP (1<<6)
|
||||
#define UPSTATE_ALLGOOD (1<<7)
|
||||
|
||||
#define APC_RESET_EMP "emp"
|
||||
|
||||
//update_overlay
|
||||
#define APC_UPOVERLAY_CHARGEING0 1
|
||||
#define APC_UPOVERLAY_CHARGEING1 2
|
||||
#define APC_UPOVERLAY_CHARGEING2 4
|
||||
#define APC_UPOVERLAY_EQUIPMENT0 8
|
||||
#define APC_UPOVERLAY_EQUIPMENT1 16
|
||||
#define APC_UPOVERLAY_EQUIPMENT2 32
|
||||
#define APC_UPOVERLAY_LIGHTING0 64
|
||||
#define APC_UPOVERLAY_LIGHTING1 128
|
||||
#define APC_UPOVERLAY_LIGHTING2 256
|
||||
#define APC_UPOVERLAY_ENVIRON0 512
|
||||
#define APC_UPOVERLAY_ENVIRON1 1024
|
||||
#define APC_UPOVERLAY_ENVIRON2 2048
|
||||
#define APC_UPOVERLAY_LOCKED 4096
|
||||
#define APC_UPOVERLAY_OPERATING 8192
|
||||
#define APC_UPOVERLAY_CHARGEING0 (1<<0)
|
||||
#define APC_UPOVERLAY_CHARGEING1 (1<<1)
|
||||
#define APC_UPOVERLAY_CHARGEING2 (1<<2)
|
||||
#define APC_UPOVERLAY_EQUIPMENT0 (1<<3)
|
||||
#define APC_UPOVERLAY_EQUIPMENT1 (1<<4)
|
||||
#define APC_UPOVERLAY_EQUIPMENT2 (1<<5)
|
||||
#define APC_UPOVERLAY_LIGHTING0 (1<<6)
|
||||
#define APC_UPOVERLAY_LIGHTING1 (1<<7)
|
||||
#define APC_UPOVERLAY_LIGHTING2 (1<<8)
|
||||
#define APC_UPOVERLAY_ENVIRON0 (1<<9)
|
||||
#define APC_UPOVERLAY_ENVIRON1 (1<<10)
|
||||
#define APC_UPOVERLAY_ENVIRON2 (1<<11)
|
||||
#define APC_UPOVERLAY_LOCKED (1<<12)
|
||||
#define APC_UPOVERLAY_OPERATING (1<<13)
|
||||
|
||||
|
||||
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
|
||||
@@ -911,12 +911,11 @@
|
||||
update()
|
||||
if("emergency_lighting")
|
||||
emergency_lights = !emergency_lights
|
||||
for(var/area/A in area.related)
|
||||
for(var/obj/machinery/light/L in A)
|
||||
if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override
|
||||
L.no_emergency = emergency_lights
|
||||
INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE)
|
||||
CHECK_TICK
|
||||
for(var/obj/machinery/light/L in area)
|
||||
if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override
|
||||
L.no_emergency = emergency_lights
|
||||
INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE)
|
||||
CHECK_TICK
|
||||
return 1
|
||||
|
||||
/obj/machinery/power/apc/proc/toggle_breaker()
|
||||
@@ -1281,12 +1280,11 @@
|
||||
INVOKE_ASYNC(src, .proc/break_lights)
|
||||
|
||||
/obj/machinery/power/apc/proc/break_lights()
|
||||
for(var/area/A in area.related)
|
||||
for(var/obj/machinery/light/L in A)
|
||||
L.on = TRUE
|
||||
L.break_light_tube()
|
||||
L.on = FALSE
|
||||
stoplag()
|
||||
for(var/obj/machinery/light/L in area)
|
||||
L.on = TRUE
|
||||
L.break_light_tube()
|
||||
L.on = FALSE
|
||||
stoplag()
|
||||
|
||||
/obj/machinery/power/apc/proc/shock(mob/user, prb)
|
||||
if(!prob(prb))
|
||||
@@ -1322,12 +1320,11 @@
|
||||
/obj/machinery/power/apc/proc/set_nightshift(on)
|
||||
set waitfor = FALSE
|
||||
nightshift_lights = on
|
||||
for(var/area/A in area.related)
|
||||
for(var/obj/machinery/light/L in A)
|
||||
if(L.nightshift_allowed)
|
||||
L.nightshift_enabled = nightshift_lights
|
||||
L.update(FALSE)
|
||||
CHECK_TICK
|
||||
for(var/obj/machinery/light/L in area)
|
||||
if(L.nightshift_allowed)
|
||||
L.nightshift_enabled = nightshift_lights
|
||||
L.update(FALSE)
|
||||
CHECK_TICK
|
||||
|
||||
#undef UPSTATE_CELL_IN
|
||||
#undef UPSTATE_OPENED1
|
||||
@@ -1356,8 +1353,6 @@
|
||||
#undef APC_UPOVERLAY_LOCKED
|
||||
#undef APC_UPOVERLAY_OPERATING
|
||||
|
||||
#undef APC_UPDATE_ICON_COOLDOWN
|
||||
|
||||
/*Power module, used for APC construction*/
|
||||
/obj/item/electronics/apc
|
||||
name = "power control module"
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
/obj/singularity/proc/consume(atom/A)
|
||||
var/gain = A.singularity_act(current_size, src)
|
||||
src.energy += gain
|
||||
if(istype(A, /obj/machinery/power/supermatter_shard) && !consumedSupermatter)
|
||||
if(istype(A, /obj/machinery/power/supermatter_crystal) && !consumedSupermatter)
|
||||
desc = "[initial(desc)] It glows fiercely with inner fire."
|
||||
name = "supermatter-charged [initial(name)]"
|
||||
consumedSupermatter = 1
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#define SEVERE_POWER_PENALTY_THRESHOLD 7000 //Same as above, but causes more dangerous effects
|
||||
#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //Even more dangerous effects, threshold for tesla delamination
|
||||
#define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher.
|
||||
#define DAMAGE_HARDCAP 0.0025
|
||||
#define DAMAGE_HARDCAP 0.002
|
||||
#define DAMAGE_INCREASE_MULTIPLIER 0.25
|
||||
|
||||
|
||||
@@ -54,15 +54,17 @@
|
||||
#define SUPERMATTER_DANGER_PERCENT 50
|
||||
#define SUPERMATTER_WARNING_PERCENT 100
|
||||
|
||||
GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
#define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS
|
||||
|
||||
/obj/machinery/power/supermatter_shard
|
||||
name = "supermatter shard"
|
||||
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure."
|
||||
GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
|
||||
/obj/machinery/power/supermatter_crystal
|
||||
name = "supermatter crystal"
|
||||
desc = "A strangely translucent and iridescent crystal."
|
||||
icon = 'icons/obj/supermatter.dmi'
|
||||
icon_state = "darkmatter_shard"
|
||||
icon_state = "darkmatter"
|
||||
density = TRUE
|
||||
anchored = FALSE
|
||||
anchored = TRUE
|
||||
var/uid = 1
|
||||
var/static/gl_uid = 1
|
||||
light_range = 4
|
||||
@@ -70,9 +72,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
critical_machine = TRUE
|
||||
|
||||
var/gasefficency = 0.125
|
||||
var/gasefficency = 0.15
|
||||
|
||||
var/base_icon_state = "darkmatter_shard"
|
||||
var/base_icon_state = "darkmatter"
|
||||
|
||||
var/final_countdown = FALSE
|
||||
|
||||
var/damage = 0
|
||||
var/damage_archived = 0
|
||||
@@ -86,7 +90,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
var/emergency_issued = FALSE
|
||||
|
||||
var/explosion_power = 12
|
||||
var/explosion_power = 35
|
||||
var/temp_factor = 30
|
||||
|
||||
var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning
|
||||
@@ -137,9 +141,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
var/datum/looping_sound/supermatter/soundloop
|
||||
|
||||
var/moveable = TRUE
|
||||
var/moveable = FALSE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/Initialize()
|
||||
/obj/machinery/power/supermatter_crystal/Initialize()
|
||||
. = ..()
|
||||
uid = gl_uid++
|
||||
SSair.atmos_machinery += src
|
||||
@@ -156,7 +160,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
soundloop = new(list(src), TRUE)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/Destroy()
|
||||
/obj/machinery/power/supermatter_crystal/Destroy()
|
||||
investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER)
|
||||
SSair.atmos_machinery -= src
|
||||
QDEL_NULL(radio)
|
||||
@@ -167,7 +171,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/supermatter_shard/examine(mob/user)
|
||||
/obj/machinery/power/supermatter_crystal/examine(mob/user)
|
||||
..()
|
||||
if(!ishuman(user))
|
||||
return
|
||||
@@ -180,12 +184,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
to_chat(H, "<span class='danger'>You get headaches just from looking at it.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/power/supermatter_shard/get_spans()
|
||||
/obj/machinery/power/supermatter_crystal/get_spans()
|
||||
return list(SPAN_ROBOT)
|
||||
|
||||
#define CRITICAL_TEMPERATURE 10000
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/get_status()
|
||||
/obj/machinery/power/supermatter_crystal/proc/get_status()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return SUPERMATTER_ERROR
|
||||
@@ -212,7 +216,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
return SUPERMATTER_NORMAL
|
||||
return SUPERMATTER_INACTIVE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/alarm()
|
||||
/obj/machinery/power/supermatter_crystal/proc/alarm()
|
||||
switch(get_status())
|
||||
if(SUPERMATTER_DELAMINATING)
|
||||
playsound(src, 'sound/misc/bloblarm.ogg', 100)
|
||||
@@ -223,13 +227,51 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
if(SUPERMATTER_WARNING)
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 75)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/get_integrity()
|
||||
/obj/machinery/power/supermatter_crystal/proc/get_integrity()
|
||||
var/integrity = damage / explosion_point
|
||||
integrity = round(100 - integrity * 100, 0.01)
|
||||
integrity = integrity < 0 ? 0 : integrity
|
||||
return integrity
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/explode()
|
||||
/obj/machinery/power/supermatter_crystal/proc/countdown()
|
||||
if(final_countdown) // We're already doing it go away
|
||||
return
|
||||
final_countdown = TRUE
|
||||
|
||||
var/image/causality_field = image(icon, null, "causality_field")
|
||||
add_overlay(causality_field, TRUE)
|
||||
|
||||
var/speaking = "[emergency_alert] The supermatter has reached critical integrity failure. Emergency causality destabilization field has been activated."
|
||||
radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language())
|
||||
for(var/i in SUPERMATTER_COUNTDOWN_TIME to 0 step -10)
|
||||
if(damage < explosion_point) // Cutting it a bit close there engineers
|
||||
radio.talk_into(src, "[safe_alert] Failsafe has been disengaged.", common_channel, get_spans(), get_default_language())
|
||||
cut_overlay(causality_field, TRUE)
|
||||
final_countdown = FALSE
|
||||
return
|
||||
else if((i % 50) != 0 && i > 50) // A message once every 5 seconds until the final 5 seconds which count down individualy
|
||||
sleep(10)
|
||||
continue
|
||||
else if(i > 50)
|
||||
speaking = "[i/10] seconds remain before causality stabilization."
|
||||
else
|
||||
speaking = "[i/10]..."
|
||||
radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language())
|
||||
sleep(10)
|
||||
|
||||
explode()
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/proc/explode()
|
||||
for(var/mob in GLOB.alive_mob_list)
|
||||
var/mob/living/L = mob
|
||||
if(istype(L) && L.z == z)
|
||||
if(ishuman(mob))
|
||||
//Hilariously enough, running into a closet should make you get hit the hardest.
|
||||
var/mob/living/carbon/human/H = mob
|
||||
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
|
||||
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(L, src) + 1) )
|
||||
L.rad_act(rads)
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.z == z)
|
||||
@@ -251,7 +293,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
E.energy = power
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/process_atmos()
|
||||
/obj/machinery/power/supermatter_crystal/process_atmos()
|
||||
var/turf/T = loc
|
||||
|
||||
if(isnull(T)) // We have a null turf...something is wrong, stop processing this entity.
|
||||
@@ -282,7 +324,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
else
|
||||
if(takes_damage)
|
||||
//causing damage
|
||||
damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
damage = max(damage + (max(CLAMP(removed.total_moles() / 200, 0.5, 1) * removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
|
||||
@@ -427,21 +469,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
radio.talk_into(src, "Warning: Critical coolant mass reached.", engineering_channel, get_spans(), get_default_language())
|
||||
|
||||
if(damage > explosion_point)
|
||||
for(var/mob in GLOB.alive_mob_list)
|
||||
var/mob/living/L = mob
|
||||
if(istype(L) && L.z == z)
|
||||
if(ishuman(mob))
|
||||
//Hilariously enough, running into a closet should make you get hit the hardest.
|
||||
var/mob/living/carbon/human/H = mob
|
||||
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
|
||||
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(L, src) + 1) )
|
||||
L.rad_act(rads)
|
||||
|
||||
explode()
|
||||
countdown()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/power/supermatter_shard/bullet_act(obj/item/projectile/Proj)
|
||||
/obj/machinery/power/supermatter_crystal/bullet_act(obj/item/projectile/Proj)
|
||||
var/turf/L = loc
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
@@ -457,7 +489,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
damage += Proj.damage * config_bullet_energy
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/singularity_act()
|
||||
/obj/machinery/power/supermatter_crystal/singularity_act()
|
||||
var/gain = 100
|
||||
investigate_log("Supermatter shard consumed by singularity.", INVESTIGATE_SINGULO)
|
||||
message_admins("Singularity has consumed a supermatter shard and can now become stage six.")
|
||||
@@ -469,7 +501,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
qdel(src)
|
||||
return gain
|
||||
|
||||
/obj/machinery/power/supermatter_shard/blob_act(obj/structure/blob/B)
|
||||
/obj/machinery/power/supermatter_crystal/blob_act(obj/structure/blob/B)
|
||||
if(B && !isspaceturf(loc)) //does nothing in space
|
||||
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
|
||||
damage += B.obj_integrity * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us
|
||||
@@ -482,20 +514,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
"<span class='italics'>You hear a loud crack as you are washed with a wave of heat.</span>")
|
||||
Consume(B)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_tk(mob/user)
|
||||
/obj/machinery/power/supermatter_crystal/attack_tk(mob/user)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
to_chat(C, "<span class='userdanger'>That was a really dumb idea.</span>")
|
||||
var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD)
|
||||
rip_u.dismember(BURN) //nice try jedi
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_paw(mob/user)
|
||||
/obj/machinery/power/supermatter_crystal/attack_paw(mob/user)
|
||||
dust_mob(user, cause = "monkey attack")
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_alien(mob/user)
|
||||
/obj/machinery/power/supermatter_crystal/attack_alien(mob/user)
|
||||
dust_mob(user, cause = "alien attack")
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_animal(mob/living/simple_animal/S)
|
||||
/obj/machinery/power/supermatter_crystal/attack_animal(mob/living/simple_animal/S)
|
||||
var/murder
|
||||
if(!S.melee_damage_upper && !S.melee_damage_lower)
|
||||
murder = S.friendly
|
||||
@@ -506,20 +538,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
"<span class='userdanger'>You unwisely touch [src], and your vision glows brightly as your body crumbles to dust. Oops.</span>", \
|
||||
"simple animal attack")
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_robot(mob/user)
|
||||
/obj/machinery/power/supermatter_crystal/attack_robot(mob/user)
|
||||
if(Adjacent(user))
|
||||
dust_mob(user, cause = "cyborg attack")
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_ai(mob/user)
|
||||
/obj/machinery/power/supermatter_crystal/attack_ai(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attack_hand(mob/living/user)
|
||||
/obj/machinery/power/supermatter_crystal/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
dust_mob(user, cause = "hand")
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/dust_mob(mob/living/nom, vis_msg, mob_msg, cause)
|
||||
/obj/machinery/power/supermatter_crystal/proc/dust_mob(mob/living/nom, vis_msg, mob_msg, cause)
|
||||
if(nom.incorporeal_move || nom.status_flags & GODMODE)
|
||||
return
|
||||
if(!vis_msg)
|
||||
@@ -533,7 +565,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
|
||||
Consume(nom)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attackby(obj/item/W, mob/living/user, params)
|
||||
/obj/machinery/power/supermatter_crystal/attackby(obj/item/W, mob/living/user, params)
|
||||
if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user))
|
||||
return
|
||||
if (istype(W, /obj/item/melee/roastingstick))
|
||||
@@ -554,12 +586,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
radiation_pulse(src, 150, 4)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/wrench_act(mob/user, obj/item/tool)
|
||||
/obj/machinery/power/supermatter_crystal/wrench_act(mob/user, obj/item/tool)
|
||||
if (moveable)
|
||||
default_unfasten_wrench(user, tool, time = 20)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/CollidedWith(atom/movable/AM)
|
||||
/obj/machinery/power/supermatter_crystal/CollidedWith(atom/movable/AM)
|
||||
if(isliving(AM))
|
||||
AM.visible_message("<span class='danger'>\The [AM] slams into \the [src] inducing a resonance... [AM.p_their()] body starts to glow and catch flame before flashing into ash.</span>",\
|
||||
"<span class='userdanger'>You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"</span>",\
|
||||
@@ -574,7 +606,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
Consume(AM)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM)
|
||||
/obj/machinery/power/supermatter_crystal/proc/Consume(atom/movable/AM)
|
||||
if(isliving(AM))
|
||||
var/mob/living/user = AM
|
||||
if(user.status_flags & GODMODE)
|
||||
@@ -602,30 +634,30 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
else
|
||||
L.show_message("<span class='italics'>You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.</span>", 2)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/engine
|
||||
/obj/machinery/power/supermatter_crystal/engine
|
||||
is_main_engine = TRUE
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/shard
|
||||
name = "supermatter shard"
|
||||
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure."
|
||||
base_icon_state = "darkmatter_shard"
|
||||
icon_state = "darkmatter_shard"
|
||||
anchored = FALSE
|
||||
gasefficency = 0.125
|
||||
explosion_power = 12
|
||||
moveable = TRUE
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/shard/engine
|
||||
is_main_engine = TRUE
|
||||
|
||||
// When you wanna make a supermatter shard for the dramatic effect, but
|
||||
// don't want it exploding suddenly
|
||||
/obj/machinery/power/supermatter_shard/hugbox
|
||||
/obj/machinery/power/supermatter_crystal/shard/hugbox
|
||||
takes_damage = FALSE
|
||||
produces_gas = FALSE
|
||||
moveable = FALSE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/crystal
|
||||
name = "supermatter crystal"
|
||||
desc = "A strangely translucent and iridescent crystal."
|
||||
base_icon_state = "darkmatter"
|
||||
icon_state = "darkmatter"
|
||||
anchored = TRUE
|
||||
gasefficency = 0.15
|
||||
explosion_power = 35
|
||||
moveable = FALSE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/crystal/engine
|
||||
is_main_engine = TRUE
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/supermatter_pull(turf/center, pull_range = 10)
|
||||
/obj/machinery/power/supermatter_crystal/proc/supermatter_pull(turf/center, pull_range = 10)
|
||||
playsound(src.loc, 'sound/weapons/marauder.ogg', 100, 1, extrarange = 7)
|
||||
for(var/atom/P in orange(pull_range,center))
|
||||
if(ismovableatom(P))
|
||||
@@ -639,7 +671,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
step_towards(pulled_object,center)
|
||||
step_towards(pulled_object,center)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/supermatter_anomaly_gen(turf/anomalycenter, type = FLUX_ANOMALY, anomalyrange = 5)
|
||||
/obj/machinery/power/supermatter_crystal/proc/supermatter_anomaly_gen(turf/anomalycenter, type = FLUX_ANOMALY, anomalyrange = 5)
|
||||
var/turf/L = pick(orange(anomalyrange, anomalycenter))
|
||||
if(L)
|
||||
switch(type)
|
||||
@@ -651,7 +683,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
if(PYRO_ANOMALY)
|
||||
new /obj/effect/anomaly/pyro(L, 200)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/supermatter_zap(atom/zapstart, range = 3, power)
|
||||
/obj/machinery/power/supermatter_crystal/proc/supermatter_zap(atom/zapstart, range = 3, power)
|
||||
. = zapstart.dir
|
||||
if(power < 1000)
|
||||
return
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
//This is a power switch. When turned on it looks at the cables around the tile that it's on and notes which cables are trying to connect to it.
|
||||
//After it knows this it creates the number of cables from the center to each of the cables attempting to conenct. These cables cannot be removed
|
||||
//with wirecutters. When the switch is turned off it removes all the cables on the tile it's on.
|
||||
//The switch uses a 5s delay to prevent powernet change spamming.
|
||||
/*
|
||||
/obj/structure/powerswitch
|
||||
name = "power switch"
|
||||
desc = "A switch that controls power."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "switch-dbl-up"
|
||||
var/icon_state_on = "switch-dbl-down"
|
||||
var/icon_state_off = "switch-dbl-up"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
var/on = FALSE //up is off, down is on
|
||||
var/busy = FALSE //set to 1 when you start pulling
|
||||
|
||||
/obj/structure/powerswitch/simple
|
||||
icon_state = "switch-up"
|
||||
icon_state_on = "switch-down"
|
||||
icon_state_off = "switch-up"
|
||||
|
||||
|
||||
/obj/structure/powerswitch/examine(mob/user)
|
||||
..()
|
||||
if(on)
|
||||
to_chat(user, "The switch is in the on position")
|
||||
else
|
||||
to_chat(user, "The switch is in the off position")
|
||||
|
||||
/obj/structure/powerswitch/attack_ai(mob/user)
|
||||
to_chat(user, "\red You're an AI. This is a manual switch. It's not going to work.")
|
||||
return
|
||||
|
||||
/obj/structure/powerswitch/attack_hand(mob/user)
|
||||
|
||||
if(busy)
|
||||
to_chat(user, "\red This switch is already being toggled.")
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
busy = TRUE
|
||||
for(var/mob/O in viewers(user))
|
||||
O.show_message(text("\red [user] started pulling the [src]."), 1)
|
||||
|
||||
if(do_after(user, 50))
|
||||
set_state(!on)
|
||||
for(var/mob/O in viewers(user))
|
||||
O.show_message(text("\red [user] flipped the [src] into the [on ? "on": "off"] position."), 1)
|
||||
busy = FALSE
|
||||
|
||||
/obj/structure/powerswitch/proc/set_state(var/state)
|
||||
on = state
|
||||
if(on)
|
||||
icon_state = icon_state_on
|
||||
var/list/connection_dirs = list()
|
||||
for(var/direction in list(1,2,4,8,5,6,9,10))
|
||||
for(var/obj/structure/cable/C in get_step(src,direction))
|
||||
if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180))
|
||||
connection_dirs += direction
|
||||
break
|
||||
|
||||
for(var/direction in connection_dirs)
|
||||
var/obj/structure/cable/C = new/obj/structure/cable(src.loc)
|
||||
C.d1 = 0
|
||||
C.d2 = direction
|
||||
C.icon_state = "[C.d1]-[C.d2]"
|
||||
C.power_switch = src
|
||||
|
||||
var/datum/powernet/PN = new()
|
||||
PN.number = powernets.len + 1
|
||||
powernets += PN
|
||||
C.netnum = PN.number
|
||||
PN.cables += C
|
||||
|
||||
C.mergeConnectedNetworks(C.d2)
|
||||
C.mergeConnectedNetworksOnTurf()
|
||||
|
||||
else
|
||||
icon_state = icon_state_off
|
||||
for(var/obj/structure/cable/C in src.loc)
|
||||
qdel(C)
|
||||
*/
|
||||
@@ -2,11 +2,11 @@
|
||||
//All based on clusterMin and clusterMax as guides
|
||||
|
||||
//Individual defines
|
||||
#define CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
|
||||
#define CLUSTER_CHECK_DIFFERENT_TURFS 2 //Don't let turfs of DIFFERENT types cluster
|
||||
#define CLUSTER_CHECK_DIFFERENT_ATOMS 4 //Don't let atoms of DIFFERENT types cluster
|
||||
#define CLUSTER_CHECK_SAME_TURFS 8 //Don't let turfs of the SAME type cluster
|
||||
#define CLUSTER_CHECK_SAME_ATOMS 16 //Don't let atoms of the SAME type cluster
|
||||
#define CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
|
||||
#define CLUSTER_CHECK_DIFFERENT_TURFS (1<<1) //Don't let turfs of DIFFERENT types cluster
|
||||
#define CLUSTER_CHECK_DIFFERENT_ATOMS (1<<2) //Don't let atoms of DIFFERENT types cluster
|
||||
#define CLUSTER_CHECK_SAME_TURFS (1<<3) //Don't let turfs of the SAME type cluster
|
||||
#define CLUSTER_CHECK_SAME_ATOMS (1<<4) //Don't let atoms of the SAME type cluster
|
||||
|
||||
//Combined defines
|
||||
#define CLUSTER_CHECK_SAMES 24 //Don't let any of the same type cluster
|
||||
@@ -197,4 +197,3 @@
|
||||
to_chat(src, "Generating Region")
|
||||
N.generate()
|
||||
to_chat(src, "Generated Region")
|
||||
|
||||
|
||||
@@ -244,11 +244,10 @@
|
||||
..()
|
||||
|
||||
/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
return
|
||||
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
|
||||
return install(H, usr)
|
||||
. = ..()
|
||||
if (.)
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
|
||||
return install(H, usr)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
|
||||
. = TRUE
|
||||
@@ -281,10 +280,18 @@
|
||||
to_chat(user, "<span class='notice'>You don't have room(<b>[KA.get_remaining_mod_capacity()]%</b> remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.</span>")
|
||||
. = FALSE
|
||||
|
||||
/obj/item/borg/upgrade/modkit/deactivate(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if (.)
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA in R.module.modules)
|
||||
uninstall(KA)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA)
|
||||
forceMove(get_turf(KA))
|
||||
KA.modkits -= src
|
||||
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
|
||||
|
||||
//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
cached_reagents = null
|
||||
if(my_atom && my_atom.reagents == src)
|
||||
my_atom.reagents = null
|
||||
|
||||
my_atom = null
|
||||
|
||||
// Used in attack logs for reagents in pills and such
|
||||
/datum/reagents/proc/log_list()
|
||||
|
||||
@@ -144,9 +144,9 @@
|
||||
|
||||
data["isPillBottleLoaded"] = bottle ? 1 : 0
|
||||
if(bottle)
|
||||
GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle)
|
||||
data["pillBotContent"] = bottle.contents.len
|
||||
data["pillBotMaxContent"] = bottle.storage_slots
|
||||
|
||||
data["pillBotMaxContent"] = STRB.max_items
|
||||
|
||||
var/beakerContents[0]
|
||||
if(beaker)
|
||||
@@ -160,7 +160,6 @@
|
||||
bufferContents.Add(list(list("name" = N.name, "id" = N.id, "volume" = N.volume))) // ^
|
||||
data["bufferContents"] = bufferContents
|
||||
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/chem_master/ui_act(action, params)
|
||||
@@ -222,12 +221,18 @@
|
||||
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr)))
|
||||
return
|
||||
var/obj/item/reagent_containers/pill/P
|
||||
var/target_loc = drop_location()
|
||||
var/drop_threshold = INFINITY
|
||||
if(bottle)
|
||||
GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle)
|
||||
if(STRB)
|
||||
drop_threshold = STRB.max_items - bottle.contents.len
|
||||
|
||||
for(var/i = 0; i < amount; i++)
|
||||
if(bottle && bottle.contents.len < bottle.storage_slots)
|
||||
P = new/obj/item/reagent_containers/pill(bottle)
|
||||
if(i < drop_threshold)
|
||||
P = new(target_loc)
|
||||
else
|
||||
P = new/obj/item/reagent_containers/pill(drop_location())
|
||||
P = new(drop_location())
|
||||
P.name = trim("[name] pill")
|
||||
adjust_item_drop_location(P)
|
||||
reagents.trans_to(P,vol_each)
|
||||
@@ -303,7 +308,7 @@
|
||||
reagents.trans_to(P, vol_part)
|
||||
. = TRUE
|
||||
//CITADEL ADD Hypospray Vials
|
||||
if("createvial")
|
||||
if("createVial")
|
||||
var/many = params["many"]
|
||||
if(reagents.total_volume == 0)
|
||||
return
|
||||
@@ -314,21 +319,21 @@
|
||||
amount_full = round(reagents.total_volume / 30)
|
||||
vol_part = reagents.total_volume % 30
|
||||
var/name = stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
|
||||
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
|
||||
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr)))
|
||||
return
|
||||
|
||||
var/obj/item/reagent_containers/glass/bottle/vial/small/V
|
||||
var/obj/item/reagent_containers/glass/bottle/vial/small/P
|
||||
for(var/i = 0; i < amount_full; i++)
|
||||
V = new/obj/item/reagent_containers/glass/bottle/vial/small(drop_location())
|
||||
V.name = trim("[name] hypovial")
|
||||
adjust_item_drop_location(V)
|
||||
reagents.trans_to(V, 30)
|
||||
P = new/obj/item/reagent_containers/glass/bottle/vial/small(drop_location())
|
||||
P.name = trim("[name] hypovial")
|
||||
adjust_item_drop_location(P)
|
||||
reagents.trans_to(P, 30)
|
||||
|
||||
if(vol_part)
|
||||
V = new/obj/item/reagent_containers/glass/bottle/vial/small(drop_location())
|
||||
V.name = trim("[name] hypovial")
|
||||
adjust_item_drop_location(V)
|
||||
reagents.trans_to(V, vol_part)
|
||||
P = new/obj/item/reagent_containers/glass/bottle/vial/small(drop_location())
|
||||
P.name = trim("[name] hypovial")
|
||||
adjust_item_drop_location(P)
|
||||
reagents.trans_to(P, vol_part)
|
||||
. = TRUE
|
||||
//END CITADEL ADDITIONS
|
||||
if("analyze")
|
||||
|
||||
@@ -101,16 +101,14 @@
|
||||
|
||||
//Fill machine with a bag!
|
||||
if(istype(I, /obj/item/storage/bag))
|
||||
var/obj/item/storage/bag/B = I
|
||||
for (var/obj/item/reagent_containers/food/snacks/grown/G in B.contents)
|
||||
B.remove_from_storage(G, src)
|
||||
holdingitems[G] = TRUE
|
||||
if(length(holdingitems) >= limit) //Sanity checking so the blender doesn't overfill
|
||||
var/list/inserted = list()
|
||||
if(I.SendSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/grown, src, limit - length(holdingitems), null, null, user, inserted))
|
||||
for(var/i in inserted)
|
||||
holdingitems[i] = TRUE
|
||||
if(!I.contents.len)
|
||||
to_chat(user, "<span class='notice'>You empty [I] into [src].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You fill [src] to the brim.</span>")
|
||||
break
|
||||
|
||||
if(!I.contents.len)
|
||||
to_chat(user, "<span class='notice'>You empty [I] into [src].</span>")
|
||||
|
||||
updateUsrDialog()
|
||||
return TRUE
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
#define SOLID 1
|
||||
#define LIQUID 2
|
||||
#define GAS 3
|
||||
|
||||
#define REM REAGENTS_EFFECT_MULTIPLIER
|
||||
|
||||
//Various reagents
|
||||
|
||||
@@ -615,6 +615,7 @@
|
||||
to_chat(M, "<span class = 'warning'>Your eyes sting!</span>")
|
||||
M.blind_eyes(2)
|
||||
|
||||
|
||||
/datum/reagent/consumable/nutriment/stabilized
|
||||
name = "Stabilized Nutriment"
|
||||
id = "stabilizednutriment"
|
||||
@@ -627,7 +628,7 @@
|
||||
if(M.nutrition > NUTRITION_LEVEL_FULL - 25)
|
||||
M.nutrition -= 3*nutriment_factor
|
||||
..()
|
||||
|
||||
|
||||
////Lavaland Flora Reagents////
|
||||
|
||||
|
||||
|
||||
@@ -587,7 +587,7 @@
|
||||
..()
|
||||
if(!istype(H))
|
||||
return
|
||||
if(!H.dna || !H.dna.species || !(H.dna.species.species_traits & SPECIES_ORGANIC))
|
||||
if(!H.dna || !H.dna.species || !(MOB_ORGANIC in H.mob_biotypes))
|
||||
return
|
||||
|
||||
if(isjellyperson(H))
|
||||
@@ -1472,7 +1472,7 @@
|
||||
/datum/reagent/carpet/reaction_turf(turf/T, reac_volume)
|
||||
if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel))
|
||||
var/turf/open/floor/F = T
|
||||
F.ChangeTurf(/turf/open/floor/carpet)
|
||||
F.PlaceOnTop(/turf/open/floor/carpet)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1817,12 +1817,6 @@
|
||||
L.remove_trait(TRAIT_PACIFISM, id)
|
||||
..()
|
||||
|
||||
/datum/reagent/pax/borg
|
||||
name = "synth-pax"
|
||||
id = "synthpax"
|
||||
description = "A colorless liquid that suppresses violence on the subjects. Cheaper to synthetize, but wears out faster than normal Pax."
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/bz_metabolites
|
||||
name = "BZ metabolites"
|
||||
id = "bz_metabolites"
|
||||
@@ -1845,3 +1839,40 @@
|
||||
if(changeling)
|
||||
changeling.chem_charges = max(changeling.chem_charges-2, 0)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/pax/peaceborg
|
||||
name = "synth-pax"
|
||||
id = "synthpax"
|
||||
description = "A colorless liquid that suppresses violence on the subjects. Cheaper to synthetize, but wears out faster than normal Pax."
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/peaceborg/confuse
|
||||
name = "Dizzying Solution"
|
||||
id = "dizzysolution"
|
||||
description = "Makes the target off balance and dizzy"
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
taste_description = "dizziness"
|
||||
|
||||
/datum/reagent/peaceborg/confuse/on_mob_life(mob/living/M)
|
||||
if(M.confused < 6)
|
||||
M.confused = CLAMP(M.confused + 3, 0, 5)
|
||||
if(M.dizziness < 6)
|
||||
M.dizziness = CLAMP(M.dizziness + 3, 0, 5)
|
||||
if(prob(20))
|
||||
to_chat(M, "You feel confused and disorientated.")
|
||||
..()
|
||||
|
||||
/datum/reagent/peaceborg/tire
|
||||
name = "Tiring Solution"
|
||||
id = "tiresolution"
|
||||
description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
taste_description = "tiredness"
|
||||
|
||||
/datum/reagent/peaceborg/tire/on_mob_life(mob/living/M)
|
||||
var/healthcomp = (100 - M.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS.
|
||||
if(M.getStaminaLoss() < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.)
|
||||
M.adjustStaminaLoss(10)
|
||||
if(prob(30))
|
||||
to_chat(M, "You should sit down and take a rest...")
|
||||
..()
|
||||
|
||||
@@ -231,12 +231,10 @@
|
||||
toxpwr = 1
|
||||
|
||||
/datum/reagent/toxin/pestkiller/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(method == VAPOR)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.wear_mask) // If not wearing a mask
|
||||
var/damage = min(round(0.4*reac_volume, 0.1),10)
|
||||
C.adjustToxLoss(damage)
|
||||
..()
|
||||
if(MOB_BUG in M.mob_biotypes)
|
||||
var/damage = min(round(0.4*reac_volume, 0.1),10)
|
||||
M.adjustToxLoss(damage)
|
||||
|
||||
/datum/reagent/toxin/spore
|
||||
name = "Spore Toxin"
|
||||
@@ -847,39 +845,6 @@
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/peaceborg/confuse
|
||||
name = "Dizzying Solution"
|
||||
id = "dizzysolution"
|
||||
description = "Makes the target off balance and dizzy"
|
||||
toxpwr = 0
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
taste_description = "dizziness"
|
||||
|
||||
/datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M)
|
||||
if(M.confused < 6)
|
||||
M.confused = CLAMP(M.confused + 3, 0, 5)
|
||||
if(M.dizziness < 6)
|
||||
M.dizziness = CLAMP(M.dizziness + 3, 0, 5)
|
||||
if(prob(20))
|
||||
to_chat(M, "You feel confused and disorientated.")
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/peaceborg/tire
|
||||
name = "Tiring Solution"
|
||||
id = "tiresolution"
|
||||
description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
|
||||
toxpwr = 0
|
||||
metabolization_rate = 1.5 * REAGENTS_METABOLISM
|
||||
taste_description = "tiredness"
|
||||
|
||||
/datum/reagent/toxin/peaceborg/tire/on_mob_life(mob/living/M)
|
||||
var/healthcomp = (100 - M.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS.
|
||||
if(M.getStaminaLoss() < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.)
|
||||
M.adjustStaminaLoss(10)
|
||||
if(prob(30))
|
||||
to_chat(M, "You should sit down and take a rest...")
|
||||
..()
|
||||
|
||||
/datum/reagent/toxin/delayed
|
||||
name = "Toxin Microcapsules"
|
||||
id = "delayed_toxin"
|
||||
|
||||
@@ -67,6 +67,21 @@ Borg Hypospray
|
||||
|
||||
modes[reagent] = modes.len + 1
|
||||
|
||||
/obj/item/reagent_containers/borghypo/proc/del_reagent(reagent)
|
||||
reagent_ids -= reagent
|
||||
var/datum/reagents/RG
|
||||
var/datum/reagents/TRG
|
||||
for(var/i in 1 to reagent_ids.len)
|
||||
TRG = reagent_list[i]
|
||||
if (TRG.has_reagent(reagent))
|
||||
RG = TRG
|
||||
break
|
||||
if (RG)
|
||||
reagent_list -= RG
|
||||
RG.del_reagent(reagent)
|
||||
|
||||
modes[reagent] = modes.len - 1
|
||||
|
||||
/obj/item/reagent_containers/borghypo/proc/regenerate_reagents()
|
||||
if(iscyborg(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
|
||||
@@ -5,12 +5,12 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
|
||||
/obj/machinery/conveyor
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "conveyor0"
|
||||
icon_state = "conveyor_map"
|
||||
name = "conveyor belt"
|
||||
desc = "A conveyor belt."
|
||||
anchored = TRUE
|
||||
layer = BELOW_OPEN_DOOR_LAYER
|
||||
var/operating = FALSE // 1 if running forward, -1 if backwards, 0 if off
|
||||
var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off
|
||||
var/operable = 1 // true if can operate (no broken segments in this belt run)
|
||||
var/forwards // this is the default (forward) direction, set by the map dir
|
||||
var/backwards // hopefully self-explanatory
|
||||
@@ -18,13 +18,22 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
|
||||
var/list/affecting // the list of all items that will be moved this ptick
|
||||
var/id = "" // the control ID - must match controller ID
|
||||
var/verted = 1 // set to -1 to have the conveyour belt be inverted, so you can use the other corner icons
|
||||
var/verted = 1 // Inverts the direction the conveyor belt moves.
|
||||
speed_process = TRUE
|
||||
|
||||
/obj/machinery/conveyor/centcom_auto
|
||||
id = "round_end_belt"
|
||||
|
||||
|
||||
/obj/machinery/conveyor/inverted //Directions inverted so you can use different corner peices.
|
||||
icon_state = "conveyor_map_inverted"
|
||||
verted = -1
|
||||
|
||||
/obj/machinery/conveyor/inverted/Initialize(mapload)
|
||||
. = ..()
|
||||
if(mapload && !(dir in GLOB.diagonals))
|
||||
log_game("### MAPPING ERROR: [src] at [COORD(src)] spawned without using a diagonal dir. Please replace with a normal version.")
|
||||
|
||||
// Auto conveyour is always on unless unpowered
|
||||
|
||||
/obj/machinery/conveyor/auto/Initialize(mapload, newdir)
|
||||
@@ -214,7 +223,8 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
var/position = 0 // 0 off, -1 reverse, 1 forward
|
||||
var/last_pos = -1 // last direction setting
|
||||
var/operated = 1 // true if just operated
|
||||
var/convdir = 0 // 0 is two way switch, 1 and -1 means one way
|
||||
var/oneway = FALSE // if the switch only operates the conveyor belts in a single direction.
|
||||
var/invert_icon = FALSE // If the level points the opposite direction when it's turned on.
|
||||
|
||||
var/id = "" // must match conveyor IDs to control them
|
||||
|
||||
@@ -247,9 +257,15 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
|
||||
/obj/machinery/conveyor_switch/update_icon()
|
||||
if(position<0)
|
||||
icon_state = "switch-rev"
|
||||
if(invert_icon)
|
||||
icon_state = "switch-fwd"
|
||||
else
|
||||
icon_state = "switch-rev"
|
||||
else if(position>0)
|
||||
icon_state = "switch-fwd"
|
||||
if(invert_icon)
|
||||
icon_state = "switch-rev"
|
||||
else
|
||||
icon_state = "switch-fwd"
|
||||
else
|
||||
icon_state = "switch-off"
|
||||
|
||||
@@ -271,8 +287,8 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
/obj/machinery/conveyor_switch/interact(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(position == 0)
|
||||
if(convdir) //is it a oneway switch
|
||||
position = convdir
|
||||
if(oneway) //is it a oneway switch
|
||||
position = oneway
|
||||
else
|
||||
if(last_pos < 0)
|
||||
position = 1
|
||||
@@ -289,6 +305,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
|
||||
// find any switches with same id as this one, and set their positions to match us
|
||||
for(var/obj/machinery/conveyor_switch/S in GLOB.conveyors_by_id[id])
|
||||
S.invert_icon = invert_icon
|
||||
S.position = position
|
||||
S.update_icon()
|
||||
CHECK_TICK
|
||||
@@ -302,8 +319,14 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/conveyor_switch/oneway
|
||||
convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.)
|
||||
icon_state = "conveyor_switch_oneway"
|
||||
desc = "A conveyor control switch. It appears to only go in one direction."
|
||||
oneway = TRUE
|
||||
|
||||
/obj/machinery/conveyor_switch/oneway/Initialize()
|
||||
. = ..()
|
||||
if((dir == NORTH) || (dir == WEST))
|
||||
invert_icon = TRUE
|
||||
|
||||
//
|
||||
// CONVEYOR CONSTRUCTION STARTS HERE
|
||||
|
||||
@@ -246,13 +246,16 @@
|
||||
return src
|
||||
|
||||
//How disposal handles getting a storage dump from a storage object
|
||||
/obj/machinery/disposal/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
|
||||
/obj/machinery/disposal/storage_contents_dump_act(datum/component/storage/src_object, mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
for(var/obj/item/I in src_object)
|
||||
if(user.s_active != src_object)
|
||||
if(user.active_storage != src_object)
|
||||
if(I.on_found(user))
|
||||
return
|
||||
src_object.remove_from_storage(I, src)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
// Disposal bin
|
||||
// Holds items for disposal into pipe system
|
||||
@@ -268,11 +271,12 @@
|
||||
|
||||
// attack by item places it in to disposal
|
||||
/obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/storage/bag/trash))
|
||||
if(istype(I, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type.
|
||||
var/obj/item/storage/bag/trash/T = I
|
||||
GET_COMPONENT_FROM(STR, /datum/component/storage, T)
|
||||
to_chat(user, "<span class='warning'>You empty the bag.</span>")
|
||||
for(var/obj/item/O in T.contents)
|
||||
T.remove_from_storage(O,src)
|
||||
STR.remove_from_storage(O,src)
|
||||
T.update_icon()
|
||||
update_icon()
|
||||
else
|
||||
@@ -281,7 +285,7 @@
|
||||
// handle machine interaction
|
||||
|
||||
/obj/machinery/disposal/bin/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
GLOBAL_LIST_INIT(message_servers, list())
|
||||
|
||||
/datum/data_pda_msg
|
||||
var/recipient = "Unspecified" //name of the person
|
||||
var/sender = "Unspecified" //name of the sender
|
||||
var/message = "Blank" //transferred message
|
||||
var/icon/photo //Attached photo
|
||||
|
||||
/datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_photo=null)
|
||||
|
||||
if(param_rec)
|
||||
recipient = param_rec
|
||||
if(param_sender)
|
||||
sender = param_sender
|
||||
if(param_message)
|
||||
message = param_message
|
||||
if(param_photo)
|
||||
photo = param_photo
|
||||
|
||||
/datum/data_pda_msg/proc/get_photo_ref()
|
||||
if(photo)
|
||||
return "<a href='byond://?src=[REF(src)];photo=1'>(Photo)</a>"
|
||||
return ""
|
||||
|
||||
/datum/data_pda_msg/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["photo"])
|
||||
var/mob/M = usr
|
||||
M << browse_rsc(photo, "pda_photo.png")
|
||||
M << browse("<html><head><title>PDA Photo</title></head>" \
|
||||
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
|
||||
+ "<img src='pda_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
|
||||
+ "</body></html>", "window=book;size=192x192")
|
||||
onclose(M, "PDA Photo")
|
||||
|
||||
/datum/data_rc_msg
|
||||
var/rec_dpt = "Unspecified" //name of the person
|
||||
var/send_dpt = "Unspecified" //name of the sender
|
||||
var/message = "Blank" //transferred message
|
||||
var/stamp = "Unstamped"
|
||||
var/id_auth = "Unauthenticated"
|
||||
var/priority = "Normal"
|
||||
|
||||
/datum/data_rc_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "",var/param_stamp = "",var/param_id_auth = "",var/param_priority)
|
||||
if(param_rec)
|
||||
rec_dpt = param_rec
|
||||
if(param_sender)
|
||||
send_dpt = param_sender
|
||||
if(param_message)
|
||||
message = param_message
|
||||
if(param_stamp)
|
||||
stamp = param_stamp
|
||||
if(param_id_auth)
|
||||
id_auth = param_id_auth
|
||||
if(param_priority)
|
||||
switch(param_priority)
|
||||
if(1)
|
||||
priority = "Normal"
|
||||
if(2)
|
||||
priority = "High"
|
||||
if(3)
|
||||
priority = "Extreme"
|
||||
else
|
||||
priority = "Undetermined"
|
||||
|
||||
/obj/machinery/message_server
|
||||
icon = 'icons/obj/machines/research.dmi'
|
||||
icon_state = "server"
|
||||
name = "Messaging Server"
|
||||
desc = "A machine that attempts to gather the secret knowledge of the universe."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
|
||||
var/list/datum/data_pda_msg/pda_msgs = list()
|
||||
var/list/datum/data_rc_msg/rc_msgs = list()
|
||||
var/active = 1
|
||||
var/decryptkey = "password"
|
||||
|
||||
/obj/machinery/message_server/Initialize()
|
||||
GLOB.message_servers += src
|
||||
decryptkey = GenerateKey()
|
||||
send_pda_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/message_server/Destroy()
|
||||
GLOB.message_servers -= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/message_server/proc/GenerateKey()
|
||||
//Feel free to move to Helpers.
|
||||
var/newKey
|
||||
newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le")
|
||||
newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai")
|
||||
newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
|
||||
return newKey
|
||||
|
||||
/obj/machinery/message_server/process()
|
||||
if(active && (stat & (BROKEN|NOPOWER)))
|
||||
active = 0
|
||||
return
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/message_server/proc/send_pda_message(recipient = "",sender = "",message = "",photo=null)
|
||||
. = new/datum/data_pda_msg(recipient,sender,message,photo)
|
||||
pda_msgs += .
|
||||
|
||||
/obj/machinery/message_server/proc/send_rc_message(recipient = "",sender = "",message = "",stamp = "", id_auth = "", priority = 1)
|
||||
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
|
||||
|
||||
/obj/machinery/message_server/attack_hand(mob/user)
|
||||
to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]")
|
||||
active = !active
|
||||
update_icon()
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/message_server/update_icon()
|
||||
if((stat & (BROKEN|NOPOWER)))
|
||||
icon_state = "server-nopower"
|
||||
else if (!active)
|
||||
icon_state = "server-off"
|
||||
else
|
||||
icon_state = "server-on"
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/blackbox_recorder
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "blackbox"
|
||||
name = "Blackbox Recorder"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
|
||||
@@ -9,58 +9,18 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
storage_slots = 50
|
||||
use_to_pickup = 1
|
||||
allow_quick_gather = 1
|
||||
allow_quick_empty = 1
|
||||
collection_mode = 1
|
||||
display_contents_with_number = 1
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 100
|
||||
|
||||
can_hold = list(
|
||||
/obj/item/reagent_containers/glass/beaker,
|
||||
/obj/item/device/assembly/igniter,
|
||||
/obj/item/stock_parts,
|
||||
/obj/item/stack/ore/bluespace_crystal)
|
||||
|
||||
var/works_from_distance = 0
|
||||
component_type = /datum/component/storage/concrete/rped
|
||||
var/works_from_distance = FALSE
|
||||
var/pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/rped.ogg'
|
||||
var/alt_sound = null
|
||||
|
||||
/obj/item/storage/part_replacer/afterattack(obj/machinery/T, mob/living/carbon/human/user, flag, params)
|
||||
if(flag)
|
||||
return
|
||||
else if(works_from_distance)
|
||||
if(istype(T))
|
||||
if(T.component_parts)
|
||||
T.exchange_parts(user, src)
|
||||
user.Beam(T,icon_state="rped_upgrade",time=5)
|
||||
return
|
||||
|
||||
/obj/item/storage/part_replacer/bluespace
|
||||
name = "bluespace rapid part exchange device"
|
||||
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
|
||||
icon_state = "BS_RPED"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
storage_slots = 400
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 800
|
||||
works_from_distance = 1
|
||||
pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/pshoom.ogg'
|
||||
alt_sound = 'sound/items/pshoom_2.ogg'
|
||||
|
||||
/obj/item/storage/part_replacer/bluespace/dump_content_at(atom/dest_object, mob/user)
|
||||
if(Adjacent(user))
|
||||
var/atom/dumping_location = dest_object.get_dumping_location()
|
||||
if(get_dist(user, dumping_location) < 8)
|
||||
if(dumping_location.storage_contents_dump_act(src, user))
|
||||
play_rped_sound()
|
||||
user.Beam(dumping_location,icon_state="rped_upgrade",time=5)
|
||||
return 1
|
||||
to_chat(user, "The [src.name] buzzes.")
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
return 0
|
||||
if(!istype(T) || !T.component_parts)
|
||||
return ..()
|
||||
if(works_from_distance || user.Adjacent(T))
|
||||
T.exchange_parts(user, src)
|
||||
if(works_from_distance)
|
||||
user.Beam(T, icon_state = "rped_upgrade", time = 5)
|
||||
|
||||
/obj/item/storage/part_replacer/proc/play_rped_sound()
|
||||
//Plays the sound for RPED exhanging or installing parts.
|
||||
@@ -69,6 +29,16 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
else
|
||||
playsound(src, pshoom_or_beepboopblorpzingshadashwoosh, 40, 1)
|
||||
|
||||
/obj/item/storage/part_replacer/bluespace
|
||||
name = "bluespace rapid part exchange device"
|
||||
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
|
||||
icon_state = "BS_RPED"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
works_from_distance = TRUE
|
||||
pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/pshoom.ogg'
|
||||
alt_sound = 'sound/items/pshoom_2.ogg'
|
||||
component_type = /datum/component/storage/concrete/bluespace/rped
|
||||
|
||||
/obj/item/storage/part_replacer/cyborg
|
||||
name = "rapid part exchange device"
|
||||
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
|
||||
@@ -78,8 +48,9 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
|
||||
//Sorts stock parts inside an RPED by their rating.
|
||||
/proc/cmp_rped_sort(obj/item/A, obj/item/B)
|
||||
return A.get_part_rating() - B.get_part_rating()
|
||||
//Only use /obj/item/stock_parts/ with this sort proc!
|
||||
/proc/cmp_rped_sort(obj/item/stock_parts/A, obj/item/stock_parts/B)
|
||||
return B.rating - A.rating
|
||||
|
||||
/obj/item/stock_parts
|
||||
name = "stock part"
|
||||
@@ -95,6 +66,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
|
||||
/obj/item/stock_parts/get_part_rating()
|
||||
return rating
|
||||
|
||||
//Rating 1
|
||||
|
||||
/obj/item/stock_parts/capacitor
|
||||
|
||||
@@ -18,22 +18,16 @@ Reproductive extracts:
|
||||
to_chat(user, "<span class='warning'>[src] is still digesting!</span>")
|
||||
return
|
||||
if(istype(O, /obj/item/storage/bag/bio))
|
||||
var/obj/item/storage/P = O
|
||||
var/obj/item/reagent_containers/food/snacks/monkeycube/M
|
||||
for(var/obj/item/X in P.contents)
|
||||
M = X
|
||||
if(M && istype(M))
|
||||
break
|
||||
if(M && istype(M))
|
||||
P.remove_from_storage(M, get_turf(src))
|
||||
attackby(M,user)
|
||||
var/list/inserted = list()
|
||||
O.SendSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted)
|
||||
if(inserted.len)
|
||||
var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1]
|
||||
if(istype(M))
|
||||
eat_cube(M, user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There are no monkey cubes in the bio bag!</span>")
|
||||
if(istype(O,/obj/item/reagent_containers/food/snacks/monkeycube))
|
||||
qdel(O)
|
||||
cubes_eaten++
|
||||
to_chat(user, "<span class='notice'>You feed [O] to [src], and it pulses gently.</span>")
|
||||
playsound(src, 'sound/items/eatfood.ogg', 20, 1)
|
||||
eat_cube(O, user)
|
||||
if(cubes_eaten >= 3)
|
||||
var/cores = rand(1,4)
|
||||
visible_message("<span class='notice'>[src] briefly swells to a massive size, and expels [cores] extract[cores > 1 ? "s":""]!</span>")
|
||||
@@ -43,6 +37,12 @@ Reproductive extracts:
|
||||
new extract_type(get_turf(loc))
|
||||
cubes_eaten = 0
|
||||
|
||||
/obj/item/slimecross/reproductive/proc/eat_cube(obj/item/reagent_containers/food/snacks/monkeycube, mob/user)
|
||||
qdel(monkeycube)
|
||||
cubes_eaten++
|
||||
to_chat(user, "<span class='notice'>You feed [monkeycube] to [src], and it pulses gently.</span>")
|
||||
playsound(src, 'sound/items/eatfood.ogg', 20, 1)
|
||||
|
||||
/obj/item/slimecross/reproductive/grey
|
||||
extract_type = /obj/item/slime_extract/grey
|
||||
colour = "grey"
|
||||
|
||||
@@ -22,14 +22,16 @@
|
||||
desc = "A computer used for remotely handling slimes."
|
||||
networks = list("ss13")
|
||||
circuit = /obj/item/circuitboard/computer/xenobiology
|
||||
var/datum/action/innate/slime_place/slime_place_action = new
|
||||
var/datum/action/innate/slime_pick_up/slime_up_action = new
|
||||
var/datum/action/innate/feed_slime/feed_slime_action = new
|
||||
var/datum/action/innate/monkey_recycle/monkey_recycle_action = new
|
||||
var/datum/action/innate/slime_scan/scan_action = new
|
||||
var/datum/action/innate/feed_potion/potion_action = new
|
||||
var/datum/action/innate/slime_place/slime_place_action
|
||||
var/datum/action/innate/slime_pick_up/slime_up_action
|
||||
var/datum/action/innate/feed_slime/feed_slime_action
|
||||
var/datum/action/innate/monkey_recycle/monkey_recycle_action
|
||||
var/datum/action/innate/slime_scan/scan_action
|
||||
var/datum/action/innate/feed_potion/potion_action
|
||||
|
||||
var/list/stored_slimes = list()
|
||||
var/datum/component/redirect/listener
|
||||
|
||||
var/list/stored_slimes
|
||||
var/obj/item/slimepotion/slime/current_potion
|
||||
var/max_slimes = 5
|
||||
var/monkeys = 0
|
||||
@@ -39,6 +41,26 @@
|
||||
|
||||
light_color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/Initialize()
|
||||
. = ..()
|
||||
slime_place_action = new
|
||||
slime_up_action = new
|
||||
feed_slime_action = new
|
||||
monkey_recycle_action = new
|
||||
scan_action = new
|
||||
potion_action = new
|
||||
stored_slimes = list()
|
||||
listener = AddComponent(/datum/component/redirect, COMSIG_ATOM_CONTENTS_DEL, CALLBACK(src, .proc/on_contents_del))
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
|
||||
stored_slimes = null
|
||||
QDEL_NULL(current_potion)
|
||||
for(var/i in contents)
|
||||
var/mob/living/simple_animal/slime/S = i
|
||||
if(istype(S))
|
||||
S.forceMove(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
|
||||
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
|
||||
eyeobj.origin = src
|
||||
@@ -64,7 +86,7 @@
|
||||
feed_slime_action.Grant(user)
|
||||
actions += feed_slime_action
|
||||
|
||||
if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes remote monkey recycling require XENOBIO_UPGRADE_MONKEYS
|
||||
if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
||||
monkey_recycle_action.target = src
|
||||
monkey_recycle_action.Grant(user)
|
||||
actions += monkey_recycle_action
|
||||
@@ -79,6 +101,12 @@
|
||||
potion_action.Grant(user)
|
||||
actions += potion_action
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
|
||||
if(current_potion == deleted)
|
||||
current_potion = null
|
||||
if(deleted in stored_slimes)
|
||||
stored_slimes -= deleted
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
||||
monkeys++
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
height = 7
|
||||
|
||||
/obj/docking_port/mobile/assault_pod/request()
|
||||
if(z == initial(src.z)) //No launching pods that have already launched
|
||||
if(!(z in SSmapping.levels_by_trait(ZTRAIT_STATION))) //No launching pods that have already launched
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user