Merge pull request #6486 from Poojawa/4-22-sync

Hard TG Sync 4/22
This commit is contained in:
LetterJay
2018-04-27 00:08:38 -05:00
committed by GitHub
395 changed files with 90949 additions and 23433 deletions
+5 -3
View File
@@ -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>"
+3 -4
View File
@@ -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()
+5 -12
View File
@@ -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)
+2
View File
@@ -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> - "
+12 -2
View File
@@ -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
+1 -23
View File
@@ -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
//
+4 -5
View File
@@ -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)
+217
View File
@@ -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
+14 -29
View File
@@ -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)
+12 -2
View File
@@ -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
-19
View File
@@ -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
+2 -4
View File
@@ -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,
+5 -5
View File
@@ -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()
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
-34
View File
@@ -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" */
+3 -61
View File
@@ -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))
+7 -2
View File
@@ -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()
+9 -55
View File
@@ -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
+5 -1
View File
@@ -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>")
+1 -1
View File
@@ -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)
+1 -2
View File
@@ -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)
+5 -5
View File
@@ -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
+7 -7
View File
@@ -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)
+18 -17
View File
@@ -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."
+2 -3
View File
@@ -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
+2 -7
View File
@@ -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."
+3 -2
View File
@@ -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
-64
View File
@@ -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
+8 -4
View File
@@ -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()
+2 -2
View File
@@ -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)
+1 -4
View File
@@ -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)
+11 -10
View File
@@ -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()
+2 -6
View File
@@ -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
+4 -7
View File
@@ -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))
+2 -2
View File
@@ -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()
+1 -1
View File
@@ -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
-2
View File
@@ -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
+1 -2
View File
@@ -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 -6
View File
@@ -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)
+6 -8
View File
@@ -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)
+9 -21
View File
@@ -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"
+7 -32
View File
@@ -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
+75 -81
View File
@@ -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
+2 -5
View File
@@ -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
+17 -28
View File
@@ -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