Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-27891
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
|
||||
|
||||
@@ -421,6 +421,8 @@
|
||||
return
|
||||
|
||||
var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
|
||||
if(world.RunningService())
|
||||
options += "Service Restart (Force restart DD)";
|
||||
var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
|
||||
if(result)
|
||||
SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -433,6 +435,9 @@
|
||||
if("Hardest Restart (No actions, just reboot)")
|
||||
|
||||
world.Reboot(fast_track = TRUE)
|
||||
if("Service Restart (Force restart DD)")
|
||||
GLOB.reboot_mode = REBOOT_MODE_HARD
|
||||
world.ServiceReboot()
|
||||
|
||||
/datum/admins/proc/end_round()
|
||||
set category = "Server"
|
||||
@@ -590,7 +595,7 @@
|
||||
set category = "Admin"
|
||||
set name = "Unprison"
|
||||
if (M.z == ZLEVEL_CENTCOM)
|
||||
M.loc = pick(GLOB.latejoin)
|
||||
SSjob.SendToLateJoin(M)
|
||||
message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]")
|
||||
log_admin("[key_name(usr)] has unprisoned [key_name(M)]")
|
||||
else
|
||||
|
||||
@@ -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(initiator_ckey, "Ticket #[id]: [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,11 +1,11 @@
|
||||
#define WHITELISTFILE "config/whitelist.txt"
|
||||
#define WHITELISTFILE "config/whitelist.txt, gamedata/config/whitelist.txt"
|
||||
|
||||
GLOBAL_LIST(whitelist)
|
||||
GLOBAL_PROTECT(whitelist)
|
||||
|
||||
/proc/load_whitelist()
|
||||
GLOB.whitelist = list()
|
||||
for(var/line in world.file2list(WHITELISTFILE))
|
||||
for(var/line in world.file2list(WHITELISTFILE))
|
||||
if(!line)
|
||||
continue
|
||||
if(findtextEx(line,"#",1,2))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -55,16 +55,3 @@
|
||||
var/loc = pick(L)
|
||||
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)*/
|
||||
|
||||
@@ -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"
|
||||
@@ -68,6 +70,8 @@
|
||||
|
||||
M.adjustOxyLoss(oxy_damage)
|
||||
M.adjustBruteLoss(brute_damage)
|
||||
M.adjustFireLoss(burn_damage)
|
||||
M.color = mob_color
|
||||
equip(M)
|
||||
|
||||
if(ckey)
|
||||
@@ -115,23 +119,29 @@
|
||||
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()
|
||||
|
||||
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")
|
||||
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))
|
||||
@@ -319,7 +329,6 @@
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a beach bum!"
|
||||
|
||||
|
||||
/datum/outfit/beachbum
|
||||
name = "Beach Bum"
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
@@ -353,7 +362,7 @@
|
||||
/obj/effect/mob_spawn/human/commander
|
||||
name = "Commander"
|
||||
id_job = "Commander"
|
||||
id_access_list = list(GLOB.access_cent_captain)
|
||||
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
|
||||
@@ -373,7 +382,7 @@
|
||||
/obj/effect/mob_spawn/human/nanotrasensoldier
|
||||
name = "Nanotrasen Private Security Officer"
|
||||
id_job = "Private Security Force"
|
||||
id_access_list = list(GLOB.access_cent_specops)
|
||||
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
|
||||
@@ -397,6 +406,16 @@
|
||||
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//////////////////////
|
||||
|
||||
@@ -460,4 +479,4 @@
|
||||
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
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
@@ -66,10 +66,10 @@
|
||||
|
||||
/datum/export/organ/hivelord
|
||||
cost = 1500
|
||||
unit_name = "active hivelord core"
|
||||
export_types = list(/obj/item/organ/hivelord_core)
|
||||
unit_name = "active regenerative core"
|
||||
export_types = list(/obj/item/organ/regenerative_core)
|
||||
|
||||
/datum/export/organ/alien/plasmavessel/get_cost(obj/item/organ/hivelord_core/C)
|
||||
/datum/export/organ/alien/plasmavessel/get_cost(obj/item/organ/regenerative_core/C)
|
||||
if(C.inert)
|
||||
return ..() / 3
|
||||
if(C.preserved)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
name = "goliath cloak"
|
||||
icon_state = "goliath_cloak"
|
||||
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear, /obj/item/weapon/twohanded/bonespear, /obj/item/organ/hivelord_core/legion, /obj/item/weapon/kitchen/knife/combat/bone, /obj/item/weapon/kitchen/knife/combat/survival)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear, /obj/item/weapon/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/weapon/kitchen/knife/combat/bone, /obj/item/weapon/kitchen/knife/combat/survival)
|
||||
armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
|
||||
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -147,15 +147,7 @@
|
||||
if(product_types[dispense_cone] >= 1)
|
||||
product_types[dispense_cone] -= 1
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc)
|
||||
I.cone_type = cone_name
|
||||
I.icon_state = "icecream_cone_[cone_name]"
|
||||
switch (I.cone_type)
|
||||
if ("waffle")
|
||||
I.reagents.add_reagent("nutriment", 1)
|
||||
if ("chocolate")
|
||||
I.reagents.add_reagent("cocoa", 1) // chocolate ain't as nutritious kids
|
||||
|
||||
I.desc = "Delicious [cone_name] cone, but no ice cream."
|
||||
I.set_cone_type(cone_name)
|
||||
src.visible_message("<span class='info'>[usr] dispenses a crunchy [cone_name] cone from [src].</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>There are no [cone_name] cones left!</span>")
|
||||
@@ -187,10 +179,23 @@
|
||||
var/cone_type
|
||||
bitesize = 3
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/New()
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/Initialize()
|
||||
. = ..()
|
||||
create_reagents(20)
|
||||
reagents.add_reagent("nutriment", 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/set_cone_type(var/cone_name)
|
||||
cone_type = cone_name
|
||||
icon_state = "icecream_cone_[cone_name]"
|
||||
switch (cone_type)
|
||||
if ("waffle")
|
||||
reagents.add_reagent("nutriment", 1)
|
||||
if ("chocolate")
|
||||
reagents.add_reagent("cocoa", 1) // chocolate ain't as nutritious kids
|
||||
|
||||
desc = "Delicious [cone_name] cone, but no ice cream."
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour_name)
|
||||
name = "[flavour_name] icecream"
|
||||
src.add_overlay("icecream_[flavour_name]")
|
||||
@@ -206,8 +211,15 @@
|
||||
if ("blue")
|
||||
desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?"
|
||||
reagents.add_reagent("singulo", 2)
|
||||
if ("mob")
|
||||
desc = "A suspicious [cone_type] cone filled with bright red ice cream. That's probably not strawberry..."
|
||||
reagents.add_reagent("liquidgibs", 2)
|
||||
ice_creamed = 1
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_mob_flavor(var/mob/M)
|
||||
add_ice_cream("mob")
|
||||
name = "[M.name] icecream"
|
||||
|
||||
/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
new /obj/item/stack/sheet/metal(loc, 4)
|
||||
|
||||
@@ -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
|
||||
@@ -264,12 +264,12 @@
|
||||
time = 40
|
||||
reqs = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath = 1,
|
||||
/obj/item/organ/hivelord_core/legion = 1,
|
||||
/obj/item/organ/regenerative_core/legion = 1,
|
||||
/datum/reagent/consumable/ketchup = 2,
|
||||
/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)
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
/obj/item/stack/sheet/animalhide/goliath_hide
|
||||
name = "goliath hide plates"
|
||||
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "goliath_hide"
|
||||
flags = NOBLUDGEON
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
layer = MOB_LAYER
|
||||
|
||||
/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(proximity_flag)
|
||||
if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/hooded/explorer) || istype(target, /obj/item/clothing/head/hooded/explorer))
|
||||
var/obj/item/clothing/C = target
|
||||
var/list/current_armor = C.armor
|
||||
if(current_armor.["melee"] < 60)
|
||||
current_armor.["melee"] = min(current_armor.["melee"] + 10, 60)
|
||||
to_chat(user, "<span class='info'>You strengthen [target], improving its resistance against melee attacks.</span>")
|
||||
use(1)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't improve [C] any further!</span>")
|
||||
return
|
||||
if(istype(target, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/D = target
|
||||
if(D.hides < 3)
|
||||
D.hides++
|
||||
D.armor["melee"] = min(D.armor["melee"] + 10, 70)
|
||||
D.armor["bullet"] = min(D.armor["bullet"] + 5, 50)
|
||||
D.armor["laser"] = min(D.armor["laser"] + 5, 50)
|
||||
to_chat(user, "<span class='info'>You strengthen [target], improving its resistance against melee attacks.</span>")
|
||||
D.update_icon()
|
||||
if(D.hides == 3)
|
||||
D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - its pilot must be an experienced monster hunter."
|
||||
else
|
||||
D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't improve [D] any further!</span>")
|
||||
return
|
||||
@@ -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
|
||||
|
||||
@@ -22,6 +22,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
|
||||
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
|
||||
@@ -55,14 +56,14 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
|
||||
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())
|
||||
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
|
||||
if(user.incapacitated() || !istype(user))
|
||||
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))
|
||||
if(user.incapacitated() || !istype(user) || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
@@ -127,15 +128,15 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/marker_beacon/AltClick(mob/user)
|
||||
/obj/structure/marker_beacon/AltClick(mob/living/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
if(user.incapacitated() || !istype(user))
|
||||
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))
|
||||
if(user.incapacitated() || !istype(user) || !in_range(src, user))
|
||||
return
|
||||
if(input_color)
|
||||
picked_color = input_color
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
/*********************Hivelord stabilizer****************/
|
||||
/obj/item/weapon/hivelordstabilizer
|
||||
name = "stabilizing serum"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle19"
|
||||
desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "biotech=3"
|
||||
|
||||
/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
|
||||
var/obj/item/organ/regenerative_core/C = M
|
||||
if(!istype(C, /obj/item/organ/regenerative_core))
|
||||
to_chat(user, "<span class='warning'>The stabilizer only works on certain types of monster organs, generally regenerative in nature.</span>")
|
||||
return ..()
|
||||
|
||||
C.preserved()
|
||||
to_chat(user, "<span class='notice'>You inject the [M] with the stabilizer. It will no longer go inert.</span>")
|
||||
qdel(src)
|
||||
|
||||
/************************Hivelord core*******************/
|
||||
/obj/item/organ/regenerative_core
|
||||
name = "regenerative core"
|
||||
desc = "All that remains of a hivelord. It can be used to heal completely, but it will rapidly decay into uselessness."
|
||||
icon_state = "roro core 2"
|
||||
flags = NOBLUDGEON
|
||||
slot = "hivecore"
|
||||
force = 0
|
||||
actions_types = list(/datum/action/item_action/organ_action/use)
|
||||
var/inert = 0
|
||||
var/preserved = 0
|
||||
|
||||
/obj/item/organ/regenerative_core/Initialize()
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/inert_check), 2400)
|
||||
|
||||
/obj/item/organ/regenerative_core/proc/inert_check()
|
||||
if(!preserved)
|
||||
go_inert()
|
||||
|
||||
/obj/item/organ/regenerative_core/proc/preserved(implanted = 0)
|
||||
inert = FALSE
|
||||
preserved = TRUE
|
||||
update_icon()
|
||||
desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay."
|
||||
if(implanted)
|
||||
SSblackbox.add_details("hivelord_core", "[type]|implanted")
|
||||
else
|
||||
SSblackbox.add_details("hivelord_core", "[type]|stabilizer")
|
||||
|
||||
/obj/item/organ/regenerative_core/proc/go_inert()
|
||||
inert = TRUE
|
||||
name = "decayed regenerative core"
|
||||
desc = "All that remains of a hivelord. It has decayed, and is completely useless."
|
||||
SSblackbox.add_details("hivelord_core", "[type]|inert")
|
||||
update_icon()
|
||||
|
||||
/obj/item/organ/regenerative_core/ui_action_click()
|
||||
if(inert)
|
||||
to_chat(owner, "<span class='notice'>[src] breaks down as it tries to activate.</span>")
|
||||
else
|
||||
owner.revive(full_heal = 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/regenerative_core/on_life()
|
||||
..()
|
||||
if(owner.health < HEALTH_THRESHOLD_CRIT)
|
||||
ui_action_click()
|
||||
|
||||
/obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(proximity_flag && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(inert)
|
||||
to_chat(user, "<span class='notice'>[src] has decayed and can no longer be used to heal.</span>")
|
||||
return
|
||||
else
|
||||
if(H.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'>[src] are useless on the dead.</span>")
|
||||
return
|
||||
if(H != user)
|
||||
H.visible_message("[user] forces [H] to apply [src]... [H.p_they()] quickly regenerate all injuries!")
|
||||
SSblackbox.add_details("hivelord_core","[src.type]|used|other")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.</span>")
|
||||
SSblackbox.add_details("hivelord_core","[src.type]|used|self")
|
||||
H.revive(full_heal = 1)
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
/obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
. = ..()
|
||||
if(!preserved && !inert)
|
||||
preserved(TRUE)
|
||||
owner.visible_message("<span class='notice'>[src] stabilizes as it's inserted.</span>")
|
||||
|
||||
/obj/item/organ/regenerative_core/Remove(mob/living/carbon/M, special = 0)
|
||||
if(!inert && !special)
|
||||
owner.visible_message("<span class='notice'>[src] rapidly decays as it's removed.</span>")
|
||||
go_inert()
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/regenerative_core/prepare_eat()
|
||||
return null
|
||||
|
||||
/*************************Legion core********************/
|
||||
/obj/item/organ/regenerative_core/legion
|
||||
desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
|
||||
icon_state = "legion_soul"
|
||||
|
||||
/obj/item/organ/regenerative_core/legion/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/organ/regenerative_core/update_icon()
|
||||
icon_state = inert ? "legion_soul_inert" : "legion_soul"
|
||||
cut_overlays()
|
||||
if(!inert && !preserved)
|
||||
add_overlay("legion_soul_crackle")
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/organ/regenerative_core/legion/go_inert()
|
||||
..()
|
||||
desc = "[src] has become inert. It has decayed, and is completely useless."
|
||||
|
||||
/obj/item/organ/regenerative_core/legion/preserved(implanted = 0)
|
||||
..()
|
||||
desc = "[src] has been stabilized. It is preserved, allowing you to use it to heal completely without danger of decay."
|
||||
@@ -12,22 +12,3 @@
|
||||
|
||||
/obj/item/clothing/mask/facehugger/toy/Die()
|
||||
return
|
||||
|
||||
/*********************Hivelord stabilizer****************/
|
||||
/obj/item/weapon/hivelordstabilizer
|
||||
name = "stabilizing serum"
|
||||
icon = 'icons/obj/chemical.dmi'
|
||||
icon_state = "bottle19"
|
||||
desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "biotech=3"
|
||||
|
||||
/obj/item/weapon/hivelordstabilizer/afterattack(obj/item/organ/M, mob/user)
|
||||
var/obj/item/organ/hivelord_core/C = M
|
||||
if(!istype(C, /obj/item/organ/hivelord_core))
|
||||
to_chat(user, "<span class='warning'>The stabilizer only works on certain types of monster organs, generally regenerative in nature.</span>")
|
||||
return ..()
|
||||
|
||||
C.preserved()
|
||||
to_chat(user, "<span class='notice'>You inject the [M] with the stabilizer. It will no longer go inert.</span>")
|
||||
qdel(src)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -260,7 +260,6 @@
|
||||
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)
|
||||
|
||||
@@ -140,8 +140,7 @@
|
||||
observer.name = observer.real_name
|
||||
observer.update_icon()
|
||||
observer.stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
qdel(mind)
|
||||
|
||||
QDEL_NULL(mind)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
@@ -322,28 +321,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
|
||||
@@ -371,7 +351,6 @@
|
||||
if(SHUTTLE_CALL)
|
||||
if(SSshuttle.emergency.timeLeft(1) > initial(SSshuttle.emergencyCallTime)*0.5)
|
||||
SSticker.mode.make_antag_chance(humanc)
|
||||
qdel(src)
|
||||
|
||||
/mob/dead/new_player/proc/AddEmploymentContract(mob/living/carbon/human/employee)
|
||||
//TODO: figure out a way to exclude wizards/nukeops/demons from this.
|
||||
@@ -470,6 +449,8 @@
|
||||
if(.)
|
||||
new_character.key = key //Manually transfer the key to log them in
|
||||
new_character.stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
new_character = null
|
||||
qdel(src)
|
||||
|
||||
/mob/dead/new_player/proc/ViewManifest()
|
||||
var/dat = "<html><body>"
|
||||
|
||||
@@ -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()
|
||||
|
||||
..()
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
spawn(10)
|
||||
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()
|
||||
|
||||
@@ -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, \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -380,17 +381,22 @@ Difficulty: Hard
|
||||
break
|
||||
max_amount--
|
||||
var/obj/effect/decal/cleanable/blood/B = H
|
||||
new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter(B.loc)
|
||||
new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(B.loc)
|
||||
return max_amount
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter
|
||||
name = "slaughterling"
|
||||
desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you."
|
||||
icon_state = "bloodbrood"
|
||||
icon_living = "bloodbrood"
|
||||
icon_aggro = "bloodbrood"
|
||||
attacktext = "pierces"
|
||||
color = "#C80000"
|
||||
density = 0
|
||||
faction = list("mining", "boss")
|
||||
weather_immunities = list("lava","ash")
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter/CanPass(atom/movable/mover, turf/target, height = 0)
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter/CanPass(atom/movable/mover, turf/target, height = 0)
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,80 @@
|
||||
//A beast that fire freezing blasts.
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk
|
||||
name = "basilisk"
|
||||
desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Basilisk"
|
||||
icon_living = "Basilisk"
|
||||
icon_aggro = "Basilisk_alert"
|
||||
icon_dead = "Basilisk_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
move_to_delay = 20
|
||||
projectiletype = /obj/item/projectile/temp/basilisk
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
ranged = 1
|
||||
ranged_message = "stares"
|
||||
ranged_cooldown_time = 30
|
||||
throw_message = "does nothing against the hard shell of"
|
||||
vision_range = 2
|
||||
speed = 3
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 12
|
||||
melee_damage_upper = 12
|
||||
attacktext = "bites into"
|
||||
a_intent = INTENT_HARM
|
||||
speak_emote = list("chitters")
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 2
|
||||
turns_per_move = 5
|
||||
loot = list(/obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER},
|
||||
/obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER})
|
||||
|
||||
/obj/item/projectile/temp/basilisk
|
||||
name = "freezing blast"
|
||||
icon_state = "ice_2"
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
nodamage = 1
|
||||
flag = "energy"
|
||||
temperature = 50
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target)
|
||||
if(..()) //we have a target
|
||||
if(isliving(target) && !target.Adjacent(targets_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams
|
||||
OpenFire(target)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target)
|
||||
switch(severity)
|
||||
if(1)
|
||||
gib()
|
||||
if(2)
|
||||
adjustBruteLoss(140)
|
||||
if(3)
|
||||
adjustBruteLoss(110)
|
||||
|
||||
//Watcher
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher
|
||||
name = "watcher"
|
||||
desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body."
|
||||
icon = 'icons/mob/lavaland/watcher.dmi'
|
||||
icon_state = "watcher"
|
||||
icon_living = "watcher"
|
||||
icon_aggro = "watcher"
|
||||
icon_dead = "watcher_dead"
|
||||
pixel_x = -10
|
||||
throw_message = "bounces harmlessly off of"
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attacktext = "impales"
|
||||
a_intent = INTENT_HARM
|
||||
speak_emote = list("telepathically cries")
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
stat_attack = UNCONSCIOUS
|
||||
movement_type = FLYING
|
||||
robust_searching = 1
|
||||
loot = list()
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
||||
@@ -0,0 +1,79 @@
|
||||
//An ore-devouring but easily scared creature
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub
|
||||
name = "goldgrub"
|
||||
desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Goldgrub"
|
||||
icon_living = "Goldgrub"
|
||||
icon_aggro = "Goldgrub_alert"
|
||||
icon_dead = "Goldgrub_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
vision_range = 2
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 2
|
||||
move_to_delay = 5
|
||||
friendly = "harmlessly rolls into"
|
||||
maxHealth = 45
|
||||
health = 45
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
attacktext = "barrels into"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
a_intent = INTENT_HELP
|
||||
speak_emote = list("screeches")
|
||||
throw_message = "sinks in slowly, before being pushed out of "
|
||||
deathmessage = "spits up the contents of its stomach before dying!"
|
||||
status_flags = CANPUSH
|
||||
search_objects = 1
|
||||
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
|
||||
/obj/item/weapon/ore/uranium)
|
||||
|
||||
var/chase_time = 100
|
||||
var/will_burrow = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/Initialize()
|
||||
..()
|
||||
var/i = rand(1,3)
|
||||
while(i)
|
||||
loot += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond)
|
||||
i--
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target)
|
||||
target = new_target
|
||||
if(target != null)
|
||||
if(istype(target, /obj/item/weapon/ore) && loot.len < 10)
|
||||
visible_message("<span class='notice'>The [src.name] looks at [target.name] with hungry eyes.</span>")
|
||||
else if(isliving(target))
|
||||
Aggro()
|
||||
visible_message("<span class='danger'>The [src.name] tries to flee from [target.name]!</span>")
|
||||
retreat_distance = 10
|
||||
minimum_distance = 10
|
||||
if(will_burrow)
|
||||
addtimer(CALLBACK(src, .proc/Burrow), chase_time)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
|
||||
if(istype(target, /obj/item/weapon/ore))
|
||||
EatOre(target)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/targeted_ore)
|
||||
for(var/obj/item/weapon/ore/O in targeted_ore.loc)
|
||||
if(loot.len < 10)
|
||||
loot += O.type
|
||||
qdel(O)
|
||||
visible_message("<span class='notice'>The ore was swallowed whole!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
|
||||
if(!stat)
|
||||
visible_message("<span class='danger'>The [src.name] buries into the ground, vanishing from sight!</span>")
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P)
|
||||
visible_message("<span class='danger'>The [P.name] was repelled by [src.name]'s girth!</span>")
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
idle_vision_range = 9
|
||||
. = ..()
|
||||
@@ -0,0 +1,130 @@
|
||||
//A slow but strong beast that tries to stun using its tentacles
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath
|
||||
name = "goliath"
|
||||
desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Goliath"
|
||||
icon_living = "Goliath"
|
||||
icon_aggro = "Goliath_alert"
|
||||
icon_dead = "Goliath_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
mouse_opacity = 2
|
||||
move_to_delay = 40
|
||||
ranged = 1
|
||||
ranged_cooldown_time = 120
|
||||
friendly = "wails at"
|
||||
speak_emote = list("bellows")
|
||||
vision_range = 4
|
||||
speed = 3
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
harm_intent_damage = 0
|
||||
obj_damage = 100
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
attacktext = "pulverizes"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
throw_message = "does nothing to the rocky hide of the"
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 5
|
||||
anchored = TRUE //Stays anchored until death as to be unpullable
|
||||
var/pre_attack = 0
|
||||
var/pre_attack_icon = "Goliath_preattack"
|
||||
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
|
||||
..()
|
||||
handle_preattack()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
|
||||
if(ranged_cooldown <= world.time + ranged_cooldown_time*0.25 && !pre_attack)
|
||||
pre_attack++
|
||||
if(!pre_attack || stat || AIStatus == AI_IDLE)
|
||||
return
|
||||
icon_state = pre_attack_icon
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/revive(full_heal = 0, admin_revive = 0)
|
||||
if(..())
|
||||
anchored = TRUE
|
||||
. = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed)
|
||||
anchored = 0
|
||||
..(gibbed)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
|
||||
var/tturf = get_turf(target)
|
||||
if(!isturf(tturf))
|
||||
return
|
||||
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
|
||||
visible_message("<span class='warning'>The [src.name] digs its tentacles under [target.name]!</span>")
|
||||
new /obj/effect/goliath_tentacle/original(tturf)
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
icon_state = icon_aggro
|
||||
pre_attack = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
ranged_cooldown -= 10
|
||||
handle_preattack()
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/Aggro()
|
||||
vision_range = aggro_vision_range
|
||||
handle_preattack()
|
||||
if(icon_state != icon_aggro)
|
||||
icon_state = icon_aggro
|
||||
|
||||
//Lavaland Goliath
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/beast
|
||||
name = "goliath"
|
||||
desc = "A hulking, armor-plated beast with long tendrils arching from its back."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "goliath"
|
||||
icon_living = "goliath"
|
||||
icon_aggro = "goliath"
|
||||
icon_dead = "goliath_dead"
|
||||
throw_message = "does nothing to the tough hide of the"
|
||||
pre_attack_icon = "goliath2"
|
||||
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
|
||||
loot = list()
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
|
||||
//tentacles
|
||||
/obj/effect/goliath_tentacle
|
||||
name = "Goliath tentacle"
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Goliath_tentacle"
|
||||
var/latched = FALSE
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/goliath_tentacle/Initialize()
|
||||
. = ..()
|
||||
if(ismineralturf(loc))
|
||||
var/turf/closed/mineral/M = loc
|
||||
M.gets_drilled()
|
||||
addtimer(CALLBACK(src, .proc/Trip), 10)
|
||||
|
||||
/obj/effect/goliath_tentacle/original/Initialize()
|
||||
. = ..()
|
||||
for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you
|
||||
if(O != src)
|
||||
qdel(src)
|
||||
var/list/directions = GLOB.cardinal.Copy()
|
||||
for(var/i in 1 to 3)
|
||||
var/spawndir = pick(directions)
|
||||
directions -= spawndir
|
||||
var/turf/T = get_step(src,spawndir)
|
||||
if(T)
|
||||
new /obj/effect/goliath_tentacle(T)
|
||||
|
||||
/obj/effect/goliath_tentacle/proc/Trip()
|
||||
for(var/mob/living/M in src.loc)
|
||||
visible_message("<span class='danger'>The [src.name] grabs hold of [M.name]!</span>")
|
||||
M.Stun(5)
|
||||
M.adjustBruteLoss(rand(10,15))
|
||||
latched = TRUE
|
||||
if(!latched)
|
||||
qdel(src)
|
||||
else
|
||||
QDEL_IN(src, 50)
|
||||
@@ -0,0 +1,113 @@
|
||||
//Gutlunches, passive mods that devour blood and gibs
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch
|
||||
name = "gutlunch"
|
||||
desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "gutlunch"
|
||||
icon_living = "gutlunch"
|
||||
icon_dead = "gutlunch"
|
||||
speak_emote = list("warbles", "quavers")
|
||||
emote_hear = list("trills.")
|
||||
emote_see = list("sniffs.", "burps.")
|
||||
weather_immunities = list("lava","ash")
|
||||
faction = list("mining", "ashwalker")
|
||||
density = 0
|
||||
speak_chance = 1
|
||||
turns_per_move = 8
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
move_to_delay = 15
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "squishes"
|
||||
friendly = "pinches"
|
||||
a_intent = INTENT_HELP
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
gold_core_spawnable = 2
|
||||
stat_attack = UNCONSCIOUS
|
||||
gender = NEUTER
|
||||
stop_automated_movement = FALSE
|
||||
stop_automated_movement_when_pulled = TRUE
|
||||
stat_exclusive = TRUE
|
||||
robust_searching = TRUE
|
||||
search_objects = TRUE
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs)
|
||||
deathmessage = "is pulped into bugmash."
|
||||
|
||||
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
|
||||
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
|
||||
|
||||
wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/)
|
||||
var/obj/item/udder/gutlunch/udder = null
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
|
||||
udder = new()
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy()
|
||||
QDEL_NULL(udder)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons()
|
||||
cut_overlays()
|
||||
if(udder.reagents.total_volume == udder.reagents.maximum_volume)
|
||||
add_overlay("gl_full")
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params)
|
||||
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
udder.milkAnimal(O, user)
|
||||
regenerate_icons()
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget()
|
||||
if(is_type_in_typecache(target,wanted_objects)) //we eats
|
||||
udder.generateMilk()
|
||||
regenerate_icons()
|
||||
visible_message("<span class='notice'>[src] slurps up [target].</span>")
|
||||
qdel(target)
|
||||
return ..()
|
||||
|
||||
//Male gutlunch. They're smaller and more colorful!
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck
|
||||
name = "gubbuck"
|
||||
gender = MALE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/Initialize()
|
||||
..()
|
||||
add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY)
|
||||
resize = 0.85
|
||||
update_transform()
|
||||
|
||||
//Lady gutlunch. They make the babby.
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen
|
||||
name = "guthen"
|
||||
gender = FEMALE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life()
|
||||
..()
|
||||
if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full.
|
||||
make_babies()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/make_babies()
|
||||
. = ..()
|
||||
if(.)
|
||||
udder.reagents.clear_reagents()
|
||||
regenerate_icons()
|
||||
|
||||
//Gutlunch udder
|
||||
/obj/item/udder/gutlunch
|
||||
name = "nutrient sac"
|
||||
|
||||
/obj/item/udder/gutlunch/New()
|
||||
reagents = new(50)
|
||||
reagents.my_atom = src
|
||||
|
||||
/obj/item/udder/gutlunch/generateMilk()
|
||||
if(prob(60))
|
||||
reagents.add_reagent("cream", rand(2, 5))
|
||||
if(prob(45))
|
||||
reagents.add_reagent("salglu_solution", rand(2,5))
|
||||
|
||||
@@ -0,0 +1,216 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord
|
||||
name = "hivelord"
|
||||
desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Hivelord"
|
||||
icon_living = "Hivelord"
|
||||
icon_aggro = "Hivelord_alert"
|
||||
icon_dead = "Hivelord_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
mouse_opacity = 2
|
||||
move_to_delay = 14
|
||||
ranged = 1
|
||||
vision_range = 5
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 5
|
||||
speed = 3
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
attacktext = "lashes out at"
|
||||
speak_emote = list("telepathically cries")
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
throw_message = "falls right through the strange body of the"
|
||||
ranged_cooldown = 0
|
||||
ranged_cooldown_time = 20
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
retreat_distance = 3
|
||||
minimum_distance = 3
|
||||
pass_flags = PASSTABLE
|
||||
loot = list(/obj/item/organ/regenerative_core)
|
||||
var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target)
|
||||
if(world.time >= ranged_cooldown)
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new brood_type(src.loc)
|
||||
A.admin_spawned = admin_spawned
|
||||
A.GiveTarget(target)
|
||||
A.friends = friends
|
||||
A.faction = faction.Copy()
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
|
||||
OpenFire()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
|
||||
mouse_opacity = 1
|
||||
..(gibbed)
|
||||
|
||||
//A fragile but rapidly produced creature
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood
|
||||
name = "hivelord brood"
|
||||
desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Hivelordbrood"
|
||||
icon_living = "Hivelordbrood"
|
||||
icon_aggro = "Hivelordbrood"
|
||||
icon_dead = "Hivelordbrood"
|
||||
icon_gib = "syndicate_gib"
|
||||
mouse_opacity = 2
|
||||
move_to_delay = 1
|
||||
friendly = "buzzes near"
|
||||
vision_range = 10
|
||||
speed = 3
|
||||
maxHealth = 1
|
||||
health = 1
|
||||
movement_type = FLYING
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 2
|
||||
attacktext = "slashes"
|
||||
speak_emote = list("telepathically cries")
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
throw_message = "falls right through the strange body of the"
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
pass_flags = PASSTABLE
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/death), 100)
|
||||
|
||||
//Legion
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
name = "legion"
|
||||
desc = "You can still see what was once a human under the shifting mass of corruption."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "legion"
|
||||
icon_living = "legion"
|
||||
icon_aggro = "legion"
|
||||
icon_dead = "legion"
|
||||
icon_gib = "syndicate_gib"
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attacktext = "lashes out at"
|
||||
speak_emote = list("echoes")
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
throw_message = "bounces harmlessly off of"
|
||||
loot = list(/obj/item/organ/regenerative_core/legion)
|
||||
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
|
||||
del_on_death = 1
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
var/mob/living/carbon/human/stored_mob
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed)
|
||||
visible_message("<span class='warning'>The skulls on [src] wail in anger as they flee from their dying host!</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
if(T)
|
||||
if(stored_mob)
|
||||
stored_mob.forceMove(get_turf(src))
|
||||
stored_mob = null
|
||||
else
|
||||
new /obj/effect/mob_spawn/human/corpse/damaged(T)
|
||||
..(gibbed)
|
||||
|
||||
//Legion skull
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
|
||||
name = "legion"
|
||||
desc = "One of many."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "legion_head"
|
||||
icon_living = "legion_head"
|
||||
icon_aggro = "legion_head"
|
||||
icon_dead = "legion_head"
|
||||
icon_gib = "syndicate_gib"
|
||||
friendly = "buzzes near"
|
||||
vision_range = 10
|
||||
maxHealth = 1
|
||||
health = 5
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 12
|
||||
melee_damage_upper = 12
|
||||
attacktext = "bites"
|
||||
speak_emote = list("echoes")
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
throw_message = "is shrugged off by"
|
||||
pass_flags = PASSTABLE
|
||||
del_on_death = TRUE
|
||||
stat_attack = UNCONSCIOUS
|
||||
robust_searching = 1
|
||||
var/can_infest_dead = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
|
||||
if(isturf(loc))
|
||||
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
|
||||
if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD))
|
||||
infest(H)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
|
||||
visible_message("<span class='warning'>[name] burrows into the flesh of [H]!</span>")
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = new(H.loc)
|
||||
visible_message("<span class='warning'>[L] staggers to their feet!</span>")
|
||||
H.death()
|
||||
H.adjustBruteLoss(1000)
|
||||
L.stored_mob = H
|
||||
H.forceMove(L)
|
||||
qdel(src)
|
||||
|
||||
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
|
||||
stat_attack = 2
|
||||
maxHealth = 120
|
||||
health = 120
|
||||
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
|
||||
icon_state = "dwarf_legion"
|
||||
icon_living = "dwarf_legion"
|
||||
icon_aggro = "dwarf_legion"
|
||||
icon_dead = "dwarf_legion"
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
|
||||
stat_attack = 2
|
||||
can_infest_dead = TRUE
|
||||
|
||||
//Legion that spawns Legions
|
||||
/mob/living/simple_animal/hostile/spawner/legion
|
||||
name = "legion"
|
||||
desc = "One of many."
|
||||
icon = 'icons/mob/lavaland/dragon.dmi'
|
||||
icon_state = "legion"
|
||||
icon_living = "legion"
|
||||
icon_dead = "legion"
|
||||
health = 450
|
||||
maxHealth = 450
|
||||
max_mobs = 3
|
||||
spawn_time = 200
|
||||
spawn_text = "peels itself off from"
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
anchored = FALSE
|
||||
AIStatus = AI_ON
|
||||
stop_automated_movement = FALSE
|
||||
wander = TRUE
|
||||
maxbodytemp = INFINITY
|
||||
layer = MOB_LAYER
|
||||
del_on_death = TRUE
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
loot = list(/obj/item/organ/regenerative_core/legion = 3, /obj/effect/mob_spawn/human/corpse/damaged = 5)
|
||||
move_to_delay = 14
|
||||
vision_range = 5
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 5
|
||||
speed = 3
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
obj_damage = 30
|
||||
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
@@ -0,0 +1,59 @@
|
||||
//the base mining mob
|
||||
/mob/living/simple_animal/hostile/asteroid
|
||||
vision_range = 2
|
||||
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)
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
obj_damage = 30
|
||||
environment_smash = ENVIRONMENT_SMASH_WALLS
|
||||
minbodytemp = 0
|
||||
maxbodytemp = INFINITY
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "strikes"
|
||||
status_flags = 0
|
||||
a_intent = INTENT_HARM
|
||||
var/throw_message = "bounces off of"
|
||||
var/icon_aggro = null // for swapping to when we get aggressive
|
||||
see_in_dark = 8
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/Aggro()
|
||||
..()
|
||||
if(vision_range != aggro_vision_range)
|
||||
icon_state = icon_aggro
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/LoseAggro()
|
||||
..()
|
||||
if(stat == DEAD)
|
||||
return
|
||||
icon_state = icon_living
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
|
||||
if(!stat)
|
||||
Aggro()
|
||||
if(P.damage < 30 && P.damage_type != BRUTE)
|
||||
P.damage = (P.damage / 3)
|
||||
visible_message("<span class='danger'>[P] has a reduced effect on [src]!</span>")
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/T = AM
|
||||
if(!stat)
|
||||
Aggro()
|
||||
if(T.throwforce <= 20)
|
||||
visible_message("<span class='notice'>The [T.name] [src.throw_message] [src.name]!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
|
||||
SSblackbox.add_details("mobs_killed_mining","[src.type]")
|
||||
..(gibbed)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/handle_temperature_damage()
|
||||
if(bodytemperature < minbodytemp)
|
||||
adjustBruteLoss(2)
|
||||
else if(bodytemperature > maxbodytemp)
|
||||
adjustBruteLoss(20)
|
||||
@@ -0,0 +1,101 @@
|
||||
//Necropolis Tendrils, which spawn lavaland monsters and break into a chasm when killed
|
||||
/obj/effect/light_emitter/tendril
|
||||
set_luminosity = 4
|
||||
set_cap = 2.5
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland
|
||||
name = "necropolis tendril"
|
||||
desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it."
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
icon_state = "tendril"
|
||||
icon_living = "tendril"
|
||||
icon_dead = "tendril"
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
health = 250
|
||||
maxHealth = 250
|
||||
max_mobs = 3
|
||||
spawn_time = 300 //30 seconds default
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher
|
||||
spawn_text = "emerges from"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = INFINITY
|
||||
loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril)
|
||||
del_on_death = 1
|
||||
var/gps = null
|
||||
var/obj/effect/light_emitter/tendril/emitted_light
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/legion
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/Initialize()
|
||||
. = ..()
|
||||
emitted_light = new(loc)
|
||||
for(var/F in RANGE_TURFS(1, src))
|
||||
if(ismineralturf(F))
|
||||
var/turf/closed/mineral/M = F
|
||||
M.ChangeTurf(M.turf_type,FALSE,TRUE)
|
||||
gps = new /obj/item/device/gps/internal(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/Destroy()
|
||||
QDEL_NULL(emitted_light)
|
||||
QDEL_NULL(gps)
|
||||
. = ..()
|
||||
|
||||
#define MEDAL_PREFIX "Tendril"
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/death()
|
||||
var/last_tendril = TRUE
|
||||
for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in GLOB.mob_list)
|
||||
if(other != src)
|
||||
last_tendril = FALSE
|
||||
break
|
||||
if(last_tendril && !admin_spawned)
|
||||
if(global.medal_hub && global.medal_pass && global.medals_enabled)
|
||||
for(var/mob/living/L in view(7,src))
|
||||
if(L.stat)
|
||||
continue
|
||||
if(L.client)
|
||||
var/client/C = L.client
|
||||
var/suffixm = ALL_KILL_MEDAL
|
||||
var/prefix = MEDAL_PREFIX
|
||||
UnlockMedal("[prefix] [suffixm]",C)
|
||||
SetScore(TENDRIL_CLEAR_SCORE,C,1)
|
||||
..()
|
||||
#undef MEDAL_PREFIX
|
||||
|
||||
/obj/effect/collapse
|
||||
name = "collapsing necropolis tendril"
|
||||
desc = "Get clear!"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
icon_state = "tendril"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/obj/effect/light_emitter/tendril/emitted_light
|
||||
|
||||
/obj/effect/collapse/Initialize()
|
||||
. = ..()
|
||||
emitted_light = new(loc)
|
||||
visible_message("<span class='boldannounce'>The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!</span>")
|
||||
visible_message("<span class='warning'>Something falls free of the tendril!</span>")
|
||||
playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1)
|
||||
addtimer(CALLBACK(src, .proc/collapse), 50)
|
||||
|
||||
/obj/effect/collapse/Destroy()
|
||||
QDEL_NULL(emitted_light)
|
||||
return ..()
|
||||
|
||||
/obj/effect/collapse/proc/collapse()
|
||||
for(var/mob/M in range(7,src))
|
||||
shake_camera(M, 15, 1)
|
||||
playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1)
|
||||
visible_message("<span class='boldannounce'>The tendril falls inward, the ground around it widening into a yawning chasm!</span>")
|
||||
for(var/turf/T in range(2,src))
|
||||
if(!T.density)
|
||||
T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface)
|
||||
qdel(src)
|
||||
@@ -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)
|
||||
@@ -0,0 +1,127 @@
|
||||
//A fragile mob that becomes temporarily invincible and large to attack
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu
|
||||
name = "wumborian fugu"
|
||||
desc = "The wumborian fugu rapidly increases its body mass in order to ward off its prey. Great care should be taken to avoid it while it's in this state as it is nearly invincible, but it cannot maintain its form forever."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "Fugu"
|
||||
icon_living = "Fugu"
|
||||
icon_aggro = "Fugu"
|
||||
icon_dead = "Fugu_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
mouse_opacity = 2
|
||||
move_to_delay = 5
|
||||
friendly = "floats near"
|
||||
speak_emote = list("puffs")
|
||||
vision_range = 5
|
||||
speed = 0
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
attacktext = "chomps"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
throw_message = "is avoided by the"
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 5
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
var/wumbo = 0
|
||||
var/inflate_cooldown = 0
|
||||
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/Life()
|
||||
if(!wumbo)
|
||||
inflate_cooldown = max((inflate_cooldown - 1), 0)
|
||||
if(target && AIStatus == AI_ON)
|
||||
Inflate()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(!forced && wumbo)
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/Aggro()
|
||||
..()
|
||||
Inflate()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/verb/Inflate()
|
||||
set name = "Inflate"
|
||||
set category = "Fugu"
|
||||
set desc = "Temporarily increases your size, and makes you significantly more dangerous and tough."
|
||||
if(wumbo)
|
||||
to_chat(src, "<span class='notice'>You're already inflated.</span>")
|
||||
return
|
||||
if(inflate_cooldown)
|
||||
to_chat(src, "<span class='notice'>We need time to gather our strength.</span>")
|
||||
return
|
||||
if(buffed)
|
||||
to_chat(src, "<span class='notice'>Something is interfering with our growth.</span>")
|
||||
return
|
||||
wumbo = 1
|
||||
icon_state = "Fugu_big"
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
harm_intent_damage = 0
|
||||
throw_message = "is absorbed by the girth of the"
|
||||
retreat_distance = null
|
||||
minimum_distance = 1
|
||||
move_to_delay = 6
|
||||
transform *= 2
|
||||
environment_smash = ENVIRONMENT_SMASH_WALLS
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
speed = 1
|
||||
addtimer(CALLBACK(src, .proc/Deflate), 100)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate()
|
||||
if(wumbo)
|
||||
walk(src, 0)
|
||||
wumbo = 0
|
||||
icon_state = "Fugu"
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
harm_intent_damage = 5
|
||||
throw_message = "is avoided by the"
|
||||
retreat_distance = 9
|
||||
minimum_distance = 9
|
||||
move_to_delay = 2
|
||||
transform /= 2
|
||||
inflate_cooldown = 4
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
speed = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/death(gibbed)
|
||||
Deflate()
|
||||
..(gibbed)
|
||||
|
||||
/obj/item/asteroid/fugu_gland
|
||||
name = "wumborian fugu gland"
|
||||
desc = "The key to the wumborian fugu's ability to increase its mass arbitrarily, this disgusting remnant can apply the same effect to other creatures, giving them great strength."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "fugu_gland"
|
||||
flags = NOBLUDGEON
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
layer = MOB_LAYER
|
||||
origin_tech = "biotech=6"
|
||||
var/list/banned_mobs()
|
||||
|
||||
/obj/item/asteroid/fugu_gland/afterattack(atom/target, mob/user, proximity_flag)
|
||||
if(proximity_flag && istype(target, /mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/A = target
|
||||
if(A.buffed || (A.type in banned_mobs) || A.stat)
|
||||
to_chat(user, "<span class='warning'>Something's interfering with the [src]'s effects. It's no use.</span>")
|
||||
return
|
||||
A.buffed++
|
||||
A.maxHealth *= 1.5
|
||||
A.health = min(A.maxHealth,A.health*1.5)
|
||||
A.melee_damage_lower = max((A.melee_damage_lower * 2), 10)
|
||||
A.melee_damage_upper = max((A.melee_damage_upper * 2), 10)
|
||||
A.transform *= 2
|
||||
A.environment_smash += 2
|
||||
to_chat(user, "<span class='info'>You increase the size of [A], giving it a surge of strength!</span>")
|
||||
qdel(src)
|
||||
@@ -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
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
if(!user.dna)
|
||||
return -1
|
||||
user.dna.add_mutation(HULK)
|
||||
var/obj/item/organ/hivelord_core/organ = new /obj/item/organ/hivelord_core
|
||||
var/obj/item/organ/regenerative_core/organ = new /obj/item/organ/regenerative_core
|
||||
organ.Insert(user)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -96,8 +96,6 @@
|
||||
/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()
|
||||
|
||||
@@ -238,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()
|
||||
@@ -445,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"]")
|
||||
@@ -631,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, \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -244,6 +244,7 @@
|
||||
icon_state = "bulldog"
|
||||
item_state = "bulldog"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
weapon_weight = WEAPON_MEDIUM
|
||||
origin_tech = "combat=6;materials=4;syndicate=6"
|
||||
mag_type = /obj/item/ammo_box/magazine/m12g
|
||||
fire_sound = 'sound/weapons/Gunshot.ogg'
|
||||
@@ -261,8 +262,8 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/update_icon()
|
||||
cut_overlays()
|
||||
if(magazine)
|
||||
cut_overlays()
|
||||
add_overlay("[magazine.icon_state]")
|
||||
icon_state = "bulldog[chambered ? "" : "-e"]"
|
||||
|
||||
@@ -379,6 +380,11 @@
|
||||
pin = /obj/item/device/firing_pin/implant/pindicate
|
||||
origin_tech = "combat=7;syndicate=6"
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/sniper_rifle/gang
|
||||
name = "black market sniper rifle"
|
||||
desc = "A long ranged weapon that does significant damage. It is well worn from years of service."
|
||||
mag_type = /obj/item/ammo_box/magazine/sniper_rounds/gang
|
||||
|
||||
// Old Semi-Auto Rifle //
|
||||
|
||||
/obj/item/weapon/gun/ballistic/automatic/surplus
|
||||
|
||||
@@ -263,6 +263,7 @@
|
||||
icon_state = "dshotgun"
|
||||
item_state = "shotgun"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
weapon_weight = WEAPON_MEDIUM
|
||||
force = 10
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
var/list/modkits = list()
|
||||
|
||||
var/empty_state = "kineticgun_empty"
|
||||
var/recharge_timerid
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
|
||||
..()
|
||||
@@ -61,10 +62,10 @@
|
||||
. += A
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
|
||||
K.kinetic_gun = src //do something special on-hit, easy!
|
||||
for(var/A in get_modkits())
|
||||
var/obj/item/borg/upgrade/modkit/M = A
|
||||
M.modify_projectile(K)
|
||||
K.kinetic_modules += M //do something special on-hit, easy!
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
|
||||
holds_charge = TRUE
|
||||
@@ -100,15 +101,16 @@
|
||||
power_supply.use(500)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
|
||||
if(overheat)
|
||||
return
|
||||
if(!recharge_time)
|
||||
recharge_time = overheat_time
|
||||
overheat = TRUE
|
||||
|
||||
var/carried = 0
|
||||
if(!unique_frequency)
|
||||
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \
|
||||
loc.GetAllContents())
|
||||
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in loc.GetAllContents())
|
||||
|
||||
carried++
|
||||
|
||||
@@ -116,7 +118,8 @@
|
||||
else
|
||||
carried = 1
|
||||
|
||||
addtimer(CALLBACK(src, .proc/reload), overheat_time * carried)
|
||||
deltimer(recharge_timerid)
|
||||
recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE)
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
|
||||
return
|
||||
@@ -161,10 +164,10 @@
|
||||
log_override = TRUE
|
||||
|
||||
var/pressure_decrease = 0.25
|
||||
var/list/kinetic_modules = list()
|
||||
var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun
|
||||
|
||||
/obj/item/projectile/kinetic/Destroy()
|
||||
QDEL_NULL(kinetic_modules)
|
||||
kinetic_gun = null
|
||||
return ..()
|
||||
|
||||
/obj/item/projectile/kinetic/prehit(atom/target)
|
||||
@@ -190,15 +193,14 @@
|
||||
var/turf/target_turf = get_turf(target)
|
||||
if(!target_turf)
|
||||
target_turf = get_turf(src)
|
||||
if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
|
||||
for(var/obj/item/borg/upgrade/modkit/M in kinetic_gun.get_modkits())
|
||||
M.projectile_strike(src, target_turf, target, kinetic_gun)
|
||||
if(ismineralturf(target_turf))
|
||||
var/turf/closed/mineral/M = target_turf
|
||||
M.gets_drilled(firer)
|
||||
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
|
||||
K.color = color
|
||||
for(var/obj/item/borg/upgrade/modkit/M in kinetic_modules)
|
||||
if(QDELETED(M)) //whoever shot this was very, very unfortunate.
|
||||
continue
|
||||
M.projectile_strike(src, target_turf, target)
|
||||
|
||||
|
||||
//Modkits
|
||||
@@ -262,7 +264,7 @@
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
|
||||
/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
|
||||
//Range
|
||||
/obj/item/borg/upgrade/modkit/range
|
||||
@@ -311,7 +313,7 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple
|
||||
if(AOE.stats_stolen)
|
||||
if(AOE.stats_stolen || AOE == src)
|
||||
continue
|
||||
modifier += AOE.modifier //take its modifiers
|
||||
AOE.modifier = 0
|
||||
@@ -350,7 +352,7 @@
|
||||
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
|
||||
K.name = "kinetic explosion"
|
||||
|
||||
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
|
||||
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
if(stats_stolen)
|
||||
return
|
||||
new /obj/effect/temp_visual/explosion/fast(target_turf)
|
||||
@@ -382,6 +384,58 @@
|
||||
desc = "Causes the kinetic accelerator to damage mobs in an AoE."
|
||||
modifier = 0.2
|
||||
|
||||
//Tendril-unique modules
|
||||
/obj/item/borg/upgrade/modkit/cooldown/repeater
|
||||
name = "rapid repeater"
|
||||
desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown."
|
||||
denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater
|
||||
modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
|
||||
cost = 50
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
var/valid_repeat = FALSE
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.stat != DEAD)
|
||||
valid_repeat = TRUE
|
||||
if(ismineralturf(target_turf))
|
||||
valid_repeat = TRUE
|
||||
if(valid_repeat)
|
||||
KA.overheat = FALSE
|
||||
KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds.
|
||||
|
||||
/obj/item/borg/upgrade/modkit/lifesteal
|
||||
name = "lifesteal crystal"
|
||||
desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target."
|
||||
icon_state = "modkit_crystal"
|
||||
denied_type = /obj/item/borg/upgrade/modkit/lifesteal
|
||||
modifier = 2.5 //Not a very effective method of healing.
|
||||
cost = 20
|
||||
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
if(isliving(target) && isliving(K.firer))
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
return
|
||||
L = K.firer
|
||||
L.heal_ordered_damage(modifier, damage_heal_order)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/resonator_blasts
|
||||
name = "resonator blast"
|
||||
desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts."
|
||||
denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts
|
||||
cost = 30
|
||||
modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it.
|
||||
|
||||
/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
|
||||
if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs.
|
||||
var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in target_turf
|
||||
if(R)
|
||||
R.damage_multiplier = modifier
|
||||
R.burst()
|
||||
return
|
||||
new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30)
|
||||
|
||||
//Indoors
|
||||
/obj/item/borg/upgrade/modkit/indoors
|
||||
|
||||
@@ -279,7 +279,30 @@
|
||||
target.ex_act(rand(1,2))
|
||||
return ..()
|
||||
|
||||
/obj/item/projectile/bullet/sniper/gang
|
||||
damage = 55
|
||||
stun = 1
|
||||
weaken = 1
|
||||
dismemberment = 15
|
||||
armour_penetration = 25
|
||||
|
||||
/obj/item/projectile/bullet/sniper/gang/sleeper
|
||||
nodamage = 1
|
||||
stun = 0
|
||||
weaken = 0
|
||||
dismemberment = 0
|
||||
breakthings = FALSE
|
||||
|
||||
/obj/item/projectile/bullet/sniper/gang/sleeper/on_hit(atom/target, blocked = 0)
|
||||
if((blocked != 100) && isliving(target))
|
||||
var/mob/living/L = target
|
||||
L.blur_eyes(8)
|
||||
if(L.staminaloss >= 40)
|
||||
L.Sleeping(20)
|
||||
else
|
||||
L.adjustStaminaLoss(55)
|
||||
return 1
|
||||
|
||||
/obj/item/projectile/bullet/sniper/soporific
|
||||
armour_penetration = 0
|
||||
nodamage = 1
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
beaker.loc = src
|
||||
to_chat(user, "<span class='notice'>You add \the [B] to the machine.</span>")
|
||||
|
||||
beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker")
|
||||
beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker")
|
||||
beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position.
|
||||
add_overlay(beaker_overlay)
|
||||
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag))
|
||||
@@ -370,6 +370,19 @@
|
||||
|
||||
|
||||
/obj/machinery/chem_dispenser/mutagensaltpeter
|
||||
name = "mutagen and saltpeter dispenser"
|
||||
desc = "Creates and dispenses mutagen and even saltpeter."
|
||||
dispensable_reagents = list("mutagen", "saltpetre")
|
||||
name = "botanical chemical dispenser"
|
||||
desc = "Creates and dispenses chemicals useful for botany."
|
||||
dispensable_reagents = list(
|
||||
"mutagen",
|
||||
"saltpetre",
|
||||
"eznutriment",
|
||||
"left4zednutriment",
|
||||
"robustharvestnutriment",
|
||||
"water",
|
||||
"plantbgone",
|
||||
"weedkiller",
|
||||
"pestkiller",
|
||||
"cryoxadone",
|
||||
"ammonia",
|
||||
"ash",
|
||||
"diethylamine")
|
||||
|
||||
@@ -121,8 +121,8 @@
|
||||
/datum/chemical_reaction/nitrous_oxide
|
||||
name = "Nitrous Oxide"
|
||||
id = "nitrous_oxide"
|
||||
results = list("nitrous_oxide" = 2, "water" = 4)
|
||||
required_reagents = list("ammonia" = 3, "nitrogen" = 1, "oxygen" = 2)
|
||||
results = list("nitrous_oxide" = 5)
|
||||
required_reagents = list("ammonia" = 2, "nitrogen" = 1, "oxygen" = 2)
|
||||
required_temp = 525
|
||||
|
||||
////////////////////////////////// Mutation Toxins ///////////////////////////////////
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import pickle
|
||||
import socket
|
||||
|
||||
|
||||
def pack():
|
||||
data = sys.argv[1]
|
||||
|
||||
nudge(str.encode(data))
|
||||
|
||||
|
||||
def nudge(data):
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
with open('config/server_to_tool_bridge_port.txt', 'r') as myfile:
|
||||
portstr=myfile.read().replace('\n', '').strip()
|
||||
s.connect(("localhost", int(portstr)))
|
||||
s.send(data)
|
||||
s.close()
|
||||
|
||||
if __name__ == "__main__" and len(sys.argv) > 1:
|
||||
pack()
|
||||
@@ -0,0 +1,79 @@
|
||||
GLOBAL_VAR_INIT(reboot_mode, REBOOT_MODE_NORMAL) //if the world should request the service to kill it at reboot
|
||||
GLOBAL_PROTECT(reboot_mode)
|
||||
|
||||
/world/proc/RunningService()
|
||||
return params[SERVICE_WORLD_PARAM]
|
||||
|
||||
/world/proc/ExportService(command)
|
||||
return shell("python code/modules/server_tools/nudge.py \"[command]\"") == 0
|
||||
|
||||
/world/proc/IRCBroadcast(msg)
|
||||
ExportService("[SERVICE_REQUEST_IRC_BROADCAST] [msg]")
|
||||
|
||||
//called at the exact moment the world is supposed to reboot
|
||||
/world/proc/ServiceReboot()
|
||||
switch(GLOB.reboot_mode)
|
||||
if(REBOOT_MODE_HARD)
|
||||
to_chat(src, "<span class='boldannounce'>Hard reboot triggered, you will automatically reconnect...</span>")
|
||||
log_world("Sending shutdown request!");
|
||||
sleep(1) //flush the buffers
|
||||
ExportService(SERVICE_REQUEST_KILL_PROCESS)
|
||||
if(REBOOT_MODE_SHUTDOWN)
|
||||
to_chat(src, "<span class='boldannounce'>The server is shutting down...</span>")
|
||||
log_world("Deleting world")
|
||||
qdel(src)
|
||||
|
||||
/world/proc/ServiceCommand(list/params)
|
||||
var/sCK = RunningService()
|
||||
var/their_sCK = params[SERVICE_CMD_PARAM_KEY]
|
||||
|
||||
if(!their_sCK || their_sCK != sCK)
|
||||
return "Invalid comms key!";
|
||||
|
||||
var/command = params[SERVICE_CMD_PARAM_COMMAND]
|
||||
if(!command)
|
||||
return "No command!"
|
||||
|
||||
var/static/last_irc_status = 0
|
||||
switch(command)
|
||||
if(SERVICE_CMD_HARD_REBOOT)
|
||||
if(GLOB.reboot_mode != REBOOT_MODE_HARD)
|
||||
GLOB.reboot_mode = REBOOT_MODE_HARD
|
||||
log_world("Hard reboot requested by service")
|
||||
message_admins("The world will hard reboot at the end of the game. Requested by service.")
|
||||
SSblackbox.set_val("service_hard_restart", TRUE)
|
||||
if(SERVICE_CMD_GRACEFUL_SHUTDOWN)
|
||||
if(GLOB.reboot_mode != REBOOT_MODE_SHUTDOWN)
|
||||
GLOB.reboot_mode = REBOOT_MODE_SHUTDOWN
|
||||
log_world("Shutdown requested by service")
|
||||
message_admins("The world will shutdown at the end of the game. Requested by service.")
|
||||
SSblackbox.set_val("service_shutdown", TRUE)
|
||||
if(SERVICE_CMD_WORLD_ANNOUNCE)
|
||||
var/msg = params["message"]
|
||||
if(!istext(msg) || !msg)
|
||||
return "No message set!"
|
||||
to_chat(src, "<span class='boldannounce'>[html_encode(msg)]</span>")
|
||||
return "SUCCESS"
|
||||
if(SERVICE_CMD_IRC_STATUS)
|
||||
var/rtod = REALTIMEOFDAY
|
||||
if(rtod - last_irc_status < IRC_STATUS_THROTTLE)
|
||||
return
|
||||
last_irc_status = rtod
|
||||
var/list/adm = get_admin_counts()
|
||||
var/list/allmins = adm["total"]
|
||||
var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
|
||||
status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode ? SSticker.mode.name : "Not started"]."
|
||||
return status
|
||||
|
||||
if(SERVICE_CMD_ADMIN_MSG)
|
||||
return IrcPm(params[SERVICE_CMD_PARAM_TARGET], params[SERVICE_CMD_PARAM_MESSAGE], params[SERVICE_CMD_PARAM_SENDER])
|
||||
|
||||
if(SERVICE_CMD_NAME_CHECK)
|
||||
log_admin("IRC Name Check: [params[SERVICE_CMD_PARAM_SENDER]] on [params[SERVICE_CMD_PARAM_TARGET]]")
|
||||
message_admins("IRC name checking on [params[SERVICE_CMD_PARAM_TARGET]] from [params[SERVICE_CMD_PARAM_SENDER]]")
|
||||
return keywords_lookup(params[SERVICE_CMD_PARAM_TARGET], 1)
|
||||
if(SERVICE_CMD_ADMIN_WHO)
|
||||
return ircadminwho()
|
||||
else
|
||||
return "Unknown command: [command]"
|
||||
|
||||
@@ -48,16 +48,16 @@
|
||||
console = locate(/obj/machinery/requests_console) in A
|
||||
areas += A
|
||||
|
||||
if(GLOB.latejoin.len)
|
||||
if(SSjob.latejoin_trackers.len)
|
||||
WARNING("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.")
|
||||
|
||||
if(!new_latejoin.len)
|
||||
WARNING("Arrivals shuttle contains no chairs for spawn points. Reverting to latejoin landmarks.")
|
||||
if(!GLOB.latejoin.len)
|
||||
if(!SSjob.latejoin_trackers.len)
|
||||
WARNING("No latejoin landmarks exist. Players will spawn unbuckled on the shuttle.")
|
||||
return
|
||||
|
||||
GLOB.latejoin = new_latejoin
|
||||
SSjob.latejoin_trackers = new_latejoin
|
||||
|
||||
/obj/docking_port/mobile/arrivals/dockRoundstart()
|
||||
SSshuttle.generate_transit_dock(src)
|
||||
@@ -114,7 +114,7 @@
|
||||
Launch(FALSE)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure()
|
||||
for(var/I in GLOB.latejoin)
|
||||
for(var/I in SSjob.latejoin_trackers)
|
||||
var/turf/open/T = get_turf(I)
|
||||
var/pressure = T.air.return_pressure()
|
||||
if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
var/datum/effect_system/smoke_spread/s = new
|
||||
s.set_up(4,get_turf(centerpiece))
|
||||
s.start()
|
||||
var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),cannon_direction=centerpiece.get_cannon_direction())
|
||||
var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction())
|
||||
qdel(centerpiece.front)
|
||||
qdel(centerpiece.back)
|
||||
qdel(centerpiece)
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
cooldown = COOLDOWN_MEME
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0)
|
||||
new /obj/effect/hallucination/delusion(get_turf(L),L,null,150 * power_multiplier,0)
|
||||
|
||||
//WAKE UP
|
||||
else if((findtext(message, wakeup_words)))
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
|
||||
return 1
|
||||
else if(istype(tool, /obj/item/weapon/melee/synthetic_arm_blade))
|
||||
var/obj/item/weapon/melee/arm_blade/new_arm = new(target, silent = TRUE, synthetic = TRUE)
|
||||
var/obj/item/weapon/melee/arm_blade/new_arm = new(target,TRUE,TRUE)
|
||||
target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
/datum/uplink_item/dangerous/shotgun
|
||||
name = "Bulldog Shotgun"
|
||||
desc = "A fully-loaded semi-automatic drum-fed shotgun. Compatiable with all 12g rounds. Designed for close \
|
||||
quarter anti-personel engagements."
|
||||
quarter anti-personnel engagements."
|
||||
item = /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog
|
||||
cost = 8
|
||||
surplus = 40
|
||||
@@ -297,7 +297,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
/datum/uplink_item/dangerous/powerfist
|
||||
name = "Power Fist"
|
||||
desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
|
||||
Upon hitting a target, the piston-ram will extend foward to make contact for some serious damage. \
|
||||
Upon hitting a target, the piston-ram will extend forward to make contact for some serious damage. \
|
||||
Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \
|
||||
deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
|
||||
item = /obj/item/weapon/melee/powerfist
|
||||
@@ -649,13 +649,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
cost = 4
|
||||
exclude_modes = list(/datum/game_mode/nuclear,/datum/game_mode/gang)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/poison_pen
|
||||
name = "Poison Pen"
|
||||
desc = "Cutting edge of deadly writing implements technology, this gadget will infuse any piece of paper with delayed contact poison."
|
||||
item = /obj/item/weapon/pen/poison
|
||||
cost = 2
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/soap
|
||||
name = "Syndicate Soap"
|
||||
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. \
|
||||
@@ -905,7 +898,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/device_tools/military_belt
|
||||
name = "Chest Rig"
|
||||
desc = "A robust seven-slot set of webbing that is capable of holding all manner of tatical equipment."
|
||||
desc = "A robust seven-slot set of webbing that is capable of holding all manner of tactical equipment."
|
||||
item = /obj/item/weapon/storage/belt/military
|
||||
cost = 1
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -1021,7 +1014,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
/datum/uplink_item/device_tools/powersink
|
||||
name = "Power Sink"
|
||||
desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \
|
||||
load on the grid, causing a stationwide blackout. The sink is large and cannot be stored in most \
|
||||
load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \
|
||||
traditional bags and boxes."
|
||||
item = /obj/item/device/powersink
|
||||
cost = 6
|
||||
@@ -1059,7 +1052,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
/datum/uplink_item/device_tools/rad_laser
|
||||
name = "Radioactive Microlaser"
|
||||
desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a \
|
||||
powerful burst of radiation, which, after a short delay, can incapitate all but the most protected \
|
||||
powerful burst of radiation, which, after a short delay, can incapacitate all but the most protected \
|
||||
of humanoids. It has two settings: intensity, which controls the power of the radiation, \
|
||||
and wavelength, which controls how long the radiation delay is."
|
||||
item = /obj/item/device/healthanalyzer/rad_laser
|
||||
@@ -1241,7 +1234,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/role_restricted/mimery
|
||||
name = "Guide to Advanced Mimery Series"
|
||||
desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisble walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
|
||||
desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
|
||||
cost = 12
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/mimery
|
||||
restricted_roles = list("Mime")
|
||||
@@ -1353,7 +1346,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
|
||||
/datum/uplink_item/badass/surplus
|
||||
name = "Syndicate Surplus Crate"
|
||||
desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortion of items, \
|
||||
desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \
|
||||
but you never know. Contents are sorted to always be worth 50 TC."
|
||||
item = /obj/structure/closet/crate
|
||||
cost = 20
|
||||
|
||||
Reference in New Issue
Block a user