@@ -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 ..()
|
||||
|
||||
|
||||
@@ -376,11 +376,11 @@
|
||||
if(GLOB.highlander)
|
||||
to_chat(humanc, "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>")
|
||||
humanc.make_scottish()
|
||||
if(prob(5) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in humanc.client.prefs.be_special)
|
||||
/* if(prob(5) && !issilicon(humanc) && !jobban_isbanned(humanc.mind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in humanc.client.prefs.be_special)
|
||||
SSticker.generate_miscreant_objectives(humanc.mind)
|
||||
else
|
||||
if(CONFIG_GET(flag/allow_crew_objectives))
|
||||
SSticker.generate_individual_objectives(humanc.mind)
|
||||
SSticker.generate_individual_objectives(humanc.mind) */
|
||||
|
||||
if(GLOB.summon_guns_triggered)
|
||||
give_guns(humanc)
|
||||
|
||||
@@ -381,7 +381,7 @@
|
||||
dropItemToGround(I)
|
||||
drop_all_held_items()
|
||||
|
||||
/obj/item/proc/equip_to_best_slot(var/mob/M)
|
||||
/obj/item/proc/equip_to_best_slot(mob/M)
|
||||
if(src != M.get_active_held_item())
|
||||
to_chat(M, "<span class='warning'>You are not holding anything to equip!</span>")
|
||||
return FALSE
|
||||
@@ -393,28 +393,16 @@
|
||||
if(equip_delay_self)
|
||||
return
|
||||
|
||||
if(M.s_active && M.s_active.can_be_inserted(src,1)) //if storage active insert there
|
||||
M.s_active.handle_item_insertion(src)
|
||||
if(M.active_storage && M.active_storage.parent && M.active_storage.parent.SendSignal(COMSIG_TRY_STORAGE_INSERT, src,M))
|
||||
return TRUE
|
||||
|
||||
var/obj/item/storage/S = M.get_inactive_held_item()
|
||||
if(istype(S) && S.can_be_inserted(src,1)) //see if we have box in other hand
|
||||
S.handle_item_insertion(src)
|
||||
return TRUE
|
||||
|
||||
S = M.get_item_by_slot(slot_belt)
|
||||
if(istype(S) && S.can_be_inserted(src,1)) //else we put in belt
|
||||
S.handle_item_insertion(src)
|
||||
return TRUE
|
||||
|
||||
S = M.get_item_by_slot(slot_generic_dextrous_storage) //else we put in whatever is in drone storage
|
||||
if(istype(S) && S.can_be_inserted(src,1))
|
||||
S.handle_item_insertion(src)
|
||||
|
||||
S = M.get_item_by_slot(slot_back) //else we put in backpack
|
||||
if(istype(S) && S.can_be_inserted(src,1))
|
||||
S.handle_item_insertion(src)
|
||||
return TRUE
|
||||
var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(slot_belt), M.get_item_by_slot(slot_generic_dextrous_storage), M.get_item_by_slot(slot_back))
|
||||
for(var/i in possible)
|
||||
if(!i)
|
||||
continue
|
||||
var/obj/item/I = i
|
||||
if(I.SendSignal(COMSIG_TRY_STORAGE_INSERT, src, M))
|
||||
return TRUE
|
||||
|
||||
to_chat(M, "<span class='warning'>You are unable to equip that!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
|
||||
|
||||
|
||||
/mob/living/carbon/alien
|
||||
name = "alien"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
@@ -146,9 +141,5 @@ Des: Removes all infected images from the alien.
|
||||
mind.transfer_to(new_xeno)
|
||||
qdel(src)
|
||||
|
||||
#undef HEAT_DAMAGE_LEVEL_1
|
||||
#undef HEAT_DAMAGE_LEVEL_2
|
||||
#undef HEAT_DAMAGE_LEVEL_3
|
||||
|
||||
/mob/living/carbon/alien/can_hold_items()
|
||||
return has_fine_manipulation
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
pressure_resistance = 25
|
||||
can_buckle = TRUE
|
||||
buckle_lying = FALSE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
//Hair colour and style
|
||||
var/hair_color = "000"
|
||||
var/hair_style = "Bald"
|
||||
|
||||
@@ -2,24 +2,6 @@
|
||||
|
||||
//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick!
|
||||
|
||||
|
||||
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
|
||||
|
||||
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
|
||||
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
|
||||
#define COLD_DAMAGE_LEVEL_3 3 //Amount of damage applied when your body temperature passes the 120K point
|
||||
|
||||
//Note that gas heat damage is only applied once every FOUR ticks.
|
||||
#define HEAT_GAS_DAMAGE_LEVEL_1 2 //Amount of damage applied when the current breath's temperature just passes the 360.15k safety point
|
||||
#define HEAT_GAS_DAMAGE_LEVEL_2 4 //Amount of damage applied when the current breath's temperature passes the 400K point
|
||||
#define HEAT_GAS_DAMAGE_LEVEL_3 8 //Amount of damage applied when the current breath's temperature passes the 1000K point
|
||||
|
||||
#define COLD_GAS_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when the current breath's temperature just passes the 260.15k safety point
|
||||
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
|
||||
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
|
||||
|
||||
// bitflags for the percentual amount of protection a piece of clothing which covers the body part offers.
|
||||
// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection()
|
||||
// The values here should add up to 1.
|
||||
@@ -102,8 +84,7 @@
|
||||
/mob/living/carbon/human/breathe()
|
||||
if(!dna.species.breathe(src))
|
||||
..()
|
||||
#define HUMAN_MAX_OXYLOSS 3
|
||||
#define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30)
|
||||
|
||||
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
|
||||
|
||||
var/L = getorganslot(ORGAN_SLOT_LUNGS)
|
||||
@@ -133,9 +114,6 @@
|
||||
var/obj/item/organ/lungs/lun = L
|
||||
lun.check_breath(breath,src)
|
||||
|
||||
#undef HUMAN_MAX_OXYLOSS
|
||||
#undef HUMAN_CRIT_MAX_OXYLOSS
|
||||
|
||||
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
|
||||
dna.species.handle_environment(environment, src)
|
||||
|
||||
@@ -147,12 +125,12 @@
|
||||
|
||||
/mob/living/carbon/human/proc/get_thermal_protection()
|
||||
var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures
|
||||
//CITADEL EDIT Vore code required overrides
|
||||
//CITADEL EDIT Vore code required overrides
|
||||
if(istype(loc, /obj/item/device/dogborg/sleeper))
|
||||
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
if(ismob(loc))
|
||||
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
if(istype(loc, /obj/belly))
|
||||
if(isbelly(loc))
|
||||
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
//END EDIT
|
||||
if(wear_suit)
|
||||
@@ -262,16 +240,14 @@
|
||||
/mob/living/carbon/human/proc/get_cold_protection(temperature)
|
||||
if(has_trait(TRAIT_RESISTCOLD))
|
||||
return TRUE
|
||||
|
||||
//CITADEL EDIT Mandatory for vore code.
|
||||
if(istype(loc, /obj/item/device/dogborg/sleeper))
|
||||
return 1 //freezing to death in sleepers ruins fun.
|
||||
if(istype(loc, /obj/belly))
|
||||
return 1
|
||||
return TRUE //freezing to death in sleepers ruins fun.
|
||||
if(isbelly(loc))
|
||||
return TRUE
|
||||
if(ismob(loc))
|
||||
return 1 //because lazy and being inside somemone insulates you from space
|
||||
return TRUE //because lazy and being inside somemone insulates you from space
|
||||
//END EDIT
|
||||
|
||||
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
|
||||
var/thermal_protection_flags = get_cold_protection_flags(temperature)
|
||||
|
||||
@@ -458,7 +434,6 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
if(drunkenness >= 101)
|
||||
adjustToxLoss(4) //Let's be honest you shouldn't be alive by now
|
||||
|
||||
#undef HUMAN_MAX_OXYLOSS
|
||||
#undef THERMAL_PROTECTION_HEAD
|
||||
#undef THERMAL_PROTECTION_CHEST
|
||||
#undef THERMAL_PROTECTION_GROIN
|
||||
|
||||
@@ -2,14 +2,6 @@
|
||||
|
||||
GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
#define HEAT_DAMAGE_LEVEL_1 2
|
||||
#define HEAT_DAMAGE_LEVEL_2 3
|
||||
#define HEAT_DAMAGE_LEVEL_3 8
|
||||
|
||||
#define COLD_DAMAGE_LEVEL_1 0.5
|
||||
#define COLD_DAMAGE_LEVEL_2 1.5
|
||||
#define COLD_DAMAGE_LEVEL_3 3
|
||||
|
||||
/datum/species
|
||||
var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this
|
||||
var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans.
|
||||
@@ -57,6 +49,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/list/species_traits = list()
|
||||
// generic traits tied to having the species
|
||||
var/list/inherent_traits = list()
|
||||
var/list/inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
|
||||
var/attack_verb = "punch" // punch-specific attack verb
|
||||
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
|
||||
@@ -269,6 +262,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(DIGITIGRADE in species_traits)
|
||||
C.Digitigrade_Leg_Swap(FALSE)
|
||||
|
||||
C.mob_biotypes = inherent_biotypes
|
||||
regenerate_organs(C,old_species)
|
||||
|
||||
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
|
||||
@@ -864,7 +858,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
/datum/species/proc/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self = FALSE)
|
||||
if(slot in no_equip)
|
||||
if(!I.species_exception || !is_type_in_list(src, I.species_exception))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/num_arms = H.get_num_arms()
|
||||
var/num_legs = H.get_num_legs()
|
||||
@@ -876,181 +870,180 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
return FALSE
|
||||
if(slot_wear_mask)
|
||||
if(H.wear_mask)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_MASK) )
|
||||
return 0
|
||||
return FALSE
|
||||
if(!(I.slot_flags & SLOT_MASK))
|
||||
return FALSE
|
||||
if(!H.get_bodypart(BODY_ZONE_HEAD))
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_neck)
|
||||
if(H.wear_neck)
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_NECK) )
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(slot_back)
|
||||
if(H.back)
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_BACK) )
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_wear_suit)
|
||||
if(H.wear_suit)
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_OCLOTHING) )
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_gloves)
|
||||
if(H.gloves)
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_GLOVES) )
|
||||
return 0
|
||||
return FALSE
|
||||
if(num_arms < 2)
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_shoes)
|
||||
if(H.shoes)
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_FEET) )
|
||||
return 0
|
||||
return FALSE
|
||||
if(num_legs < 2)
|
||||
return 0
|
||||
return FALSE
|
||||
if(DIGITIGRADE in species_traits)
|
||||
if(!disable_warning)
|
||||
to_chat(H, "<span class='warning'>The footwear around here isn't compatible with your feet!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_belt)
|
||||
if(H.belt)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
|
||||
|
||||
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
|
||||
if(!disable_warning)
|
||||
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_BELT) )
|
||||
return FALSE
|
||||
if(!(I.slot_flags & SLOT_BELT))
|
||||
return
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_glasses)
|
||||
if(H.glasses)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_EYES) )
|
||||
return 0
|
||||
return FALSE
|
||||
if(!(I.slot_flags & SLOT_EYES))
|
||||
return FALSE
|
||||
if(!H.get_bodypart(BODY_ZONE_HEAD))
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_head)
|
||||
if(H.head)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_HEAD) )
|
||||
return 0
|
||||
return FALSE
|
||||
if(!(I.slot_flags & SLOT_HEAD))
|
||||
return FALSE
|
||||
if(!H.get_bodypart(BODY_ZONE_HEAD))
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_ears)
|
||||
if(H.ears)
|
||||
return 0
|
||||
if( !(I.slot_flags & SLOT_EARS) )
|
||||
return 0
|
||||
return FALSE
|
||||
if(!(I.slot_flags & SLOT_EARS))
|
||||
return FALSE
|
||||
if(!H.get_bodypart(BODY_ZONE_HEAD))
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_w_uniform)
|
||||
if(H.w_uniform)
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_ICLOTHING) )
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_wear_id)
|
||||
if(H.wear_id)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
|
||||
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
|
||||
if(!disable_warning)
|
||||
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if( !(I.slot_flags & SLOT_ID) )
|
||||
return 0
|
||||
return FALSE
|
||||
return equip_delay_self_check(I, H, bypass_equip_delay_self)
|
||||
if(slot_l_store)
|
||||
if(I.flags_1 & NODROP_1) //Pockets aren't visible, so you can't move NODROP_1 items into them.
|
||||
return 0
|
||||
return FALSE
|
||||
if(H.l_store)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_L_LEG)
|
||||
|
||||
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
|
||||
if(!disable_warning)
|
||||
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(I.slot_flags & SLOT_DENYPOCKET)
|
||||
return
|
||||
return FALSE
|
||||
if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET) )
|
||||
return 1
|
||||
return TRUE
|
||||
if(slot_r_store)
|
||||
if(I.flags_1 & NODROP_1)
|
||||
return 0
|
||||
return FALSE
|
||||
if(H.r_store)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_R_LEG)
|
||||
|
||||
if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
|
||||
if(!disable_warning)
|
||||
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(I.slot_flags & SLOT_DENYPOCKET)
|
||||
return 0
|
||||
return FALSE
|
||||
if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & SLOT_POCKET) )
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(slot_s_store)
|
||||
if(I.flags_1 & NODROP_1)
|
||||
return 0
|
||||
return FALSE
|
||||
if(H.s_store)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!H.wear_suit)
|
||||
if(!disable_warning)
|
||||
to_chat(H, "<span class='warning'>You need a suit before you can attach this [I.name]!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(!H.wear_suit.allowed)
|
||||
if(!disable_warning)
|
||||
to_chat(H, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
|
||||
return 0
|
||||
return FALSE
|
||||
if(I.w_class > WEIGHT_CLASS_BULKY)
|
||||
if(!disable_warning)
|
||||
to_chat(H, "The [I.name] is too big to attach.") //should be src?
|
||||
return 0
|
||||
return FALSE
|
||||
if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) )
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(slot_handcuffed)
|
||||
if(H.handcuffed)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!istype(I, /obj/item/restraints/handcuffs))
|
||||
return 0
|
||||
return FALSE
|
||||
if(num_arms < 2)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(slot_legcuffed)
|
||||
if(H.legcuffed)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!istype(I, /obj/item/restraints/legcuffs))
|
||||
return 0
|
||||
return FALSE
|
||||
if(num_legs < 2)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(slot_in_backpack)
|
||||
if(H.back && istype(H.back, /obj/item/storage))
|
||||
var/obj/item/storage/B = H.back
|
||||
if(B.can_be_inserted(I, 1, H))
|
||||
return 1
|
||||
return 0
|
||||
return 0 //Unsupported slot
|
||||
if(H.back)
|
||||
if(H.back.SendSignal(COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE))
|
||||
return TRUE
|
||||
return FALSE
|
||||
return FALSE //Unsupported slot
|
||||
|
||||
/datum/species/proc/equip_delay_self_check(obj/item/I, mob/living/carbon/human/H, bypass_equip_delay_self)
|
||||
if(!I.equip_delay_self || bypass_equip_delay_self)
|
||||
@@ -1069,7 +1062,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM)
|
||||
H.reagents.del_reagent(chem.id)
|
||||
return 1
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/datum/species/proc/handle_speech(message, mob/living/carbon/human/H)
|
||||
return message
|
||||
@@ -1079,7 +1072,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
return list()
|
||||
|
||||
/datum/species/proc/check_weakness(obj/item, mob/living/attacker)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
////////
|
||||
//LIFE//
|
||||
@@ -1116,6 +1109,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(prob(round(-H.satiety/40)))
|
||||
H.Jitter(5)
|
||||
hunger_rate = 3 * HUNGER_FACTOR
|
||||
hunger_rate *= H.physiology.hunger_mod
|
||||
H.nutrition = max(0, H.nutrition - hunger_rate)
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id = "abductor"
|
||||
say_mod = "gibbers"
|
||||
sexes = FALSE
|
||||
species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES)
|
||||
species_traits = list(NOBLOOD,NOEYES)
|
||||
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
mutanttongue = /obj/item/organ/tongue/abductor
|
||||
var/scientist = FALSE // vars to not pollute spieces list with castes
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
name = "Android"
|
||||
id = "android"
|
||||
say_mod = "states"
|
||||
species_traits = list(SPECIES_ROBOTIC,NOBLOOD)
|
||||
species_traits = list(NOBLOOD)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
meat = null
|
||||
damage_overlay_type = "synth"
|
||||
mutanttongue = /obj/item/organ/tongue/robot
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Angel"
|
||||
id = "angel"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
mutant_bodyparts = list("wings")
|
||||
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "Angel")
|
||||
use_skintones = 1
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
attack_sound = 'sound/weapons/resonator_blast.ogg'
|
||||
blacklisted = 1
|
||||
use_skintones = 0
|
||||
species_traits = list(SPECIES_ORGANIC,NOBLOOD,EYECOLOR)
|
||||
species_traits = list(NOBLOOD,EYECOLOR)
|
||||
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
|
||||
sexes = 0
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "dullahan"
|
||||
id = "dullahan"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
|
||||
use_skintones = TRUE
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
name = "Flyperson"
|
||||
id = "fly"
|
||||
say_mod = "buzzes"
|
||||
species_traits = list(SPECIES_ORGANIC, NOEYES)
|
||||
species_traits = list(NOEYES)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
|
||||
mutanttongue = /obj/item/organ/tongue/fly
|
||||
mutantliver = /obj/item/organ/liver/fly
|
||||
mutantstomach = /obj/item/organ/stomach/fly
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
|
||||
name = "Golem"
|
||||
id = "iron golem"
|
||||
species_traits = list(SPECIES_INORGANIC,NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
|
||||
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutant_organs = list(/obj/item/organ/adamantine_resonator)
|
||||
speedmod = 2
|
||||
armor = 55
|
||||
@@ -566,7 +567,7 @@
|
||||
limbs_id = "cultgolem"
|
||||
sexes = FALSE
|
||||
info_text = "As a <span class='danger'>Runic Golem</span>, you possess eldritch powers granted by the Elder God Nar'Sie."
|
||||
species_traits = list(SPECIES_INORGANIC,NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors
|
||||
prefix = "Runic"
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift
|
||||
@@ -620,7 +621,8 @@
|
||||
limbs_id = "clockgolem"
|
||||
info_text = "<span class='bold alloy'>As a </span><span class='bold brass'>clockwork golem</span><span class='bold alloy'>, you are faster than \
|
||||
other types of golem (being a machine), and are immune to electric shocks.</span>"
|
||||
species_traits = list(SPECIES_ROBOTIC,NOBLOOD,NO_UNDERWEAR,NOEYES)
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
armor = 20 //Reinforced, but much less so to allow for fast movement
|
||||
attack_verb = "smash"
|
||||
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
|
||||
@@ -672,8 +674,9 @@
|
||||
limbs_id = "clothgolem"
|
||||
sexes = FALSE
|
||||
info_text = "As a <span class='danger'>Cloth Golem</span>, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable."
|
||||
species_traits = list(SPECIES_UNDEAD,NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
|
||||
species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
armor = 15 //feels no pain, but not too resistant
|
||||
burnmod = 2 // don't get burned
|
||||
speedmod = 1 // not as heavy as stone
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
name = "Human"
|
||||
id = "human"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(MUTCOLORS_PARTSONLY,SPECIES_ORGANIC,EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "wings", "taur")
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "wings" = "None", "taur" = "none")
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY)
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "wings", "taur") // CITADEL EDIT gives humans snowflake parts
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "wings" = "None", "taur" = "None")
|
||||
use_skintones = 1
|
||||
skinned_type = /obj/item/stack/sheet/animalhide/human
|
||||
disliked_food = GROSS | RAW
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
|
||||
/datum/species/human/qualifies_for_rank(rank, list/features)
|
||||
return TRUE
|
||||
return TRUE //Pure humans are always allowed in all roles.
|
||||
|
||||
//Curiosity killed the cat's wagging tail.
|
||||
/datum/species/human/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
id = "jelly"
|
||||
default_color = "00FF90"
|
||||
say_mod = "chirps"
|
||||
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,,HAIR,FACEHAIR,NOBLOOD)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
|
||||
inherent_traits = list(TRAIT_TOXINLOVER)
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "taur") //CIT CHANGE
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None") //CIT CHANGE
|
||||
@@ -119,7 +119,7 @@
|
||||
name = "Slimeperson"
|
||||
id = "slime"
|
||||
default_color = "00FFFF"
|
||||
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
|
||||
say_mod = "says"
|
||||
hair_color = "mutcolor"
|
||||
hair_alpha = 150
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
id = "lizard"
|
||||
say_mod = "hisses"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR,LIPS, HAIR, FACEHAIR)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,FACEHAIR)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_REPTILE)
|
||||
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur")
|
||||
mutanttongue = /obj/item/organ/tongue/lizard
|
||||
mutanttail = /obj/item/organ/tail/lizard
|
||||
@@ -17,8 +18,8 @@
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard
|
||||
skinned_type = /obj/item/stack/sheet/animalhide/lizard
|
||||
exotic_bloodtype = "L"
|
||||
disliked_food = NONE
|
||||
liked_food = NONE
|
||||
disliked_food = GRAIN | DAIRY
|
||||
liked_food = GROSS | MEAT
|
||||
|
||||
/datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H)
|
||||
H.grant_language(/datum/language/draconic)
|
||||
@@ -36,7 +37,7 @@
|
||||
|
||||
/datum/species/lizard/qualifies_for_rank(rank, list/features)
|
||||
return TRUE
|
||||
|
||||
|
||||
//I wag in death
|
||||
/datum/species/lizard/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
if(H)
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
id = "moth"
|
||||
say_mod = "flutters"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(LIPS, SPECIES_ORGANIC, NOEYES)
|
||||
species_traits = list(LIPS, NOEYES)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
|
||||
mutant_bodyparts = list("moth_wings")
|
||||
default_features = list("moth_wings" = "Plain")
|
||||
attack_verb = "slash"
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
say_mod = "rattles"
|
||||
sexes = 0
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(SPECIES_INORGANIC,NOBLOOD,NOTRANSSTING)
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
|
||||
mutantliver = /obj/item/organ/liver/plasmaman
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "Podperson"
|
||||
id = "pod"
|
||||
default_color = "59CE00"
|
||||
species_traits = list(SPECIES_ORGANIC,MUTCOLORS,EYECOLOR)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR)
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slice.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
blacklisted = 1
|
||||
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
|
||||
species_traits = list(SPECIES_ORGANIC,NOBLOOD,NOEYES)
|
||||
species_traits = list(NOBLOOD,NOEYES)
|
||||
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
|
||||
|
||||
dangerous_existence = 1
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
blacklisted = 1
|
||||
sexes = 0
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
|
||||
species_traits = list(SPECIES_UNDEAD,NOBLOOD)
|
||||
species_traits = list(NOBLOOD)
|
||||
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
|
||||
disliked_food = NONE
|
||||
|
||||
@@ -3,14 +3,15 @@
|
||||
id = "synth"
|
||||
say_mod = "beep boops" //inherited from a user's real species
|
||||
sexes = 0
|
||||
species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //all of these + whatever we inherit from the real species
|
||||
species_traits = list(NOTRANSSTING) //all of these + whatever we inherit from the real species
|
||||
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
|
||||
dangerous_existence = 1
|
||||
blacklisted = 1
|
||||
meat = null
|
||||
damage_overlay_type = "synth"
|
||||
limbs_id = "synth"
|
||||
var/list/initial_species_traits = list(SPECIES_ROBOTIC,NOTRANSSTING) //for getting these values back for assume_disguise()
|
||||
var/list/initial_species_traits = list(NOTRANSSTING) //for getting these values back for assume_disguise()
|
||||
var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
|
||||
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
|
||||
@@ -46,7 +47,6 @@
|
||||
inherent_traits = initial_inherent_traits.Copy()
|
||||
species_traits |= S.species_traits
|
||||
inherent_traits |= S.inherent_traits
|
||||
species_traits -= list(SPECIES_ORGANIC, SPECIES_INORGANIC, SPECIES_UNDEAD)
|
||||
attack_verb = S.attack_verb
|
||||
attack_sound = S.attack_sound
|
||||
miss_sound = S.miss_sound
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
name = "vampire"
|
||||
id = "vampire"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(SPECIES_UNDEAD,EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD)
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD)
|
||||
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None")
|
||||
exotic_bloodtype = "U"
|
||||
use_skintones = TRUE
|
||||
|
||||
@@ -8,8 +8,9 @@
|
||||
sexes = 0
|
||||
blacklisted = 1
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
|
||||
species_traits = list(SPECIES_UNDEAD,NOBLOOD,NOZOMBIE,NOTRANSSTING)
|
||||
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH)
|
||||
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
|
||||
mutanttongue = /obj/item/organ/tongue/zombie
|
||||
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
|
||||
disliked_food = NONE
|
||||
@@ -74,7 +75,6 @@
|
||||
id = "goofzombies"
|
||||
limbs_id = "zombie" //They look like zombies
|
||||
sexes = 0
|
||||
species_traits = list(SPECIES_ORGANIC)
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
|
||||
mutanttongue = /obj/item/organ/tongue/zombie
|
||||
|
||||
|
||||
@@ -72,11 +72,8 @@
|
||||
put_in_hands(I)
|
||||
update_inv_hands()
|
||||
if(slot_in_backpack)
|
||||
var/obj/item/storage/B = back
|
||||
var/prev_jimmies = B.rustle_jimmies
|
||||
B.rustle_jimmies = FALSE //don't conspicously rustle
|
||||
B.handle_item_insertion(I, 1, src)
|
||||
B.rustle_jimmies = prev_jimmies
|
||||
if(!back.SendSignal(COMSIG_TRY_STORAGE_INSERT, I, src, TRUE))
|
||||
not_handled = TRUE
|
||||
else
|
||||
not_handled = TRUE
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
|
||||
|
||||
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
|
||||
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
|
||||
#define COLD_DAMAGE_LEVEL_3 3 //Amount of damage applied when your body temperature passes the 120K point
|
||||
|
||||
/mob/living/carbon/monkey
|
||||
|
||||
@@ -170,3 +176,11 @@
|
||||
|
||||
adjust_bodytemperature(BODYTEMP_HEATING_MAX)
|
||||
SendSignal(COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
|
||||
|
||||
#undef HEAT_DAMAGE_LEVEL_1
|
||||
#undef HEAT_DAMAGE_LEVEL_2
|
||||
#undef HEAT_DAMAGE_LEVEL_3
|
||||
|
||||
#undef COLD_DAMAGE_LEVEL_1
|
||||
#undef COLD_DAMAGE_LEVEL_2
|
||||
#undef COLD_DAMAGE_LEVEL_3
|
||||
@@ -7,6 +7,7 @@
|
||||
gender = NEUTER
|
||||
pass_flags = PASSTABLE
|
||||
ventcrawler = VENTCRAWLER_NUDE
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
|
||||
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
|
||||
gib_type = /obj/effect/decal/cleanable/blood/gibs
|
||||
|
||||
@@ -395,6 +395,7 @@
|
||||
update_canmove()
|
||||
|
||||
/mob/proc/get_contents()
|
||||
|
||||
/*CIT CHANGE - comments out lay_down proc to be modified in modular_citadel
|
||||
/mob/living/proc/lay_down()
|
||||
set name = "Rest"
|
||||
@@ -404,30 +405,18 @@
|
||||
to_chat(src, "<span class='notice'>You are now [resting ? "resting" : "getting up"].</span>")
|
||||
update_canmove()
|
||||
*/
|
||||
//Recursive function to find everything a mob is holding.
|
||||
/mob/living/get_contents(obj/item/storage/Storage = null)
|
||||
var/list/L = list()
|
||||
|
||||
if(Storage) //If it called itself
|
||||
L += Storage.return_inv()
|
||||
return L
|
||||
else
|
||||
L += src.contents
|
||||
for(var/obj/item/storage/S in src.contents) //Check for storage items
|
||||
L += get_contents(S)
|
||||
for(var/obj/item/clothing/under/U in src.contents) //Check for jumpsuit accessories
|
||||
L += U.contents
|
||||
for(var/obj/item/folder/F in src.contents) //Check for folders
|
||||
L += F.contents
|
||||
return L
|
||||
|
||||
/mob/living/proc/check_contents_for(A)
|
||||
var/list/L = src.get_contents()
|
||||
|
||||
for(var/obj/B in L)
|
||||
if(B.type == A)
|
||||
return 1
|
||||
return 0
|
||||
//Recursive function to find everything a mob is holding. Really shitty proc tbh.
|
||||
/mob/living/get_contents()
|
||||
. = list()
|
||||
. |= list(src)
|
||||
for(var/obj/o in .)
|
||||
var/list/newlist = list()
|
||||
o.SendSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, newlist)
|
||||
. |= newlist
|
||||
for(var/obj/item/clothing/under/U in .)
|
||||
. |= U.contents
|
||||
for(var/obj/item/folder/F in .)
|
||||
. |= F.contents
|
||||
|
||||
// Living mobs use can_inject() to make sure that the mob is not syringe-proof in general.
|
||||
/mob/living/proc/can_inject()
|
||||
@@ -545,8 +534,8 @@
|
||||
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
|
||||
pulledby.stop_pulling()
|
||||
|
||||
if (s_active && !(CanReach(s_active,view_only = TRUE)))
|
||||
s_active.close(src)
|
||||
if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE)))
|
||||
active_storage.close(src)
|
||||
|
||||
if(lying && !buckled && prob(getBruteLoss()*200/maxHealth))
|
||||
makeTrail(newloc, T, old_direction)
|
||||
@@ -739,10 +728,10 @@
|
||||
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
|
||||
sleep(10)
|
||||
animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
|
||||
floating = 1
|
||||
floating = TRUE
|
||||
else if(((!on || fixed) && floating))
|
||||
animate(src, pixel_y = get_standard_pixel_y_offset(lying), time = 10)
|
||||
floating = 0
|
||||
floating = FALSE
|
||||
|
||||
// The src mob is trying to strip an item from someone
|
||||
// Override if a certain type of mob should be behave differently when stripping items (can't, for example)
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
var/limb_destroyer = 0 //1 Sets AI behavior that allows mobs to target and dismember limbs with their basic attack.
|
||||
|
||||
var/mob_size = MOB_SIZE_HUMAN
|
||||
var/list/mob_biotypes = list(MOB_ORGANIC)
|
||||
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
|
||||
var/list/image/staticOverlays = list()
|
||||
var/has_limbs = 0 //does the mob have distinct limbs?(arms,legs, chest,head)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user