Merge branch 'master' into upstream-merge-27773
This commit is contained in:
@@ -122,7 +122,7 @@
|
||||
computerid = "0"
|
||||
if(!ip)
|
||||
ip = "0.0.0.0"
|
||||
var/sql = "INSERT INTO [format_table_name("ban")] (`bantime`,`server_ip`,`server_port`,`bantype`,`reason`,`job`,`duration`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`) VALUES (Now(), INET_ATON('[world.internet_address]'), '[world.port]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', INET_ATON('[ip]'), '[a_ckey]', '[a_computerid]', INET_ATON('[a_ip]'), '[who]', '[adminwho]')"
|
||||
var/sql = "INSERT INTO [format_table_name("ban")] (`bantime`,`server_ip`,`server_port`,`round_id`,`bantype`,`reason`,`job`,`duration`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', INET_ATON('[ip]'), '[a_ckey]', '[a_computerid]', INET_ATON('[a_ip]'), '[who]', '[adminwho]')"
|
||||
var/datum/DBQuery/query_add_ban = SSdbcore.NewQuery(sql)
|
||||
if(!query_add_ban.warn_execute())
|
||||
return
|
||||
|
||||
+832
-825
File diff suppressed because it is too large
Load Diff
@@ -183,7 +183,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
to_chat(C, "<span class='adminnotice'>PM to-<b>Admins</b>: [name]</span>")
|
||||
|
||||
//send it to irc if nobody is on and tell us how many were on
|
||||
var/admin_number_present = send2irc_adminless_only(initiator_ckey, name)
|
||||
var/admin_number_present = send2irc_adminless_only("#[id] [initiator_ckey]", name)
|
||||
log_admin_private("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.")
|
||||
if(admin_number_present <= 0)
|
||||
to_chat(C, "<span class='notice'>No active admins are online, your adminhelp was sent to the admin irc.</span>")
|
||||
@@ -431,9 +431,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
/obj/effect/statclick/ahelp
|
||||
var/datum/admin_help/ahelp_datum
|
||||
|
||||
/obj/effect/statclick/ahelp/Initialize(mapload, datum/admin_help/AH)
|
||||
/obj/effect/statclick/ahelp/Initialize(mapload, datum/admin_help/AH)
|
||||
ahelp_datum = AH
|
||||
. = ..()
|
||||
. = ..()
|
||||
|
||||
/obj/effect/statclick/ahelp/update()
|
||||
return ..(ahelp_datum.name)
|
||||
@@ -479,7 +479,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
current_ticket.MessageNoRecipient(msg)
|
||||
current_ticket.TimeoutVerb()
|
||||
return
|
||||
else
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Ticket not found, creating new one...</span>")
|
||||
else
|
||||
current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
|
||||
@@ -567,9 +567,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
|
||||
|
||||
/proc/send2irc(msg,msg2)
|
||||
if(config.useircbot)
|
||||
if(world.RunningService())
|
||||
world.ExportService("[SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE] [msg] | [msg2]")
|
||||
else if(config.useircbot)
|
||||
shell("python nudge.py [msg] [msg2]")
|
||||
return
|
||||
|
||||
/proc/send2otherserver(source,msg,type = "Ahelp")
|
||||
if(config.cross_allowed)
|
||||
@@ -591,7 +592,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
|
||||
|
||||
for(var/admin in admin_keys)
|
||||
if(LAZYLEN(message) > 1)
|
||||
if(LAZYLEN(message) > 1)
|
||||
message += ", [admin]"
|
||||
else
|
||||
message += "[admin]"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
if( !ismob(M) || !M.client )
|
||||
return
|
||||
cmd_admin_pm(M.client,null)
|
||||
SSblackbox.add_details("admin_verb","Admin PM Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.add_details("admin_verb","Admin PM Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
//shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm
|
||||
/client/proc/cmd_admin_pm_panel()
|
||||
@@ -33,7 +33,7 @@
|
||||
targets["(No Mob) - [T]"] = T
|
||||
var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sortList(targets)
|
||||
cmd_admin_pm(targets[target],null)
|
||||
SSblackbox.add_details("admin_verb","Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.add_details("admin_verb","Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/cmd_ahelp_reply(whom)
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
@@ -59,11 +59,11 @@
|
||||
if (!msg)
|
||||
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
|
||||
return
|
||||
cmd_admin_pm(whom, msg, AH)
|
||||
cmd_admin_pm(whom, msg)
|
||||
|
||||
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
|
||||
//Fetching a message if needed. src is the sender and C is the target client
|
||||
/client/proc/cmd_admin_pm(whom, msg, datum/admin_help/AH)
|
||||
/client/proc/cmd_admin_pm(whom, msg)
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
|
||||
return
|
||||
@@ -103,7 +103,7 @@
|
||||
if(!recipient)
|
||||
if(holder)
|
||||
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
|
||||
to_chat(src, msg)
|
||||
to_chat(src, msg)
|
||||
else
|
||||
current_ticket.MessageNoRecipient(msg)
|
||||
return
|
||||
@@ -144,9 +144,9 @@
|
||||
|
||||
if(irc)
|
||||
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: [rawmsg]</font>")
|
||||
admin_ticket_log(src, "<font color='red'>Reply PM from-<b>[key_name(src, TRUE, TRUE)] to <i>IRC</i>: [keywordparsedmsg]</font>")
|
||||
var/datum/admin_help/AH = admin_ticket_log(src, "<font color='red'>Reply PM from-<b>[key_name(src, TRUE, TRUE)] to <i>IRC</i>: [keywordparsedmsg]</font>")
|
||||
ircreplyamount--
|
||||
send2irc("Reply: [ckey]",rawmsg)
|
||||
send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg)
|
||||
else
|
||||
if(recipient.holder)
|
||||
if(holder) //both are admins
|
||||
@@ -221,42 +221,44 @@
|
||||
|
||||
var/datum/admin_help/ticket = C ? C.current_ticket : GLOB.ahelp_tickets.CKey2ActiveTicket(target)
|
||||
var/compliant_msg = trim(lowertext(msg))
|
||||
var/unhandled = FALSE
|
||||
var/irc_tagged = "[sender](IRC)"
|
||||
switch(compliant_msg)
|
||||
if("ticket close")
|
||||
if(ticket)
|
||||
ticket.Close(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully closed"
|
||||
if("ticket resolve")
|
||||
if(ticket)
|
||||
ticket.Resolve(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully resolved"
|
||||
if("ticket ic")
|
||||
if(ticket)
|
||||
ticket.ICIssue(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully marked as IC issue"
|
||||
if("ticket reject")
|
||||
if(ticket)
|
||||
ticket.Reject(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully rejected"
|
||||
else
|
||||
unhandled = TRUE
|
||||
if(!unhandled)
|
||||
return "Ticket could not be found"
|
||||
var/list/splits = splittext(compliant_msg, " ")
|
||||
if(splits.len && splits[1] == "ticket")
|
||||
if(splits.len < 2)
|
||||
return "Usage: ticket <close|resolve|icissue|reject>"
|
||||
switch(splits[2])
|
||||
if("close")
|
||||
if(ticket)
|
||||
ticket.Close(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully closed"
|
||||
if("resolve")
|
||||
if(ticket)
|
||||
ticket.Resolve(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully resolved"
|
||||
if("icissue")
|
||||
if(ticket)
|
||||
ticket.ICIssue(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully marked as IC issue"
|
||||
if("reject")
|
||||
if(ticket)
|
||||
ticket.Reject(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully rejected"
|
||||
else
|
||||
return "Usage: ticket <close|resolve|icissue|reject>"
|
||||
return "Error: Ticket could not be found"
|
||||
|
||||
var/static/stealthkey
|
||||
var/adminname = config.showircname ? irc_tagged : "Administrator"
|
||||
|
||||
if(!C)
|
||||
return "No client"
|
||||
return "Error: No client"
|
||||
|
||||
if(!stealthkey)
|
||||
stealthkey = GenIrcStealthKey()
|
||||
|
||||
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
||||
if(!msg)
|
||||
return "No message"
|
||||
return "Error: No message"
|
||||
|
||||
message_admins("IRC message from [sender] to [key_name_admin(C)] : [msg]")
|
||||
log_admin_private("IRC PM: [sender] -> [key_name(C)] : [msg]")
|
||||
|
||||
@@ -52,7 +52,20 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if(!procname)
|
||||
return
|
||||
|
||||
if(targetselected && !hascall(target,procname))
|
||||
//hascall() doesn't support proc paths (eg: /proc/gib(), it only supports "gib")
|
||||
var/testname = procname
|
||||
if(targetselected)
|
||||
//Find one of the 3 possible ways they could have written /proc/PROCNAME
|
||||
if(findtext(procname, "/proc/"))
|
||||
testname = replacetext(procname, "/proc/", "")
|
||||
else if(findtext(procname, "/proc"))
|
||||
testname = replacetext(procname, "/proc", "")
|
||||
else if(findtext(procname, "proc/"))
|
||||
testname = replacetext(procname, "proc/", "")
|
||||
//Clear out any parenthesis if they're a dummy
|
||||
testname = replacetext(testname, "()", "")
|
||||
|
||||
if(targetselected && !hascall(target,testname))
|
||||
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no proc named [procname].</font>")
|
||||
return
|
||||
else
|
||||
@@ -581,7 +594,8 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job)
|
||||
for(var/path in paths)
|
||||
var/datum/outfit/O = path //not much to initalize here but whatever
|
||||
outfits[initial(O.name)] = path
|
||||
if(initial(O.can_be_admin_equipped))
|
||||
outfits[initial(O.name)] = path
|
||||
|
||||
|
||||
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in outfits
|
||||
@@ -596,7 +610,8 @@ GLOBAL_PROTECT(AdminProcCallCount)
|
||||
var/list/job_outfits = list()
|
||||
for(var/path in job_paths)
|
||||
var/datum/outfit/O = path
|
||||
job_outfits[initial(O.name)] = path
|
||||
if(initial(O.can_be_admin_equipped))
|
||||
job_outfits[initial(O.name)] = path
|
||||
|
||||
dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits
|
||||
dresscode = job_outfits[dresscode]
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
for(var/log_type in M.logging)
|
||||
var/list/reversed = M.logging[log_type]
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
dat += "<center>[log_type]</center><br>"
|
||||
dat += "<center><b>[log_type]</b></center><br>"
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
dat += "<hr>"
|
||||
@@ -26,6 +26,6 @@
|
||||
if(reversed)
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><hr>"
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
|
||||
usr << browse(dat, "window=invidual_logging;size=600x480")
|
||||
@@ -227,7 +227,7 @@
|
||||
return 0
|
||||
|
||||
var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva")
|
||||
var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : pick(GLOB.latejoin)
|
||||
var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : null
|
||||
var/mob/living/carbon/alien/new_xeno
|
||||
switch(alien_caste)
|
||||
if("Queen")
|
||||
@@ -244,6 +244,8 @@
|
||||
new_xeno = new /mob/living/carbon/alien/larva(spawn_here)
|
||||
else
|
||||
return 0
|
||||
if(!spawn_here)
|
||||
SSjob.SendToLateJoin(new_xeno, FALSE)
|
||||
|
||||
new_xeno.ckey = ckey
|
||||
var/msg = "<span class='notice'>[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste].</span>"
|
||||
@@ -284,8 +286,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
var/turf/T
|
||||
if(GLOB.xeno_spawn.len)
|
||||
T = pick(GLOB.xeno_spawn)
|
||||
else
|
||||
T = pick(GLOB.latejoin)
|
||||
|
||||
var/mob/living/carbon/alien/new_xeno
|
||||
switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were.
|
||||
@@ -302,6 +302,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
else//If we don't know what special role they have, for whatever reason, or they're a larva.
|
||||
create_xeno(G_found.ckey)
|
||||
return
|
||||
|
||||
if(!T)
|
||||
SSjob.SendToLateJoin(new_xeno, FALSE)
|
||||
|
||||
//Now to give them their mind back.
|
||||
G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use
|
||||
@@ -315,7 +318,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
//check if they were a monkey
|
||||
else if(findtext(G_found.real_name,"monkey"))
|
||||
if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")
|
||||
var/mob/living/carbon/monkey/new_monkey = new(pick(GLOB.latejoin))
|
||||
var/mob/living/carbon/monkey/new_monkey = new
|
||||
SSjob.SendToLateJoin(new_monkey)
|
||||
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
|
||||
new_monkey.key = G_found.key
|
||||
to_chat(new_monkey, "You have been fully respawned. Enjoy the game.")
|
||||
@@ -326,7 +330,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
|
||||
|
||||
//Ok, it's not a xeno or a monkey. So, spawn a human.
|
||||
var/mob/living/carbon/human/new_character = new(pick(GLOB.latejoin))//The mob being spawned.
|
||||
var/mob/living/carbon/human/new_character = new//The mob being spawned.
|
||||
SSjob.SendToLateJoin(new_character)
|
||||
|
||||
var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character.
|
||||
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
|
||||
@@ -1206,4 +1211,5 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
return
|
||||
|
||||
message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]")
|
||||
log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]")
|
||||
log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]")
|
||||
SSshuttle.centcom_recall(SSshuttle.emergency.timer, message)
|
||||
@@ -1,6 +1,6 @@
|
||||
#define PUMP_OUT "out"
|
||||
#define PUMP_IN "in"
|
||||
#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 30)
|
||||
#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE * 10)
|
||||
#define PUMP_MIN_PRESSURE (ONE_ATMOSPHERE / 10)
|
||||
#define PUMP_DEFAULT_PRESSURE (ONE_ATMOSPHERE)
|
||||
|
||||
|
||||
@@ -53,18 +53,5 @@
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
L+=T
|
||||
var/loc = pick(L)
|
||||
explosion(loc,explosiondev,explosionmed,explosionlight)
|
||||
explosion(loc,explosiondev,explosionmed,explosionlight)
|
||||
reload = 0
|
||||
|
||||
/*/mob/proc/openfire()
|
||||
var/A
|
||||
A = input("Area to jump bombard", "Open Fire", A) in GLOB.teleportlocs
|
||||
var/area/thearea = GLOB.teleportlocs[A]
|
||||
priority_announce("Bluespace artillery fire detected. Brace for impact.")
|
||||
spawn(30)
|
||||
var/list/L = list()
|
||||
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
L+=T
|
||||
var/loc = pick(L)
|
||||
explosion(loc,2,5,11)*/
|
||||
|
||||
+143
-144
@@ -18,6 +18,8 @@
|
||||
var/uses = 1 //how many times can we spawn from it. set to -1 for infinite.
|
||||
var/brute_damage = 0
|
||||
var/oxy_damage = 0
|
||||
var/burn_damage = 0
|
||||
var/mob_color //Change the mob's color
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/banType = "lavaland"
|
||||
@@ -38,7 +40,7 @@
|
||||
create(ckey = user.ckey)
|
||||
|
||||
/obj/effect/mob_spawn/Initialize(mapload)
|
||||
..()
|
||||
. = ..()
|
||||
if(instant || (roundstart && (mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP))))
|
||||
create()
|
||||
else
|
||||
@@ -68,6 +70,8 @@
|
||||
|
||||
M.adjustOxyLoss(oxy_damage)
|
||||
M.adjustBruteLoss(brute_damage)
|
||||
M.adjustFireLoss(burn_damage)
|
||||
M.color = mob_color
|
||||
equip(M)
|
||||
|
||||
if(ckey)
|
||||
@@ -90,78 +94,66 @@
|
||||
mob_type = /mob/living/carbon/human
|
||||
//Human specific stuff.
|
||||
var/mob_species = null //Set to make them a mutant race such as lizard or skeleton. Uses the datum typepath instead of the ID.
|
||||
var/outfit_type = null //Will start with this if exists then apply specific slots. Job outfits are generated with IDs and disabled PDAs.
|
||||
var/uniform = null //Set this to an object path to have the slot filled with said object on the corpse.
|
||||
var/r_hand = null
|
||||
var/l_hand = null
|
||||
var/suit = null
|
||||
var/shoes = null
|
||||
var/gloves = null
|
||||
var/radio = null
|
||||
var/glasses = null
|
||||
var/mask = null
|
||||
var/neck = null
|
||||
var/helmet = null
|
||||
var/belt = null
|
||||
var/pocket1 = null
|
||||
var/pocket2 = null
|
||||
var/back = null
|
||||
var/has_id = FALSE //Set to TRUE if you want them to have an ID
|
||||
var/datum/outfit/outfit = /datum/outfit //If this is a path, it will be instanced in Initialize()
|
||||
var/disable_pda = TRUE
|
||||
//All of these only affect the ID that the outfit has placed in the ID slot
|
||||
var/id_job = null //Such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/id_access = null //This is for access. See access.dm for which jobs give what access. Use "Captain" if you want it to be all access.
|
||||
var/id_access_list = null //Allows you to manually add access to an ID card.
|
||||
var/id_icon = null //For setting it to be a gold, silver, centcom etc ID
|
||||
|
||||
var/husk = null
|
||||
var/list/implants = list()
|
||||
//these vars are for lazy mappers to override parts of the outfit
|
||||
//these cannot be null by default, or mappers cannot set them to null if they want nothing in that slot
|
||||
var/uniform = -1
|
||||
var/r_hand = -1
|
||||
var/l_hand = -1
|
||||
var/suit = -1
|
||||
var/shoes = -1
|
||||
var/gloves = -1
|
||||
var/ears = -1
|
||||
var/glasses = -1
|
||||
var/mask = -1
|
||||
var/head = -1
|
||||
var/belt = -1
|
||||
var/r_pocket = -1
|
||||
var/l_pocket = -1
|
||||
var/back = -1
|
||||
var/id = -1
|
||||
var/neck = -1
|
||||
var/backpack_contents = -1
|
||||
var/suit_store = -1
|
||||
|
||||
/obj/effect/mob_spawn/human/Initialize()
|
||||
if(ispath(outfit))
|
||||
outfit = new outfit()
|
||||
if(!outfit)
|
||||
outfit = new /datum/outfit
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/equip(mob/living/carbon/human/H)
|
||||
if(mob_species)
|
||||
H.set_species(mob_species)
|
||||
if(husk)
|
||||
H.Drain()
|
||||
|
||||
if(outfit_type)
|
||||
H.equipOutfit(outfit_type)
|
||||
|
||||
// We don't want corpse PDAs to show up in the messenger list.
|
||||
var/obj/item/device/pda/PDA = locate(/obj/item/device/pda) in H
|
||||
if(PDA)
|
||||
PDA.toff = TRUE
|
||||
|
||||
if(uniform)
|
||||
H.equip_to_slot_or_del(new uniform(H), slot_w_uniform)
|
||||
if(suit)
|
||||
H.equip_to_slot_or_del(new suit(H), slot_wear_suit)
|
||||
if(shoes)
|
||||
H.equip_to_slot_or_del(new shoes(H), slot_shoes)
|
||||
if(gloves)
|
||||
H.equip_to_slot_or_del(new gloves(H), slot_gloves)
|
||||
if(radio)
|
||||
H.equip_to_slot_or_del(new radio(H), slot_ears)
|
||||
if(glasses)
|
||||
H.equip_to_slot_or_del(new glasses(H), slot_glasses)
|
||||
if(mask)
|
||||
H.equip_to_slot_or_del(new mask(H), slot_wear_mask)
|
||||
if(neck)
|
||||
H.equip_to_slot_or_del(new neck(H), slot_neck)
|
||||
if(helmet)
|
||||
H.equip_to_slot_or_del(new helmet(H), slot_head)
|
||||
if(belt)
|
||||
H.equip_to_slot_or_del(new belt(H), slot_belt)
|
||||
if(pocket1)
|
||||
H.equip_to_slot_or_del(new pocket1(H), slot_r_store)
|
||||
if(pocket2)
|
||||
H.equip_to_slot_or_del(new pocket2(H), slot_l_store)
|
||||
if(back)
|
||||
H.equip_to_slot_or_del(new back(H), slot_back)
|
||||
if(l_hand)
|
||||
H.put_in_hands_or_del(new l_hand(H))
|
||||
if(r_hand)
|
||||
H.put_in_hands_or_del(new r_hand(H))
|
||||
if(has_id)
|
||||
var/obj/item/weapon/card/id/W = new(H)
|
||||
if(id_icon)
|
||||
W.icon_state = id_icon
|
||||
else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere.
|
||||
H.cure_husk()
|
||||
H.underwear = "Nude"
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
if(outfit)
|
||||
var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store")
|
||||
for(var/slot in slots)
|
||||
var/T = vars[slot]
|
||||
if(!isnum(T))
|
||||
outfit.vars[slot] = T
|
||||
H.equipOutfit(outfit)
|
||||
if(disable_pda)
|
||||
// We don't want corpse PDAs to show up in the messenger list.
|
||||
var/obj/item/device/pda/PDA = locate(/obj/item/device/pda) in H
|
||||
if(PDA)
|
||||
PDA.toff = TRUE
|
||||
var/obj/item/weapon/card/id/W = H.wear_id
|
||||
if(W)
|
||||
if(id_access)
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
@@ -176,15 +168,6 @@
|
||||
W.assignment = id_job
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
H.equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
for(var/I in implants)
|
||||
var/obj/item/weapon/implant/X = new I
|
||||
X.implant(H)
|
||||
|
||||
if(!H.head && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit
|
||||
HS.ToggleHelmet()
|
||||
|
||||
//Instant version - use when spawning corpses during runtime
|
||||
/obj/effect/mob_spawn/human/corpse
|
||||
@@ -248,52 +231,22 @@
|
||||
|
||||
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
|
||||
|
||||
/obj/effect/mob_spawn/human/syndicatesoldier
|
||||
name = "Syndicate Operative"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
helmet = /obj/item/clothing/head/helmet/swat
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
has_id = 1
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
|
||||
/obj/effect/mob_spawn/human/syndicatecommando
|
||||
name = "Syndicate Commando"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/weapon/tank/jetpack/oxygen
|
||||
pocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
|
||||
has_id = 1
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
|
||||
///////////Civilians//////////////////////
|
||||
|
||||
/obj/effect/mob_spawn/human/cook
|
||||
name = "Cook"
|
||||
outfit_type = /datum/outfit/job/cook
|
||||
outfit = /datum/outfit/job/cook
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/doctor
|
||||
name = "Doctor"
|
||||
outfit_type = /datum/outfit/job/doctor
|
||||
outfit = /datum/outfit/job/doctor
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/doctor/alive
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
radio = null
|
||||
back = null
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
@@ -309,49 +262,40 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/engineer
|
||||
name = "Engineer"
|
||||
outfit_type = /datum/outfit/job/engineer
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
outfit = /datum/outfit/job/engineer/gloved
|
||||
|
||||
/obj/effect/mob_spawn/human/engineer/rig
|
||||
outfit_type = /datum/outfit/job/engineer/rig
|
||||
outfit = /datum/outfit/job/engineer/gloved/rig
|
||||
|
||||
/obj/effect/mob_spawn/human/clown
|
||||
name = "Clown"
|
||||
outfit_type = /datum/outfit/job/clown
|
||||
outfit = /datum/outfit/job/clown
|
||||
|
||||
/obj/effect/mob_spawn/human/scientist
|
||||
name = "Scientist"
|
||||
outfit_type = /datum/outfit/job/scientist
|
||||
outfit = /datum/outfit/job/scientist
|
||||
|
||||
/obj/effect/mob_spawn/human/miner
|
||||
name = "Shaft Miner"
|
||||
outfit_type = /datum/outfit/job/miner/asteroid
|
||||
outfit = /datum/outfit/job/miner/asteroid
|
||||
|
||||
/obj/effect/mob_spawn/human/miner/rig
|
||||
outfit_type = /datum/outfit/job/miner/equipped/asteroid
|
||||
outfit = /datum/outfit/job/miner/equipped/asteroid
|
||||
|
||||
/obj/effect/mob_spawn/human/miner/explorer
|
||||
outfit_type = /datum/outfit/job/miner/equipped
|
||||
outfit = /datum/outfit/job/miner/equipped
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/plasmaman
|
||||
mob_species = /datum/species/plasmaman
|
||||
helmet = /obj/item/clothing/head/helmet/space/plasmaman
|
||||
uniform = /obj/item/clothing/under/plasmaman
|
||||
back = /obj/item/weapon/tank/internals/plasmaman/full
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
outfit = /datum/outfit/plasmaman
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/bartender
|
||||
name = "Space Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
has_id = 1
|
||||
id_job = "Bartender"
|
||||
id_access_list = list(GLOB.access_bar)
|
||||
outfit = /datum/outfit/spacebartender
|
||||
|
||||
/obj/effect/mob_spawn/human/bartender/alive
|
||||
death = FALSE
|
||||
@@ -362,10 +306,18 @@
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a space bartender!"
|
||||
|
||||
/datum/outfit/spacebartender
|
||||
name = "Space Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/beach
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
uniform = /obj/item/clothing/under/shorts/red
|
||||
pocket1 = /obj/item/weapon/storage/wallet/random
|
||||
outfit = /datum/outfit/beachbum
|
||||
|
||||
/obj/effect/mob_spawn/human/beach/alive
|
||||
death = FALSE
|
||||
@@ -377,46 +329,73 @@
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a beach bum!"
|
||||
|
||||
/datum/outfit/beachbum
|
||||
name = "Beach Bum"
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
uniform = /obj/item/clothing/under/shorts/red
|
||||
r_pocket = /obj/item/weapon/storage/wallet/random
|
||||
|
||||
/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
H.dna.add_mutation(STONER)
|
||||
|
||||
/////////////////Officers+Nanotrasen Security//////////////////////
|
||||
|
||||
/obj/effect/mob_spawn/human/bridgeofficer
|
||||
name = "Bridge Officer"
|
||||
radio = /obj/item/device/radio/headset/heads/hop
|
||||
id_job = "Bridge Officer"
|
||||
id_access_list = list(GLOB.access_cent_captain)
|
||||
outfit = /datum/outfit/nanotrasenbridgeofficercorpse
|
||||
|
||||
/datum/outfit/nanotrasenbridgeofficercorpse
|
||||
name = "Bridge Officer Corpse"
|
||||
ears = /obj/item/device/radio/headset/heads/hop
|
||||
uniform = /obj/item/clothing/under/rank/centcom_officer
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
has_id = 1
|
||||
id_job = "Bridge Officer"
|
||||
id_access_list = list(GLOB.access_cent_captain)
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/commander
|
||||
name = "Commander"
|
||||
id_job = "Commander"
|
||||
id_access_list = list(GLOB.access_cent_captain, GLOB.access_cent_general, GLOB.access_cent_specops, GLOB.access_cent_medical, GLOB.access_cent_storage)
|
||||
outfit = /datum/outfit/nanotrasencommandercorpse
|
||||
|
||||
/datum/outfit/nanotrasencommandercorpse
|
||||
name = "Nanotrasen Private Security Commander"
|
||||
uniform = /obj/item/clothing/under/rank/centcom_commander
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
radio = /obj/item/device/radio/headset/heads/captain
|
||||
ears = /obj/item/device/radio/headset/heads/captain
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
|
||||
helmet = /obj/item/clothing/head/centhat
|
||||
head = /obj/item/clothing/head/centhat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
shoes = /obj/item/clothing/shoes/combat/swat
|
||||
pocket1 = /obj/item/weapon/lighter
|
||||
has_id = 1
|
||||
id_job = "Commander"
|
||||
id_access_list = list(GLOB.access_cent_captain)
|
||||
r_pocket = /obj/item/weapon/lighter
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/nanotrasensoldier
|
||||
name = "Nanotrasen Private Security Officer"
|
||||
id_job = "Private Security Force"
|
||||
id_access_list = list(GLOB.access_cent_captain, GLOB.access_cent_general, GLOB.access_cent_specops, GLOB.access_cent_medical, GLOB.access_cent_storage, GLOB.access_security)
|
||||
outfit = /datum/outfit/nanotrasensoldiercorpse
|
||||
|
||||
/datum/outfit/nanotrasensoldiercorpse
|
||||
name = "NT Private Security Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/rank/security
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
helmet = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
head = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
back = /obj/item/weapon/storage/backpack/security
|
||||
has_id = 1
|
||||
id_job = "Private Security Force"
|
||||
id_access_list = list(GLOB.access_cent_specops)
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/commander/alive
|
||||
death = FALSE
|
||||
@@ -427,6 +406,17 @@
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a Nanotrasen Commander!"
|
||||
|
||||
/obj/effect/mob_spawn/human/nanotrasensoldier/alive
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
mob_name = "Private Security Officer"
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
faction = "nanotrasenprivate"
|
||||
flavour_text = "You are a Nanotrasen Private Security Officer!"
|
||||
|
||||
|
||||
/////////////////Spooky Undead//////////////////////
|
||||
|
||||
/obj/effect/mob_spawn/human/skeleton
|
||||
@@ -459,9 +449,14 @@
|
||||
name = "abductor"
|
||||
mob_name = "alien"
|
||||
mob_species = /datum/species/abductor
|
||||
outfit = /datum/outfit/abductorcorpse
|
||||
|
||||
/datum/outfit/abductorcorpse
|
||||
name = "Abductor Corpse"
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
|
||||
|
||||
//For ghost bar.
|
||||
/obj/effect/mob_spawn/human/alive/space_bar_patron
|
||||
name = "Bar cryogenics"
|
||||
@@ -469,11 +464,7 @@
|
||||
random = TRUE
|
||||
permanent = TRUE
|
||||
uses = -1
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
outfit = /datum/outfit/spacebartender
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/space_bar_patron/attack_hand(mob/user)
|
||||
var/despawn = alert("Return to cryosleep? (Warning, Your mob will be deleted!)",,"Yes","No")
|
||||
@@ -481,3 +472,11 @@
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user.name] climbs back into cryosleep...</span>")
|
||||
qdel(user)
|
||||
|
||||
/datum/outfit/cryobartender
|
||||
name = "Cryogenic Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
@@ -186,12 +186,11 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/syndicatesoldier/coldres
|
||||
name = "Syndicate Snow Operative"
|
||||
uniform = /obj/item/clothing/under/syndicate/coldres
|
||||
shoes = /obj/item/clothing/shoes/combat/coldres
|
||||
radio = /obj/item/device/radio/headset/syndicate/alt
|
||||
pocket1 = /obj/item/weapon/gun/ballistic/automatic/pistol
|
||||
pocket2 = /obj/item/weapon/card/id/syndicate
|
||||
has_id = 0
|
||||
outfit = /datum/outfit/snowsyndie/corpse
|
||||
|
||||
/datum/outfit/snowsyndie/corpse
|
||||
name = "Syndicate Snow Operative Corpse"
|
||||
implants = null
|
||||
|
||||
/obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive
|
||||
name = "sleeper"
|
||||
@@ -200,11 +199,20 @@
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
implants = list(/obj/item/weapon/implant/exile)
|
||||
faction = "syndicate"
|
||||
outfit = /datum/outfit/snowsyndie
|
||||
flavour_text = {"You are a syndicate operative recently awoken from cyrostatis in an underground outpost. Monitor Nanotrasen communications and record infomation. All intruders should be
|
||||
disposed of swirfly to assure no gathered infomation is stolen or lost. Try not to wander too far from the outpost as the caves can be a deadly place even for a trained operative such as yourself."}
|
||||
|
||||
/datum/outfit/snowsyndie
|
||||
name = "Syndicate Snow Operative"
|
||||
uniform = /obj/item/clothing/under/syndicate/coldres
|
||||
shoes = /obj/item/clothing/shoes/combat/coldres
|
||||
ears = /obj/item/device/radio/headset/syndicate/alt
|
||||
r_pocket = /obj/item/weapon/gun/ballistic/automatic/pistol
|
||||
l_pocket = /obj/item/weapon/card/id/syndicate
|
||||
implants = list(/obj/item/weapon/implant/exile)
|
||||
|
||||
/obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive/female
|
||||
mob_gender = FEMALE
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
explosion(M, 1, 0, 0, 0)
|
||||
explosion(M, 1, 0, 0, 0)
|
||||
qdel(src)
|
||||
|
||||
/////For the Wishgranter///////////
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
// Plasma. The oil of 26 century. The reason why you are here.
|
||||
/datum/export/material/plasma
|
||||
cost = 500
|
||||
cost = 300
|
||||
material_id = MAT_PLASMA
|
||||
message = "cm3 of plasma"
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
// Plastitanium.
|
||||
/datum/export/material/plastitanium
|
||||
cost = 750
|
||||
cost = 550
|
||||
material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium, so ((250 x 250) + (250 x 500)) / 250
|
||||
message = "cm3 of plastitanium"
|
||||
|
||||
|
||||
@@ -488,7 +488,7 @@ GLOBAL_LIST(external_rsc_urls)
|
||||
return
|
||||
if(!account_join_date)
|
||||
account_join_date = "Error"
|
||||
var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),INET_ATON('[world.internet_address]'),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')")
|
||||
var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),COALESCE(INET_ATON('[world.internet_address]'), 0),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')")
|
||||
query_log_connection.Execute()
|
||||
|
||||
/client/proc/findJoinDate()
|
||||
|
||||
@@ -39,8 +39,9 @@
|
||||
vision_flags = SEE_TURFS
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
glass_colour_type = /datum/client_colour/glass_colour/lightgreen
|
||||
var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \
|
||||
"gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat")
|
||||
var/static/list/meson_mining_failure_excuses = list("badly understood science", "damaged meson generators", "electromagnetic storms", "bluespace disruption", "ancient structures", \
|
||||
"ambient radiation", "seismic activity", "extreme weather", "strange signals", "excessive lava", "giant monsters", "a loose wire", "lens warping", "radiant heat", "volcanic ash", \
|
||||
"budget cuts","alien life","dense rock", "gravity", "dust")
|
||||
var/picked_excuse
|
||||
var/mesons_on = TRUE
|
||||
|
||||
@@ -65,7 +66,7 @@
|
||||
|
||||
if(iscarbon(user)) //only carbons can wear glasses
|
||||
var/mob/living/carbon/C = user
|
||||
if(!mesons_on)
|
||||
if(mesons_on)
|
||||
to_chat(C, "<span class='notice'>Your Meson Scanners have reactivated.</span>")
|
||||
else if(picked_excuse)
|
||||
to_chat(C, "<span class='warning'>Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.</span>")
|
||||
|
||||
@@ -100,7 +100,6 @@
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
strip_delay = 80
|
||||
put_on_delay = 60
|
||||
|
||||
|
||||
@@ -1,24 +1,35 @@
|
||||
/datum/personal_crafting
|
||||
var/busy
|
||||
var/viewing_category = 1 //typical powergamer starting on the Weapons tab
|
||||
var/list/categories = list(CAT_WEAPON,
|
||||
CAT_AMMO,
|
||||
var/viewing_subcategory = 1
|
||||
var/list/categories = list(
|
||||
CAT_WEAPONRY,
|
||||
CAT_ROBOT,
|
||||
CAT_MISC,
|
||||
CAT_PRIMAL,
|
||||
CAT_BREAD,
|
||||
CAT_BURGER,
|
||||
CAT_CAKE,
|
||||
CAT_EGG,
|
||||
CAT_MEAT,
|
||||
CAT_MISCFOOD,
|
||||
CAT_PASTRY,
|
||||
CAT_PIE,
|
||||
CAT_PIZZA,
|
||||
CAT_SALAD,
|
||||
CAT_SANDWICH,
|
||||
CAT_SOUP,
|
||||
CAT_SPAGHETTI)
|
||||
CAT_FOOD)
|
||||
var/list/subcategories = list(
|
||||
list( //Weapon subcategories
|
||||
CAT_WEAPON,
|
||||
CAT_AMMO),
|
||||
CAT_NONE, //Robot subcategories
|
||||
CAT_NONE, //Misc subcategories
|
||||
CAT_NONE, //Tribal subcategories
|
||||
list( //Food subcategories
|
||||
CAT_BREAD,
|
||||
CAT_BURGER,
|
||||
CAT_CAKE,
|
||||
CAT_EGG,
|
||||
CAT_MEAT,
|
||||
CAT_MISCFOOD,
|
||||
CAT_PASTRY,
|
||||
CAT_PIE,
|
||||
CAT_PIZZA,
|
||||
CAT_SALAD,
|
||||
CAT_SANDWICH,
|
||||
CAT_SOUP,
|
||||
CAT_SPAGHETTI))
|
||||
|
||||
var/datum/action/innate/crafting/button
|
||||
var/display_craftable_only = FALSE
|
||||
var/display_compact = TRUE
|
||||
@@ -262,11 +273,19 @@
|
||||
|
||||
/datum/personal_crafting/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/subs = list()
|
||||
var/cur_subcategory = CAT_NONE
|
||||
var/cur_category = categories[viewing_category]
|
||||
if (islist(subcategories[viewing_category]))
|
||||
subs = subcategories[viewing_category]
|
||||
cur_subcategory = subs[viewing_subcategory]
|
||||
data["busy"] = busy
|
||||
data["prev_cat"] = categories[prev_cat()]
|
||||
data["prev_subcat"] = subs[prev_subcat()]
|
||||
data["category"] = cur_category
|
||||
data["subcategory"] = cur_subcategory
|
||||
data["next_cat"] = categories[next_cat()]
|
||||
data["next_subcat"] = subs[next_subcat()]
|
||||
data["display_craftable_only"] = display_craftable_only
|
||||
data["display_compact"] = display_compact
|
||||
|
||||
@@ -275,7 +294,7 @@
|
||||
var/list/cant_craft = list()
|
||||
for(var/rec in GLOB.crafting_recipes)
|
||||
var/datum/crafting_recipe/R = rec
|
||||
if(R.category != cur_category)
|
||||
if((R.category != cur_category) || (R.subcategory != cur_subcategory))
|
||||
continue
|
||||
if(check_contents(R, surroundings))
|
||||
can_craft += list(build_recipe_data(R))
|
||||
@@ -302,29 +321,41 @@
|
||||
busy = 0
|
||||
ui_interact(usr)
|
||||
if("forwardCat") //Meow
|
||||
viewing_category = next_cat()
|
||||
to_chat(usr, "<span class='notice'>Category is now [categories[viewing_category]].</span>")
|
||||
viewing_category = next_cat(FALSE)
|
||||
. = TRUE
|
||||
if("backwardCat")
|
||||
viewing_category = prev_cat()
|
||||
to_chat(usr, "<span class='notice'>Category is now [categories[viewing_category]].</span>")
|
||||
viewing_category = prev_cat(FALSE)
|
||||
. = TRUE
|
||||
if("forwardSubCat")
|
||||
viewing_subcategory = next_subcat()
|
||||
. = TRUE
|
||||
if("backwardSubCat")
|
||||
viewing_subcategory = prev_subcat()
|
||||
. = TRUE
|
||||
if("toggle_recipes")
|
||||
display_craftable_only = !display_craftable_only
|
||||
to_chat(usr, "<span class='notice'>You will now [display_craftable_only ? "only see recipes you can craft":"see all recipes"].</span>")
|
||||
. = TRUE
|
||||
if("toggle_compact")
|
||||
display_compact = !display_compact
|
||||
to_chat(usr, "<span class='notice'>Crafting menu is now [display_compact? "compact" : "full size"].</span>")
|
||||
. = TRUE
|
||||
|
||||
|
||||
//Next works nicely with modular arithmetic
|
||||
/datum/personal_crafting/proc/next_cat()
|
||||
/datum/personal_crafting/proc/next_cat(readonly = TRUE)
|
||||
if (!readonly)
|
||||
viewing_subcategory = 1
|
||||
. = viewing_category % categories.len + 1
|
||||
|
||||
/datum/personal_crafting/proc/next_subcat()
|
||||
if(islist(subcategories[viewing_category]))
|
||||
var/list/subs = subcategories[viewing_category]
|
||||
. = viewing_subcategory % subs.len + 1
|
||||
|
||||
|
||||
//Previous can go fuck itself
|
||||
/datum/personal_crafting/proc/prev_cat()
|
||||
/datum/personal_crafting/proc/prev_cat(readonly = TRUE)
|
||||
if (!readonly)
|
||||
viewing_subcategory = 1
|
||||
if(viewing_category == categories.len)
|
||||
. = viewing_category-1
|
||||
else
|
||||
@@ -332,6 +363,18 @@
|
||||
if(. <= 0)
|
||||
. = categories.len
|
||||
|
||||
/datum/personal_crafting/proc/prev_subcat()
|
||||
if(islist(subcategories[viewing_category]))
|
||||
var/list/subs = subcategories[viewing_category]
|
||||
if(viewing_subcategory == subs.len)
|
||||
. = viewing_subcategory-1
|
||||
else
|
||||
. = viewing_subcategory % subs.len - 1
|
||||
if(. <= 0)
|
||||
. = subs.len
|
||||
else
|
||||
. = null
|
||||
|
||||
|
||||
/datum/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
|
||||
var/list/data = list()
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
var/parts[] = list() //type paths of items that will be placed in the result
|
||||
var/chem_catalysts[] = list() //like tools but for reagents
|
||||
var/category = CAT_NONE //where it shows up in the crafting UI
|
||||
var/subcategory = CAT_NONE
|
||||
|
||||
|
||||
/datum/crafting_recipe/pin_removal
|
||||
@@ -17,7 +18,8 @@
|
||||
parts = list(/obj/item/weapon/gun = 1)
|
||||
tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver, /obj/item/weapon/wirecutters)
|
||||
time = 50
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/IED
|
||||
name = "IED"
|
||||
@@ -28,7 +30,8 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/soda_cans = 1)
|
||||
parts = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans = 1)
|
||||
time = 15
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/lance
|
||||
name = "explosive lance (grenade)"
|
||||
@@ -38,7 +41,8 @@
|
||||
parts = list(/obj/item/weapon/twohanded/spear = 1,
|
||||
/obj/item/weapon/grenade = 1)
|
||||
time = 15
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/strobeshield
|
||||
name = "strobe shield"
|
||||
@@ -47,7 +51,8 @@
|
||||
/obj/item/device/assembly/flash/handheld = 1,
|
||||
/obj/item/weapon/shield/riot = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/molotov
|
||||
name = "Molotov"
|
||||
@@ -56,7 +61,8 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle = 1)
|
||||
parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/stunprod
|
||||
name = "Stunprod"
|
||||
@@ -65,7 +71,8 @@
|
||||
/obj/item/stack/rods = 1,
|
||||
/obj/item/device/assembly/igniter = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/teleprod
|
||||
name = "Teleprod"
|
||||
@@ -75,7 +82,8 @@
|
||||
/obj/item/device/assembly/igniter = 1,
|
||||
/obj/item/weapon/ore/bluespace_crystal = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/bola
|
||||
name = "Bola"
|
||||
@@ -84,6 +92,7 @@
|
||||
/obj/item/stack/sheet/metal = 6)
|
||||
time = 20//15 faster than crafting them by hand!
|
||||
category= CAT_WEAPON
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/tailclub
|
||||
name = "Tail Club"
|
||||
@@ -91,7 +100,8 @@
|
||||
reqs = list(/obj/item/severedtail = 1,
|
||||
/obj/item/stack/sheet/metal = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/tailwhip
|
||||
name = "Liz O' Nine Tails"
|
||||
@@ -99,7 +109,8 @@
|
||||
reqs = list(/obj/item/severedtail = 1,
|
||||
/obj/item/stack/cable_coil = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/ed209
|
||||
name = "ED209"
|
||||
@@ -159,6 +170,18 @@
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
|
||||
name = "Pneumatic Cannon"
|
||||
result = /obj/item/weapon/pneumatic_cannon/ghetto
|
||||
tools = list(/obj/item/weapon/weldingtool,
|
||||
/obj/item/weapon/wrench)
|
||||
reqs = list(/obj/item/stack/sheet/metal = 4,
|
||||
/obj/item/stack/packageWrap = 8,
|
||||
/obj/item/pipe = 2)
|
||||
time = 300
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/flamethrower
|
||||
name = "Flamethrower"
|
||||
result = /obj/item/weapon/flamethrower
|
||||
@@ -169,7 +192,8 @@
|
||||
/obj/item/weapon/weldingtool = 1)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 10
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/meteorshot
|
||||
name = "Meteorshot Shell"
|
||||
@@ -179,7 +203,8 @@
|
||||
/obj/item/weapon/stock_parts/manipulator = 2)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/pulseslug
|
||||
name = "Pulse Slug Shell"
|
||||
@@ -189,7 +214,8 @@
|
||||
/obj/item/weapon/stock_parts/micro_laser/ultra = 1)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/dragonsbreath
|
||||
name = "Dragonsbreath Shell"
|
||||
@@ -197,7 +223,8 @@
|
||||
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,/datum/reagent/phosphorus = 5)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/frag12
|
||||
name = "FRAG-12 Shell"
|
||||
@@ -208,7 +235,8 @@
|
||||
/datum/reagent/toxin/acid/fluacid = 5)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/ionslug
|
||||
name = "Ion Scatter Shell"
|
||||
@@ -218,7 +246,8 @@
|
||||
/obj/item/weapon/stock_parts/subspace/crystal = 1)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/improvisedslug
|
||||
name = "Improvised Shotgun Shell"
|
||||
@@ -229,7 +258,8 @@
|
||||
/datum/reagent/fuel = 10)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/improvisedslugoverload
|
||||
name = "Overload Improvised Shell"
|
||||
@@ -239,7 +269,8 @@
|
||||
/datum/reagent/toxin/plasma = 20)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/laserslug
|
||||
name = "Laser Slug Shell"
|
||||
@@ -249,7 +280,8 @@
|
||||
/obj/item/weapon/stock_parts/micro_laser/high = 1)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 5
|
||||
category = CAT_AMMO
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_AMMO
|
||||
|
||||
/datum/crafting_recipe/ishotgun
|
||||
name = "Improvised Shotgun"
|
||||
@@ -260,7 +292,8 @@
|
||||
/obj/item/stack/packageWrap = 5)
|
||||
tools = list(/obj/item/weapon/screwdriver)
|
||||
time = 100
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/chainsaw
|
||||
name = "Chainsaw"
|
||||
@@ -270,7 +303,8 @@
|
||||
/obj/item/stack/sheet/plasteel = 1)
|
||||
tools = list(/obj/item/weapon/weldingtool)
|
||||
time = 50
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/spear
|
||||
name = "Spear"
|
||||
@@ -279,7 +313,8 @@
|
||||
/obj/item/weapon/shard = 1,
|
||||
/obj/item/stack/rods = 1)
|
||||
time = 40
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/spooky_camera
|
||||
name = "Camera Obscura"
|
||||
@@ -354,7 +389,8 @@
|
||||
)
|
||||
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
|
||||
time = 30
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/chemical_payload2
|
||||
name = "Chemical Payload (gibtonite)"
|
||||
@@ -366,7 +402,8 @@
|
||||
)
|
||||
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
|
||||
time = 50
|
||||
category = CAT_WEAPON
|
||||
category = CAT_WEAPONRY
|
||||
subcategory = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/bonearmor
|
||||
name = "Bone Armor"
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
/datum/round_event/brand_intelligence/start()
|
||||
for(var/obj/machinery/vending/V in GLOB.machines)
|
||||
if(V.z != 1)
|
||||
if(V.z != ZLEVEL_STATION)
|
||||
continue
|
||||
vendingMachines.Add(V)
|
||||
if(!vendingMachines.len)
|
||||
@@ -57,7 +57,7 @@
|
||||
M.speak = rampant_speeches.Copy()
|
||||
M.speak_chance = 7
|
||||
else
|
||||
explosion(upriser.loc, -1, 1, 2, 4, 0)
|
||||
explosion(upriser.loc, -1, 1, 2, 4, 0)
|
||||
qdel(upriser)
|
||||
|
||||
kill()
|
||||
|
||||
@@ -14,9 +14,7 @@
|
||||
|
||||
/datum/round_event/ghost_role/devil/spawn_role()
|
||||
//selecting a spawn_loc
|
||||
var/list/spawn_locs = GLOB.latejoin
|
||||
var/spawn_loc = pick(spawn_locs)
|
||||
if(!spawn_loc)
|
||||
if(!SSjob.latejoin_trackers.len)
|
||||
return MAP_ERROR
|
||||
|
||||
//selecting a candidate player
|
||||
@@ -30,7 +28,7 @@
|
||||
var/datum/mind/Mind = create_devil_mind(key)
|
||||
Mind.active = 1
|
||||
|
||||
var/mob/living/carbon/human/devil = create_event_devil(spawn_loc)
|
||||
var/mob/living/carbon/human/devil = create_event_devil()
|
||||
Mind.transfer_to(devil)
|
||||
add_devil(devil, ascendable = FALSE)
|
||||
|
||||
@@ -45,6 +43,8 @@
|
||||
|
||||
/proc/create_event_devil(spawn_loc)
|
||||
var/mob/living/carbon/human/new_devil = new(spawn_loc)
|
||||
if(!spawn_loc)
|
||||
SSjob.SendToLateJoin(new_devil)
|
||||
var/datum/preferences/A = new() //Randomize appearance for the devil.
|
||||
A.copy_to(new_devil)
|
||||
new_devil.dna.update_dna_identity()
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z != 1)
|
||||
if(T.z != ZLEVEL_STATION)
|
||||
continue
|
||||
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
/datum/round_event/presents/start()
|
||||
for(var/obj/structure/flora/tree/pine/xmas in world)
|
||||
if(xmas.z != 1)
|
||||
if(xmas.z != ZLEVEL_STATION)
|
||||
continue
|
||||
for(var/turf/open/floor/T in orange(1,xmas))
|
||||
for(var/i=1,i<=rand(1,5),i++)
|
||||
|
||||
@@ -21,8 +21,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
|
||||
/datum/round_event/immovable_rod/start()
|
||||
var/startside = pick(GLOB.cardinal)
|
||||
var/turf/startT = spaceDebrisStartLoc(startside, 1)
|
||||
var/turf/endT = spaceDebrisFinishLoc(startside, 1)
|
||||
var/turf/startT = spaceDebrisStartLoc(startside, ZLEVEL_STATION)
|
||||
var/turf/endT = spaceDebrisFinishLoc(startside, ZLEVEL_STATION)
|
||||
new /obj/effect/immovablerod(startT, endT)
|
||||
|
||||
/obj/effect/immovablerod
|
||||
|
||||
@@ -8,13 +8,12 @@
|
||||
announceWhen = 50
|
||||
endWhen = 20
|
||||
var/list/area/areasToOpen = list()
|
||||
var/list/potential_areas = list(/area/atmos,
|
||||
/area/bridge,
|
||||
var/list/potential_areas = list(/area/bridge,
|
||||
/area/engine,
|
||||
/area/medical,
|
||||
/area/security,
|
||||
/area/quartermaster,
|
||||
/area/toxins)
|
||||
/area/science)
|
||||
var/severity = 1
|
||||
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/obj/machinery/telecomms/processor/P = T
|
||||
if(prob(10))
|
||||
// Damage the surrounding area to indicate that it popped
|
||||
explosion(get_turf(P), 0, 0, 2)
|
||||
explosion(get_turf(P), 0, 0, 2)
|
||||
// Only a level 1 explosion actually damages the machine
|
||||
// at all
|
||||
P.ex_act(1)
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
ruins_wizard_loadout = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if(ruins_spaceworthiness && (H.z != 1 || isspaceturf(H.loc) || isplasmaman(H)))
|
||||
if(ruins_spaceworthiness && (H.z != ZLEVEL_STATION || isspaceturf(H.loc) || isplasmaman(H)))
|
||||
continue //#savetheminers
|
||||
if(ruins_wizard_loadout && H.mind && ((H.mind in SSticker.mode.wizards) || (H.mind in SSticker.mode.apprentices)))
|
||||
continue
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
if(H.z != 1)
|
||||
if(H.z != ZLEVEL_STATION)
|
||||
continue //lets not try to strand people in space or stuck in the wizards den
|
||||
moblocs += H.loc
|
||||
mobs += H
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
var/obj/effect/abstract/proximity_checker/advanced/F = edge_turfs[T]
|
||||
F.appearance = I.appearance
|
||||
F.invisibility = 0
|
||||
F.mouse_opacity = 0
|
||||
F.layer = 5
|
||||
|
||||
/datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/T)
|
||||
|
||||
@@ -437,7 +437,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
var/list/image/delusions = list()
|
||||
|
||||
/obj/effect/hallucination/delusion/Initialize(mapload, mob/living/carbon/T,force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null)
|
||||
..()
|
||||
. = ..()
|
||||
target = T
|
||||
var/image/A = null
|
||||
var/kind = force_kind ? force_kind : pick("clown","corgi","carp","skeleton","demon","zombie")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/crafting_recipe/food
|
||||
var/real_parts
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/food/New()
|
||||
real_parts = parts.Copy()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/meat
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/xenomeatbread
|
||||
name = "Xenomeat bread"
|
||||
@@ -21,7 +21,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/xenomeat
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/spidermeatbread
|
||||
name = "Spidermeat bread"
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/banananutbread
|
||||
name = "Banana nut bread"
|
||||
@@ -42,7 +42,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/banana
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/tofubread
|
||||
name = "Tofu bread"
|
||||
@@ -52,7 +52,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/tofu
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/creamcheesebread
|
||||
name = "Cream cheese bread"
|
||||
@@ -62,7 +62,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/mimanabread
|
||||
name = "Mimana bread"
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/mime = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/butteredtoast
|
||||
name = "Buttered Toast"
|
||||
@@ -82,7 +82,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/butter = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/butteredtoast
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
/datum/crafting_recipe/food/butterbiscuit
|
||||
name = "Butter Biscuit"
|
||||
@@ -91,5 +91,5 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/butter = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/butterbiscuit
|
||||
category = CAT_BREAD
|
||||
subcategory = CAT_BREAD
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/human
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/burger
|
||||
name = "Burger"
|
||||
@@ -24,7 +24,7 @@
|
||||
)
|
||||
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/plain
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/corgiburger
|
||||
name = "Corgi burger"
|
||||
@@ -34,7 +34,7 @@
|
||||
)
|
||||
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/corgi
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/appendixburger
|
||||
name = "Appendix burger"
|
||||
@@ -43,7 +43,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/appendix
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/brainburger
|
||||
name = "Brain burger"
|
||||
@@ -52,7 +52,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/brain
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/xenoburger
|
||||
name = "Xeno burger"
|
||||
@@ -61,7 +61,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/xeno
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/bearger
|
||||
name = "Bearger"
|
||||
@@ -70,7 +70,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/bearger
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/fishburger
|
||||
name = "Fish burger"
|
||||
@@ -79,7 +79,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/fish
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/tofuburger
|
||||
name = "Tofu burger"
|
||||
@@ -88,7 +88,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/tofu
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/ghostburger
|
||||
name = "Ghost burger"
|
||||
@@ -97,7 +97,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/ghost
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/clownburger
|
||||
name = "Clown burger"
|
||||
@@ -106,7 +106,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/clown
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/mimeburger
|
||||
name = "Mime burger"
|
||||
@@ -115,7 +115,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/mime
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/redburger
|
||||
name = "Red burger"
|
||||
@@ -125,7 +125,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/red
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/orangeburger
|
||||
name = "Orange burger"
|
||||
@@ -135,7 +135,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/orange
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/yellowburger
|
||||
name = "Yellow burger"
|
||||
@@ -145,7 +145,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/yellow
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/greenburger
|
||||
name = "Green burger"
|
||||
@@ -155,7 +155,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/green
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/blueburger
|
||||
name = "Blue burger"
|
||||
@@ -165,7 +165,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/blue
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/purpleburger
|
||||
name = "Purple burger"
|
||||
@@ -175,7 +175,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/purple
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/spellburger
|
||||
name = "Spell burger"
|
||||
@@ -183,7 +183,7 @@
|
||||
/obj/item/clothing/head/wizard/fake = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/spell
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/spellburger2
|
||||
name = "Spell burger"
|
||||
@@ -192,7 +192,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/spell
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/bigbiteburger
|
||||
name = "Big bite burger"
|
||||
@@ -201,7 +201,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/bigbite
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/superbiteburger
|
||||
name = "Super bite burger"
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/superbite
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/slimeburger
|
||||
name = "Jelly burger"
|
||||
@@ -225,7 +225,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/jellyburger
|
||||
name = "Jelly burger"
|
||||
@@ -234,7 +234,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/fivealarmburger
|
||||
name = "Five alarm burger"
|
||||
@@ -243,7 +243,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/ratburger
|
||||
name = "Rat burger"
|
||||
@@ -252,7 +252,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/rat
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/baseballburger
|
||||
name = "Home run baseball burger"
|
||||
@@ -261,7 +261,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/baseball
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/baconburger
|
||||
name = "Bacon Burger"
|
||||
@@ -272,4 +272,4 @@
|
||||
)
|
||||
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/baconburger
|
||||
category = CAT_BURGER
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/carrot
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/cheesecake
|
||||
name = "Cheese cake"
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/cheese
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/applecake
|
||||
name = "Apple cake"
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/apple
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/orangecake
|
||||
name = "Orange cake"
|
||||
@@ -37,7 +37,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/orange
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/limecake
|
||||
name = "Lime cake"
|
||||
@@ -46,7 +46,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/lime
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/lemoncake
|
||||
name = "Lemon cake"
|
||||
@@ -55,7 +55,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/lemon
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/chocolatecake
|
||||
name = "Chocolate cake"
|
||||
@@ -64,7 +64,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/chocolate
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/birthdaycake
|
||||
name = "Birthday cake"
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/braincake
|
||||
name = "Brain cake"
|
||||
@@ -82,7 +82,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/brain
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/slimecake
|
||||
name = "Slime cake"
|
||||
@@ -91,7 +91,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/pumpkinspicecake
|
||||
name = "Pumpkin spice cake"
|
||||
@@ -100,7 +100,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice
|
||||
category = CAT_CAKE
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/cak
|
||||
name = "Living cat/cake hybrid"
|
||||
@@ -114,4 +114,4 @@
|
||||
/datum/reagent/teslium = 1 //To shock the whole thing into life
|
||||
)
|
||||
result = /mob/living/simple_animal/pet/cat/cak
|
||||
category = CAT_CAKE //Cat! Haha, get it? CAT? GET IT???
|
||||
subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT???
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/friedegg
|
||||
category = CAT_EGG
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/omelette
|
||||
name = "omelette"
|
||||
@@ -20,7 +20,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/omelette
|
||||
category = CAT_EGG
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/chocolateegg
|
||||
name = "Chocolate egg"
|
||||
@@ -29,7 +29,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg
|
||||
category = CAT_EGG
|
||||
subcategory = CAT_EGG
|
||||
|
||||
/datum/crafting_recipe/food/eggsbenedict
|
||||
name = "Eggs benedict"
|
||||
@@ -39,4 +39,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/benedict
|
||||
category = CAT_EGG
|
||||
subcategory = CAT_EGG
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/human
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/kebab
|
||||
name = "Kebab"
|
||||
@@ -18,7 +18,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/monkey
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/tofukebab
|
||||
name = "Tofu kebab"
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofu = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tofu
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/tailkebab
|
||||
name = "Lizard tail kebab"
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/item/severedtail = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tail
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
// see code/module/crafting/table.dm
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/fishandchips
|
||||
name = "Fish and chips"
|
||||
@@ -59,7 +59,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/fishandchips
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/fishfingers
|
||||
name = "Fish fingers"
|
||||
@@ -69,7 +69,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/sashimi
|
||||
name = "Sashimi"
|
||||
@@ -79,7 +79,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sashimi
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/spidereggsham
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
////////////////////////////////////////////////MISC RECIPE's////////////////////////////////////////////////
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/bearsteak
|
||||
name = "Filet migrawr"
|
||||
@@ -113,7 +113,7 @@
|
||||
)
|
||||
tools = list(/obj/item/weapon/lighter)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bearsteak
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/enchiladas
|
||||
name = "Enchiladas"
|
||||
@@ -123,7 +123,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/stewedsoymeat
|
||||
name = "Stewed soymeat"
|
||||
@@ -133,7 +133,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/sausage
|
||||
name = "Sausage"
|
||||
@@ -142,7 +142,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sausage
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/nugget
|
||||
name = "Chicken nugget"
|
||||
@@ -150,7 +150,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/nugget
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/rawkhinkali
|
||||
name = "Raw Khinkali"
|
||||
@@ -159,7 +159,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/faggot = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/rawkhinkali
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/pigblanket
|
||||
name = "Pig in a Blanket"
|
||||
@@ -169,4 +169,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pigblanket
|
||||
category = CAT_MEAT
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/chococoin
|
||||
name = "Choco coin"
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chococoin
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/fudgedice
|
||||
name = "Fudge dice"
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/fudgedice
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/chocoorange
|
||||
name = "Choco orange"
|
||||
@@ -37,7 +37,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chocoorange
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/loadedbakedpotato
|
||||
name = "Loaded baked potato"
|
||||
@@ -47,7 +47,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/cheesyfries
|
||||
name = "Cheesy fries"
|
||||
@@ -56,7 +56,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyfries
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/wrap
|
||||
name = "Wrap"
|
||||
@@ -65,7 +65,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/eggwrap
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/beans
|
||||
name = "Beans"
|
||||
@@ -74,7 +74,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/beans
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/eggplantparm
|
||||
name ="Eggplant parmigiana"
|
||||
@@ -83,7 +83,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/baguette
|
||||
name = "Baguette"
|
||||
@@ -93,7 +93,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/baguette
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
////////////////////////////////////////////////TOAST////////////////////////////////////////////////
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/jelliedyoast
|
||||
name = "Jellied toast"
|
||||
@@ -113,7 +113,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/twobread
|
||||
name = "Two bread"
|
||||
@@ -122,7 +122,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/twobread
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/burrito
|
||||
name ="Burrito"
|
||||
@@ -131,7 +131,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burrito
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/cheesyburrito
|
||||
name ="Cheesy burrito"
|
||||
@@ -141,7 +141,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyburrito
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/carneburrito
|
||||
name ="Carne de asada burrito"
|
||||
@@ -151,7 +151,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/carneburrito
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/fuegoburrito
|
||||
name ="Fuego plasma burrito"
|
||||
@@ -161,7 +161,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/melonfruitbowl
|
||||
name ="Melon fruit bowl"
|
||||
@@ -174,7 +174,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/spacefreezy
|
||||
name ="Space freezy"
|
||||
@@ -184,7 +184,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/spacefreezy
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/sundae
|
||||
name ="Sundae"
|
||||
@@ -195,7 +195,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sundae
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/honkdae
|
||||
name ="Honkdae"
|
||||
@@ -207,7 +207,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/honkdae
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/nachos
|
||||
name ="Nachos"
|
||||
@@ -216,7 +216,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/nachos
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/cheesynachos
|
||||
name ="Cheesy nachos"
|
||||
@@ -226,7 +226,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cheesynachos
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/cubannachos
|
||||
name ="Cuban nachos"
|
||||
@@ -236,7 +236,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cubannachos
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/melonkeg
|
||||
name ="Melon keg"
|
||||
@@ -247,7 +247,7 @@
|
||||
)
|
||||
parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/melonkeg
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/honeybar
|
||||
name = "Honey nut bar"
|
||||
@@ -256,7 +256,7 @@
|
||||
/datum/reagent/consumable/honey = 5
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/honeybar
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/stuffedlegion
|
||||
@@ -269,7 +269,7 @@
|
||||
/datum/reagent/consumable/capsaicin = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/stuffedlegion
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/lizardwine
|
||||
@@ -280,7 +280,7 @@
|
||||
/datum/reagent/consumable/ethanol = 100
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/drinks/bottle/lizardwine
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/powercrepe
|
||||
@@ -294,7 +294,7 @@
|
||||
/obj/item/weapon/melee/sabre = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/powercrepe
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/taco
|
||||
name ="Classic Taco"
|
||||
@@ -305,7 +305,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/taco
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/tacoplain
|
||||
name ="Plain Taco"
|
||||
@@ -315,7 +315,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/taco/plain
|
||||
category = CAT_MISCFOOD
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/branrequests
|
||||
name = "Bran Requests Cereal"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/donut
|
||||
time = 15
|
||||
@@ -21,7 +21,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donut
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/jellydonut
|
||||
name = "Jelly donut"
|
||||
@@ -30,7 +30,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/cherryjellydonut
|
||||
name = "Cherry jelly donut"
|
||||
@@ -39,7 +39,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/cherryjelly
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/slimejellydonut
|
||||
name = "Slime jelly donut"
|
||||
@@ -48,7 +48,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/slimejelly
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
////////////////////////////////////////////////WAFFLES////////////////////////////////////////////////
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/waffles
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/soylenviridians
|
||||
@@ -69,7 +69,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/soylentgreen
|
||||
name = "Soylent green"
|
||||
@@ -78,7 +78,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/rofflewaffles
|
||||
@@ -88,7 +88,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
////////////////////////////////////////////////DONKPOCCKETS////////////////////////////////////////////////
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/faggot = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/dankpocket
|
||||
time = 15
|
||||
@@ -110,7 +110,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cannabis = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/dankpocket
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
////////////////////////////////////////////////MUFFINS////////////////////////////////////////////////
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/muffin
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/berrymuffin
|
||||
name = "Berry muffin"
|
||||
@@ -132,7 +132,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/muffin/berry
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/booberrymuffin
|
||||
name = "Booberry muffin"
|
||||
@@ -143,7 +143,7 @@
|
||||
/obj/item/weapon/ectoplasm = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/chawanmushi
|
||||
name = "Chawanmushi"
|
||||
@@ -154,7 +154,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
////////////////////////////////////////////OTHER////////////////////////////////////////////
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sausage = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/hotdog
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/meatbun
|
||||
name = "Meat bun"
|
||||
@@ -177,7 +177,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/meatbun
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/khachapuri
|
||||
name = "Khachapuri"
|
||||
@@ -187,7 +187,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/khachapuri
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/sugarcookie
|
||||
time = 15
|
||||
@@ -197,7 +197,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/fortunecookie
|
||||
time = 15
|
||||
@@ -210,7 +210,7 @@
|
||||
/obj/item/weapon/paper = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/poppypretzel
|
||||
time = 15
|
||||
@@ -220,7 +220,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/plumphelmetbiscuit
|
||||
time = 15
|
||||
@@ -230,7 +230,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/cracker
|
||||
time = 15
|
||||
@@ -240,7 +240,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cracker
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/chococornet
|
||||
name = "Choco cornet"
|
||||
@@ -250,7 +250,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chococornet
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/oatmealcookie
|
||||
name = "Oatmeal cookie"
|
||||
@@ -268,7 +268,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/raisincookie
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/cherrycupcake
|
||||
name = "Cherry cupcake"
|
||||
@@ -277,7 +277,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cherrycupcake
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/bluecherrycupcake
|
||||
name = "Blue cherry cupcake"
|
||||
@@ -286,7 +286,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/datum/crafting_recipe/food/honeybun
|
||||
name = "Honey bun"
|
||||
@@ -295,4 +295,4 @@
|
||||
/datum/reagent/consumable/honey = 5
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/honeybun
|
||||
category = CAT_PASTRY
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/cream
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/meatpie
|
||||
name = "Meat pie"
|
||||
@@ -22,7 +22,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/meatpie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/tofupie
|
||||
name = "Tofu pie"
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofu = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/tofupie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/xenopie
|
||||
name = "Xeno pie"
|
||||
@@ -40,7 +40,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/xemeatpie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/cherrypie
|
||||
name = "Cherry pie"
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/cherrypie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/berryclafoutis
|
||||
name = "Berry clafoutis"
|
||||
@@ -58,7 +58,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/bearypie
|
||||
name = "Beary Pie"
|
||||
@@ -68,7 +68,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/bearypie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/amanitapie
|
||||
name = "Amanita pie"
|
||||
@@ -77,7 +77,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/amanita_pie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/plumppie
|
||||
name = "Plump pie"
|
||||
@@ -86,7 +86,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/applepie
|
||||
name = "Apple pie"
|
||||
@@ -95,7 +95,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/applepie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/pumpkinpie
|
||||
name = "Pumpkin pie"
|
||||
@@ -106,7 +106,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/goldenappletart
|
||||
name = "Golden apple tart"
|
||||
@@ -117,7 +117,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/appletart
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/grapetart
|
||||
name = "Grape tart"
|
||||
@@ -128,7 +128,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/grapetart
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/blumpkinpie
|
||||
name = "Blumpkin pie"
|
||||
@@ -139,7 +139,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/dulcedebatata
|
||||
name = "Dulce de batata"
|
||||
@@ -149,7 +149,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
/datum/crafting_recipe/food/frostypie
|
||||
name = "Frosty pie"
|
||||
@@ -158,4 +158,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pie/frostypie
|
||||
category = CAT_PIE
|
||||
subcategory = CAT_PIE
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/margherita
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
/datum/crafting_recipe/food/meatpizza
|
||||
name = "Meat pizza"
|
||||
@@ -22,7 +22,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meat
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
/datum/crafting_recipe/food/mushroompizza
|
||||
name = "Mushroom pizza"
|
||||
@@ -31,7 +31,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom = 5
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
/datum/crafting_recipe/food/vegetablepizza
|
||||
name = "Vegetable pizza"
|
||||
@@ -43,7 +43,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
/datum/crafting_recipe/food/donpocketpizza
|
||||
name = "Donkpocket pizza"
|
||||
@@ -54,7 +54,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
/datum/crafting_recipe/food/dankpizza
|
||||
name = "Dank pizza"
|
||||
@@ -65,7 +65,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/dank
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
/datum/crafting_recipe/food/sassysagepizza
|
||||
name = "Sassysage pizza"
|
||||
@@ -76,4 +76,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage
|
||||
category = CAT_PIZZA
|
||||
subcategory = CAT_PIZZA
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/herbsalad
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/aesirsalad
|
||||
name = "Aesir salad"
|
||||
@@ -21,7 +21,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/aesirsalad
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/validsalad
|
||||
name = "Valid salad"
|
||||
@@ -32,7 +32,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/faggot = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/validsalad
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/monkeysdelight
|
||||
name = "Monkeys delight"
|
||||
@@ -45,7 +45,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/oatmeal
|
||||
name = "Oatmeal"
|
||||
@@ -55,7 +55,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/fruitsalad
|
||||
name = "Fruit salad"
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/fruit
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/junglesalad
|
||||
name = "Jungle salad"
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/jungle
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/citrusdelight
|
||||
name = "Citrus delight"
|
||||
@@ -93,7 +93,7 @@
|
||||
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/ricepork
|
||||
name = "Rice and pork"
|
||||
@@ -102,7 +102,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepork
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/eggbowl
|
||||
name = "Egg bowl"
|
||||
@@ -113,7 +113,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
/datum/crafting_recipe/food/ricepudding
|
||||
name = "Rice pudding"
|
||||
@@ -123,4 +123,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding
|
||||
category = CAT_SALAD
|
||||
subcategory = CAT_SALAD
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sandwich
|
||||
category = CAT_SANDWICH
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/grilledcheesesandwich
|
||||
name = "Grilled cheese sandwich"
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/grilledcheese
|
||||
category = CAT_SANDWICH
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/slimesandwich
|
||||
name = "Jelly sandwich"
|
||||
@@ -32,7 +32,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
|
||||
category = CAT_SANDWICH
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/cherrysandwich
|
||||
name = "Jelly sandwich"
|
||||
@@ -41,7 +41,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
|
||||
category = CAT_SANDWICH
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/icecreamsandwich
|
||||
name = "Icecream sandwich"
|
||||
@@ -51,7 +51,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich
|
||||
category = CAT_SANDWICH
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/notasandwich
|
||||
name = "Not a sandwich"
|
||||
@@ -60,7 +60,7 @@
|
||||
/obj/item/clothing/mask/fakemoustache = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich
|
||||
category = CAT_SANDWICH
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/meatball
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/vegetablesoup
|
||||
name = "Vegetable soup"
|
||||
@@ -26,7 +26,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/vegetable
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/nettlesoup
|
||||
name = "Nettle soup"
|
||||
@@ -38,7 +38,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/nettle
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/wingfangchu
|
||||
name = "Wingfangchu"
|
||||
@@ -48,7 +48,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/wishsoup
|
||||
name = "Wish soup"
|
||||
@@ -57,7 +57,7 @@
|
||||
/obj/item/weapon/reagent_containers/glass/bowl = 1
|
||||
)
|
||||
result= /obj/item/weapon/reagent_containers/food/snacks/soup/wish
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/hotchili
|
||||
name = "Hot chili"
|
||||
@@ -68,7 +68,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/hotchili
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/coldchili
|
||||
name = "Cold chili"
|
||||
@@ -79,7 +79,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/coldchili
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/tomatosoup
|
||||
name = "Tomato soup"
|
||||
@@ -89,7 +89,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/eyeballsoup
|
||||
name = "Eyeball soup"
|
||||
@@ -100,7 +100,7 @@
|
||||
/obj/item/organ/eyes = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/milosoup
|
||||
@@ -112,7 +112,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofu = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/milo
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/bloodsoup
|
||||
name = "Blood soup"
|
||||
@@ -122,7 +122,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/blood
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/slimesoup
|
||||
name = "Slime soup"
|
||||
@@ -132,7 +132,7 @@
|
||||
/obj/item/weapon/reagent_containers/glass/bowl = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/slime
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/clownstears
|
||||
name = "Clowns tears"
|
||||
@@ -143,7 +143,7 @@
|
||||
/obj/item/weapon/ore/bananium = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/clownstears
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/mysterysoup
|
||||
name = "Mystery soup"
|
||||
@@ -156,7 +156,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/mystery
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/mushroomsoup
|
||||
name = "Mushroom soup"
|
||||
@@ -167,7 +167,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/mushroom
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/beetsoup
|
||||
name = "Beet soup"
|
||||
@@ -178,7 +178,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/stew
|
||||
name = "Stew"
|
||||
@@ -193,7 +193,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/stew
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/spacylibertyduff
|
||||
name = "Spacy liberty duff"
|
||||
@@ -203,7 +203,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/spacylibertyduff
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/amanitajelly
|
||||
name = "Amanita jelly"
|
||||
@@ -213,7 +213,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita = 3
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/sweetpotatosoup
|
||||
name = "Sweet potato soup"
|
||||
@@ -224,7 +224,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato/sweet = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
/datum/crafting_recipe/food/redbeetsoup
|
||||
name = "Red beet soup"
|
||||
@@ -235,4 +235,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet/red
|
||||
category = CAT_SOUP
|
||||
subcategory = CAT_SOUP
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
/datum/crafting_recipe/food/copypasta
|
||||
name = "Copypasta"
|
||||
@@ -18,7 +18,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastatomato = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/copypasta
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
/datum/crafting_recipe/food/spaghettimeatball
|
||||
name = "Spaghetti meatball"
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/faggot = 2
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
/datum/crafting_recipe/food/spesslaw
|
||||
name = "Spesslaw"
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/faggot = 4
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/spesslaw
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
/datum/crafting_recipe/food/beefnoodle
|
||||
name = "Beef noodle"
|
||||
@@ -47,7 +47,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/beefnoodle
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
/datum/crafting_recipe/food/chowmein
|
||||
name = "Chowmein"
|
||||
@@ -58,7 +58,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chowmein
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
/datum/crafting_recipe/food/butternoodles
|
||||
name = "Butter Noodles"
|
||||
@@ -67,4 +67,4 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/butter = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/butternoodles
|
||||
category = CAT_SPAGHETTI
|
||||
subcategory = CAT_SPAGHETTI
|
||||
@@ -98,9 +98,9 @@ GLOBAL_VAR_CONST(access_away_generic3, 207)
|
||||
GLOBAL_VAR_CONST(access_away_generic4, 208)
|
||||
|
||||
/obj/var/list/req_access = null
|
||||
/obj/var/req_access_txt = "0"
|
||||
/obj/var/req_access_txt = "0" as text
|
||||
/obj/var/list/req_one_access = null
|
||||
/obj/var/req_one_access_txt = "0"
|
||||
/obj/var/req_one_access_txt = "0" as text
|
||||
|
||||
//returns 1 if this mob has sufficient access to use this object
|
||||
/obj/proc/allowed(mob/M)
|
||||
@@ -149,10 +149,14 @@ GLOBAL_VAR_CONST(access_away_generic4, 208)
|
||||
//Call this before using req_access or req_one_access directly
|
||||
/obj/proc/gen_access()
|
||||
//These generations have been moved out of /obj/New() because they were slowing down the creation of objects that never even used the access system.
|
||||
for(var/a in text2access(req_access_txt))
|
||||
req_access += a
|
||||
for(var/b in text2access(req_one_access_txt))
|
||||
req_one_access += b
|
||||
if(!req_access)
|
||||
req_access = list()
|
||||
for(var/a in text2access(req_access_txt))
|
||||
req_access += a
|
||||
if(!req_one_access)
|
||||
req_one_access = list()
|
||||
for(var/b in text2access(req_one_access_txt))
|
||||
req_one_access += b
|
||||
|
||||
/obj/proc/check_access(obj/item/I)
|
||||
gen_access()
|
||||
|
||||
@@ -89,7 +89,8 @@ Shaft Miner
|
||||
backpack_contents = list(
|
||||
/obj/item/weapon/storage/bag/ore=1,\
|
||||
/obj/item/weapon/kitchen/knife/combat/survival=1,\
|
||||
/obj/item/weapon/mining_voucher=1)
|
||||
/obj/item/weapon/mining_voucher=1,\
|
||||
/obj/item/stack/marker_beacon/ten=1)
|
||||
|
||||
backpack = /obj/item/weapon/storage/backpack/explorer
|
||||
satchel = /obj/item/weapon/storage/backpack/satchel/explorer
|
||||
@@ -113,7 +114,8 @@ Shaft Miner
|
||||
/obj/item/weapon/kitchen/knife/combat/survival=1,
|
||||
/obj/item/weapon/mining_voucher=1,
|
||||
/obj/item/device/t_scanner/adv_mining_scanner/lesser=1,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator=1)
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator=1,\
|
||||
/obj/item/stack/marker_beacon/ten=1)
|
||||
|
||||
/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
|
||||
@@ -98,13 +98,16 @@ Station Engineer
|
||||
pda_slot = slot_l_store
|
||||
backpack_contents = list(/obj/item/device/modular_computer/tablet/preset/advanced=1)
|
||||
|
||||
/datum/outfit/job/engineer/rig
|
||||
/datum/outfit/job/engineer/gloved
|
||||
name = "Station Engineer (Gloves)"
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
|
||||
/datum/outfit/job/engineer/gloved/rig
|
||||
name = "Station Engineer (Hardsuit)"
|
||||
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/engine
|
||||
suit_store = /obj/item/weapon/tank/internals/oxygen
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
head = null
|
||||
internals_slot = slot_s_store
|
||||
|
||||
|
||||
+185
-190
@@ -1,190 +1,185 @@
|
||||
/datum/job
|
||||
//The name of the job
|
||||
var/title = "NOPE"
|
||||
|
||||
//Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access
|
||||
var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population)
|
||||
var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!)
|
||||
|
||||
//Determines who can demote this position
|
||||
var/department_head = list()
|
||||
|
||||
//Tells the given channels that the given mob is the new department head. See communications.dm for valid channels.
|
||||
var/list/head_announce = null
|
||||
|
||||
//Bitflags for the job
|
||||
var/flag = 0
|
||||
var/department_flag = 0
|
||||
|
||||
//Players will be allowed to spawn in as jobs that are set to "Station"
|
||||
var/faction = "None"
|
||||
|
||||
//How many players can be this job
|
||||
var/total_positions = 0
|
||||
|
||||
//How many players can spawn in as this job
|
||||
var/spawn_positions = 0
|
||||
|
||||
//How many players have this job
|
||||
var/current_positions = 0
|
||||
|
||||
//Supervisors, who this person answers to directly
|
||||
var/supervisors = ""
|
||||
|
||||
//Sellection screen color
|
||||
var/selection_color = "#ffffff"
|
||||
|
||||
|
||||
//If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
|
||||
var/req_admin_notify
|
||||
|
||||
//If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
|
||||
var/minimal_player_age = 0
|
||||
|
||||
var/outfit = null
|
||||
|
||||
//Only override this proc
|
||||
//H is usually a human unless an /equip override transformed it
|
||||
/datum/job/proc/after_spawn(mob/living/H, mob/M)
|
||||
//do actions on H but send messages to M as the key may not have been transferred_yet
|
||||
|
||||
|
||||
/datum/job/proc/announce(mob/living/carbon/human/H)
|
||||
if(head_announce)
|
||||
announce_head(H, head_announce)
|
||||
|
||||
|
||||
//Don't override this unless the job transforms into a non-human (Silicons do this for example)
|
||||
/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE)
|
||||
if(!H)
|
||||
return 0
|
||||
|
||||
//Equip the rest of the gear
|
||||
H.dna.species.before_equip_job(src, H, visualsOnly)
|
||||
|
||||
if(outfit)
|
||||
H.equipOutfit(outfit, visualsOnly)
|
||||
|
||||
H.dna.species.after_equip_job(src, H, visualsOnly)
|
||||
|
||||
if(!visualsOnly && announce)
|
||||
announce(H)
|
||||
|
||||
if(config.enforce_human_authority && (title in GLOB.command_positions))
|
||||
H.dna.features["tail_human"] = "None"
|
||||
H.dna.features["ears"] = "None"
|
||||
H.regenerate_icons()
|
||||
|
||||
/datum/job/proc/get_access()
|
||||
if(!config) //Needed for robots.
|
||||
return src.minimal_access.Copy()
|
||||
|
||||
. = list()
|
||||
|
||||
if(config.jobs_have_minimal_access)
|
||||
. = src.minimal_access.Copy()
|
||||
else
|
||||
. = src.access.Copy()
|
||||
|
||||
if(config.jobs_have_maint_access & EVERYONE_HAS_MAINT_ACCESS) //Config has global maint access set
|
||||
. |= list(GLOB.access_maint_tunnels)
|
||||
|
||||
/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
|
||||
if(H && GLOB.announcement_systems.len)
|
||||
//timer because these should come after the captain announcement
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1))
|
||||
|
||||
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
|
||||
/datum/job/proc/player_old_enough(client/C)
|
||||
if(available_in_days(C) == 0)
|
||||
return 1 //Available in 0 days = available right now = player is old enough to play.
|
||||
return 0
|
||||
|
||||
|
||||
/datum/job/proc/available_in_days(client/C)
|
||||
if(!C)
|
||||
return 0
|
||||
if(!config.use_age_restriction_for_jobs)
|
||||
return 0
|
||||
if(!isnum(C.player_age))
|
||||
return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
|
||||
if(!isnum(minimal_player_age))
|
||||
return 0
|
||||
|
||||
return max(0, minimal_player_age - C.player_age)
|
||||
|
||||
/datum/job/proc/config_check()
|
||||
return 1
|
||||
|
||||
/datum/job/proc/map_check()
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/outfit/job
|
||||
name = "Standard Gear"
|
||||
|
||||
var/jobtype = null
|
||||
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
id = /obj/item/weapon/card/id
|
||||
ears = /obj/item/device/radio/headset
|
||||
belt = /obj/item/device/pda
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
|
||||
var/list/implants = null
|
||||
|
||||
var/backpack = /obj/item/weapon/storage/backpack
|
||||
var/satchel = /obj/item/weapon/storage/backpack/satchel
|
||||
var/dufflebag = /obj/item/weapon/storage/backpack/dufflebag
|
||||
var/box = /obj/item/weapon/storage/box/survival
|
||||
|
||||
var/pda_slot = slot_belt
|
||||
|
||||
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
switch(H.backbag)
|
||||
if(GBACKPACK)
|
||||
back = /obj/item/weapon/storage/backpack //Grey backpack
|
||||
if(GSATCHEL)
|
||||
back = /obj/item/weapon/storage/backpack/satchel //Grey satchel
|
||||
if(GDUFFLEBAG)
|
||||
back = /obj/item/weapon/storage/backpack/dufflebag //Grey Dufflebag
|
||||
if(LSATCHEL)
|
||||
back = /obj/item/weapon/storage/backpack/satchel/leather //Leather Satchel
|
||||
if(DSATCHEL)
|
||||
back = satchel //Department satchel
|
||||
if(DDUFFLEBAG)
|
||||
back = dufflebag //Department dufflebag
|
||||
else
|
||||
back = backpack //Department backpack
|
||||
|
||||
if(box)
|
||||
backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
|
||||
backpack_contents[box] = 1
|
||||
|
||||
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
var/datum/job/J = SSjob.GetJobType(jobtype)
|
||||
if(!J)
|
||||
J = SSjob.GetJob(H.job)
|
||||
|
||||
var/obj/item/weapon/card/id/C = H.wear_id
|
||||
if(istype(C))
|
||||
C.access = J.get_access()
|
||||
C.registered_name = H.real_name
|
||||
C.assignment = J.title
|
||||
C.update_label()
|
||||
H.sec_hud_set_ID()
|
||||
|
||||
var/obj/item/device/pda/PDA = H.get_item_by_slot(pda_slot)
|
||||
if(istype(PDA))
|
||||
PDA.owner = H.real_name
|
||||
PDA.ownjob = J.title
|
||||
PDA.update_label()
|
||||
|
||||
if(implants)
|
||||
for(var/implant_type in implants)
|
||||
var/obj/item/weapon/implant/I = new implant_type(H)
|
||||
I.implant(H, null, silent=TRUE)
|
||||
/datum/job
|
||||
//The name of the job
|
||||
var/title = "NOPE"
|
||||
|
||||
//Job access. The use of minimal_access or access is determined by a config setting: config.jobs_have_minimal_access
|
||||
var/list/minimal_access = list() //Useful for servers which prefer to only have access given to the places a job absolutely needs (Larger server population)
|
||||
var/list/access = list() //Useful for servers which either have fewer players, so each person needs to fill more than one role, or servers which like to give more access, so players can't hide forever in their super secure departments (I'm looking at you, chemistry!)
|
||||
|
||||
//Determines who can demote this position
|
||||
var/department_head = list()
|
||||
|
||||
//Tells the given channels that the given mob is the new department head. See communications.dm for valid channels.
|
||||
var/list/head_announce = null
|
||||
|
||||
//Bitflags for the job
|
||||
var/flag = 0
|
||||
var/department_flag = 0
|
||||
|
||||
//Players will be allowed to spawn in as jobs that are set to "Station"
|
||||
var/faction = "None"
|
||||
|
||||
//How many players can be this job
|
||||
var/total_positions = 0
|
||||
|
||||
//How many players can spawn in as this job
|
||||
var/spawn_positions = 0
|
||||
|
||||
//How many players have this job
|
||||
var/current_positions = 0
|
||||
|
||||
//Supervisors, who this person answers to directly
|
||||
var/supervisors = ""
|
||||
|
||||
//Sellection screen color
|
||||
var/selection_color = "#ffffff"
|
||||
|
||||
|
||||
//If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
|
||||
var/req_admin_notify
|
||||
|
||||
//If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
|
||||
var/minimal_player_age = 0
|
||||
|
||||
var/outfit = null
|
||||
|
||||
//Only override this proc
|
||||
//H is usually a human unless an /equip override transformed it
|
||||
/datum/job/proc/after_spawn(mob/living/H, mob/M)
|
||||
//do actions on H but send messages to M as the key may not have been transferred_yet
|
||||
|
||||
|
||||
/datum/job/proc/announce(mob/living/carbon/human/H)
|
||||
if(head_announce)
|
||||
announce_head(H, head_announce)
|
||||
|
||||
|
||||
//Don't override this unless the job transforms into a non-human (Silicons do this for example)
|
||||
/datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE)
|
||||
if(!H)
|
||||
return 0
|
||||
|
||||
//Equip the rest of the gear
|
||||
H.dna.species.before_equip_job(src, H, visualsOnly)
|
||||
|
||||
if(outfit)
|
||||
H.equipOutfit(outfit, visualsOnly)
|
||||
|
||||
H.dna.species.after_equip_job(src, H, visualsOnly)
|
||||
|
||||
if(!visualsOnly && announce)
|
||||
announce(H)
|
||||
|
||||
if(config.enforce_human_authority && (title in GLOB.command_positions))
|
||||
H.dna.features["tail_human"] = "None"
|
||||
H.dna.features["ears"] = "None"
|
||||
H.regenerate_icons()
|
||||
|
||||
/datum/job/proc/get_access()
|
||||
if(!config) //Needed for robots.
|
||||
return src.minimal_access.Copy()
|
||||
|
||||
. = list()
|
||||
|
||||
if(config.jobs_have_minimal_access)
|
||||
. = src.minimal_access.Copy()
|
||||
else
|
||||
. = src.access.Copy()
|
||||
|
||||
if(config.jobs_have_maint_access & EVERYONE_HAS_MAINT_ACCESS) //Config has global maint access set
|
||||
. |= list(GLOB.access_maint_tunnels)
|
||||
|
||||
/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
|
||||
if(H && GLOB.announcement_systems.len)
|
||||
//timer because these should come after the captain announcement
|
||||
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/addtimer, CALLBACK(pick(GLOB.announcement_systems), /obj/machinery/announcement_system/proc/announce, "NEWHEAD", H.real_name, H.job, channels), 1))
|
||||
|
||||
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
|
||||
/datum/job/proc/player_old_enough(client/C)
|
||||
if(available_in_days(C) == 0)
|
||||
return 1 //Available in 0 days = available right now = player is old enough to play.
|
||||
return 0
|
||||
|
||||
|
||||
/datum/job/proc/available_in_days(client/C)
|
||||
if(!C)
|
||||
return 0
|
||||
if(!config.use_age_restriction_for_jobs)
|
||||
return 0
|
||||
if(!isnum(C.player_age))
|
||||
return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
|
||||
if(!isnum(minimal_player_age))
|
||||
return 0
|
||||
|
||||
return max(0, minimal_player_age - C.player_age)
|
||||
|
||||
/datum/job/proc/config_check()
|
||||
return 1
|
||||
|
||||
/datum/job/proc/map_check()
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/outfit/job
|
||||
name = "Standard Gear"
|
||||
|
||||
var/jobtype = null
|
||||
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
id = /obj/item/weapon/card/id
|
||||
ears = /obj/item/device/radio/headset
|
||||
belt = /obj/item/device/pda
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
|
||||
var/backpack = /obj/item/weapon/storage/backpack
|
||||
var/satchel = /obj/item/weapon/storage/backpack/satchel
|
||||
var/dufflebag = /obj/item/weapon/storage/backpack/dufflebag
|
||||
var/box = /obj/item/weapon/storage/box/survival
|
||||
|
||||
var/pda_slot = slot_belt
|
||||
|
||||
/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
switch(H.backbag)
|
||||
if(GBACKPACK)
|
||||
back = /obj/item/weapon/storage/backpack //Grey backpack
|
||||
if(GSATCHEL)
|
||||
back = /obj/item/weapon/storage/backpack/satchel //Grey satchel
|
||||
if(GDUFFLEBAG)
|
||||
back = /obj/item/weapon/storage/backpack/dufflebag //Grey Dufflebag
|
||||
if(LSATCHEL)
|
||||
back = /obj/item/weapon/storage/backpack/satchel/leather //Leather Satchel
|
||||
if(DSATCHEL)
|
||||
back = satchel //Department satchel
|
||||
if(DDUFFLEBAG)
|
||||
back = dufflebag //Department dufflebag
|
||||
else
|
||||
back = backpack //Department backpack
|
||||
|
||||
if(box)
|
||||
if(!backpack_contents)
|
||||
backpack_contents = list()
|
||||
backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
|
||||
backpack_contents[box] = 1
|
||||
|
||||
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
var/datum/job/J = SSjob.GetJobType(jobtype)
|
||||
if(!J)
|
||||
J = SSjob.GetJob(H.job)
|
||||
|
||||
var/obj/item/weapon/card/id/C = H.wear_id
|
||||
if(istype(C))
|
||||
C.access = J.get_access()
|
||||
C.registered_name = H.real_name
|
||||
C.assignment = J.title
|
||||
C.update_label()
|
||||
H.sec_hud_set_ID()
|
||||
|
||||
var/obj/item/device/pda/PDA = H.get_item_by_slot(pda_slot)
|
||||
if(istype(PDA))
|
||||
PDA.owner = H.real_name
|
||||
PDA.ownjob = J.title
|
||||
PDA.update_label()
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/datum/language/beachbum
|
||||
name = "Beach Bumbian"
|
||||
desc = "For when you're too toasted to speak normally."
|
||||
speech_verb = "mumbles"
|
||||
ask_verb = "grills"
|
||||
exclaim_verb = "hollers"
|
||||
key = "u"
|
||||
space_chance = 85
|
||||
default_priority = 90
|
||||
syllables = list("cowabunga", "rad", "radical", "dudes", "bogus", "weeed", "every",
|
||||
"dee", "dah", "woah", "surf", "blazed", "high", "heinous", "day",
|
||||
"brah", "bro", "blown", "catch", "body", "beach", "oooo", "twenty",
|
||||
"shiz", "phiz", "wizz", "pop", "chill", "awesome", "dude", "it",
|
||||
"wax", "stoked", "yes", "ding", "way", "no", "wicked", "aaaa",
|
||||
"cool", "hoo", "wah", "wee", "man", "maaaaaan", "mate", "wick",
|
||||
"oh", "ocean", "up", "out", "rip", "slide", "big", "stomp",
|
||||
"weed", "pot", "smoke", "four-twenty", "shove", "wacky", "hah",
|
||||
"sick", "slash", "spit", "stoked", "shallow", "gun", "party",
|
||||
"heavy", "stellar", "excellent", "triumphant", "babe", "four",
|
||||
"tail", "trim", "tube", "wobble", "roll", "gnarly", "epic")
|
||||
|
||||
icon_state = "beach"
|
||||
@@ -5,9 +5,7 @@
|
||||
item_state = "mining_hammer1"
|
||||
name = "proto-kinetic crusher"
|
||||
desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
|
||||
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna.\
|
||||
\n<span class='info'>Mark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \
|
||||
This weapon is only particularly effective against large creatures.</span>"
|
||||
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna."
|
||||
force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BACK
|
||||
@@ -21,9 +19,97 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
|
||||
sharpness = IS_SHARP
|
||||
var/list/trophies = list()
|
||||
var/charged = TRUE
|
||||
var/charge_time = 14
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/Destroy()
|
||||
for(var/a in trophies)
|
||||
qdel(a)
|
||||
trophies = null
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/examine(mob/living/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Mark a large creature with the destabilizing force, then hit them in melee to do <b>50</b> damage.</span>")
|
||||
to_chat(user, "<span class='notice'>Does <b>80</b> damage if the target is backstabbed, instead of <b>50</b>.</span>")
|
||||
for(var/t in trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
to_chat(user, "<span class='notice'>It has \a [T] attached, which causes [T.effect_desc()].</span>")
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/attackby(obj/item/A, mob/living/user)
|
||||
if(istype(A, /obj/item/weapon/crowbar))
|
||||
if(LAZYLEN(trophies))
|
||||
to_chat(user, "<span class='notice'>You remove [src]'s trophies.</span>")
|
||||
playsound(loc, A.usesound, 100, 1)
|
||||
for(var/t in trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.remove_from(src, user)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There are no trophies on [src].</span>")
|
||||
else if(istype(A, /obj/item/crusher_trophy))
|
||||
var/obj/item/crusher_trophy/T = A
|
||||
T.add_to(src, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/attack(mob/living/target, mob/living/carbon/user)
|
||||
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
var/target_health = target.health
|
||||
..()
|
||||
for(var/t in trophies)
|
||||
if(!QDELETED(target))
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_melee_hit(target, user)
|
||||
if(!QDELETED(C) && !QDELETED(target))
|
||||
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/living/user, proximity_flag)
|
||||
if(!proximity_flag && charged)//Mark a target, or mine a tile.
|
||||
var/turf/proj_turf = user.loc
|
||||
if(!isturf(proj_turf))
|
||||
return
|
||||
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
|
||||
for(var/t in trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_projectile_fire(D, user)
|
||||
D.preparePixelProjectile(target, get_turf(target), user)
|
||||
D.firer = user
|
||||
D.hammer_synced = src
|
||||
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
|
||||
D.fire()
|
||||
charged = FALSE
|
||||
icon_state = "mining_hammer1_uncharged"
|
||||
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
|
||||
return
|
||||
if(proximity_flag && isliving(target))
|
||||
var/mob/living/L = target
|
||||
var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
|
||||
if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
|
||||
return
|
||||
var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
var/target_health = L.health
|
||||
for(var/t in trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_mark_detonation(target, user)
|
||||
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
|
||||
var/backstab_dir = get_dir(user, L)
|
||||
var/def_check = L.getarmor(type = "bomb")
|
||||
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
|
||||
L.apply_damage(80, BRUTE, blocked = def_check)
|
||||
playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
|
||||
else
|
||||
L.apply_damage(50, BRUTE, blocked = def_check)
|
||||
if(!QDELETED(C) && !QDELETED(L))
|
||||
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
|
||||
if(!charged)
|
||||
charged = TRUE
|
||||
icon_state = "mining_hammer1"
|
||||
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
|
||||
|
||||
//destablizing force
|
||||
/obj/item/projectile/destabilizer
|
||||
name = "destabilizing force"
|
||||
icon_state = "pulse1"
|
||||
@@ -42,8 +128,13 @@
|
||||
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean
|
||||
var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
|
||||
CM.hammer_synced = hammer_synced
|
||||
if(hammer_synced)
|
||||
CM.hammer_synced = hammer_synced
|
||||
for(var/t in hammer_synced.trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_mark_application(target, CM, had_effect)
|
||||
var/target_turf = get_turf(target)
|
||||
if(ismineralturf(target_turf))
|
||||
var/turf/closed/mineral/M = target_turf
|
||||
@@ -51,36 +142,153 @@
|
||||
M.gets_drilled(firer)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(!proximity_flag && charged)//Mark a target, or mine a tile.
|
||||
var/turf/proj_turf = user.loc
|
||||
if(!isturf(proj_turf))
|
||||
return
|
||||
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
|
||||
D.preparePixelProjectile(target, get_turf(target), user)
|
||||
D.hammer_synced = src
|
||||
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
|
||||
D.fire()
|
||||
charged = FALSE
|
||||
icon_state = "mining_hammer1_uncharged"
|
||||
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
|
||||
return
|
||||
if(proximity_flag && isliving(target))
|
||||
var/mob/living/L = target
|
||||
var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
|
||||
if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
|
||||
return
|
||||
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
|
||||
var/backstab_dir = get_dir(user, L)
|
||||
var/def_check = L.getarmor(type = "bomb")
|
||||
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
|
||||
L.apply_damage(80, BRUTE, blocked = def_check)
|
||||
playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
|
||||
else
|
||||
L.apply_damage(50, BRUTE, blocked = def_check)
|
||||
//trophies
|
||||
/obj/item/crusher_trophy
|
||||
name = "tail spike"
|
||||
desc = "A strange spike with no usage."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "tail_spike"
|
||||
var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is
|
||||
var/denied_type = /obj/item/crusher_trophy
|
||||
|
||||
/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
|
||||
if(!charged)
|
||||
charged = TRUE
|
||||
icon_state = "mining_hammer1"
|
||||
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
|
||||
/obj/item/crusher_trophy/examine(mob/living/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Causes [effect_desc()] when attached to a kinetic crusher.</span>")
|
||||
|
||||
/obj/item/crusher_trophy/proc/effect_desc()
|
||||
return "errors"
|
||||
|
||||
/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
|
||||
if(istype(A, /obj/item/weapon/twohanded/required/mining_hammer))
|
||||
add_to(A, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/crusher_trophy/proc/add_to(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user)
|
||||
for(var/t in H.trophies)
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
if(istype(T, denied_type) || istype(src, T.denied_type))
|
||||
to_chat(user, "<span class='warning'>You can't seem to attach [src] to [H]. Maybe remove a few trophies?</span>")
|
||||
return FALSE
|
||||
H.trophies += src
|
||||
forceMove(H)
|
||||
to_chat(user, "<span class='notice'>You attach [src] to [H].</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/crusher_trophy/proc/remove_from(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user)
|
||||
forceMove(get_turf(H))
|
||||
H.trophies -= src
|
||||
return TRUE
|
||||
|
||||
/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user
|
||||
/obj/item/crusher_trophy/proc/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
|
||||
/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
|
||||
/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user
|
||||
|
||||
//ash drake
|
||||
/obj/item/crusher_trophy/tail_spike
|
||||
desc = "A spike taken from a ash drake's tail."
|
||||
denied_type = /obj/item/crusher_trophy/tail_spike
|
||||
bonus_value = 5
|
||||
|
||||
/obj/item/crusher_trophy/tail_spike/effect_desc()
|
||||
return "mark detonation to do <b>[bonus_value]</b> damage to nearby creatures and push them back"
|
||||
|
||||
/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
for(var/mob/living/L in oview(2, user))
|
||||
if(L.stat == DEAD)
|
||||
continue
|
||||
playsound(L, 'sound/magic/Fireball.ogg', 20, 1)
|
||||
new /obj/effect/temp_visual/fire(L.loc)
|
||||
addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
|
||||
L.adjustBruteLoss(bonus_value)
|
||||
|
||||
/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
|
||||
if(!target.anchored || ismegafauna(target)) //megafauna will always be pushed
|
||||
step(target, get_dir(user, target))
|
||||
|
||||
//bubblegum
|
||||
/obj/item/crusher_trophy/demon_claws
|
||||
name = "demon claws"
|
||||
desc = "A set of blood-drenched claws from a massive demon's hand."
|
||||
icon_state = "demon_claws"
|
||||
gender = PLURAL
|
||||
denied_type = /obj/item/crusher_trophy/demon_claws
|
||||
bonus_value = 10
|
||||
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
|
||||
|
||||
/obj/item/crusher_trophy/demon_claws/effect_desc()
|
||||
return "melee hits to do <b>[bonus_value * 0.2]</b> more damage and heal you for <b>[bonus_value * 0.1]</b>; this effect is increased by <b>500%</b> during mark detonation"
|
||||
|
||||
/obj/item/crusher_trophy/demon_claws/add_to(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
H.force += bonus_value * 0.2
|
||||
H.force_unwielded += bonus_value * 0.2
|
||||
H.force_wielded += bonus_value * 0.2
|
||||
|
||||
/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
H.force -= bonus_value * 0.2
|
||||
H.force_unwielded -= bonus_value * 0.2
|
||||
H.force_wielded -= bonus_value * 0.2
|
||||
|
||||
/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
|
||||
user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
|
||||
|
||||
/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
target.adjustBruteLoss(bonus_value * 0.8)
|
||||
user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
|
||||
|
||||
//colossus
|
||||
/obj/item/crusher_trophy/blaster_tubes
|
||||
name = "blaster tubes"
|
||||
desc = "The blaster tubes from a colossus's arm."
|
||||
icon_state = "blaster_tubes"
|
||||
gender = PLURAL
|
||||
denied_type = /obj/item/crusher_trophy/blaster_tubes
|
||||
bonus_value = 15
|
||||
var/deadly_shot = FALSE
|
||||
|
||||
/obj/item/crusher_trophy/blaster_tubes/effect_desc()
|
||||
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage but move slower"
|
||||
|
||||
/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
|
||||
if(deadly_shot)
|
||||
marker.name = "deadly [marker.name]"
|
||||
marker.icon_state = "chronobolt"
|
||||
marker.damage = bonus_value
|
||||
marker.nodamage = FALSE
|
||||
marker.speed = 2
|
||||
deadly_shot = FALSE
|
||||
|
||||
/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
deadly_shot = TRUE
|
||||
addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_OVERRIDE)
|
||||
|
||||
/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot()
|
||||
deadly_shot = FALSE
|
||||
|
||||
//hierophant
|
||||
/obj/item/crusher_trophy/vortex_talisman
|
||||
name = "vortex talisman"
|
||||
desc = "A glowing trinket that was originally the Hierophant's beacon."
|
||||
icon_state = "vortex_talisman"
|
||||
denied_type = /obj/item/crusher_trophy/vortex_talisman
|
||||
|
||||
/obj/item/crusher_trophy/vortex_talisman/effect_desc()
|
||||
return "mark detonation to create a barrier you can pass"
|
||||
|
||||
/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
var/turf/T = get_turf(user)
|
||||
new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass!
|
||||
var/turf/otherT = get_step(T, turn(user.dir, 90))
|
||||
if(otherT)
|
||||
new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
|
||||
otherT = get_step(T, turn(user.dir, -90))
|
||||
if(otherT)
|
||||
new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
|
||||
|
||||
/obj/effect/temp_visual/hierophant/wall/crusher
|
||||
duration = 75
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
/*****************Marker Beacons**************************/
|
||||
GLOBAL_LIST_INIT(marker_beacon_colors, list(
|
||||
"Random" = FALSE,//not a true color, will pick a random color
|
||||
"Burgundy" = LIGHT_COLOR_FLARE,
|
||||
"Bronze" = LIGHT_COLOR_ORANGE,
|
||||
"Yellow" = LIGHT_COLOR_YELLOW,
|
||||
"Lime" = LIGHT_COLOR_SLIME_LAMP,
|
||||
"Olive" = LIGHT_COLOR_GREEN,
|
||||
"Jade" = LIGHT_COLOR_BLUEGREEN,
|
||||
"Teal" = LIGHT_COLOR_LIGHT_CYAN,
|
||||
"Cerulean" = LIGHT_COLOR_BLUE,
|
||||
"Indigo" = LIGHT_COLOR_DARK_BLUE,
|
||||
"Purple" = LIGHT_COLOR_PURPLE,
|
||||
"Violet" = LIGHT_COLOR_LAVENDER,
|
||||
"Fuchsia" = LIGHT_COLOR_PINK))
|
||||
|
||||
/obj/item/stack/marker_beacon
|
||||
name = "marker beacon"
|
||||
singular_name = "marker beacon"
|
||||
desc = "Prism-brand path illumination devices. Used by miners to mark paths and warn of danger."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "marker"
|
||||
merge_type = /obj/item/stack/marker_beacon
|
||||
max_amount = 100
|
||||
novariants = TRUE
|
||||
var/picked_color = "random"
|
||||
|
||||
/obj/item/stack/marker_beacon/ten //miners start with 10 of these
|
||||
amount = 10
|
||||
|
||||
/obj/item/stack/marker_beacon/thirty //and they're bought in stacks of 1, 10, or 30
|
||||
amount = 30
|
||||
|
||||
/obj/item/stack/marker_beacon/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/stack/marker_beacon/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Use in-hand to place a [singular_name].</span>")
|
||||
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
|
||||
|
||||
/obj/item/stack/marker_beacon/update_icon()
|
||||
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
|
||||
|
||||
/obj/item/stack/marker_beacon/attack_self(mob/user)
|
||||
if(!isturf(user.loc))
|
||||
to_chat(user, "<span class='warning'>You need more space to place a [singular_name] here.</span>")
|
||||
return
|
||||
if(locate(/obj/structure/marker_beacon) in user.loc)
|
||||
to_chat(user, "<span class='warning'>There is already a [singular_name] here.</span>")
|
||||
return
|
||||
if(use(1))
|
||||
to_chat(user, "<span class='notice'>You activate and anchor [amount ? "a":"the"] [singular_name] in place.</span>")
|
||||
playsound(user, 'sound/machines/click.ogg', 50, 1)
|
||||
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
|
||||
transfer_fingerprints_to(M)
|
||||
|
||||
/obj/item/stack/marker_beacon/AltClick(mob/user)
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
|
||||
if(user.incapacitated() || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
update_icon()
|
||||
|
||||
/obj/structure/marker_beacon
|
||||
name = "marker beacon"
|
||||
desc = "A Prism-brand path illumination device. It is anchored in place and glowing steadily."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "marker"
|
||||
layer = BELOW_OPEN_DOOR_LAYER
|
||||
armor = list(melee = 50, bullet = 75, laser = 75, energy = 75, bomb = 25, bio = 100, rad = 100, fire = 25, acid = 0)
|
||||
obj_integrity = 50
|
||||
max_integrity = 50
|
||||
anchored = TRUE
|
||||
light_range = 2
|
||||
light_power = 3
|
||||
var/remove_speed = 15
|
||||
var/picked_color
|
||||
|
||||
/obj/structure/marker_beacon/Initialize(mapload, set_color)
|
||||
. = ..()
|
||||
picked_color = set_color
|
||||
update_icon()
|
||||
|
||||
/obj/structure/marker_beacon/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
var/obj/item/stack/marker_beacon/M = new(loc)
|
||||
M.picked_color = picked_color
|
||||
M.update_icon()
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/marker_beacon/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
|
||||
|
||||
/obj/structure/marker_beacon/update_icon()
|
||||
while(!picked_color || !GLOB.marker_beacon_colors[picked_color])
|
||||
picked_color = pick(GLOB.marker_beacon_colors)
|
||||
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
|
||||
set_light(light_range, light_power, GLOB.marker_beacon_colors[picked_color])
|
||||
|
||||
/obj/structure/marker_beacon/attack_hand(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
|
||||
if(do_after(user, remove_speed, target = src))
|
||||
var/obj/item/stack/marker_beacon/M = new(loc)
|
||||
M.picked_color = picked_color
|
||||
M.update_icon()
|
||||
transfer_fingerprints_to(M)
|
||||
if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails
|
||||
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
qdel(src) //otherwise delete us
|
||||
|
||||
/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/stack/marker_beacon))
|
||||
var/obj/item/stack/marker_beacon/M = I
|
||||
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
|
||||
if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount)
|
||||
M.add(1)
|
||||
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/marker_beacon/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
|
||||
if(user.incapacitated() || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
update_icon()
|
||||
@@ -0,0 +1,111 @@
|
||||
/*****************Pickaxes & Drills & Shovels****************/
|
||||
/obj/item/weapon/pickaxe
|
||||
name = "pickaxe"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "pickaxe"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
force = 15
|
||||
throwforce = 10
|
||||
item_state = "pickaxe"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
|
||||
var/digspeed = 40
|
||||
var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
|
||||
origin_tech = "materials=2;engineering=3"
|
||||
attack_verb = list("hit", "pierced", "sliced", "attacked")
|
||||
|
||||
/obj/item/weapon/pickaxe/mini
|
||||
name = "compact pickaxe"
|
||||
desc = "A smaller, compact version of the standard pickaxe."
|
||||
icon_state = "minipick"
|
||||
force = 10
|
||||
throwforce = 7
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=1000)
|
||||
|
||||
/obj/item/weapon/pickaxe/proc/playDigSound()
|
||||
playsound(src, pick(digsound),50,1)
|
||||
|
||||
/obj/item/weapon/pickaxe/silver
|
||||
name = "silver-plated pickaxe"
|
||||
icon_state = "spickaxe"
|
||||
item_state = "spickaxe"
|
||||
digspeed = 20 //mines faster than a normal pickaxe, bought from mining vendor
|
||||
origin_tech = "materials=3;engineering=4"
|
||||
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
|
||||
force = 17
|
||||
|
||||
/obj/item/weapon/pickaxe/diamond
|
||||
name = "diamond-tipped pickaxe"
|
||||
icon_state = "dpickaxe"
|
||||
item_state = "dpickaxe"
|
||||
digspeed = 14
|
||||
origin_tech = "materials=5;engineering=4"
|
||||
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
|
||||
force = 19
|
||||
|
||||
/obj/item/weapon/pickaxe/drill
|
||||
name = "mining drill"
|
||||
icon_state = "handdrill"
|
||||
item_state = "jackhammer"
|
||||
slot_flags = SLOT_BELT
|
||||
digspeed = 25 //available from roundstart, faster than a pickaxe.
|
||||
digsound = list('sound/weapons/drill.ogg')
|
||||
hitsound = 'sound/weapons/drill.ogg'
|
||||
origin_tech = "materials=2;powerstorage=2;engineering=3"
|
||||
desc = "An electric mining drill for the especially scrawny."
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/cyborg
|
||||
name = "cyborg mining drill"
|
||||
desc = "An integrated electric mining drill."
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/diamonddrill
|
||||
name = "diamond-tipped mining drill"
|
||||
icon_state = "diamonddrill"
|
||||
digspeed = 7
|
||||
origin_tech = "materials=6;powerstorage=4;engineering=4"
|
||||
desc = "Yours is the drill that will pierce the heavens!"
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/cyborg/diamond //This is the BORG version!
|
||||
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
|
||||
icon_state = "diamonddrill"
|
||||
digspeed = 7
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/jackhammer
|
||||
name = "sonic jackhammer"
|
||||
icon_state = "jackhammer"
|
||||
item_state = "jackhammer"
|
||||
digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls
|
||||
origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
|
||||
digsound = list('sound/weapons/sonic_jackhammer.ogg')
|
||||
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
|
||||
|
||||
/obj/item/weapon/shovel
|
||||
name = "shovel"
|
||||
desc = "A large tool for digging and moving dirt."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "shovel"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 8
|
||||
var/digspeed = 20
|
||||
throwforce = 4
|
||||
item_state = "shovel"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=50)
|
||||
origin_tech = "materials=2;engineering=2"
|
||||
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/weapon/shovel/spade
|
||||
name = "spade"
|
||||
desc = "A small tool for digging and moving dirt."
|
||||
icon_state = "spade"
|
||||
item_state = "spade"
|
||||
force = 5
|
||||
throwforce = 7
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -0,0 +1,333 @@
|
||||
/*****************************Survival Pod********************************/
|
||||
/area/survivalpod
|
||||
name = "\improper Emergency Shelter"
|
||||
icon_state = "away"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
|
||||
//Survival Capsule
|
||||
/obj/item/weapon/survivalcapsule
|
||||
name = "bluespace shelter capsule"
|
||||
desc = "An emergency shelter stored within a pocket of bluespace."
|
||||
icon_state = "capsule"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "engineering=3;bluespace=3"
|
||||
var/template_id = "shelter_alpha"
|
||||
var/datum/map_template/shelter/template
|
||||
var/used = FALSE
|
||||
|
||||
/obj/item/weapon/survivalcapsule/proc/get_template()
|
||||
if(template)
|
||||
return
|
||||
template = SSmapping.shelter_templates[template_id]
|
||||
if(!template)
|
||||
throw EXCEPTION("Shelter template ([template_id]) not found!")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/survivalcapsule/Destroy()
|
||||
template = null // without this, capsules would be one use. per round.
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/survivalcapsule/examine(mob/user)
|
||||
. = ..()
|
||||
get_template()
|
||||
to_chat(user, "This capsule has the [template.name] stored.")
|
||||
to_chat(user, template.description)
|
||||
|
||||
/obj/item/weapon/survivalcapsule/attack_self()
|
||||
//Can't grab when capsule is New() because templates aren't loaded then
|
||||
get_template()
|
||||
if(!used)
|
||||
loc.visible_message("<span class='warning'>\The [src] begins to shake. Stand back!</span>")
|
||||
used = TRUE
|
||||
sleep(50)
|
||||
var/turf/deploy_location = get_turf(src)
|
||||
var/status = template.check_deploy(deploy_location)
|
||||
switch(status)
|
||||
if(SHELTER_DEPLOY_BAD_AREA)
|
||||
src.loc.visible_message("<span class='warning'>\The [src] will not function in this area.</span>")
|
||||
if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
|
||||
var/width = template.width
|
||||
var/height = template.height
|
||||
src.loc.visible_message("<span class='warning'>\The [src] doesn't have room to deploy! You need to clear a [width]x[height] area!</span>")
|
||||
|
||||
if(status != SHELTER_DEPLOY_ALLOWED)
|
||||
used = FALSE
|
||||
return
|
||||
|
||||
playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
|
||||
|
||||
var/turf/T = deploy_location
|
||||
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]")
|
||||
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]")
|
||||
template.load(deploy_location, centered = TRUE)
|
||||
new /obj/effect/particle_effect/smoke(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/survivalcapsule/luxury
|
||||
name = "luxury bluespace shelter capsule"
|
||||
desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
|
||||
origin_tech = "engineering=3;bluespace=4"
|
||||
template_id = "shelter_beta"
|
||||
|
||||
//Pod objects
|
||||
|
||||
//Window
|
||||
/obj/structure/window/shuttle/survival_pod
|
||||
name = "pod window"
|
||||
icon = 'icons/obj/smooth_structures/pod_window.dmi'
|
||||
icon_state = "smooth"
|
||||
smooth = SMOOTH_MORE
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
|
||||
|
||||
/obj/structure/window/reinforced/survival_pod
|
||||
name = "pod window"
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "pwindow"
|
||||
|
||||
//Door
|
||||
/obj/machinery/door/airlock/survival_pod
|
||||
name = "airlock"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
assemblytype = /obj/structure/door_assembly/door_assembly_pod
|
||||
opacity = FALSE
|
||||
glass = TRUE
|
||||
var/expected_dir = SOUTH //we visually turn when shuttle rotated, but need to not turn for any other reason
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/setDir(direction)
|
||||
direction = expected_dir
|
||||
..()
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation)
|
||||
expected_dir = angle2dir(rotation+dir2angle(dir))
|
||||
..()
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/vertical
|
||||
dir = EAST
|
||||
expected_dir = EAST
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod
|
||||
name = "pod airlock assembly"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
airlock_type = /obj/machinery/door/airlock/survival_pod
|
||||
anchored = TRUE
|
||||
state = 1
|
||||
mineral = "glass"
|
||||
material = "glass"
|
||||
var/expected_dir = SOUTH
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/setDir(direction)
|
||||
direction = expected_dir
|
||||
..()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation)
|
||||
expected_dir = angle2dir(rotation+dir2angle(dir))
|
||||
..()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/vertical
|
||||
dir = EAST
|
||||
expected_dir = EAST
|
||||
|
||||
//Windoor
|
||||
/obj/machinery/door/window/survival_pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "windoor"
|
||||
base_state = "windoor"
|
||||
|
||||
//Table
|
||||
/obj/structure/table/survival_pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "table"
|
||||
smooth = SMOOTH_FALSE
|
||||
|
||||
//Sleeper
|
||||
/obj/machinery/sleeper/survival_pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/machinery/sleeper/survival_pod/update_icon()
|
||||
if(state_open)
|
||||
cut_overlays()
|
||||
else
|
||||
add_overlay("sleeper_cover")
|
||||
|
||||
//Computer
|
||||
/obj/item/device/gps/computer
|
||||
name = "pod computer"
|
||||
icon_state = "pod_computer"
|
||||
icon = 'icons/obj/lavaland/pod_computer.dmi'
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
pixel_y = -32
|
||||
|
||||
/obj/item/device/gps/computer/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the gps.</span>", \
|
||||
"<span class='notice'>You start to disassemble the gps...</span>", "You hear clanking and banging noises.")
|
||||
if(do_after(user, 20*W.toolspeed, target = src))
|
||||
new /obj/item/device/gps(loc)
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/device/gps/computer/attack_hand(mob/user)
|
||||
attack_self(user)
|
||||
|
||||
//Bed
|
||||
/obj/structure/bed/pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "bed"
|
||||
|
||||
//Survival Storage Unit
|
||||
/obj/machinery/smartfridge/survival_pod
|
||||
name = "survival pod storage"
|
||||
desc = "A heated storage unit."
|
||||
icon_state = "donkvendor"
|
||||
icon = 'icons/obj/lavaland/donkvendor.dmi'
|
||||
icon_on = "donkvendor"
|
||||
icon_off = "donkvendor"
|
||||
light_range = 5
|
||||
light_power = 1.2
|
||||
light_color = "#DDFFD3"
|
||||
max_n_of_items = 10
|
||||
pixel_y = -4
|
||||
flags = NODECONSTRUCT
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/empty
|
||||
name = "dusty survival pod storage"
|
||||
desc = "A heated storage unit. This one's seen better days."
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/empty/Initialize(mapload)
|
||||
..(mapload, TRUE)
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
|
||||
if(istype(O, /obj/item))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/Initialize(mapload, empty)
|
||||
. = ..()
|
||||
if(empty)
|
||||
return
|
||||
for(var/i in 1 to 5)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm/W = new(src)
|
||||
load(W)
|
||||
if(prob(50))
|
||||
var/obj/item/weapon/storage/pill_bottle/dice/D = new(src)
|
||||
load(D)
|
||||
else
|
||||
var/obj/item/device/instrument/guitar/G = new(src)
|
||||
load(G)
|
||||
|
||||
//Fans
|
||||
/obj/structure/fans
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "fans"
|
||||
name = "environmental regulation system"
|
||||
desc = "A large machine releasing a constant gust of air."
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/arbitraryatmosblockingvar = TRUE
|
||||
var/buildstacktype = /obj/item/stack/sheet/metal
|
||||
var/buildstackamount = 5
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
|
||||
/obj/structure/fans/deconstruct()
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(buildstacktype)
|
||||
new buildstacktype(loc,buildstackamount)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the fan.</span>", \
|
||||
"<span class='notice'>You start to disassemble the fan...</span>", "You hear clanking and banging noises.")
|
||||
if(do_after(user, 20*W.toolspeed, target = src))
|
||||
deconstruct()
|
||||
return ..()
|
||||
|
||||
/obj/structure/fans/tiny
|
||||
name = "tiny fan"
|
||||
desc = "A tiny fan, releasing a thin gust of air."
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
density = FALSE
|
||||
icon_state = "fan_tiny"
|
||||
buildstackamount = 2
|
||||
|
||||
/obj/structure/fans/Initialize(mapload)
|
||||
. = ..()
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/fans/Destroy()
|
||||
var/turf/T = loc
|
||||
. = ..()
|
||||
T.air_update_turf(1)
|
||||
|
||||
//Inivisible, indestructible fans
|
||||
/obj/structure/fans/tiny/invisible
|
||||
name = "air flow blocker"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
//Signs
|
||||
/obj/structure/sign/mining
|
||||
name = "nanotrasen mining corps sign"
|
||||
desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
|
||||
icon = 'icons/turf/walls/survival_pod_walls.dmi'
|
||||
icon_state = "ntpod"
|
||||
|
||||
/obj/structure/sign/mining/survival
|
||||
name = "shelter sign"
|
||||
desc = "A high visibility sign designating a safe shelter."
|
||||
icon = 'icons/turf/walls/survival_pod_walls.dmi'
|
||||
icon_state = "survival"
|
||||
|
||||
//Fluff
|
||||
/obj/structure/tubes
|
||||
icon_state = "tubes"
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
name = "tubes"
|
||||
anchored = TRUE
|
||||
layer = BELOW_MOB_LAYER
|
||||
density = FALSE
|
||||
|
||||
/obj/item/fakeartefact
|
||||
name = "expensive forgery"
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "x2"
|
||||
var/possible = list(/obj/item/ship_in_a_bottle,
|
||||
/obj/item/weapon/gun/energy/pulse,
|
||||
/obj/item/weapon/sleeping_carp_scroll,
|
||||
/obj/item/weapon/melee/supermatter_sword,
|
||||
/obj/item/weapon/shield/changeling,
|
||||
/obj/item/weapon/lava_staff,
|
||||
/obj/item/weapon/katana/energy,
|
||||
/obj/item/weapon/hierophant_club,
|
||||
/obj/item/weapon/his_grace,
|
||||
/obj/item/weapon/gun/ballistic/minigun,
|
||||
/obj/item/weapon/gun/ballistic/automatic/l6_saw,
|
||||
/obj/item/weapon/gun/magic/staff/chaos,
|
||||
/obj/item/weapon/gun/magic/staff/spellblade,
|
||||
/obj/item/weapon/gun/magic/wand/death,
|
||||
/obj/item/weapon/gun/magic/wand/fireball,
|
||||
/obj/item/stack/telecrystal/twenty,
|
||||
/obj/item/nuke_core,
|
||||
/obj/item/phylactery,
|
||||
/obj/item/riding_offhand,
|
||||
/obj/item/weapon/banhammer)
|
||||
|
||||
/obj/item/fakeartefact/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/I = pick(possible)
|
||||
name = initial(I.name)
|
||||
icon = initial(I.icon)
|
||||
desc = initial(I.desc)
|
||||
icon_state = initial(I.icon_state)
|
||||
item_state = initial(I.item_state)
|
||||
@@ -11,7 +11,7 @@
|
||||
desc = "It's watching you suspiciously."
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
|
||||
var/loot = rand(1,26)
|
||||
var/loot = rand(1,27)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/device/shared_storage/red(src)
|
||||
@@ -28,9 +28,7 @@
|
||||
if(7)
|
||||
new /obj/item/weapon/pickaxe/diamond(src)
|
||||
if(8)
|
||||
new /obj/item/clothing/head/culthood(src)
|
||||
new /obj/item/clothing/suit/cultrobes(src)
|
||||
new /obj/item/weapon/bedsheet/cult(src)
|
||||
new /obj/item/borg/upgrade/modkit/resonator_blasts(src)
|
||||
if(9)
|
||||
new /obj/item/organ/brain/alien(src)
|
||||
if(10)
|
||||
@@ -40,7 +38,7 @@
|
||||
if(12)
|
||||
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src)
|
||||
if(13)
|
||||
new /obj/item/weapon/sord(src)
|
||||
new /obj/item/borg/upgrade/modkit/cooldown/repeater(src)
|
||||
if(14)
|
||||
new /obj/item/weapon/nullrod/scythe/talking(src)
|
||||
if(15)
|
||||
@@ -68,6 +66,9 @@
|
||||
new /obj/item/weapon/spellbook/oneuse/summonitem(src)
|
||||
if(26)
|
||||
new /obj/item/book_of_babel(src)
|
||||
if(27)
|
||||
new /obj/item/borg/upgrade/modkit/lifesteal(src)
|
||||
new /obj/item/weapon/bedsheet/cult(src)
|
||||
|
||||
|
||||
|
||||
@@ -488,6 +489,13 @@
|
||||
if(4)
|
||||
new /obj/item/weapon/dragons_blood(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/dragon/crusher
|
||||
name = "firey dragon chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents()
|
||||
..()
|
||||
new /obj/item/crusher_trophy/tail_spike(src)
|
||||
|
||||
/obj/item/weapon/melee/ghost_sword
|
||||
name = "\improper spectral blade"
|
||||
desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
|
||||
@@ -700,7 +708,26 @@
|
||||
icon_state = "lavastaff_warn"
|
||||
duration = 50
|
||||
|
||||
///Bubblegum
|
||||
//Bubblegum
|
||||
/obj/structure/closet/crate/necropolis/bubblegum
|
||||
name = "bubblegum chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
|
||||
var/loot = rand(1,3)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/mayhem(src)
|
||||
if(2)
|
||||
new /obj/item/blood_contract(src)
|
||||
if(3)
|
||||
new /obj/item/weapon/gun/magic/staff/spellblade(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum/crusher
|
||||
name = "bloody bubblegum chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents()
|
||||
..()
|
||||
new /obj/item/crusher_trophy/demon_claws(src)
|
||||
|
||||
/obj/item/mayhem
|
||||
name = "mayhem in a bottle"
|
||||
@@ -716,19 +743,6 @@
|
||||
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum
|
||||
name = "bubblegum chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
|
||||
var/loot = rand(1,3)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/mayhem(src)
|
||||
if(2)
|
||||
new /obj/item/blood_contract(src)
|
||||
if(3)
|
||||
new /obj/item/weapon/gun/magic/staff/spellblade(src)
|
||||
|
||||
/obj/item/blood_contract
|
||||
name = "blood contract"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
@@ -773,6 +787,23 @@
|
||||
|
||||
qdel(src)
|
||||
|
||||
//Colossus
|
||||
/obj/structure/closet/crate/necropolis/colossus
|
||||
name = "colossus chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/colossus/PopulateContents()
|
||||
var/list/choices = subtypesof(/obj/machinery/anomalous_crystal)
|
||||
var/random_crystal = pick(choices)
|
||||
new random_crystal(src)
|
||||
new /obj/item/organ/vocal_cords/colossus(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/colossus/crusher
|
||||
name = "angelic colossus chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents()
|
||||
..()
|
||||
new /obj/item/crusher_trophy/blaster_tubes(src)
|
||||
|
||||
//Hierophant
|
||||
/obj/item/weapon/hierophant_club
|
||||
name = "hierophant club"
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
anchored = 1
|
||||
var/obj/item/weapon/card/id/inserted_id
|
||||
var/list/prize_list = list( //if you add something to this, please, for the love of god, use tabs and not spaces.
|
||||
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
|
||||
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
|
||||
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
|
||||
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
|
||||
new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium,100),
|
||||
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
|
||||
@@ -182,6 +185,7 @@
|
||||
if("Extraction and Rescue Kit")
|
||||
new /obj/item/weapon/extraction_pack(loc)
|
||||
new /obj/item/fulton_core(loc)
|
||||
new /obj/item/stack/marker_beacon/thirty(loc)
|
||||
if("Crusher Kit")
|
||||
new /obj/item/weapon/twohanded/required/mining_hammer(loc)
|
||||
new /obj/item/weapon/storage/belt/mining/alt(loc)
|
||||
|
||||
@@ -72,432 +72,9 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/*********************Pickaxe & Drills**************************/
|
||||
|
||||
/obj/item/weapon/pickaxe
|
||||
name = "pickaxe"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "pickaxe"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
force = 15
|
||||
throwforce = 10
|
||||
item_state = "pickaxe"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
|
||||
var/digspeed = 40
|
||||
var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
|
||||
origin_tech = "materials=2;engineering=3"
|
||||
attack_verb = list("hit", "pierced", "sliced", "attacked")
|
||||
|
||||
/obj/item/weapon/pickaxe/mini
|
||||
name = "compact pickaxe"
|
||||
desc = "A smaller, compact version of the standard pickaxe."
|
||||
icon_state = "minipick"
|
||||
force = 10
|
||||
throwforce = 7
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=1000)
|
||||
|
||||
/obj/item/weapon/pickaxe/proc/playDigSound()
|
||||
playsound(src, pick(digsound),50,1)
|
||||
|
||||
/obj/item/weapon/pickaxe/silver
|
||||
name = "silver-plated pickaxe"
|
||||
icon_state = "spickaxe"
|
||||
item_state = "spickaxe"
|
||||
digspeed = 20 //mines faster than a normal pickaxe, bought from mining vendor
|
||||
origin_tech = "materials=3;engineering=4"
|
||||
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
|
||||
force = 17
|
||||
|
||||
/obj/item/weapon/pickaxe/diamond
|
||||
name = "diamond-tipped pickaxe"
|
||||
icon_state = "dpickaxe"
|
||||
item_state = "dpickaxe"
|
||||
digspeed = 14
|
||||
origin_tech = "materials=5;engineering=4"
|
||||
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
|
||||
force = 19
|
||||
|
||||
/obj/item/weapon/pickaxe/drill
|
||||
name = "mining drill"
|
||||
icon_state = "handdrill"
|
||||
item_state = "jackhammer"
|
||||
slot_flags = SLOT_BELT
|
||||
digspeed = 25 //available from roundstart, faster than a pickaxe.
|
||||
digsound = list('sound/weapons/drill.ogg')
|
||||
hitsound = 'sound/weapons/drill.ogg'
|
||||
origin_tech = "materials=2;powerstorage=2;engineering=3"
|
||||
desc = "An electric mining drill for the especially scrawny."
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/cyborg
|
||||
name = "cyborg mining drill"
|
||||
desc = "An integrated electric mining drill."
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/diamonddrill
|
||||
name = "diamond-tipped mining drill"
|
||||
icon_state = "diamonddrill"
|
||||
digspeed = 7
|
||||
origin_tech = "materials=6;powerstorage=4;engineering=4"
|
||||
desc = "Yours is the drill that will pierce the heavens!"
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/cyborg/diamond //This is the BORG version!
|
||||
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
|
||||
icon_state = "diamonddrill"
|
||||
digspeed = 7
|
||||
|
||||
/obj/item/weapon/pickaxe/drill/jackhammer
|
||||
name = "sonic jackhammer"
|
||||
icon_state = "jackhammer"
|
||||
item_state = "jackhammer"
|
||||
digspeed = 5 //the epitome of powertools. extremely fast mining, laughs at puny walls
|
||||
origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
|
||||
digsound = list('sound/weapons/sonic_jackhammer.ogg')
|
||||
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
|
||||
|
||||
/*****************************Shovel********************************/
|
||||
|
||||
/obj/item/weapon/shovel
|
||||
name = "shovel"
|
||||
desc = "A large tool for digging and moving dirt."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "shovel"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 8
|
||||
var/digspeed = 20
|
||||
throwforce = 4
|
||||
item_state = "shovel"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=50)
|
||||
origin_tech = "materials=2;engineering=2"
|
||||
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/weapon/shovel/spade
|
||||
name = "spade"
|
||||
desc = "A small tool for digging and moving dirt."
|
||||
icon_state = "spade"
|
||||
item_state = "spade"
|
||||
force = 5
|
||||
throwforce = 7
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/weapon/emptysandbag
|
||||
name = "empty sandbag"
|
||||
desc = "A bag to be filled with sand."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sandbag"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
/obj/item/weapon/emptysandbag/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W,/obj/item/weapon/ore/glass))
|
||||
to_chat(user, "<span class='notice'>You fill the sandbag.</span>")
|
||||
var/obj/item/stack/sheet/mineral/sandbags/I = new /obj/item/stack/sheet/mineral/sandbags
|
||||
qdel(src)
|
||||
user.put_in_hands(I)
|
||||
qdel(W)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/**********************Mining car (Crate like thing, not the rail car)**************************/
|
||||
|
||||
/obj/structure/closet/crate/miningcar
|
||||
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
|
||||
name = "Mining car (not for rails)"
|
||||
icon_state = "miningcar"
|
||||
|
||||
/*****************************Survival Pod********************************/
|
||||
|
||||
|
||||
/area/survivalpod
|
||||
name = "\improper Emergency Shelter"
|
||||
icon_state = "away"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = 0
|
||||
has_gravity = 1
|
||||
|
||||
/obj/item/weapon/survivalcapsule
|
||||
name = "bluespace shelter capsule"
|
||||
desc = "An emergency shelter stored within a pocket of bluespace."
|
||||
icon_state = "capsule"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "engineering=3;bluespace=3"
|
||||
var/template_id = "shelter_alpha"
|
||||
var/datum/map_template/shelter/template
|
||||
var/used = FALSE
|
||||
|
||||
/obj/item/weapon/survivalcapsule/proc/get_template()
|
||||
if(template)
|
||||
return
|
||||
template = SSmapping.shelter_templates[template_id]
|
||||
if(!template)
|
||||
throw EXCEPTION("Shelter template ([template_id]) not found!")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/survivalcapsule/Destroy()
|
||||
template = null // without this, capsules would be one use. per round.
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/survivalcapsule/examine(mob/user)
|
||||
. = ..()
|
||||
get_template()
|
||||
to_chat(user, "This capsule has the [template.name] stored.")
|
||||
to_chat(user, template.description)
|
||||
|
||||
/obj/item/weapon/survivalcapsule/attack_self()
|
||||
// Can't grab when capsule is New() because templates aren't loaded then
|
||||
get_template()
|
||||
if(used == FALSE)
|
||||
src.loc.visible_message("<span class='warning'>\The [src] begins \
|
||||
to shake. Stand back!</span>")
|
||||
used = TRUE
|
||||
sleep(50)
|
||||
var/turf/deploy_location = get_turf(src)
|
||||
var/status = template.check_deploy(deploy_location)
|
||||
switch(status)
|
||||
if(SHELTER_DEPLOY_BAD_AREA)
|
||||
src.loc.visible_message("<span class='warning'>\The [src] \
|
||||
will not function in this area.</span>")
|
||||
if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
|
||||
var/width = template.width
|
||||
var/height = template.height
|
||||
src.loc.visible_message("<span class='warning'>\The [src] \
|
||||
doesn't have room to deploy! You need to clear a \
|
||||
[width]x[height] area!</span>")
|
||||
|
||||
if(status != SHELTER_DEPLOY_ALLOWED)
|
||||
used = FALSE
|
||||
return
|
||||
|
||||
playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
|
||||
|
||||
var/turf/T = deploy_location
|
||||
if(T.z != ZLEVEL_MINING && T.z != ZLEVEL_LAVALAND)//only report capsules away from the mining/lavaland level
|
||||
message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_JMP(T)]")
|
||||
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [get_area(T)][COORD(T)]")
|
||||
template.load(deploy_location, centered = TRUE)
|
||||
new /obj/effect/particle_effect/smoke(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
//Pod turfs and objects
|
||||
|
||||
|
||||
//Window
|
||||
/obj/structure/window/shuttle/survival_pod
|
||||
name = "pod window"
|
||||
icon = 'icons/obj/smooth_structures/pod_window.dmi'
|
||||
icon_state = "smooth"
|
||||
smooth = SMOOTH_MORE
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
|
||||
|
||||
//Door
|
||||
/obj/machinery/door/airlock/survival_pod
|
||||
name = "airlock"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
assemblytype = /obj/structure/door_assembly/door_assembly_pod
|
||||
opacity = 0
|
||||
glass = 1
|
||||
var/expected_dir = SOUTH //we visually turn when shuttle rotated, but need to not turn for any other reason
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/setDir(direction)
|
||||
direction = expected_dir
|
||||
..()
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation)
|
||||
expected_dir = angle2dir(rotation+dir2angle(dir))
|
||||
..()
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/vertical
|
||||
dir = EAST
|
||||
expected_dir = EAST
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod
|
||||
name = "pod airlock assembly"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
airlock_type = /obj/machinery/door/airlock/survival_pod
|
||||
anchored = 1
|
||||
state = 1
|
||||
mineral = "glass"
|
||||
material = "glass"
|
||||
var/expected_dir = SOUTH
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/setDir(direction)
|
||||
direction = expected_dir
|
||||
..()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation)
|
||||
expected_dir = angle2dir(rotation+dir2angle(dir))
|
||||
..()
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod/vertical
|
||||
dir = EAST
|
||||
expected_dir = EAST
|
||||
|
||||
//Table
|
||||
/obj/structure/table/survival_pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "table"
|
||||
smooth = SMOOTH_FALSE
|
||||
|
||||
//Sleeper
|
||||
/obj/machinery/sleeper/survival_pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/machinery/sleeper/survival_pod/update_icon()
|
||||
if(state_open)
|
||||
cut_overlays()
|
||||
else
|
||||
add_overlay("sleeper_cover")
|
||||
|
||||
//Computer
|
||||
/obj/item/device/gps/computer
|
||||
name = "pod computer"
|
||||
icon_state = "pod_computer"
|
||||
icon = 'icons/obj/lavaland/pod_computer.dmi'
|
||||
anchored = 1
|
||||
density = 1
|
||||
pixel_y = -32
|
||||
|
||||
/obj/item/device/gps/computer/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the gps.</span>", \
|
||||
"<span class='notice'>You start to disassemble the gps...</span>", "You hear clanking and banging noises.")
|
||||
if(do_after(user, 20*W.toolspeed, target = src))
|
||||
new /obj/item/device/gps(src.loc)
|
||||
qdel(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/gps/computer/attack_hand(mob/user)
|
||||
attack_self(user)
|
||||
|
||||
//Bed
|
||||
/obj/structure/bed/pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "bed"
|
||||
|
||||
//Survival Storage Unit
|
||||
/obj/machinery/smartfridge/survival_pod
|
||||
name = "survival pod storage"
|
||||
desc = "A heated storage unit."
|
||||
icon_state = "donkvendor"
|
||||
icon = 'icons/obj/lavaland/donkvendor.dmi'
|
||||
icon_on = "donkvendor"
|
||||
icon_off = "donkvendor"
|
||||
light_range = 5
|
||||
light_power = 1.2
|
||||
light_color = "#DDFFD3"
|
||||
max_n_of_items = 10
|
||||
pixel_y = -4
|
||||
flags = NODECONSTRUCT
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/empty
|
||||
name = "dusty survival pod storage"
|
||||
desc = "A heated storage unit. This one's seen better days."
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/empty/Initialize(mapload)
|
||||
..(mapload, TRUE)
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
|
||||
if(istype(O, /obj/item))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/smartfridge/survival_pod/Initialize(mapload, empty)
|
||||
..()
|
||||
if(empty)
|
||||
return
|
||||
for(var/i in 1 to 5)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm/W = new(src)
|
||||
load(W)
|
||||
if(prob(50))
|
||||
var/obj/item/weapon/storage/pill_bottle/dice/D = new(src)
|
||||
load(D)
|
||||
else
|
||||
var/obj/item/device/instrument/guitar/G = new(src)
|
||||
load(G)
|
||||
|
||||
//Fans
|
||||
/obj/structure/fans
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "fans"
|
||||
name = "environmental regulation system"
|
||||
desc = "A large machine releasing a constant gust of air."
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/arbitraryatmosblockingvar = TRUE
|
||||
var/buildstacktype = /obj/item/stack/sheet/metal
|
||||
var/buildstackamount = 5
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
|
||||
/obj/structure/fans/deconstruct()
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(buildstacktype)
|
||||
new buildstacktype(loc,buildstackamount)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/wrench) && !(flags&NODECONSTRUCT))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the fan.</span>", \
|
||||
"<span class='notice'>You start to disassemble the fan...</span>", "You hear clanking and banging noises.")
|
||||
if(do_after(user, 20*W.toolspeed, target = src))
|
||||
deconstruct()
|
||||
return ..()
|
||||
|
||||
/obj/structure/fans/tiny
|
||||
name = "tiny fan"
|
||||
desc = "A tiny fan, releasing a thin gust of air."
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
density = 0
|
||||
icon_state = "fan_tiny"
|
||||
buildstackamount = 2
|
||||
|
||||
/obj/structure/fans/New(loc)
|
||||
..()
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/fans/Destroy()
|
||||
var/turf/T = loc
|
||||
. = ..()
|
||||
T.air_update_turf(1)
|
||||
|
||||
//Inivisible, indestructible fans
|
||||
/obj/structure/fans/tiny/invisible
|
||||
name = "air flow blocker"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
|
||||
//Signs
|
||||
/obj/structure/sign/mining
|
||||
name = "nanotrasen mining corps sign"
|
||||
desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
|
||||
icon = 'icons/turf/walls/survival_pod_walls.dmi'
|
||||
icon_state = "ntpod"
|
||||
|
||||
/obj/structure/sign/mining/survival
|
||||
name = "shelter sign"
|
||||
desc = "A high visibility sign designating a safe shelter."
|
||||
icon = 'icons/turf/walls/survival_pod_walls.dmi'
|
||||
icon_state = "survival"
|
||||
|
||||
//Fluff
|
||||
/obj/structure/tubes
|
||||
icon_state = "tubes"
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
name = "tubes"
|
||||
anchored = 1
|
||||
layer = BELOW_MOB_LAYER
|
||||
density = 0
|
||||
|
||||
@@ -260,14 +260,13 @@
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] strikes \the [src], causing a chain reaction!</span>", "<span class='danger'>You strike \the [src], causing a chain reaction.</span>")
|
||||
log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]")
|
||||
spawn(det_time)
|
||||
if(primed)
|
||||
if(quality == 3)
|
||||
explosion(src.loc,2,4,9,adminlog = notify_admins)
|
||||
explosion(src.loc,2,4,9,adminlog = notify_admins)
|
||||
if(quality == 2)
|
||||
explosion(src.loc,1,2,5,adminlog = notify_admins)
|
||||
explosion(src.loc,1,2,5,adminlog = notify_admins)
|
||||
if(quality == 1)
|
||||
explosion(src.loc,-1,1,3,adminlog = notify_admins)
|
||||
explosion(src.loc,-1,1,3,adminlog = notify_admins)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ore/Initialize()
|
||||
|
||||
@@ -29,4 +29,10 @@
|
||||
new_player_panel()
|
||||
client.playtitlemusic()
|
||||
if(SSticker.current_state < GAME_STATE_SETTING_UP)
|
||||
to_chat(src, "Please set up your character and select \"Ready\". The game will start in about [round(SSticker.GetTimeLeft(), 1)/10] seconds.")
|
||||
var/tl = round(SSticker.GetTimeLeft(), 1)/10
|
||||
var/postfix
|
||||
if(tl >= 0)
|
||||
postfix = "in about [tl] seconds"
|
||||
else
|
||||
postfix = "soon"
|
||||
to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].")
|
||||
|
||||
@@ -322,28 +322,9 @@
|
||||
if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob.
|
||||
character = equip
|
||||
|
||||
var/D
|
||||
if(GLOB.latejoin.len)
|
||||
D = get_turf(pick(GLOB.latejoin))
|
||||
if(!D)
|
||||
for(var/turf/T in get_area_turfs(/area/shuttle/arrival))
|
||||
if(!T.density)
|
||||
var/clear = 1
|
||||
for(var/obj/O in T)
|
||||
if(O.density)
|
||||
clear = 0
|
||||
break
|
||||
if(clear)
|
||||
D = T
|
||||
continue
|
||||
|
||||
character.loc = D
|
||||
SSjob.SendToLateJoin(character)
|
||||
character.update_parallax_teleport()
|
||||
|
||||
var/atom/movable/chair = locate(/obj/structure/chair) in character.loc
|
||||
if(chair)
|
||||
chair.buckle_mob(character)
|
||||
|
||||
SSticker.minds += character.mind
|
||||
|
||||
var/mob/living/carbon/human/humanc
|
||||
|
||||
@@ -65,12 +65,22 @@ GLOBAL_VAR(posibrain_notify_cooldown)
|
||||
/obj/item/device/mmi/posibrain/attack_ghost(mob/user)
|
||||
activate(user)
|
||||
|
||||
/obj/item/device/mmi/posibrain/proc/is_occupied()
|
||||
if(brainmob.key)
|
||||
return TRUE
|
||||
if(iscyborg(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R.mmi == src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself.
|
||||
/obj/item/device/mmi/posibrain/proc/activate(mob/user)
|
||||
if(QDELETED(brainmob))
|
||||
return
|
||||
if(brainmob.key || jobban_isbanned(user,"posibrain"))
|
||||
if(is_occupied() || jobban_isbanned(user,"posibrain"))
|
||||
return
|
||||
|
||||
var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
|
||||
if(posi_ask == "No" || QDELETED(src))
|
||||
return
|
||||
@@ -98,7 +108,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
|
||||
/obj/item/device/mmi/posibrain/proc/transfer_personality(mob/candidate)
|
||||
if(QDELETED(brainmob))
|
||||
return
|
||||
if(brainmob.key) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain.
|
||||
if(is_occupied()) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain.
|
||||
to_chat(candidate, "This brain has already been taken! Please try your possession again later!")
|
||||
return FALSE
|
||||
if(candidate.mind && !isobserver(candidate))
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#define MAX_ALIEN_LEAP_DIST 7
|
||||
|
||||
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)
|
||||
if(pounce_cooldown)
|
||||
if(pounce_cooldown > world.time)
|
||||
to_chat(src, "<span class='alertalien'>You are too fatigued to pounce right now!</span>")
|
||||
return
|
||||
|
||||
@@ -83,9 +83,7 @@
|
||||
Weaken(2, 1, 1)
|
||||
|
||||
toggle_leap(0)
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
spawn(pounce_cooldown_time) //3s by default
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
pounce_cooldown = world.time + pounce_cooldown_time
|
||||
else if(A.density && !A.CanPass(src))
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='alertalien'>[src] smashes into [A]!</span>")
|
||||
Weaken(2, 1, 1)
|
||||
|
||||
@@ -36,9 +36,6 @@
|
||||
//initialise organs
|
||||
create_internal_organs()
|
||||
|
||||
if(mind)
|
||||
mind.martial_art = mind.default_martial_art
|
||||
|
||||
handcrafting = new()
|
||||
|
||||
..()
|
||||
|
||||
@@ -809,13 +809,13 @@
|
||||
if(T.title == "Chief Medical Officer" || T.title == "Medical Doctor" || T.title == "Chemist" || T.title == "Virologist" || T.title == "Geneticist")
|
||||
return /area/medical
|
||||
if(T.title == "Research Director" || T.title == "Scientist" || T.title == "Roboticist")
|
||||
return /area/toxins
|
||||
return /area/science
|
||||
if(T.title == "Head of Security" || T.title == "Warden" || T.title == "Security Officer" || T.title == "Detective")
|
||||
return /area/security
|
||||
if(T.title == "Botanist")
|
||||
return /area/hydroponics
|
||||
else
|
||||
return pick(/area/hallway,/area/crew_quarters)
|
||||
return pick(/area/hallway,/area/crew_quarters/locker)
|
||||
|
||||
/mob/living/carbon/human/interactive/proc/target_filter(target)
|
||||
var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/light, /obj/structure/cable, /obj/machinery/atmospherics)
|
||||
|
||||
@@ -20,3 +20,16 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/set_drugginess(amount)
|
||||
..()
|
||||
if(!amount)
|
||||
remove_language(/datum/language/beachbum)
|
||||
|
||||
/mob/living/carbon/human/adjust_drugginess(amount)
|
||||
..()
|
||||
if(!dna.check_mutation(STONER))
|
||||
if(druggy)
|
||||
grant_language(/datum/language/beachbum)
|
||||
else
|
||||
remove_language(/datum/language/beachbum)
|
||||
|
||||
@@ -420,6 +420,9 @@
|
||||
message = null
|
||||
emote_type = EMOTE_VISIBLE
|
||||
|
||||
/datum/emote/living/custom/replace_pronoun(mob/user, message)
|
||||
return message
|
||||
|
||||
/datum/emote/living/help
|
||||
key = "help"
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click()
|
||||
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
|
||||
var/malf_cooldown = 0 //Cooldown var for malf modules
|
||||
var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown
|
||||
|
||||
var/obj/machinery/power/apc/malfhack = null
|
||||
var/explosive = 0 //does the AI explode when it dies?
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
|
||||
if(explosive)
|
||||
spawn(10)
|
||||
explosion(src.loc, 3, 6, 12, 15)
|
||||
explosion(src.loc, 3, 6, 12, 15)
|
||||
|
||||
for(var/obj/machinery/ai_status_display/O in world) //change status
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||
if(src.key)
|
||||
O.mode = 2
|
||||
if(istype(loc, /obj/item/device/aicard))
|
||||
@@ -42,4 +42,4 @@
|
||||
if(doomsday_device)
|
||||
doomsday_device.timing = FALSE
|
||||
SSshuttle.clearHostileEnvironment(doomsday_device)
|
||||
qdel(doomsday_device)
|
||||
qdel(doomsday_device)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
client.images += blood
|
||||
|
||||
if(stat != DEAD)
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.machines) //change status
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||
O.mode = 1
|
||||
O.emotion = "Neutral"
|
||||
view_core()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/living/silicon/ai/Logout()
|
||||
..()
|
||||
for(var/obj/machinery/ai_status_display/O in world) //change status
|
||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||
O.mode = 0
|
||||
view_core()
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
|
||||
/mob/living/silicon/pai/Destroy()
|
||||
GLOB.pai_list -= src
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/pai/Initialize()
|
||||
var/obj/item/device/paicard/P = loc
|
||||
|
||||
@@ -195,6 +195,10 @@
|
||||
if(module.type != /obj/item/weapon/robot_module)
|
||||
return
|
||||
|
||||
if(wires.is_cut(WIRE_RESET_MODULE))
|
||||
to_chat(src,"<span class='userdanger'>ERROR: Module installer reply timeout. Please check internal connections.</span>")
|
||||
return
|
||||
|
||||
var/list/modulelist = list("Standard" = /obj/item/weapon/robot_module/standard, \
|
||||
"Engineering" = /obj/item/weapon/robot_module/engineering, \
|
||||
"Medical" = /obj/item/weapon/robot_module/medical, \
|
||||
|
||||
@@ -104,6 +104,10 @@
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/wire)
|
||||
|
||||
else if(istype(S, /obj/item/stack/marker_beacon))
|
||||
S.cost = 1
|
||||
S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon)
|
||||
|
||||
if(S && S.source)
|
||||
S.materials = list()
|
||||
S.is_cyborg = 1
|
||||
@@ -535,7 +539,8 @@
|
||||
/obj/item/weapon/storage/bag/sheetsnatcher/borg,
|
||||
/obj/item/device/t_scanner/adv_mining_scanner,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg,
|
||||
/obj/item/device/gps/cyborg)
|
||||
/obj/item/device/gps/cyborg,
|
||||
/obj/item/stack/marker_beacon)
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
ratvar_modules = list(
|
||||
/obj/item/clockwork/slab/cyborg/miner,
|
||||
@@ -631,3 +636,8 @@
|
||||
max_energy = 2500
|
||||
recharge_rate = 250
|
||||
name = "Medical Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/beacon
|
||||
max_energy = 30
|
||||
recharge_rate = 1
|
||||
name = "Marker Beacon Storage"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/mob/living/proc/robot_talk(message)
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_message(message, INDIVIDUAL_SAY_LOG)
|
||||
var/desig = "Default Cyborg" //ezmode for taters
|
||||
if(issilicon(src))
|
||||
var/mob/living/silicon/S = src
|
||||
|
||||
@@ -10,45 +10,58 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/syndicatesoldier
|
||||
name = "Syndicate Operative"
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
outfit = /datum/outfit/syndicatesoldiercorpse
|
||||
|
||||
/datum/outfit/syndicatesoldiercorpse
|
||||
name = "Syndicate Operative Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
ears = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
helmet = /obj/item/clothing/head/helmet/swat
|
||||
head = /obj/item/clothing/head/helmet/swat
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
has_id = 1
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/syndicatecommando
|
||||
name = "Syndicate Commando"
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
outfit = /datum/outfit/syndicatecommandocorpse
|
||||
|
||||
/datum/outfit/syndicatecommandocorpse
|
||||
name = "Syndicate Commando Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
ears = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/weapon/tank/jetpack/oxygen
|
||||
pocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
|
||||
has_id = 1
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
r_pocket = /obj/item/weapon/tank/internals/emergency_oxygen
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/syndicatestormtrooper
|
||||
name = "Syndicate Stormtrooper"
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
outfit = /datum/outfit/syndicatestormtroopercorpse
|
||||
|
||||
/datum/outfit/syndicatestormtroopercorpse
|
||||
name = "Syndicate Stormtrooper Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
ears = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/weapon/tank/jetpack/oxygen/harness
|
||||
has_id = 1
|
||||
id_job = "Operative"
|
||||
id_access_list = list(GLOB.access_syndicate)
|
||||
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/clown/corpse
|
||||
@@ -58,62 +71,97 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/pirate
|
||||
name = "Pirate"
|
||||
outfit = /datum/outfit/piratecorpse
|
||||
|
||||
/datum/outfit/piratecorpse
|
||||
name = "Pirate Corpse"
|
||||
uniform = /obj/item/clothing/under/pirate
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
helmet = /obj/item/clothing/head/bandana
|
||||
|
||||
head = /obj/item/clothing/head/bandana
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/pirate/ranged
|
||||
name = "Pirate Gunner"
|
||||
outfit = /datum/outfit/piratecorpse/ranged
|
||||
|
||||
/datum/outfit/piratecorpse/ranged
|
||||
name = "Pirate Gunner Corpse"
|
||||
suit = /obj/item/clothing/suit/pirate
|
||||
helmet = /obj/item/clothing/head/pirate
|
||||
head = /obj/item/clothing/head/pirate
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/russian
|
||||
name = "Russian"
|
||||
outfit = /datum/outfit/russiancorpse
|
||||
|
||||
/datum/outfit/russiancorpse
|
||||
name = "Russian Corpse"
|
||||
uniform = /obj/item/clothing/under/soviet
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
helmet = /obj/item/clothing/head/bearpelt
|
||||
head = /obj/item/clothing/head/bearpelt
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/russian/ranged
|
||||
helmet = /obj/item/clothing/head/ushanka
|
||||
outfit = /datum/outfit/russiancorpse/ranged
|
||||
|
||||
/datum/outfit/russiancorpse/ranged
|
||||
name = "Ranged Russian Corpse"
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/russian/ranged/trooper
|
||||
outfit = /datum/outfit/russiancorpse/ranged/trooper
|
||||
|
||||
/datum/outfit/russiancorpse/ranged/trooper
|
||||
name = "Ranged Russian Trooper Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate/camo
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
ears = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/balaclava
|
||||
helmet = /obj/item/clothing/head/helmet/alt
|
||||
head = /obj/item/clothing/head/helmet/alt
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/russian/ranged/officer
|
||||
name = "Russian Officer"
|
||||
outfit = /datum/outfit/russiancorpse/officer
|
||||
|
||||
/datum/outfit/russiancorpse/officer
|
||||
name = "Russian Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/rank/security/navyblue/russian
|
||||
suit = /obj/item/clothing/suit/security/officer/russian
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
radio = /obj/item/device/radio/headset
|
||||
helmet = /obj/item/clothing/head/ushanka
|
||||
ears = /obj/item/device/radio/headset
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/wizard
|
||||
name = "Space Wizard"
|
||||
name = "Space Wizard Corpse"
|
||||
outfit = /datum/outfit/wizardcorpse
|
||||
|
||||
/datum/outfit/wizardcorpse
|
||||
name = "Space Wizard Corpse"
|
||||
uniform = /obj/item/clothing/under/color/lightpurple
|
||||
suit = /obj/item/clothing/suit/wizrobe
|
||||
shoes = /obj/item/clothing/shoes/sandal/magic
|
||||
helmet = /obj/item/clothing/head/wizard
|
||||
head = /obj/item/clothing/head/wizard
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/nanotrasensoldier
|
||||
name = "Nanotrasen Private Security Officer"
|
||||
id_job = "Private Security Force"
|
||||
id_access = "Security Officer"
|
||||
outfit = /datum/outfit/nanotrasensoldiercorpse2
|
||||
|
||||
/datum/outfit/nanotrasensoldiercorpse2
|
||||
name = "NT Private Security Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/rank/security
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
radio = /obj/item/device/radio/headset
|
||||
ears = /obj/item/device/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
helmet = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
head = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
back = /obj/item/weapon/storage/backpack/security
|
||||
has_id = 1
|
||||
id_job = "Private Security Force"
|
||||
id_access = "Security Officer"
|
||||
id = /obj/item/weapon/card/id
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
gold_core_spawnable = 2
|
||||
|
||||
/mob/living/simple_animal/pet/dog/Initialize()
|
||||
. = ..()
|
||||
var/dog_area = get_area(src)
|
||||
for(var/obj/structure/bed/dogbed/D in dog_area)
|
||||
if(!D.owner)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
|
||||
. = ..()
|
||||
if(. && ishuman(target) && target != summoner)
|
||||
new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
|
||||
new /obj/effect/hallucination/delusion(target.loc,target,"custom",200,0, icon_state,icon)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
|
||||
..()
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
//Will probably eventually be expanded to fit multiple types of Flan because I am a nerd.
|
||||
|
||||
/mob/living/simple_animal/hostile/flan
|
||||
name = "Flan"
|
||||
desc = "Definitely not a dessert."
|
||||
var/casting = 0
|
||||
icon_state = "flan" //Required for the inheritance of casting animations.
|
||||
icon_living = "flan"
|
||||
icon_dead = "flan_dead"
|
||||
turns_per_move = 5
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
speed = -2
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
harm_intent_damage = 5
|
||||
damage_coeff = list(BRUTE = 0.75, BURN = 1.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
attacktext = "headbutts"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
a_intent = INTENT_HARM
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 0
|
||||
ranged = 1
|
||||
retreat_distance = 2
|
||||
minimum_distance = 4
|
||||
AIStatus = AI_IDLE
|
||||
ranged_message = "begins to cast something"
|
||||
ranged_cooldown_time = 15
|
||||
var/spellname = "a generic spell!"
|
||||
var/spellsound = 'sound/effects/spray3.ogg'
|
||||
var/spellanimation = ATTACK_EFFECT_SMASH //More in defines/misc.dm
|
||||
var/spelldamagetype = BRUTE
|
||||
var/spelldamage = 15
|
||||
var/spellcasttime = 15 //if you varedit this also varedit ranged_cooldown_time else the mob will attack again before the spell hits, looking weird but still working
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/Initialize() //Required for the inheritance of casting animations.
|
||||
..()
|
||||
casting = 0
|
||||
icon_state = "[initial(icon_state)][casting]"
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/proc/spellaftereffects(mob/living/A) //Inherit and override. Allows for spells that stun and do basically anything you'd want.
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/OpenFire(mob/living/A) //Spellcasting!
|
||||
if(isliving(A)) //A is originally an atom, this is here to prevent that from fucking this up.
|
||||
visible_message("<span class='danger'><b>[src]</b> [ranged_message] at [A]!</span>")
|
||||
casting = 1
|
||||
icon_state = "[initial(icon_state)][casting]"
|
||||
if(do_after_mob(src, A, spellcasttime, uninterruptible = 1, progress = 0)) //Break LOS to dodge.
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if((A in view(src)))
|
||||
A.do_attack_animation(A, spellanimation)
|
||||
playsound(A, spellsound, 20, 1)
|
||||
A.apply_damage(damage = spelldamage,damagetype = spelldamagetype, def_zone = null, blocked = 0)
|
||||
visible_message("<span class='danger'><b>[A]</b> has been hit by [spellname]</span>")
|
||||
spellaftereffects(A,src)
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
casting = 0
|
||||
icon_state = "[initial(icon_state)][casting]"
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/fire
|
||||
name = "Flame Flan"
|
||||
desc = "You'd think they'd be spicy, but nobody has ever tried."
|
||||
icon_state = "fireflan"
|
||||
icon_living = "fireflan"
|
||||
icon_dead = "fireflan_dead"
|
||||
damage_coeff = list(BRUTE = 1.5, BURN = 0.75, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
spellname = "a Fire spell!"
|
||||
spellsound = 'sound/effects/fuse.ogg'
|
||||
spelldamagetype = BURN
|
||||
spellcasttime = 20
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/fire/spellaftereffects(mob/living/A)
|
||||
A.adjust_fire_stacks(2)
|
||||
A.IgniteMob()
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/water
|
||||
name = "Water Flan"
|
||||
desc = "Is pretty likely to dampen your spirits."
|
||||
icon_state = "flan"
|
||||
icon_living = "flan"
|
||||
icon_dead = "flan_dead"
|
||||
spellname = "a Water spell!"
|
||||
spelldamage = 10 //Basic flan, learn the dance with em.
|
||||
|
||||
/mob/living/simple_animal/hostile/flan/water/spellaftereffects(mob/living/A)
|
||||
A.ExtinguishMob()
|
||||
@@ -44,6 +44,7 @@ Difficulty: Hard
|
||||
ranged = 1
|
||||
pixel_x = -32
|
||||
del_on_death = 1
|
||||
crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
|
||||
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
|
||||
blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME
|
||||
var/charging = FALSE
|
||||
|
||||
@@ -46,7 +46,8 @@ Difficulty: Very Hard
|
||||
del_on_death = 1
|
||||
medal_type = MEDAL_PREFIX
|
||||
score_type = COLOSSUS_SCORE
|
||||
loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus)
|
||||
crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
|
||||
loot = list(/obj/structure/closet/crate/necropolis/colossus)
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
|
||||
deathmessage = "disintegrates, leaving a glowing core in its wake."
|
||||
death_sound = 'sound/magic/demon_dies.ogg'
|
||||
@@ -444,13 +445,6 @@ Difficulty: Very Hard
|
||||
/obj/machinery/anomalous_crystal/ex_act()
|
||||
ActivationReaction(null, ACTIVATE_BOMB)
|
||||
|
||||
/obj/effect/spawner/lootdrop/anomalous_crystal
|
||||
name = "anomalous crystal spawner"
|
||||
|
||||
/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize()
|
||||
loot = subtypesof(/obj/machinery/anomalous_crystal)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
|
||||
observer_desc = "This crystal strips and equips its targets as clowns."
|
||||
possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH)
|
||||
|
||||
@@ -51,6 +51,7 @@ Difficulty: Medium
|
||||
move_to_delay = 10
|
||||
ranged = 1
|
||||
pixel_x = -16
|
||||
crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
|
||||
loot = list(/obj/structure/closet/crate/necropolis/dragon)
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
|
||||
var/swooping = NONE
|
||||
|
||||
@@ -78,6 +78,9 @@ Difficulty: Hard
|
||||
internal = new/obj/item/device/gps/internal/hierophant(src)
|
||||
spawned_beacon = new(loc)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/hierophant/spawn_crusher_loot()
|
||||
new /obj/item/crusher_trophy/vortex_talisman(get_turf(spawned_beacon))
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/hierophant/Life()
|
||||
. = ..()
|
||||
if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client)
|
||||
@@ -461,6 +464,12 @@ Difficulty: Hard
|
||||
return ..()
|
||||
|
||||
/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
|
||||
if(mover == caster.pulledby)
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
if(P.firer == caster)
|
||||
return TRUE
|
||||
if(mover == caster)
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -589,6 +598,8 @@ Difficulty: Hard
|
||||
do_damage(get_turf(src))
|
||||
|
||||
/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T)
|
||||
if(!damage)
|
||||
return
|
||||
for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
|
||||
hit_things += L
|
||||
if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD)
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
/obj/structure/barricade,
|
||||
/obj/machinery/field,
|
||||
/obj/machinery/power/emitter)
|
||||
var/list/crusher_loot
|
||||
var/medal_type = MEDAL_PREFIX
|
||||
var/score_type = BOSS_SCORE
|
||||
var/elimination = 0
|
||||
@@ -44,6 +45,10 @@
|
||||
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
|
||||
mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/Initialize(mapload)
|
||||
. = ..()
|
||||
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/Destroy()
|
||||
QDEL_NULL(internal)
|
||||
. = ..()
|
||||
@@ -52,12 +57,19 @@
|
||||
if(health > 0)
|
||||
return
|
||||
else
|
||||
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
|
||||
if(C && crusher_loot)
|
||||
if(C.total_damage >= maxHealth * 0.60) //if you do at least 60% of its health with the crusher, you'll get the item
|
||||
spawn_crusher_loot()
|
||||
if(!admin_spawned)
|
||||
SSblackbox.set_details("megafauna_kills","[initial(name)]")
|
||||
if(!elimination) //used so the achievment only occurs for the last legion to die.
|
||||
grant_achievement(medal_type,score_type)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
|
||||
loot = crusher_loot
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/gib()
|
||||
if(health > 0)
|
||||
return
|
||||
|
||||
@@ -23,3 +23,51 @@
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
del_on_death = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace
|
||||
name = "Nanotrasen Private Security Officer"
|
||||
desc = "An officer part of Nanotrasen's private security force."
|
||||
icon = 'icons/mob/simple_human.dmi'
|
||||
icon_state = "nanotrasen"
|
||||
icon_living = "nanotrasen"
|
||||
icon_dead = null
|
||||
icon_gib = "syndicate_gib"
|
||||
turns_per_move = 5
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
speed = 0
|
||||
stat_attack = 1
|
||||
robust_searching = 1
|
||||
vision_range = 3
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 15
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
faction = list("nanotrasenprivate")
|
||||
a_intent = INTENT_HARM
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
status_flags = CANPUSH
|
||||
search_objects = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro()
|
||||
..()
|
||||
summon_backup(15)
|
||||
say("411 in progress, requesting backup!")
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged
|
||||
icon_state = "nanotrasenrangedsmg"
|
||||
icon_living = "nanotrasenrangedsmg"
|
||||
vision_range = 9
|
||||
rapid = 1
|
||||
ranged = 1
|
||||
retreat_distance = 3
|
||||
minimum_distance = 5
|
||||
casingtype = /obj/item/ammo_casing/c46x30mm
|
||||
projectilesound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
loot = list(/obj/item/weapon/gun/ballistic/automatic/wt550,
|
||||
/obj/effect/mob_spawn/human/corpse/nanotrasensoldier)
|
||||
@@ -309,11 +309,11 @@
|
||||
|
||||
if(Target)
|
||||
--target_patience
|
||||
if (target_patience <= 0 || SStun || Discipline || attacked || docile) // Tired of chasing or something draws out attention
|
||||
if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention
|
||||
target_patience = 0
|
||||
Target = null
|
||||
|
||||
if(AIproc && SStun)
|
||||
if(AIproc && SStun > world.time)
|
||||
return
|
||||
|
||||
var/hungry = 0 // determines if the slime is hungry
|
||||
|
||||
@@ -394,11 +394,7 @@
|
||||
if(buckled)
|
||||
Feedstop(silent=1) //we unbuckle the slime from the mob it latched onto.
|
||||
|
||||
spawn(0)
|
||||
SStun = 1
|
||||
sleep(rand(20,60))
|
||||
SStun = 0
|
||||
|
||||
SStun = world.time + rand(20,60)
|
||||
spawn(0)
|
||||
canmove = 0
|
||||
if(user)
|
||||
|
||||
@@ -39,4 +39,9 @@
|
||||
if(client)
|
||||
client.click_intercept = null
|
||||
|
||||
client.view = world.view // Resets the client.view in case it was changed.
|
||||
client.view = world.view // Resets the client.view in case it was changed.
|
||||
|
||||
if(!GLOB.individual_log_list[ckey])
|
||||
GLOB.individual_log_list[ckey] = logging
|
||||
else
|
||||
logging = GLOB.individual_log_list[ckey]
|
||||
|
||||
@@ -473,7 +473,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
ClickOn(T)
|
||||
|
||||
/mob/proc/log_message(message, message_type)
|
||||
if(!LAZYLEN(message) || !message_type)
|
||||
if(!LAZYLEN(message) || !message_type)
|
||||
return
|
||||
|
||||
if(!islist(logging[message_type]))
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/list/region_access = null
|
||||
var/list/head_subordinates = null
|
||||
var/target_dept = 0 //Which department this computer has access to. 0=all departments
|
||||
var/change_position_cooldown = 60
|
||||
var/change_position_cooldown = 30
|
||||
//Jobs you cannot open new positions for
|
||||
var/list/blacklisted = list(
|
||||
"AI",
|
||||
@@ -39,6 +39,10 @@
|
||||
//Assoc array: "JobName" = (int)<Opened Positions>
|
||||
var/list/opened_positions = list();
|
||||
|
||||
/datum/computer_file/program/card_mod/New()
|
||||
..()
|
||||
change_position_cooldown = config.id_console_jobslot_delay
|
||||
|
||||
|
||||
/datum/computer_file/program/card_mod/event_idremoved(background, slot)
|
||||
if(!slot || slot == 2)// slot being false means both are removed
|
||||
|
||||
@@ -304,7 +304,6 @@
|
||||
else
|
||||
info += t // Oh, he wants to edit to the end of the file, let him.
|
||||
updateinfolinks()
|
||||
i.on_write(src,usr)
|
||||
usr << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info_links]<HR>[stamps]</BODY><div align='right'style='position:fixed;bottom:0;font-style:bold;'><A href='?src=\ref[src];help=1'>\[?\]</A></div></HTML>", "window=[name]") // Update the window
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -197,12 +197,3 @@
|
||||
else
|
||||
icon_state = initial(icon_state) //looks like a normal pen when off.
|
||||
item_state = initial(item_state)
|
||||
|
||||
//Crayons path disambiguity sigh.
|
||||
/obj/item/proc/on_write(obj/item/weapon/paper/P, mob/user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user)
|
||||
P.contact_poison = "delayed_toxin"
|
||||
P.contact_poison_volume = 10
|
||||
add_logs(user,P,"used poison pen on")
|
||||
|
||||
@@ -18,12 +18,12 @@
|
||||
/obj/item/weapon/am_containment/ex_act(severity, target)
|
||||
switch(severity)
|
||||
if(1)
|
||||
explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess
|
||||
explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess
|
||||
if(src)
|
||||
qdel(src)
|
||||
if(2)
|
||||
if(prob((fuel/10)-stability))
|
||||
explosion(get_turf(src), 1, 2, 3, 5)
|
||||
explosion(get_turf(src), 1, 2, 3, 5)
|
||||
if(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
/obj/machinery/power/am_control_unit/process()
|
||||
if(exploding)
|
||||
explosion(get_turf(src),8,12,18,12)
|
||||
explosion(get_turf(src),8,12,18,12)
|
||||
if(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
+14
-10
@@ -27,8 +27,6 @@
|
||||
#define APC_UPOVERLAY_OPERATING 8192
|
||||
|
||||
|
||||
#define APC_UPDATE_ICON_COOLDOWN 200 // 20 seconds
|
||||
|
||||
// the Area Power Controller (APC), formerly Power Distribution Unit (PDU)
|
||||
// one per area, needs wire conection to power network through a terminal
|
||||
|
||||
@@ -93,13 +91,11 @@
|
||||
var/force_update = 0
|
||||
var/update_state = -1
|
||||
var/update_overlay = -1
|
||||
|
||||
var/icon_update_needed = FALSE
|
||||
|
||||
/obj/machinery/power/apc/connect_to_network()
|
||||
//Override because the APC does not directly connect to the network; it goes through a terminal.
|
||||
//The terminal is what the power computer looks for anyway.
|
||||
if(!terminal)
|
||||
make_terminal()
|
||||
if(terminal)
|
||||
terminal.connect_to_network()
|
||||
|
||||
@@ -212,11 +208,11 @@
|
||||
// update the APC icon to show the three base states
|
||||
// also add overlays for indicator lights
|
||||
/obj/machinery/power/apc/update_icon()
|
||||
|
||||
var/update = check_updates() //returns 0 if no need to update icons.
|
||||
// 1 if we need to update the icon_state
|
||||
// 2 if we need to update the overlays
|
||||
if(!update)
|
||||
icon_update_needed = FALSE
|
||||
return
|
||||
|
||||
if(update & 1) // Updating the icon state
|
||||
@@ -240,6 +236,8 @@
|
||||
icon_state = "apcemag"
|
||||
else if(update_state & UPSTATE_WIREEXP)
|
||||
icon_state = "apcewires"
|
||||
else if(update_state & UPSTATE_MAINT)
|
||||
icon_state = "apc0"
|
||||
|
||||
if(!(update_state & UPSTATE_ALLGOOD))
|
||||
cut_overlays()
|
||||
@@ -272,8 +270,9 @@
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
/obj/machinery/power/apc/proc/check_updates()
|
||||
icon_update_needed = FALSE
|
||||
|
||||
/obj/machinery/power/apc/proc/check_updates()
|
||||
var/last_update_state = update_state
|
||||
var/last_update_overlay = update_overlay
|
||||
update_state = 0
|
||||
@@ -344,7 +343,7 @@
|
||||
|
||||
// Used in process so it doesn't update the icon too much
|
||||
/obj/machinery/power/apc/proc/queue_icon_update()
|
||||
addtimer(CALLBACK(src, .proc/update_icon), APC_UPDATE_ICON_COOLDOWN, TIMER_UNIQUE)
|
||||
icon_update_needed = TRUE
|
||||
|
||||
//attack with an item - open/close cover, insert cell, or (un)lock interface
|
||||
|
||||
@@ -446,6 +445,8 @@
|
||||
update_icon()
|
||||
else if(emagged)
|
||||
to_chat(user, "<span class='warning'>The interface is broken!</span>")
|
||||
else if((stat & MAINT) && !opened)
|
||||
..() //its an empty closed frame... theres no wires to expose!
|
||||
else
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]")
|
||||
@@ -632,6 +633,8 @@
|
||||
charging = 0
|
||||
src.update_icon()
|
||||
return
|
||||
if((stat & MAINT) && !opened) //no board; no interface
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
|
||||
@@ -828,7 +831,7 @@
|
||||
if(!malf.can_shunt)
|
||||
to_chat(malf, "<span class='warning'>You cannot shunt!</span>")
|
||||
return
|
||||
if(src.z != 1)
|
||||
if(src.z != ZLEVEL_STATION)
|
||||
return
|
||||
occupier = new /mob/living/silicon/ai(src, malf.laws, malf) //DEAR GOD WHY? //IKR????
|
||||
occupier.adjustOxyLoss(malf.getOxyLoss())
|
||||
@@ -937,7 +940,8 @@
|
||||
return 0
|
||||
|
||||
/obj/machinery/power/apc/process()
|
||||
|
||||
if(icon_update_needed)
|
||||
update_icon()
|
||||
if(stat & (BROKEN|MAINT))
|
||||
return
|
||||
if(!area.requires_power)
|
||||
|
||||
@@ -509,6 +509,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
||||
slot_flags = SLOT_BELT
|
||||
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
|
||||
singular_name = "cable piece"
|
||||
full_w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/stack/cable_coil/cyborg
|
||||
is_cyborg = 1
|
||||
@@ -527,7 +528,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
||||
user.visible_message("<span class='suicide'>[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return(OXYLOSS)
|
||||
|
||||
/obj/item/stack/cable_coil/New(loc, new_amount = null, var/param_color = null)
|
||||
/obj/item/stack/cable_coil/Initialize(mapload, new_amount = null, param_color = null)
|
||||
. = ..()
|
||||
if(new_amount) // MAXCOIL by default
|
||||
amount = new_amount
|
||||
@@ -779,9 +780,9 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
||||
/obj/item/stack/cable_coil/cut
|
||||
item_state = "coil_red2"
|
||||
|
||||
/obj/item/stack/cable_coil/cut/New(loc)
|
||||
..()
|
||||
src.amount = rand(1,2)
|
||||
/obj/item/stack/cable_coil/cut/Initialize(mapload)
|
||||
. =..()
|
||||
amount = rand(1,2)
|
||||
pixel_x = rand(-2,2)
|
||||
pixel_y = rand(-2,2)
|
||||
update_icon()
|
||||
@@ -819,10 +820,11 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
||||
item_color = "white"
|
||||
icon_state = "coil_white"
|
||||
|
||||
/obj/item/stack/cable_coil/random/New()
|
||||
/obj/item/stack/cable_coil/random/Initialize(mapload)
|
||||
. = ..()
|
||||
item_color = pick("red","orange","yellow","green","cyan","blue","pink","white")
|
||||
icon_state = "coil_[item_color]"
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/stack/cable_coil/random/five
|
||||
amount = 5
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
corrupt()
|
||||
return
|
||||
//explosion(T, 0, 1, 2, 2)
|
||||
explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range)
|
||||
explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/proc/corrupt()
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
src.updateDialog()
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/proc/overheat()
|
||||
explosion(src.loc, 2, 5, 2, -1)
|
||||
explosion(src.loc, 2, 5, 2, -1)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, sheet_path))
|
||||
@@ -294,7 +294,7 @@
|
||||
board_path = /obj/item/weapon/circuitboard/machine/pacman/super
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/super/overheat()
|
||||
explosion(src.loc, 3, 3, 3, -1)
|
||||
explosion(src.loc, 3, 3, 3, -1)
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/mrs
|
||||
name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator"
|
||||
@@ -305,4 +305,4 @@
|
||||
board_path = /obj/item/weapon/circuitboard/machine/pacman/mrs
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/mrs/overheat()
|
||||
explosion(src.loc, 4, 4, 4, -1)
|
||||
explosion(src.loc, 4, 4, 4, -1)
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
#define SEVERE_POWER_PENALTY_THRESHOLD 7000 //Same as above, but causes more dangerous effects
|
||||
#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //Even more dangerous effects, threshold for tesla delamination
|
||||
#define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher.
|
||||
#define DAMAGE_HARDCAP 0.01
|
||||
#define DAMAGE_HARDCAP 0.0025
|
||||
#define DAMAGE_INCREASE_MULTIPLIER 0.25
|
||||
|
||||
|
||||
#define THERMAL_RELEASE_MODIFIER 5 //Higher == less heat released during reaction, not to be confused with the above values
|
||||
@@ -214,9 +215,9 @@
|
||||
damage_archived = damage
|
||||
if(takes_damage)
|
||||
//causing damage
|
||||
damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ), 0)
|
||||
damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500), 0)
|
||||
damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80), 0)
|
||||
damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0)
|
||||
|
||||
//healing damage
|
||||
if(combined_gas < MOLE_PENALTY_THRESHOLD)
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
|
||||
/datum/mapGeneratorModule/bottomLayer/lavaland_default
|
||||
spawnableTurfs = list(/turf/open/floor/plating/asteroid/basalt/lava_land_surface = 100)
|
||||
|
||||
/datum/mapGeneratorModule/bottomLayer/lavaland_mineral
|
||||
spawnableTurfs = list(/turf/closed/mineral/random/volcanic = 100)
|
||||
|
||||
/datum/mapGeneratorModule/bottomLayer/lavaland_mineral/dense
|
||||
spawnableTurfs = list(/turf/closed/mineral/random/high_chance/volcanic = 100)
|
||||
|
||||
/datum/mapGeneratorModule/splatterLayer/lavalandMonsters
|
||||
spawnableTurfs = list()
|
||||
spawnableAtoms = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 10,
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion = 10,
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 10)
|
||||
|
||||
/datum/mapGeneratorModule/splatterLayer/lavalandTendrils
|
||||
spawnableTurfs = list()
|
||||
spawnableAtoms = list(/mob/living/simple_animal/hostile/spawner/lavaland = 5,
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/legion = 5,
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/goliath = 5)
|
||||
|
||||
/datum/mapGenerator/lavaland/ground_only
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_default)
|
||||
|
||||
/datum/mapGenerator/lavaland/dense_ores
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral/dense)
|
||||
|
||||
/datum/mapGenerator/lavaland/normal_ores
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral)
|
||||
@@ -0,0 +1,29 @@
|
||||
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel
|
||||
spawnableTurfs = list(/turf/open/floor/plasteel = 100)
|
||||
var/ignore_wall = FALSE
|
||||
|
||||
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/place(turf/T)
|
||||
if(isclosedturf(T))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten
|
||||
ignore_wall = TRUE
|
||||
|
||||
/datum/mapGeneratorModule/border/normalWalls
|
||||
spawnableAtoms = list()
|
||||
spawnableTurfs = list(/turf/closed/wall = 100)
|
||||
|
||||
/datum/mapGenerator/repair
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel,
|
||||
/datum/mapGeneratorModule/bottomLayer/repressurize)
|
||||
|
||||
/datum/mapGenerator/repair/delete_walls
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
|
||||
/datum/mapGeneratorModule/bottomLayer/repressurize)
|
||||
|
||||
/datum/mapGenerator/repair/enclose_room
|
||||
modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
|
||||
/datum/mapGeneratorModule/border/normalWalls,
|
||||
/datum/mapGeneratorModule/bottomLayer/repressurize)
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
|
||||
caliber = ".50"
|
||||
projectile_type = /obj/item/projectile/bullet/sniper/soporific
|
||||
icon_state = ".50"
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/item/ammo_casing/haemorrhage
|
||||
desc = "A .50 bullet casing, specialised in causing massive bloodloss"
|
||||
@@ -131,7 +131,14 @@
|
||||
projectile_type = /obj/item/projectile/bullet/sniper/penetrator
|
||||
icon_state = ".50"
|
||||
|
||||
/obj/item/ammo_casing/point50/gang
|
||||
desc = "A black market .50 bullet casing."
|
||||
projectile_type = /obj/item/projectile/bullet/sniper/gang
|
||||
|
||||
/obj/item/ammo_casing/point50/gang/sleeper
|
||||
desc = "Am illegally modified tranquilizer round."
|
||||
projectile_type = /obj/item/projectile/bullet/sniper/gang/sleeper
|
||||
icon_state = "sleeper"
|
||||
|
||||
/// SAW ROUNDS
|
||||
|
||||
|
||||
@@ -264,6 +264,17 @@
|
||||
origin_tech = "combat=6;syndicate=3"
|
||||
max_ammo = 5
|
||||
|
||||
/obj/item/ammo_box/magazine/sniper_rounds/gang
|
||||
name = "black market sniper rounds (.50)"
|
||||
icon_state = ".50mag"
|
||||
origin_tech = "combat=6"
|
||||
ammo_type = /obj/item/ammo_casing/point50/gang
|
||||
|
||||
/obj/item/ammo_box/magazine/sniper_rounds/gang/sleeper
|
||||
name = "illegally modified tranquilizer round"
|
||||
icon_state = "soporific"
|
||||
origin_tech = "combat=6"
|
||||
ammo_type = /obj/item/ammo_casing/point50/gang/sleeper
|
||||
|
||||
//// SAW MAGAZINES
|
||||
|
||||
@@ -371,4 +382,4 @@
|
||||
icon_state = "oldrifle-[round(ammo_count(),4)]"
|
||||
|
||||
/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets"
|
||||
return
|
||||
return
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user