Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-27891

This commit is contained in:
LetterJay
2017-06-08 03:33:56 -05:00
251 changed files with 4967 additions and 9496 deletions
+1 -1
View File
@@ -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
+6 -1
View File
@@ -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
+8 -7
View File
@@ -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]"
+33 -31
View File
@@ -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]")
+18 -3
View File
@@ -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")
+12 -6
View File
@@ -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)
+2 -2
View File
@@ -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)*/
+27 -8
View File
@@ -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
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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()
-1
View File
@@ -100,7 +100,6 @@
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80)
flags_inv = HIDEJUMPSUIT
strip_delay = 80
put_on_delay = 60
+1 -1
View File
@@ -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
+67 -24
View File
@@ -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()
+60 -23
View File
@@ -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"
+4 -4
View File
@@ -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()
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+244 -36
View File
@@ -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"
-1
View File
@@ -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)
+4 -23
View File
@@ -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()
..()
+3
View File
@@ -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"
+1 -1
View File
@@ -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?
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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 -1
View File
@@ -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, \
+1
View File
@@ -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)
+6 -1
View File
@@ -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]
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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 ..()
-1
View File
@@ -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()
-9
View File
@@ -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")
+6 -2
View File
@@ -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, \
+1
View File
@@ -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 ///////////////////////////////////
+22
View File
@@ -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()
+79
View File
@@ -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]"
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+7 -14
View File
@@ -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