diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 436b4c76c78..7fedc48428d 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -38,7 +38,7 @@
for(var/path in (subtypesof(/datum/surgery)))
surgeries_list += new path()
- init_subtypes(/datum/table_recipe, table_recipes)
+ init_subtypes(/datum/crafting_recipe, crafting_recipes)
/* // Uncomment to debug chemical reaction list.
/client/verb/debug_chemical_list()
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 476a1d36ba9..2be17154cd3 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -13,7 +13,7 @@ var/global/list/nuke_tiles = list() //list of all turfs that turn to animate
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path.
-var/global/list/table_recipes = list() //list of all table craft recipes
+var/global/list/crafting_recipes = list() //list of all table craft recipes
var/global/list/rcd_list = list() //list of Rapid Construction Devices.
var/global/list/apcs_list = list() //list of all Area Power Controller machines, seperate from machines for powernet speeeeeeed.
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 29eea4900da..00e6e610f74 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -23,6 +23,7 @@
//Middle left indicators
#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
+#define ui_crafting "12:-10,1:5"
//Lower center, persistant menu
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm
index de79a28c5a2..631686b089b 100644
--- a/code/_onclick/hud/drones.dm
+++ b/code/_onclick/hud/drones.dm
@@ -64,6 +64,10 @@
zone_select.icon = ui_style
zone_select.update_icon(mymob)
+ using = new /obj/screen/inventory/craft
+ using.icon = ui_style
+ static_inventory += using
+
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index e7baed52506..0632c5ff809 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -41,9 +41,6 @@
icon_state = "power_display"
screen_loc = ui_lingchemdisplay
-
-
-
/mob/living/carbon/human/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style))
@@ -55,6 +52,10 @@
var/obj/screen/using
var/obj/screen/inventory/inv_box
+ using = new /obj/screen/inventory/craft
+ using.icon = ui_style
+ static_inventory += using
+
using = new /obj/screen/act_intent()
using.icon_state = mymob.a_intent
static_inventory += using
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index ef8ecf90a8b..72e5ae3c0f9 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -46,6 +46,15 @@
M.swap_hand()
return 1
+/obj/screen/inventory/craft
+ name = "crafting menu"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "craft"
+ screen_loc = ui_crafting
+
+/obj/screen/inventory/craft/Click()
+ var/mob/living/M = usr
+ M.OpenCraftingMenu()
/obj/screen/inventory
var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 677ccc18254..5aa5ced5756 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -365,8 +365,6 @@
/datum/action/innate/proc/Deactivate()
return
-
-
//Preset for action that call specific procs (consider innate).
/datum/action/generic
check_flags = 0
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 37e7a2f52b3..1d95041df3c 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -73,11 +73,11 @@ var/global/max_secret_rooms = 6
theme = "cult"
walltypes = list(/turf/closed/wall/cult=3,/turf/closed/mineral/random/high_chance=1)
floortypes = list(/turf/open/floor/plasteel/cult)
- treasureitems = list(/obj/item/device/soulstone/anybody=1, /obj/item/clothing/suit/space/cult=1, /obj/item/weapon/bedsheet/cult=2,
+ treasureitems = list(/obj/item/device/soulstone/anybody=1, /obj/item/clothing/suit/space/hardsuit/cult=1, /obj/item/weapon/bedsheet/cult=2,
/obj/item/clothing/suit/cultrobes=2, /mob/living/simple_animal/hostile/creature=3)
fluffitems = list(/obj/effect/gateway=1,/obj/effect/gibspawner=1,/obj/structure/cult/talisman=1,/obj/item/toy/crayon/red=2,
/obj/item/organ/heart=2, /obj/effect/decal/cleanable/blood=4,/obj/structure/table/wood=2,/obj/item/weapon/ectoplasm=3,
- /obj/item/clothing/head/helmet/space/cult=1, /obj/item/clothing/shoes/cult=1)
+ /obj/item/clothing/shoes/cult=1)
if("wizden")
theme = "wizden"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 61366698333..99e5a8205b7 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -66,8 +66,19 @@
hulk.do_attack_animation(src)
return
-/atom/proc/CheckParts()
- return
+/atom/proc/CheckParts(list/parts_list)
+ for(var/A in parts_list)
+ if(istype(A, /datum/reagent))
+ if(!reagents)
+ reagents = new()
+ reagents.reagent_list.Add(A)
+ reagents.conditional_update()
+ else if(istype(A, /atom/movable))
+ var/atom/movable/M = A
+ if(istype(M.loc, /mob/living))
+ var/mob/living/L = M.loc
+ L.unEquip(M)
+ M.loc = src
/atom/proc/assume_air(datum/gas_mixture/giver)
qdel(giver)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 179d87099e2..ebc7070d780 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -117,14 +117,16 @@
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-/obj/item/clothing/head/helmet/space/cult
+/obj/item/clothing/head/helmet/space/hardsuit/cult
name = "nar-sien hardened helmet"
desc = "A heavily-armored helmet worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
icon_state = "cult_helmet"
item_state = "cult_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ brightness_on = 0
+ actions_types = list()
-/obj/item/clothing/suit/space/cult
+/obj/item/clothing/suit/space/hardsuit/cult
name = "nar-sien hardened armor"
icon_state = "cult_armor"
item_state = "cult_armor"
@@ -132,6 +134,7 @@
w_class = 2
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/)
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
/obj/item/weapon/sharpener/cult
name = "eldritch whetstone"
@@ -151,10 +154,9 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
var/current_charges = 3
- var/shield_state = "shield-red"
hooded = 1
hoodtype = /obj/item/clothing/head/cult_hoodie
-
+
/obj/item/clothing/head/cult_hoodie
name = "empowered cultist armor"
desc = "Empowered garb which creates a powerful shield around the user."
@@ -163,8 +165,8 @@
body_parts_covered = HEAD
flags = NODROP
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
-
-/obj/item/clothing/suit/hooded/cultrobes/cult_shield/pickup(mob/living/user)
+
+/obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/user, slot)
..()
if(!iscultist(user))
user << "\"I wouldn't advise that.\""
@@ -172,26 +174,22 @@
user.unEquip(src, 1)
user.Dizzy(30)
user.Weaken(5)
-
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, attack_text, isinhands)
- if(current_charges > 0)
- var/datum/effect_system/spark_spread/s = new
- s.set_up(2, 1, src)
- s.start()
- owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!")
+ if(current_charges)
+ owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!")
current_charges--
- if(current_charges <= 0)
- owner.visible_message("[owner]'s shield is destroyed!")
- shield_state = "broken"
+ PoolOrNew(/obj/effect/overlay/temp/cult/sparks, get_turf(owner))
+ if(!current_charges)
+ owner.visible_message("The runed shield around [owner] suddenly disappears!")
owner.update_inv_wear_suit()
return 1
return 0
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands)
. = list()
- if(!isinhands)
- . += image(icon = 'icons/effects/effects.dmi', icon_state = "[shield_state]")
+ if(!isinhands && current_charges)
+ . += image(layer = MOB_LAYER+0.05, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult")
/obj/item/clothing/suit/hooded/cultrobes/berserker
name = "flagellant's robes"
@@ -205,7 +203,7 @@
slowdown = -1
hooded = 1
hoodtype = /obj/item/clothing/head/berserkerhood
-
+
/obj/item/clothing/head/berserkerhood
name = "flagellant's robes"
desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
@@ -214,8 +212,8 @@
flags = NODROP
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
-
-/obj/item/clothing/suit/hooded/cultrobes/berserker/pickup(mob/living/user)
+
+/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/user, slot)
..()
if(!iscultist(user))
user << "\"I wouldn't advise that.\""
@@ -223,7 +221,7 @@
user.unEquip(src, 1)
user.Dizzy(30)
user.Weaken(5)
-
+
/obj/item/clothing/glasses/night/cultblind
desc = "May nar-sie guide you through the darkness and shield you from the light."
name = "zealot's blindfold"
@@ -231,15 +229,15 @@
item_state = "blindfold"
darkness_view = 8
flash_protect = 1
-
-/obj/item/clothing/glasses/night/cultblind/pickup(mob/living/user)
+
+/obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot)
..()
if(!iscultist(user))
- user << "\"I wouldn't advise that.\""
- user << "An overwhelming sense of nausea overpowers you!"
+ user << "\"You want to be blind, do you?\""
user.unEquip(src, 1)
user.Dizzy(30)
user.Weaken(5)
+ user.blind_eyes(30)
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
name = "flask of unholy water"
@@ -255,7 +253,7 @@
icon_state ="bluespace"
color = "#ff0000"
var/global/curselimit = 0
-
+
/obj/item/device/shuttle_curse/attack_self(mob/user)
if(!iscultist(user))
user.unEquip(src, 1)
@@ -284,48 +282,57 @@
var/message = pick_n_take(curses)
priority_announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
curselimit++
-
+
/obj/item/device/cult_shift
name = "veil shifter"
- desc = "The veil between worlds is weak, this relic teleports you forward a small distance. It may be used twice before its power is lost."
+ desc = "This relic teleports you forward a medium distance."
icon = 'icons/obj/cult.dmi'
icon_state ="shifter"
var/uses = 2
-
+
+/obj/item/device/cult_shift/examine(mob/user)
+ ..()
+ if(uses)
+ user << "It has [uses] uses remaining."
+ else
+ user << "It seems drained."
+
/obj/item/device/cult_shift/proc/handle_teleport_grab(turf/T, mob/user)
- var/mob/living/carbon/human/H = user
- if(H.pulling && (istype(H.pulling, /mob/living)))
- var/mob/living/victim = H.pulling
- if(!victim.anchored)
- victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
- return
+ var/mob/living/carbon/C = user
+ if(C.pulling)
+ var/atom/movable/pulled = C.pulling
+ pulled.forceMove(T)
+ . = pulled
/obj/item/device/cult_shift/attack_self(mob/user)
+ if(!uses || !iscarbon(user))
+ user << "\The [src] is dull and unmoving in your hands."
+ return
if(!iscultist(user))
user.unEquip(src, 1)
- user.Weaken(5)
- user << "A powerful force shoves you away from [src]!"
+ step(src, pick(alldirs))
+ user << "\The [src] flickers out of your hands, too eager to move!"
return
- uses--
- if (uses<1)
- qdel(src)
- var/mob/living/carbon/human/H = user
- var/turf/destination = get_teleport_loc(H.loc,H,9,1,3,1,0,1)
- var/turf/mobloc = get_turf(H.loc)//Safety
- if(destination&&istype(mobloc, /turf))//So we don't teleport out of containers
- spawn(0)
- playsound(H.loc, "sparks", 50, 1)
- anim(mobloc,src,'icons/mob/mob.dmi',,"cultout",,H.dir)
+ var/mob/living/carbon/C = user
+ var/turf/mobloc = get_turf(C)
+ var/turf/destination = get_teleport_loc(mobloc,C,9,1,3,1,0,1)
- handle_teleport_grab(destination, H)
- H.loc = destination
+ if(destination)
+ uses--
+ if(uses <= 0)
+ icon_state ="shifter_drained"
+ playsound(mobloc, "sparks", 50, 1)
+ PoolOrNew(/obj/effect/overlay/temp/cult/phase/out, list(mobloc, C.dir))
+
+ var/atom/movable/pulled = handle_teleport_grab(destination, C)
+ C.forceMove(destination)
+ if(pulled)
+ C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
+
+ PoolOrNew(/obj/effect/overlay/temp/cult/phase, list(destination, C.dir))
+ playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(destination, "sparks", 50, 1)
- spawn(0)
- PoolOrNew(/obj/effect/particle_effect/sparks, H.loc)
- playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(H.loc, "sparks", 50, 1)
- anim(H.loc,H,'icons/mob/mob.dmi',,"cultin",,H.dir)
-
else
- H << "The veil cannot be torn here!"
+ C << "The veil cannot be torn here!"
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 3c3ccf77cdb..a4648b5fac6 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -6,42 +6,46 @@
var/health = 100
var/maxhealth = 100
+/obj/structure/cult/examine(mob/user)
+ ..()
+ if(iscultist(user) && cooldowntime > world.time)
+ user << "The magic in [src] is weak, it will be ready to use again in [getETA()]."
+
/obj/structure/cult/proc/getETA()
- var/time = round((0-(world.time-cooldowntime))/600, 1)
- var/eta = "[time] minutes."
- if(time == 1)
- eta = "about one minute."
- else if(time == 0)
- eta = "less than thirty seconds."
- return eta
-
+ var/time = (cooldowntime - world.time)/600
+ var/eta = "[round(time, 1)] minutes"
+ if(time <= 1)
+ time = (cooldowntime - world.time)*0.1
+ eta = "[round(time, 1)] seconds"
+ return eta
+
/obj/structure/cult/talisman
name = "altar"
desc = "A bloodstained altar dedicated to Nar-Sie."
icon_state = "talismanaltar"
-
/obj/structure/cult/talisman/attack_hand(mob/living/user)
if(!iscultist(user))
- user << "You don't even begin to understand what these words mean..."
+ user << "You're pretty sure you know exactly what this is used for and you can't seem to touch it."
return
if(cooldowntime > world.time)
- user << "The magic here is weak, it will be ready to use again in [getETA()]. "
+ user << "The magic in [src] is weak, it will be ready to use again in [getETA()]."
return
- cooldowntime = world.time + 2400
var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water")
+ var/pickedtype
switch(choice)
if("Eldritch Whetstone")
- var/obj/item/weapon/sharpener/cult/N = new(get_turf(src))
- user << "You kneel before the altar and your faith is rewarded with an [N.name]!"
+ pickedtype = /obj/item/weapon/sharpener/cult
if("Zealot's Blindfold")
- var/obj/item/clothing/glasses/night/cultblind/N = new(get_turf(src))
- user << "You kneel before the altar and your faith is rewarded with a [N.name]!"
+ pickedtype = /obj/item/clothing/glasses/night/cultblind
if("Flask of Unholy Water")
- var/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater/N = new(get_turf(src))
- user << "You kneel before the altar and your faith is rewarded with a [N.name]!"
-
-
+ pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
+ if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
+ cooldowntime = world.time + 2400
+ var/obj/item/N = new pickedtype(get_turf(src))
+ user << "You kneel before the altar and your faith is rewarded with an [N]!"
+
+
/obj/structure/cult/forge
name = "daemon forge"
desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie."
@@ -50,24 +54,25 @@
/obj/structure/cult/forge/attack_hand(mob/living/user)
if(!iscultist(user))
- user << "You don't even begin to understand what these words mean..."
+ user << "The heat radiating from [src] pushes you back."
return
if(cooldowntime > world.time)
- user << "The magic here is weak, it will be ready to use again in [getETA()]. "
+ user << "The magic in [src] is weak, it will be ready to use again in [getETA()]."
return
- cooldowntime = world.time + 2400
var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Nar-Sien Hardsuit")
+ var/pickedtype
switch(choice)
if("Shielded Robe")
- var/obj/item/clothing/suit/hooded/cultrobes/cult_shield/N = new(get_turf(src))
- user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+ pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
- var/obj/item/clothing/suit/hooded/cultrobes/berserker/N = new(get_turf(src))
- user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+ pickedtype = /obj/item/clothing/suit/hooded/cultrobes/berserker
if("Nar-Sien Hardsuit")
- new /obj/item/clothing/head/helmet/space/cult(get_turf(src))
- var /obj/item/clothing/suit/space/cult/N = new(get_turf(src))
- user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+ pickedtype = /obj/item/clothing/suit/space/hardsuit/cult
+ if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
+ cooldowntime = world.time + 2400
+ var/obj/item/N = new pickedtype(get_turf(src))
+ user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+
/obj/structure/cult/pylon
name = "pylon"
@@ -84,13 +89,13 @@
for(var/i in 1 to 5)
for(var/t in corruption)
var/turf/T = t
- corruption |= T.GetAtmosAdjacentTurfs()
+ corruption |= T.GetAtmosAdjacentTurfs()
..()
/obj/structure/cult/pylon/Destroy()
SSobj.processing.Remove(src)
return ..()
-
+
/obj/structure/cult/pylon/process()
if((last_shot + heal_delay) <= world.time)
last_shot = world.time
@@ -108,10 +113,11 @@
if(corruption.len)
var/turf/T = pick_n_take(corruption)
corruption -= T
- if (istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava))
+ if(istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava))
return
T.ChangeTurf(/turf/open/floor/engine/cult)
+
/obj/structure/cult/tome
name = "archives"
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
@@ -120,25 +126,25 @@
/obj/structure/cult/tome/attack_hand(mob/living/user)
if(!iscultist(user))
- user << "You don't even begin to understand what these words mean..."
+ user << "All of these books seem to be gibberish."
return
if(cooldowntime > world.time)
- user << "The magic here is weak, it will be ready to use again in [getETA()]. "
+ user << "The magic in [src] is weak, it will be ready to use again in [getETA()]."
return
- cooldowntime = world.time + 2400
- var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Shift")
+ var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Shifter")
+ var/pickedtype
switch(choice)
if("Supply Talisman")
- var/obj/item/weapon/paper/talisman/supply/N = new(get_turf(src))
- N.uses = 2
- user << "You summon [N] from the archives!"
+ pickedtype = /obj/item/weapon/paper/talisman/supply/weak
if("Shuttle Curse")
- var/obj/item/device/shuttle_curse/N = new(get_turf(src))
- user << "You summon [N] from the archives!"
- if("Veil Shift")
- var /obj/item/device/cult_shift/N = new(get_turf(src))
- user << "You summon [N] from the archives!"
-
+ pickedtype = /obj/item/device/shuttle_curse
+ if("Veil Shifter")
+ pickedtype = /obj/item/device/cult_shift
+ if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
+ cooldowntime = world.time + 2400
+ var/obj/item/N = new pickedtype(get_turf(src))
+ user << "You summon [N] from the archives!"
+
/obj/effect/gateway
name = "gateway"
desc = "You're pretty sure that abyss is staring back."
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 09d2e4be1c3..e1c5f6c3350 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -101,6 +101,9 @@
visible_message("[src] crumbles to dust.")
qdel(src)
+/obj/item/weapon/paper/talisman/supply/weak
+ uses = 2
+
//Rite of Translocation: Same as rune
/obj/item/weapon/paper/talisman/teleport
cultist_name = "Talisman of Teleportation"
@@ -330,19 +333,17 @@
new /obj/structure/constructshell(T)
user << "The talisman clings to the metal and twists it into a construct shell!"
user << sound('sound/effects/magic.ogg',0,1,25)
- PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, T)
qdel(src)
if(istype(target, /obj/item/stack/sheet/plasteel))
var/quantity = target.amount
var/turf/T = get_turf(target)
new /obj/item/stack/sheet/runed_metal(T,quantity)
target.use(quantity)
- user << "The talisman clings to the plasteel and runes of power appear on the surface!"
+ user << "The talisman clings to the plasteel, transforming it into runed metal!"
user << sound('sound/effects/magic.ogg',0,1,25)
- PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, T)
qdel(src)
else
- user << "The talisman requires metal or plasteel!"
+ user << "The talisman must be used on metal or plasteel!"
//Talisman of Shackling: Applies special cuffs directly from the talisman
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index f265bfe46ef..836b1fc81d0 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -320,20 +320,27 @@
doortype = /obj/structure/door_assembly/door_assembly_cult
hackProof = 1
aiControlDisabled = 1
+ var/openingoverlaytype = /obj/effect/overlay/temp/cult/door
/obj/machinery/door/airlock/cult/allowed(mob/M)
- if(!iscultist(M))
+ if(!density)
+ return 1
+ if(iscultist(M) || istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct))
+ PoolOrNew(openingoverlaytype, src.loc)
+ return 1
+ else
PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc)
var/atom/throwtarget
throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(M, src)))
M << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50))
+ if(M.client)
+ var/old_color = M.client.color
+ M.client.color = "#960000"
+ spawn(0)//animate is a delay, avoid delay, etc
+ animate(M.client,color = old_color, time = 20)
M.Weaken(2)
M.throw_at_fast(throwtarget, 5, 1,src)
return 0
- else
- PoolOrNew(/obj/effect/overlay/temp/cult/door, src.loc)
- return 1
-
/obj/machinery/door/airlock/cult/narsie_act()
return
@@ -347,6 +354,7 @@
icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi'
overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi'
doortype = /obj/structure/door_assembly/door_assembly_cult/unruned
+ openingoverlaytype = /obj/effect/overlay/temp/cult/door/unruned
/obj/machinery/door/airlock/cult/unruned/glass
doortype = /obj/structure/door_assembly/door_assembly_cult/unruned/glass
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 77028a43d1a..d3e9e6727dc 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -323,9 +323,9 @@ Class Procs:
add_fingerprint(user)
return 0
-/obj/machinery/CheckParts()
+/obj/machinery/CheckParts(list/parts_list)
+ ..()
RefreshParts()
- return
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
return
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 79bc642c579..a947c472511 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -413,7 +413,8 @@
return
..()
-/obj/item/weapon/bombcore/chemical/CheckParts()
+/obj/item/weapon/bombcore/chemical/CheckParts(list/parts_list)
+ ..()
// Using different grenade casings, causes the payload to have different properties.
var/obj/item/weapon/stock_parts/matter_bin/MB = locate(/obj/item/weapon/stock_parts/matter_bin) in src
if(MB)
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 17aa0d4288b..7bb81bc54e0 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -4,6 +4,7 @@
damage_absorption = list("brute"=0.7,"fire"=1,"bullet"=0.7,"laser"=0.85,"energy"=1,"bomb"=0.8)
/obj/mecha/combat/CheckParts(atom/holder)
+ ..()
var/obj/item/weapon/stock_parts/capacitor/C = locate() in holder
var/obj/item/weapon/stock_parts/scanning_module/SM = locate() in holder
step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 0c0b566390a..dfb1f8c5656 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -90,6 +90,24 @@
randomdir = 0
duration = 10
+/obj/effect/overlay/temp/cult/sparks
+ randomdir = 1
+ name = "blood sparks"
+ icon_state = "bloodsparkles"
+
+/obj/effect/overlay/temp/cult/phase
+ name = "phase glow"
+ duration = 7
+ icon_state = "cultin"
+
+/obj/effect/overlay/temp/cult/phase/New(loc, set_dir)
+ ..()
+ if(set_dir)
+ dir = set_dir
+
+/obj/effect/overlay/temp/cult/phase/out
+ icon_state = "cultout"
+
/obj/effect/overlay/temp/cult/sac
name = "maw of Nar-Sie"
icon_state = "sacconsume"
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 5517716c4bf..c04ead47e26 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -65,7 +65,8 @@
ratio = Ceiling(ratio*4) * 25
overlays += "[initial(icon_state)]-charge[ratio]"
-/obj/item/weapon/defibrillator/CheckParts()
+/obj/item/weapon/defibrillator/CheckParts(list/parts_list)
+ ..()
bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index fdfd0f7c4d6..218f2fba57c 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -170,7 +170,8 @@
update_icon()
return
-/obj/item/weapon/flamethrower/CheckParts()
+/obj/item/weapon/flamethrower/CheckParts(list/parts_list)
+ ..()
weldtool = locate(/obj/item/weapon/weldingtool) in contents
igniter = locate(/obj/item/device/assembly/igniter) in contents
weldtool.status = 0
diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm
index 8339ed98c7c..e8ae2498982 100644
--- a/code/game/objects/items/weapons/grenades/ghettobomb.dm
+++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm
@@ -29,7 +29,8 @@
else
range = pick(2,2,2,3,3,3,4)
-/obj/item/weapon/grenade/iedcasing/CheckParts()
+/obj/item/weapon/grenade/iedcasing/CheckParts(list/parts_list)
+ ..()
var/obj/item/weapon/reagent_containers/food/drinks/soda_cans/can = locate() in contents
if(can)
var/muh_layer = can.layer
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 3937889f8c1..9823294dcad 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -123,7 +123,7 @@
maxWeightClass = 7
gasPerThrow = 5
-/datum/table_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
+/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,
diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm
index 4454169fdd3..622f4225166 100644
--- a/code/game/objects/items/weapons/signs.dm
+++ b/code/game/objects/items/weapons/signs.dm
@@ -29,7 +29,7 @@
user.visible_message("[user] waves around blank sign.")
user.changeNext_move(CLICK_CD_MELEE)
-/datum/table_recipe/picket_sign
+/datum/crafting_recipe/picket_sign
name = "Picket Sign"
result = /obj/item/weapon/picket_sign
reqs = list(/obj/item/stack/rods = 1,
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 7c0860f9506..7298345b61b 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -339,7 +339,8 @@
if(input)
src.war_cry = input
-/obj/item/weapon/twohanded/spear/CheckParts()
+/obj/item/weapon/twohanded/spear/CheckParts(list/parts_list)
+ ..()
if(explosive)
explosive.loc = get_turf(src.loc)
explosive = null
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 010789c22e2..a781894bfc5 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -328,7 +328,7 @@
add_fingerprint(user)
if(istype(W, /obj/item/weapon/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].")
- var/obj/item/stack/sheet/metal/R = new(get_turf(src))
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
R.amount = 1
qdel(src)
@@ -342,7 +342,7 @@
return
user << "You slice apart the girder."
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
- R.amount = 2
+ R.amount = 1
transfer_fingerprints_to(R)
qdel(src)
@@ -352,7 +352,7 @@
if(do_after(user, 30, target = src))
user << "You slice apart the girder."
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
- R.amount = 2
+ R.amount = 1
transfer_fingerprints_to(R)
qdel(src)
@@ -367,15 +367,16 @@
else if(istype(W, /obj/item/stack/sheet/runed_metal))
var/obj/item/stack/sheet/runed_metal/R = W
- if(R.amount < 2)
- user << "You need at least two sheets of runed metal to construct a runed wall!"
+ if(R.amount < 1)
+ user << "You need at least one sheet of runed metal to construct a runed wall!"
return 0
user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...")
if(!do_after(user, 50, target = src))
return 0
user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.")
- R.use(2)
- new/turf/closed/wall/cult(get_turf(src))
+ R.use(1)
+ var/turf/T = get_turf(src)
+ T.ChangeTurf(/turf/closed/wall/cult)
qdel(src)
else
@@ -390,9 +391,9 @@
qdel(src)
if(2)
if(prob(30))
- new/obj/item/stack/sheet/runed_metal/(get_turf(src), 2)
+ new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
qdel(src)
if(3)
if(prob(5))
- new/obj/item/stack/sheet/runed_metal/(get_turf(src), 2)
+ new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
qdel(src)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index bcfeae80afd..9551bed794f 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -38,7 +38,8 @@
else
playsound(src, 'sound/items/Welder.ogg', 100, 1)
var/newgirder = break_wall()
- transfer_fingerprints_to(newgirder)
+ if(newgirder) //maybe we don't /want/ a girder!
+ transfer_fingerprints_to(newgirder)
for(var/obj/O in src.contents) //Eject contents!
if(istype(O,/obj/structure/sign/poster))
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 038bfb3fd26..83e29d65bce 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -1,5 +1,5 @@
/turf/closed/wall/cult
- name = "runed wall"
+ name = "runed metal wall"
desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound."
icon = 'icons/turf/walls/cult_wall.dmi'
icon_state = "cult"
@@ -12,16 +12,26 @@
..()
/turf/closed/wall/cult/break_wall()
- new/obj/item/stack/sheet/metal/(get_turf(src), 1)
+ new/obj/item/stack/sheet/runed_metal(get_turf(src), 1)
return (new /obj/structure/girder/cult(src))
/turf/closed/wall/cult/devastate_wall()
- new /obj/effect/decal/cleanable/blood(src)
- new /obj/effect/decal/remains/human(src)
+ new/obj/item/stack/sheet/runed_metal(get_turf(src), 1)
/turf/closed/wall/cult/narsie_act()
return
+/turf/closed/wall/cult/artificer
+ name = "runed stone wall"
+ desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound."
+
+/turf/closed/wall/cult/artificer/break_wall()
+ PoolOrNew(/obj/effect/overlay/temp/cult/turf, get_turf(src))
+ return null //excuse me we want no runed metal here
+
+/turf/closed/wall/cult/artificer/devastate_wall()
+ PoolOrNew(/obj/effect/overlay/temp/cult/turf, get_turf(src))
+
/turf/closed/wall/vault
icon = 'icons/turf/walls.dmi'
icon_state = "rockvault"
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index 79c29d2b705..e213e8e3e3c 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -151,8 +151,7 @@ var/sc_safecode5 = "[rand(0,9)]"
l_set = 1
new /obj/item/weapon/gun/energy/mindflayer(src)
new /obj/item/device/soulstone(src)
- new /obj/item/clothing/head/helmet/space/cult(src)
- new /obj/item/clothing/suit/space/cult(src)
+ new /obj/item/clothing/suit/space/hardsuit/cult(src)
//new /obj/item/weapon/teleportation_scroll(src)
new /obj/item/weapon/ore/diamond(src)
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
new file mode 100644
index 00000000000..dc4b405d5e6
--- /dev/null
+++ b/code/modules/crafting/craft.dm
@@ -0,0 +1,345 @@
+/datum/personal_crafting
+ var/busy
+ var/viewing_category = 1 //typical powergamer starting on the Weapons tab
+ var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
+ var/datum/action/innate/crafting/button
+
+
+
+
+
+/* This is what procs do:
+ get_environment - gets a list of things accessable for crafting by user
+ get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list
+ check_contents - takes a recipe and a key-type list and checks if said recipe can be done with available stuff
+ check_tools - takes recipe, a key-type list, and a user and checks if there are enough tools to do the stuff, checks bugs one level deep
+ construct_item - takes a recipe and a user, call all the checking procs, calls do_after, checks all the things again, calls del_reqs, creates result, calls CheckParts of said result with argument being list returned by deel_reqs
+ del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list
+*/
+
+
+
+
+/datum/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents)
+ main_loop:
+ for(var/A in R.reqs)
+ var/needed_amount = R.reqs[A]
+ for(var/B in contents)
+ if(ispath(B, A))
+ if(contents[B] >= R.reqs[A])
+ continue main_loop
+ else
+ needed_amount -= contents[B]
+ if(needed_amount <= 0)
+ continue main_loop
+ else
+ continue
+ return 0
+ for(var/A in R.chem_catalysts)
+ if(contents[A] < R.chem_catalysts[A])
+ return 0
+ return 1
+
+/datum/personal_crafting/proc/get_environment(mob/user)
+ . = list()
+ . += user.r_hand
+ . += user.l_hand
+ if(!istype(user.loc, /turf))
+ return
+ var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST))
+ for(var/A in L)
+ var/turf/T = A
+ if(T.Adjacent(user))
+ . += T.contents
+
+
+/datum/personal_crafting/proc/get_surroundings(mob/user)
+ . = list()
+ for(var/obj/item/I in get_environment(user))
+ if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
+ .[I.type] += S.amount
+ else
+ if(istype(I, /obj/item/weapon/reagent_containers))
+ var/obj/item/weapon/reagent_containers/RC = I
+ if(RC.flags & OPENCONTAINER)
+ for(var/datum/reagent/A in RC.reagents.reagent_list)
+ .[A.type] += A.volume
+ .[I.type] += 1
+
+/datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents)
+ if(!R.tools.len)
+ return 1
+ var/list/possible_tools = list()
+ for(var/obj/item/I in user.contents)
+ if(istype(I, /obj/item/weapon/storage))
+ for(var/obj/item/SI in I.contents)
+ possible_tools += SI.type
+ possible_tools += I.type
+ possible_tools += contents
+
+ main_loop:
+ for(var/A in R.tools)
+ for(var/I in possible_tools)
+ if(ispath(I,A))
+ continue main_loop
+ return 0
+ return 1
+
+/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
+ for(var/A in R.parts)
+ var/list/contents = get_surroundings(user)
+ var/send_feedback = 1
+ if(check_contents(R, contents))
+ if(check_tools(user, R, contents))
+ if(do_after(user, R.time, target = user))
+ contents = get_surroundings(user)
+ if(!check_contents(R, contents))
+ return ", missing component."
+ if(!check_tools(user, R, contents))
+ return ", missing tool."
+ var/list/parts = del_reqs(R, user)
+ var/atom/movable/I = new R.result (get_turf(user.loc))
+ I.CheckParts(parts, R)
+ if(send_feedback)
+ feedback_add_details("object_crafted","[I.type]")
+ return 0
+ return "."
+ return ", missing tool."
+ return ", missing component."
+
+
+/*Del reqs works like this:
+
+ Loop over reqs var of the recipe
+ Set var amt to the value current cycle req is pointing to, its amount of type we need to delete
+ Get var/surroundings list of things accessable to crafting by get_environment()
+ Check the type of the current cycle req
+ If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings
+ If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list
+ If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching
+ While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one
+ If its stack check if it has enough amount
+ If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack
+ If no put all of the stack in the deletion list, substract its amount from amt and keep searching
+ While doing above stuff check deletion list if it already has such stack type, if yes try to merge them instead of adding new one
+ If its anything else just locate() in in the list in a while loop, each find --s the amt var and puts the found stuff in deletion loop
+
+ Then do a loop over parts var of the recipe
+ Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return
+
+ After its done loop over deletion list and delete all the shit that wasnt taken by parts loop
+
+ del_reqs return the list of parts resulting object will recieve as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already
+*/
+
+/datum/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user)
+ var/list/surroundings
+ var/list/Deletion = list()
+ . = list()
+ var/data
+ var/amt
+ main_loop:
+ for(var/A in R.reqs)
+ amt = R.reqs[A]
+ surroundings = get_environment(user)
+ surroundings -= Deletion
+ if(ispath(A, /datum/reagent))
+ var/datum/reagent/RG = new A
+ var/datum/reagent/RGNT
+ while(amt > 0)
+ var/obj/item/weapon/reagent_containers/RC = locate() in surroundings
+ RG = RC.reagents.get_reagent(A)
+ if(RG)
+ if(!locate(RG.type) in Deletion)
+ Deletion += new RG.type()
+ if(RG.volume > amt)
+ RG.volume -= amt
+ data = RG.data
+ RC.reagents.conditional_update(RC)
+ RG = locate(RG.type) in Deletion
+ RG.volume = amt
+ RG.data += data
+ continue main_loop
+ else
+ surroundings -= RC
+ amt -= RG.volume
+ RC.reagents.reagent_list -= RG
+ RC.reagents.conditional_update(RC)
+ RGNT = locate(RG.type) in Deletion
+ RGNT.volume += RG.volume
+ RGNT.data += RG.data
+ qdel(RG)
+ else
+ surroundings -= RC
+ else if(ispath(A, /obj/item/stack))
+ var/obj/item/stack/S
+ var/obj/item/stack/SD
+ while(amt > 0)
+ S = locate(A) in surroundings
+ if(S.amount >= amt)
+ if(!locate(S.type) in Deletion)
+ SD = new S.type()
+ Deletion += SD
+ S.use(amt)
+ SD = locate(S.type) in Deletion
+ SD.amount += amt
+ continue main_loop
+ else
+ amt -= S.amount
+ if(!locate(S.type) in Deletion)
+ Deletion += S
+ else
+ data = S.amount
+ S = locate(S.type) in Deletion
+ S.add(data)
+ surroundings -= S
+ else
+ var/atom/movable/I
+ while(amt > 0)
+ I = locate(A) in surroundings
+ Deletion += I
+ surroundings -= I
+ amt--
+ var/list/partlist = list(R.parts.len)
+ for(var/M in R.parts)
+ partlist[M] = R.parts[M]
+ for(var/A in R.parts)
+ if(istype(A, /datum/reagent))
+ var/datum/reagent/RG = locate(A) in Deletion
+ if(RG.volume > partlist[A])
+ RG.volume = partlist[A]
+ . += RG
+ Deletion -= RG
+ continue
+ else if(istype(A, /obj/item/stack))
+ var/obj/item/stack/ST = locate(A) in Deletion
+ if(ST.amount > partlist[A])
+ ST.amount = partlist[A]
+ . += ST
+ Deletion -= ST
+ continue
+ else
+ while(partlist[A] > 0)
+ var/atom/movable/AM = locate(A) in Deletion
+ . += AM
+ Deletion -= AM
+ partlist[A] -= 1
+ while(Deletion.len)
+ var/DL = Deletion[Deletion.len]
+ Deletion.Cut(Deletion.len)
+ qdel(DL)
+
+/datum/personal_crafting/proc/craft(mob/user)
+ if(user.incapacitated() || user.lying || istype(user.loc, /obj/mecha))
+ return
+ var/list/surroundings = get_surroundings(user)
+ var/dat = "
Crafting menu
"
+ if(busy)
+ dat += ""
+ dat += "Crafting in progress...
"
+ else
+ dat += "<--"
+ dat += " [categories[prev_cat()]] |"
+ dat += " [categories[viewing_category]] "
+ dat += "| [categories[next_cat()]] "
+ dat += "-->
"
+
+ dat += ""
+
+ //Filter the recipes we can craft to the top
+ var/list/can_craft = list()
+ var/list/cant_craft = list()
+ for(var/datum/crafting_recipe/R in crafting_recipes)
+ if(R.category != categories[viewing_category])
+ continue
+ if(check_contents(R, surroundings))
+ can_craft += R
+ else
+ cant_craft += R
+
+ for(var/datum/crafting_recipe/R in can_craft)
+ dat += build_recipe_text(R, surroundings)
+ for(var/datum/crafting_recipe/R in cant_craft)
+ dat += build_recipe_text(R, surroundings)
+
+
+ dat += "
"
+
+ var/datum/browser/popup = new(user, "crafting", "Crafting", 500, 500)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/datum/personal_crafting/Topic(href, href_list)
+ if(usr.stat || usr.lying)
+ return
+ if(href_list["make"])
+ var/datum/crafting_recipe/TR = locate(href_list["make"])
+ busy = 1
+ craft(usr)
+ var/fail_msg = construct_item(usr, TR)
+ if(!fail_msg)
+ usr << "[TR.name] constructed."
+ else
+ usr << "Construction failed[fail_msg]"
+ busy = 0
+ craft(usr)
+ if(href_list["forwardCat"])
+ viewing_category = next_cat()
+ usr << "Category is now [categories[viewing_category]]."
+ craft(usr)
+ if(href_list["backwardCat"])
+ viewing_category = prev_cat()
+ usr << "Category is now [categories[viewing_category]]."
+ craft(usr)
+
+//Next works nicely with modular arithmetic
+/datum/personal_crafting/proc/next_cat()
+ . = viewing_category % categories.len + 1
+
+//Previous can go fuck itself
+/datum/personal_crafting/proc/prev_cat()
+ if(viewing_category == categories.len)
+ . = viewing_category-1
+ else
+ . = viewing_category % categories.len - 1
+ if(. <= 0)
+ . = categories.len
+
+/datum/personal_crafting/proc/build_recipe_text(datum/crafting_recipe/R, list/contents)
+ . = ""
+ var/name_text = ""
+ var/req_text = ""
+ var/tool_text = ""
+ var/catalist_text = ""
+ if(check_contents(R, contents))
+ name_text ="[R.name]"
+
+ else
+ name_text = "[R.name]"
+
+ if(name_text)
+ for(var/A in R.reqs)
+ if(ispath(A, /obj))
+ var/obj/O = A
+ req_text += " [R.reqs[A]] [initial(O.name)]"
+ else if(ispath(A, /datum/reagent))
+ var/datum/reagent/RE = A
+ req_text += " [R.reqs[A]] [initial(RE.name)]"
+
+ if(R.chem_catalysts.len)
+ catalist_text += ", Catalysts:"
+ for(var/C in R.chem_catalysts)
+ if(ispath(C, /datum/reagent))
+ var/datum/reagent/RE = C
+ catalist_text += " [R.chem_catalysts[C]] [initial(RE.name)]"
+
+ if(R.tools.len)
+ tool_text += ", Tools:"
+ for(var/O in R.tools)
+ if(ispath(O, /obj))
+ var/obj/T = O
+ tool_text += " [R.tools[O]] [initial(T.name)]"
+
+ . = "[name_text][req_text][tool_text][catalist_text]
"
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 2c68ecb4ff9..50f9bb46455 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -1,5 +1,5 @@
-/datum/table_recipe
+/datum/crafting_recipe
var/name = "" //in-game display name
var/reqs[] = list() //type paths of items consumed associated with how many are needed
var/result //type path of item resulting from this craft
@@ -10,7 +10,7 @@
var/category = CAT_NONE //where it shows up in the crafting UI
-/datum/table_recipe/pin_removal
+/datum/crafting_recipe/pin_removal
name = "Pin Removal"
result = /obj/item/weapon/gun
reqs = list(/obj/item/weapon/gun = 1)
@@ -19,7 +19,7 @@
time = 50
category = CAT_WEAPON
-/datum/table_recipe/IED
+/datum/crafting_recipe/IED
name = "IED"
result = /obj/item/weapon/grenade/iedcasing
reqs = list(/datum/reagent/fuel = 50,
@@ -30,8 +30,8 @@
time = 15
category = CAT_WEAPON
-/datum/table_recipe/lance
- name = "explosive lance"
+/datum/crafting_recipe/lance
+ name = "explosive lance (grenade)"
result = /obj/item/weapon/twohanded/spear
reqs = list(/obj/item/weapon/twohanded/spear = 1,
/obj/item/weapon/grenade = 1)
@@ -39,8 +39,7 @@
time = 15
category = CAT_WEAPON
-
-/datum/table_recipe/molotov
+/datum/crafting_recipe/molotov
name = "Molotov"
result = /obj/item/weapon/reagent_containers/food/drinks/bottle/molotov
reqs = list(/obj/item/weapon/reagent_containers/glass/rag = 1,
@@ -49,7 +48,7 @@
time = 40
category = CAT_WEAPON
-/datum/table_recipe/stunprod
+/datum/crafting_recipe/stunprod
name = "Stunprod"
result = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
@@ -58,7 +57,7 @@
time = 40
category = CAT_WEAPON
-/datum/table_recipe/teleprod
+/datum/crafting_recipe/teleprod
name = "Teleprod"
result = /obj/item/weapon/melee/baton/cattleprod/teleprod
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
@@ -68,7 +67,7 @@
time = 40
category = CAT_WEAPON
-/datum/table_recipe/bola
+/datum/crafting_recipe/bola
name = "Bola"
result = /obj/item/weapon/restraints/legcuffs/bola
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
@@ -76,7 +75,7 @@
time = 20//15 faster than crafting them by hand!
category= CAT_WEAPON
-/datum/table_recipe/tailclub
+/datum/crafting_recipe/tailclub
name = "Tail Club"
result = /obj/item/weapon/tailclub
reqs = list(/obj/item/severedtail = 1,
@@ -84,7 +83,7 @@
time = 40
category = CAT_WEAPON
-/datum/table_recipe/tailwhip
+/datum/crafting_recipe/tailwhip
name = "Liz O' Nine Tails"
result = /obj/item/weapon/melee/chainofcommand/tailwhip
reqs = list(/obj/item/severedtail = 1,
@@ -92,7 +91,7 @@
time = 40
category = CAT_WEAPON
-/datum/table_recipe/ed209
+/datum/crafting_recipe/ed209
name = "ED209"
result = /mob/living/simple_animal/bot/ed209
reqs = list(/obj/item/robot_parts/robot_suit = 1,
@@ -110,7 +109,7 @@
time = 60
category = CAT_ROBOT
-/datum/table_recipe/secbot
+/datum/crafting_recipe/secbot
name = "Secbot"
result = /mob/living/simple_animal/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
@@ -122,7 +121,7 @@
time = 60
category = CAT_ROBOT
-/datum/table_recipe/cleanbot
+/datum/crafting_recipe/cleanbot
name = "Cleanbot"
result = /mob/living/simple_animal/bot/cleanbot
reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1,
@@ -131,7 +130,7 @@
time = 40
category = CAT_ROBOT
-/datum/table_recipe/floorbot
+/datum/crafting_recipe/floorbot
name = "Floorbot"
result = /mob/living/simple_animal/bot/floorbot
reqs = list(/obj/item/weapon/storage/toolbox/mechanical = 1,
@@ -141,7 +140,7 @@
time = 40
category = CAT_ROBOT
-/datum/table_recipe/medbot
+/datum/crafting_recipe/medbot
name = "Medbot"
result = /mob/living/simple_animal/bot/medbot
reqs = list(/obj/item/device/healthanalyzer = 1,
@@ -151,7 +150,7 @@
time = 40
category = CAT_ROBOT
-/datum/table_recipe/flamethrower
+/datum/crafting_recipe/flamethrower
name = "Flamethrower"
result = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
@@ -163,7 +162,7 @@
time = 10
category = CAT_WEAPON
-/datum/table_recipe/meteorshot
+/datum/crafting_recipe/meteorshot
name = "Meteorshot Shell"
result = /obj/item/ammo_casing/shotgun/meteorshot
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -173,7 +172,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/pulseslug
+/datum/crafting_recipe/pulseslug
name = "Pulse Slug Shell"
result = /obj/item/ammo_casing/shotgun/pulseslug
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -183,7 +182,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/dragonsbreath
+/datum/crafting_recipe/dragonsbreath
name = "Dragonsbreath Shell"
result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -192,7 +191,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/frag12
+/datum/crafting_recipe/frag12
name = "FRAG-12 Shell"
result = /obj/item/ammo_casing/shotgun/frag12
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -203,7 +202,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/ionslug
+/datum/crafting_recipe/ionslug
name = "Ion Scatter Shell"
result = /obj/item/ammo_casing/shotgun/ion
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -213,7 +212,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/improvisedslug
+/datum/crafting_recipe/improvisedslug
name = "Improvised Shotgun Shell"
result = /obj/item/ammo_casing/shotgun/improvised
reqs = list(/obj/item/weapon/grenade/chem_grenade = 1,
@@ -224,7 +223,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/improvisedslugoverload
+/datum/crafting_recipe/improvisedslugoverload
name = "Overload Improvised Shell"
result = /obj/item/ammo_casing/shotgun/improvised/overload
reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1,
@@ -234,7 +233,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/laserslug
+/datum/crafting_recipe/laserslug
name = "Laser Slug Shell"
result = /obj/item/ammo_casing/shotgun/laserslug
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -244,7 +243,7 @@
time = 5
category = CAT_AMMO
-/datum/table_recipe/ishotgun
+/datum/crafting_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised
reqs = list(/obj/item/weaponcrafting/reciever = 1,
@@ -255,7 +254,7 @@
time = 100
category = CAT_WEAPON
-/datum/table_recipe/chainsaw
+/datum/crafting_recipe/chainsaw
name = "Chainsaw"
result = /obj/item/weapon/twohanded/required/chainsaw
reqs = list(/obj/item/weapon/circular_saw = 1,
@@ -265,7 +264,7 @@
time = 50
category = CAT_WEAPON
-/datum/table_recipe/spooky_camera
+/datum/crafting_recipe/spooky_camera
name = "Camera Obscura"
result = /obj/item/device/camera/spooky
time = 15
@@ -274,21 +273,21 @@
parts = list(/obj/item/device/camera = 1)
category = CAT_MISC
-/datum/table_recipe/lizardhat
+/datum/crafting_recipe/lizardhat
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/lizard
time = 10
reqs = list(/obj/item/severedtail = 1)
category = CAT_MISC
-/datum/table_recipe/lizardhat_alternate
+/datum/crafting_recipe/lizardhat_alternate
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/lizard
time = 10
reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
category = CAT_MISC
-/datum/table_recipe/skateboard
+/datum/crafting_recipe/skateboard
name = "Skateboard"
result = /obj/vehicle/scooter/skateboard
time = 60
@@ -296,7 +295,7 @@
/obj/item/stack/rods = 10)
category = CAT_MISC
-/datum/table_recipe/scooter
+/datum/crafting_recipe/scooter
name = "Scooter"
result = /obj/vehicle/scooter
time = 65
@@ -304,14 +303,15 @@
/obj/item/stack/rods = 12)
category = CAT_MISC
-/datum/table_recipe/papersack
+/datum/crafting_recipe/papersack
name = "Paper Sack"
result = /obj/item/weapon/storage/box/papersack
time = 10
reqs = list(/obj/item/weapon/paper = 5)
category = CAT_MISC
-/datum/table_recipe/chemical_payload
+
+/datum/crafting_recipe/chemical_payload
name = "Chemical Payload (C4)"
result = /obj/item/weapon/bombcore/chemical
reqs = list(
@@ -323,7 +323,7 @@
time = 30
category = CAT_WEAPON
-/datum/table_recipe/chemical_payload2
+/datum/crafting_recipe/chemical_payload2
name = "Chemical Payload (gibtonite)"
result = /obj/item/weapon/bombcore/chemical
reqs = list(
@@ -335,14 +335,14 @@
time = 50
category = CAT_WEAPON
-/datum/table_recipe/bonearmor
+/datum/crafting_recipe/bonearmor
name = "Bone Armor"
result = /obj/item/clothing/suit/armor/bone
time = 30
reqs = list(/obj/item/stack/sheet/bone = 6)
category = CAT_PRIMAL
-/datum/table_recipe/bonetalisman
+/datum/crafting_recipe/bonetalisman
name = "Bone Talisman"
result = /obj/item/clothing/tie/talisman
time = 20
@@ -350,7 +350,7 @@
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
-/datum/table_recipe/bracers
+/datum/crafting_recipe/bracers
name = "Bone Bracers"
result = /obj/item/clothing/gloves/bracer
time = 20
@@ -358,14 +358,14 @@
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
-/datum/table_recipe/skullhelm
+/datum/crafting_recipe/skullhelm
name = "Skull Helmet"
result = /obj/item/clothing/head/helmet/skull
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4)
category = CAT_PRIMAL
-/datum/table_recipe/drakecloak
+/datum/crafting_recipe/drakecloak
name = "Ash Drake Cloak"
result = /obj/item/clothing/suit/hooded/cloak/drake
time = 60
diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm
deleted file mode 100644
index ec813ea7e80..00000000000
--- a/code/modules/crafting/table.dm
+++ /dev/null
@@ -1,295 +0,0 @@
-
-/obj/structure/table
- mouse_drag_pointer = MOUSE_ACTIVE_POINTER
- var/list/table_contents = list()
- var/viewing_category = 1 //typical powergamer starting on the Weapons tab
- var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
-
-
-/obj/structure/table/MouseDrop(mob/living/user)
- if(!istype(user))
- return
- if(!user.IsAdvancedToolUser())
- return
- tablecraft(user)
-
-/obj/structure/table/proc/check_contents(datum/table_recipe/R)
- check_table()
- main_loop:
- for(var/A in R.reqs)
- var/needed_amount = R.reqs[A]
- for(var/B in table_contents)
- if(ispath(B, A))
- if(table_contents[B] >= R.reqs[A])
- continue main_loop
- else
- needed_amount -= table_contents[B]
- if(needed_amount <= 0)
- continue main_loop
- else
- continue
- return 0
- for(var/A in R.chem_catalysts)
- if(table_contents[A] < R.chem_catalysts[A])
- return 0
- return 1
-
-/obj/structure/table/proc/check_table()
- table_contents = list()
- for(var/obj/item/I in loc)
- if(istype(I, /obj/item/stack))
- var/obj/item/stack/S = I
- table_contents[I.type] += S.amount
- else
- if(istype(I, /obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = I
- if(RC.flags & OPENCONTAINER)
- for(var/datum/reagent/A in RC.reagents.reagent_list)
- table_contents[A.type] += A.volume
- table_contents[I.type] += 1
-
-/obj/structure/table/proc/check_tools(mob/user, datum/table_recipe/R)
- if(!R.tools.len)
- return 1
- var/list/possible_tools = list()
- for(var/obj/item/I in user.contents)
- if(istype(I, /obj/item/weapon/storage))
- for(var/obj/item/SI in I.contents)
- possible_tools += SI.type
- else
- possible_tools += I.type
- possible_tools += table_contents
- main_loop:
- for(var/A in R.tools)
- for(var/I in possible_tools)
- if(ispath(I,A))
- possible_tools -= I
- continue main_loop
- return 0
- return 1
-
-/obj/structure/table/proc/construct_item(mob/user, datum/table_recipe/R)
- check_table()
- var/send_feedback = 1
- if(check_contents(R))
- if(check_tools(user, R))
- if(do_after(user, R.time, target = src))
- if(!check_contents(R))
- return ", missing component."
- if(!check_tools(user, R))
- return ", missing tool."
- var/atom/movable/I = new R.result (loc)
- if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/S = I
- S.create_reagents(S.volume)
- feedback_add_details("food_made","[S.type]")
- send_feedback = 0
- var/list/parts = del_reqs(R, I)
- for(var/A in parts)
- if(istype(A, /obj/item))
- var/atom/movable/B = A
- B.loc = I
- B.pixel_x = initial(B.pixel_x)
- B.pixel_y = initial(B.pixel_y)
- else
- if(!I.reagents)
- I.reagents = new /datum/reagents()
- I.reagents.reagent_list.Add(A)
- I.CheckParts()
- if(send_feedback)
- feedback_add_details("object_crafted","[I.type]")
- return 0
- return "."
- return ", missing tool."
- return ", missing component."
-
-/obj/structure/table/proc/del_reqs(datum/table_recipe/R, atom/movable/resultobject)
- var/list/Deletion = list()
- var/amt
- var/reagenttransfer = 0
- if(istype(resultobject,/obj/item/weapon/reagent_containers))
- reagenttransfer = 1
- for(var/A in R.reqs)
- amt = R.reqs[A]
- if(ispath(A, /obj/item/stack))
- var/obj/item/stack/S
- stack_loop:
- for(var/B in table_contents)
- if(ispath(B, A))
- while(amt > 0)
- S = locate(B) in loc
- if(S.amount >= amt)
- S.use(amt)
- break stack_loop
- else
- amt -= S.amount
- qdel(S)
- else if(ispath(A, /obj/item))
- var/obj/item/I
- item_loop:
- for(var/B in table_contents)
- if(ispath(B, A))
- var/item_amount = table_contents[B]
- while(item_amount > 0)
- I = locate(B) in loc
- Deletion.Add(I)
- I.loc = null //remove it from the table loc so that we don't locate the same item every time (will be relocated inside the crafted item in construct_item())
- amt--
- item_amount--
- if(reagenttransfer && istype(I,/obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = I
- RC.reagents.trans_to(resultobject, RC.reagents.total_volume)
- if(amt <= 0)
- break item_loop
- else
- var/datum/reagent/RG = new A
- reagent_loop:
- for(var/B in table_contents)
- if(ispath(B, /obj/item/weapon/reagent_containers))
- var/obj/item/RC = locate(B) in loc
- if(RC.reagents.has_reagent(RG.id, amt))
- if(reagenttransfer)
- RC.reagents.trans_id_to(resultobject,RG.id, amt)
- else
- RC.reagents.remove_reagent(RG.id, amt)
- RG.volume = amt
- Deletion.Add(RG)
- break reagent_loop
- else if(RC.reagents.has_reagent(RG.id))
- Deletion.Add(RG)
- RG.volume += RC.reagents.get_reagent_amount(RG.id)
- amt -= RC.reagents.get_reagent_amount(RG.id)
- if(reagenttransfer)
- RC.reagents.trans_id_to(resultobject,RG.id, RG.volume)
- else
- RC.reagents.del_reagent(RG.id)
-
- var/list/partlist = list(R.parts.len)
- for(var/M in R.parts)
- partlist[M] = R.parts[M]
- deletion_loop:
- for(var/B in Deletion)
- for(var/A in R.parts)
- if(istype(B, A))
- if(partlist[A] > 0) //do we still need a part like that?
- partlist[A] -= 1
- continue deletion_loop
- Deletion.Remove(B)
- qdel(B)
-
- return Deletion
-
-/obj/structure/table/proc/tablecraft(mob/user)
- if(user.incapacitated() || user.lying || !Adjacent(user))
- return
- check_table()
- user.face_atom(src)
- var/dat = "Crafting menu
"
- if(busy)
- dat += ""
- dat += "Crafting in progress...
"
- else
- dat += "<--"
- dat += " [categories[prev_cat()]] |"
- dat += " [categories[viewing_category]] "
- dat += "| [categories[next_cat()]] "
- dat += "-->
"
-
- dat += ""
-
- //Filter the recipes we can craft to the top
- var/list/can_craft = list()
- var/list/cant_craft = list()
- for(var/datum/table_recipe/R in table_recipes)
- if(R.category != categories[viewing_category])
- continue
- if(check_contents(R))
- can_craft += R
- else
- cant_craft += R
-
- for(var/datum/table_recipe/R in can_craft)
- dat += build_recipe_text(R)
- for(var/datum/table_recipe/R in cant_craft)
- dat += build_recipe_text(R)
-
-
- dat += "
"
-
- var/datum/browser/popup = new(user, "table", "Table", 500, 500)
- popup.set_content(dat)
- popup.open()
- return
-
-/obj/structure/table/Topic(href, href_list)
- if(usr.stat || !Adjacent(usr) || usr.lying)
- return
- if(href_list["make"])
- var/datum/table_recipe/TR = locate(href_list["make"])
- busy = 1
- tablecraft(usr)
- var/fail_msg = construct_item(usr, TR)
- if(!fail_msg)
- usr << "[TR.name] constructed."
- else
- usr << "Construction failed[fail_msg]"
- busy = 0
- tablecraft(usr)
- if(href_list["forwardCat"])
- viewing_category = next_cat()
- usr << "Category is now [categories[viewing_category]]."
- tablecraft(usr)
- if(href_list["backwardCat"])
- viewing_category = prev_cat()
- usr << "Category is now [categories[viewing_category]]."
- tablecraft(usr)
-
-//Next works nicely with modular arithmetic
-/obj/structure/table/proc/next_cat()
- . = viewing_category % categories.len + 1
-
-//Previous can go fuck itself
-/obj/structure/table/proc/prev_cat()
- if(viewing_category == categories.len)
- . = viewing_category-1
- else
- . = viewing_category % categories.len - 1
- if(. <= 0)
- . = categories.len
-
-/obj/structure/table/proc/build_recipe_text(datum/table_recipe/R)
- . = ""
- var/name_text = ""
- var/req_text = ""
- var/tool_text = ""
- var/catalist_text = ""
- if(check_contents(R))
- name_text ="[R.name]"
-
- else
- name_text = "[R.name]"
-
- if(name_text)
- for(var/A in R.reqs)
- if(ispath(A, /obj))
- var/obj/O = A
- req_text += " [R.reqs[A]] [initial(O.name)]"
- else if(ispath(A, /datum/reagent))
- var/datum/reagent/RE = A
- req_text += " [R.reqs[A]] [initial(RE.name)]"
-
- if(R.chem_catalysts.len)
- catalist_text += ", Catalysts:"
- for(var/C in R.chem_catalysts)
- if(ispath(C, /datum/reagent))
- var/datum/reagent/RE = C
- catalist_text += " [R.chem_catalysts[C]] [initial(RE.name)]"
-
- if(R.tools.len)
- tool_text += ", Tools:"
- for(var/O in R.tools)
- if(ispath(O, /obj))
- var/obj/T = O
- tool_text += " [R.tools[O]] [initial(T.name)]"
-
- . = "[name_text][req_text][tool_text][catalist_text]
"
diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm
index c71b1aa2a71..852c8ed9108 100644
--- a/code/modules/food&drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food&drinks/drinks/drinks/bottle.dm
@@ -333,7 +333,8 @@
/datum/reagent/napalm,/datum/reagent/hellwater,/datum/reagent/toxin/plasma,/datum/reagent/toxin/spore_burning)
var/active = 0
-/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts()
+/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/CheckParts(list/parts_list)
+ ..()
var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = locate() in contents
if(B)
icon_state = B.icon_state
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm
index 2a790645521..9b340df0f0d 100644
--- a/code/modules/food&drinks/food/snacks.dm
+++ b/code/modules/food&drinks/food/snacks.dm
@@ -19,6 +19,7 @@
var/customfoodfilling = 1 // whether it can be used as filling in custom food
//Placeholder for effect that trigger on eating that aren't tied to reagents.
+
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume()
if(!usr)
return
@@ -153,7 +154,18 @@
return 1
//Called when you finish tablecrafting a snack.
-/obj/item/weapon/reagent_containers/food/snacks/CheckParts()
+/obj/item/weapon/reagent_containers/food/snacks/CheckParts(list/parts_list, datum/crafting_recipe/R)
+ ..()
+ reagents.reagent_list.Cut()
+ for(var/obj/item/weapon/reagent_containers/RC in contents)
+ RC.reagents.trans_to(reagents, RC.reagents.maximum_volume)
+ contents_loop:
+ for(var/A in contents)
+ for(var/B in initial(R.parts))
+ if(istype(A, B))
+ continue contents_loop
+ qdel(A)
+ feedback_add_details("food_made","[type]")
if(bonus_reagents.len)
for(var/r_id in bonus_reagents)
var/amount = bonus_reagents[r_id]
diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food&drinks/food/snacks_burgers.dm
index 16d5eda5f2d..061a28d6c90 100644
--- a/code/modules/food&drinks/food/snacks_burgers.dm
+++ b/code/modules/food&drinks/food/snacks_burgers.dm
@@ -18,7 +18,8 @@
desc = "A bloody burger."
bonus_reagents = list("vitamin" = 4)
-/obj/item/weapon/reagent_containers/food/snacks/burger/human/CheckParts()
+/obj/item/weapon/reagent_containers/food/snacks/burger/human/CheckParts(list/parts_list)
+ ..()
var/obj/item/weapon/reagent_containers/food/snacks/meat/M = locate(/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human) in contents
if(M)
subjectname = M.subjectname
@@ -29,8 +30,6 @@
name = "[subjectjob] burger"
qdel(M)
- ..()
-
/obj/item/weapon/reagent_containers/food/snacks/burger/corgi
name = "corgi burger"
diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food&drinks/recipes/food_mixtures.dm
index 39ad0b66acd..bfb9dcbaf4e 100644
--- a/code/modules/food&drinks/recipes/food_mixtures.dm
+++ b/code/modules/food&drinks/recipes/food_mixtures.dm
@@ -1,3 +1,5 @@
+/datum/crafting_recipe/food/New()
+ parts |= reqs
//////////////////////////////////////////FOOD MIXTURES////////////////////////////////////
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
index 083deaf6f20..56649b1f9f7 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////BREAD////////////////////////////////////////////////
-/datum/table_recipe/meatbread
+/datum/crafting_recipe/food/meatbread
name = "Meat bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
@@ -13,7 +13,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/meat
category = CAT_FOOD
-/datum/table_recipe/xenomeatbread
+/datum/crafting_recipe/food/xenomeatbread
name = "Xenomeat bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
@@ -23,7 +23,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/xenomeat
category = CAT_FOOD
-/datum/table_recipe/spidermeatbread
+/datum/crafting_recipe/food/spidermeatbread
name = "Spidermeat bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
@@ -33,7 +33,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat
category = CAT_FOOD
-/datum/table_recipe/banananutbread
+/datum/crafting_recipe/food/banananutbread
name = "Banana nut bread"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -44,7 +44,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/banana
category = CAT_FOOD
-/datum/table_recipe/tofubread
+/datum/crafting_recipe/food/tofubread
name = "Tofu bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
@@ -54,7 +54,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/tofu
category = CAT_FOOD
-/datum/table_recipe/creamcheesebread
+/datum/crafting_recipe/food/creamcheesebread
name = "Cream cheese bread"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -64,7 +64,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese
category = CAT_FOOD
-/datum/table_recipe/mimanabread
+/datum/crafting_recipe/food/mimanabread
name = "Mimana bread"
reqs = list(
/datum/reagent/consumable/soymilk = 5,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
index e3c86d5732e..8b70e10f143 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
@@ -4,7 +4,7 @@
////////////////////////////////////////////////BURGERS////////////////////////////////////////////////
-/datum/table_recipe/humanburger
+/datum/crafting_recipe/food/humanburger
name = "Human burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/bun = 1,
@@ -16,7 +16,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/human
category = CAT_FOOD
-/datum/table_recipe/burger
+/datum/crafting_recipe/food/burger
name = "Burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -26,7 +26,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/plain
category = CAT_FOOD
-/datum/table_recipe/corgiburger
+/datum/crafting_recipe/food/corgiburger
name = "Corgi burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi = 1,
@@ -36,7 +36,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/corgi
category = CAT_FOOD
-/datum/table_recipe/appendixburger
+/datum/crafting_recipe/food/appendixburger
name = "Appendix burger"
reqs = list(
/obj/item/organ/appendix = 1,
@@ -45,7 +45,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/appendix
category = CAT_FOOD
-/datum/table_recipe/brainburger
+/datum/crafting_recipe/food/brainburger
name = "Brain burger"
reqs = list(
/obj/item/organ/brain = 1,
@@ -54,7 +54,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/brain
category = CAT_FOOD
-/datum/table_recipe/xenoburger
+/datum/crafting_recipe/food/xenoburger
name = "Xeno burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno = 1,
@@ -63,7 +63,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/xeno
category = CAT_FOOD
-/datum/table_recipe/bearger
+/datum/crafting_recipe/food/bearger
name = "Bearger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1,
@@ -72,7 +72,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/bearger
category = CAT_FOOD
-/datum/table_recipe/fishburger
+/datum/crafting_recipe/food/fishburger
name = "Fish burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1,
@@ -81,7 +81,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/fish
category = CAT_FOOD
-/datum/table_recipe/tofuburger
+/datum/crafting_recipe/food/tofuburger
name = "Tofu burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/tofu = 1,
@@ -90,7 +90,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/tofu
category = CAT_FOOD
-/datum/table_recipe/ghostburger
+/datum/crafting_recipe/food/ghostburger
name = "Ghost burger"
reqs = list(
/obj/item/weapon/ectoplasm = 1,
@@ -99,7 +99,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/ghost
category = CAT_FOOD
-/datum/table_recipe/clownburger
+/datum/crafting_recipe/food/clownburger
name = "Clown burger"
reqs = list(
/obj/item/clothing/mask/gas/clown_hat = 1,
@@ -108,7 +108,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/clown
category = CAT_FOOD
-/datum/table_recipe/mimeburger
+/datum/crafting_recipe/food/mimeburger
name = "Mime burger"
reqs = list(
/obj/item/clothing/mask/gas/mime = 1,
@@ -117,7 +117,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/mime
category = CAT_FOOD
-/datum/table_recipe/redburger
+/datum/crafting_recipe/food/redburger
name = "Red burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -127,7 +127,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/red
category = CAT_FOOD
-/datum/table_recipe/orangeburger
+/datum/crafting_recipe/food/orangeburger
name = "Orange burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -137,7 +137,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/orange
category = CAT_FOOD
-/datum/table_recipe/yellowburger
+/datum/crafting_recipe/food/yellowburger
name = "Yellow burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -147,7 +147,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/yellow
category = CAT_FOOD
-/datum/table_recipe/greenburger
+/datum/crafting_recipe/food/greenburger
name = "Green burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -157,7 +157,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/green
category = CAT_FOOD
-/datum/table_recipe/blueburger
+/datum/crafting_recipe/food/blueburger
name = "Blue burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -167,7 +167,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/blue
category = CAT_FOOD
-/datum/table_recipe/purpleburger
+/datum/crafting_recipe/food/purpleburger
name = "Purple burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
@@ -177,15 +177,15 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/purple
category = CAT_FOOD
-/datum/table_recipe/spellburger
+/datum/crafting_recipe/food/spellburger
name = "Spell burger"
reqs = list(
- /obj/item/clothing/head/wizard/fake,
+ /obj/item/clothing/head/wizard/fake = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/spell
category = CAT_FOOD
-/datum/table_recipe/spellburger2
+/datum/crafting_recipe/food/spellburger2
name = "Spell burger"
reqs = list(
/obj/item/clothing/head/wizard = 1,
@@ -194,7 +194,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/spell
category = CAT_FOOD
-/datum/table_recipe/bigbiteburger
+/datum/crafting_recipe/food/bigbiteburger
name = "Big bite burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 3,
@@ -203,7 +203,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/bigbite
category = CAT_FOOD
-/datum/table_recipe/superbiteburger
+/datum/crafting_recipe/food/superbiteburger
name = "Super bite burger"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 5,
@@ -218,7 +218,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/superbite
category = CAT_FOOD
-/datum/table_recipe/slimeburger
+/datum/crafting_recipe/food/slimeburger
name = "Jelly burger"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
@@ -227,7 +227,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime
category = CAT_FOOD
-/datum/table_recipe/jellyburger
+/datum/crafting_recipe/food/jellyburger
name = "Jelly burger"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -236,7 +236,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry
category = CAT_FOOD
-/datum/table_recipe/fivealarmburger
+/datum/crafting_recipe/food/fivealarmburger
name = "Five alarm burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili = 2,
@@ -245,7 +245,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm
category = CAT_FOOD
-/datum/table_recipe/ratburger
+/datum/crafting_recipe/food/ratburger
name = "Rat burger"
reqs = list(
/obj/item/trash/deadmouse = 1,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
index 63890d8b83f..03bdce39e59 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////CAKE////////////////////////////////////////////////
-/datum/table_recipe/carrotcake
+/datum/crafting_recipe/food/carrotcake
name = "Carrot cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -12,7 +12,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/carrot
category = CAT_FOOD
-/datum/table_recipe/cheesecake
+/datum/crafting_recipe/food/cheesecake
name = "Cheese cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -21,7 +21,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/cheese
category = CAT_FOOD
-/datum/table_recipe/applecake
+/datum/crafting_recipe/food/applecake
name = "Apple cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -30,7 +30,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/apple
category = CAT_FOOD
-/datum/table_recipe/orangecake
+/datum/crafting_recipe/food/orangecake
name = "Orange cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -39,7 +39,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/orange
category = CAT_FOOD
-/datum/table_recipe/limecake
+/datum/crafting_recipe/food/limecake
name = "Lime cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -48,7 +48,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/lime
category = CAT_FOOD
-/datum/table_recipe/lemoncake
+/datum/crafting_recipe/food/lemoncake
name = "Lemon cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -57,7 +57,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/lemon
category = CAT_FOOD
-/datum/table_recipe/chocolatecake
+/datum/crafting_recipe/food/chocolatecake
name = "Chocolate cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -66,7 +66,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/chocolate
category = CAT_FOOD
-/datum/table_recipe/birthdaycake
+/datum/crafting_recipe/food/birthdaycake
name = "Birthday cake"
reqs = list(
/obj/item/clothing/head/hardhat/cakehat = 1,
@@ -75,7 +75,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday
category = CAT_FOOD
-/datum/table_recipe/braincake
+/datum/crafting_recipe/food/braincake
name = "Brain cake"
reqs = list(
/obj/item/organ/brain = 1,
@@ -84,7 +84,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/brain
category = CAT_FOOD
-/datum/table_recipe/slimecake
+/datum/crafting_recipe/food/slimecake
name = "Slime cake"
reqs = list(
/obj/item/slime_extract = 1,
@@ -93,7 +93,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake
category = CAT_FOOD
-/datum/table_recipe/pumpkinspicecake
+/datum/crafting_recipe/food/pumpkinspicecake
name = "Pumpkin spice cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
index ae2e575fa95..b01f794fc2c 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////EGG RECIPE's////////////////////////////////////////////////
-/datum/table_recipe/friedegg
+/datum/crafting_recipe/food/friedegg
name = "Fried egg"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
@@ -13,7 +13,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/friedegg
category = CAT_FOOD
-/datum/table_recipe/omelette
+/datum/crafting_recipe/food/omelette
name = "omelette"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledegg = 2,
@@ -22,7 +22,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/omelette
category = CAT_FOOD
-/datum/table_recipe/chocolateegg
+/datum/crafting_recipe/food/chocolateegg
name = "Chocolate egg"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1,
@@ -31,7 +31,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg
category = CAT_FOOD
-/datum/table_recipe/eggsbenedict
+/datum/crafting_recipe/food/eggsbenedict
name = "Eggs benedict"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
index eba85761993..f20b5ae37d7 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
@@ -2,7 +2,7 @@
////////////////////////////////////////////////KEBABS////////////////////////////////////////////////
-/datum/table_recipe/humankebab
+/datum/crafting_recipe/food/humankebab
name = "Human kebab"
reqs = list(
/obj/item/stack/rods = 1,
@@ -11,7 +11,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/human
category = CAT_FOOD
-/datum/table_recipe/kebab
+/datum/crafting_recipe/food/kebab
name = "Kebab"
reqs = list(
/obj/item/stack/rods = 1,
@@ -20,7 +20,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/monkey
category = CAT_FOOD
-/datum/table_recipe/tofukebab
+/datum/crafting_recipe/food/tofukebab
name = "Tofu kebab"
reqs = list(
/obj/item/stack/rods = 1,
@@ -29,7 +29,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tofu
category = CAT_FOOD
-/datum/table_recipe/tailkebab
+/datum/crafting_recipe/food/tailkebab
name = "Lizard tail kebab"
reqs = list(
/obj/item/stack/rods = 1,
@@ -42,7 +42,7 @@
////////////////////////////////////////////////FISH////////////////////////////////////////////////
-/datum/table_recipe/cubancarp
+/datum/crafting_recipe/food/cubancarp
name = "Cuban carp"
reqs = list(
/datum/reagent/consumable/flour = 5,
@@ -52,7 +52,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cubancarp
category = CAT_FOOD
-/datum/table_recipe/fishandchips
+/datum/crafting_recipe/food/fishandchips
name = "Fish and chips"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/fries = 1,
@@ -61,7 +61,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/fishandchips
category = CAT_FOOD
-/datum/table_recipe/fishfingers
+/datum/crafting_recipe/food/fishfingers
name = "Fish fingers"
reqs = list(
/datum/reagent/consumable/flour = 5,
@@ -71,7 +71,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers
category = CAT_FOOD
-/datum/table_recipe/sashimi
+/datum/crafting_recipe/food/sashimi
name = "Sashimi"
reqs = list(
/datum/reagent/consumable/soysauce = 5,
@@ -83,7 +83,7 @@
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
-/datum/table_recipe/spidereggsham
+/datum/crafting_recipe/food/spidereggsham
name = "Spider eggs ham"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
@@ -95,7 +95,7 @@
////////////////////////////////////////////////MISC RECIPE's////////////////////////////////////////////////
-/datum/table_recipe/cornedbeef
+/datum/crafting_recipe/food/cornedbeef
name = "Corned beef"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 5,
@@ -105,7 +105,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef
category = CAT_FOOD
-/datum/table_recipe/bearsteak
+/datum/crafting_recipe/food/bearsteak
name = "Filet migrawr"
reqs = list(
/datum/reagent/consumable/ethanol/manly_dorf = 5,
@@ -115,7 +115,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/bearsteak
category = CAT_FOOD
-/datum/table_recipe/enchiladas
+/datum/crafting_recipe/food/enchiladas
name = "Enchiladas"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2,
@@ -125,7 +125,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
category = CAT_FOOD
-/datum/table_recipe/stewedsoymeat
+/datum/crafting_recipe/food/stewedsoymeat
name = "Stewed soymeat"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/soydope = 2,
@@ -135,7 +135,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
category = CAT_FOOD
-/datum/table_recipe/sausage
+/datum/crafting_recipe/food/sausage
name = "Sausage"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/faggot = 1,
@@ -144,7 +144,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/sausage
category = CAT_FOOD
-/datum/table_recipe/nugget
+/datum/crafting_recipe/food/nugget
name = "Chicken nugget"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
index 6f299b87d31..32dea3f7b57 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
@@ -3,7 +3,7 @@
// MISC
-/datum/table_recipe/candiedapple
+/datum/crafting_recipe/food/candiedapple
name = "Candied apple"
reqs = list(/datum/reagent/water = 5,
/datum/reagent/consumable/sugar = 5,
@@ -12,7 +12,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple
category = CAT_FOOD
-/datum/table_recipe/chococoin
+/datum/crafting_recipe/food/chococoin
name = "Choco coin"
reqs = list(
/obj/item/weapon/coin = 1,
@@ -21,7 +21,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/chococoin
category = CAT_FOOD
-/datum/table_recipe/fudgedice
+/datum/crafting_recipe/food/fudgedice
name = "Fudge dice"
reqs = list(
/obj/item/weapon/dice = 1,
@@ -30,7 +30,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/fudgedice
category = CAT_FOOD
-/datum/table_recipe/chocoorange
+/datum/crafting_recipe/food/chocoorange
name = "Choco orange"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1,
@@ -39,7 +39,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/chocoorange
category = CAT_FOOD
-/datum/table_recipe/loadedbakedpotato
+/datum/crafting_recipe/food/loadedbakedpotato
name = "Loaded baked potato"
time = 40
reqs = list(
@@ -49,7 +49,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
category = CAT_FOOD
-/datum/table_recipe/cheesyfries
+/datum/crafting_recipe/food/cheesyfries
name = "Cheesy fries"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/fries = 1,
@@ -58,7 +58,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyfries
category = CAT_FOOD
-/datum/table_recipe/wrap
+/datum/crafting_recipe/food/wrap
name = "Wrap"
reqs = list(/datum/reagent/consumable/soysauce = 10,
/obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
@@ -67,7 +67,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/eggwrap
category = CAT_FOOD
-/datum/table_recipe/beans
+/datum/crafting_recipe/food/beans
name = "Beans"
time = 40
reqs = list(/datum/reagent/consumable/ketchup = 5,
@@ -76,7 +76,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/beans
category = CAT_FOOD
-/datum/table_recipe/eggplantparm
+/datum/crafting_recipe/food/eggplantparm
name ="Eggplant parmigiana"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2,
@@ -85,7 +85,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/eggplantparm
category = CAT_FOOD
-/datum/table_recipe/baguette
+/datum/crafting_recipe/food/baguette
name = "Baguette"
time = 40
reqs = list(/datum/reagent/consumable/sodiumchloride = 1,
@@ -97,7 +97,7 @@
////////////////////////////////////////////////TOAST////////////////////////////////////////////////
-/datum/table_recipe/slimetoast
+/datum/crafting_recipe/food/slimetoast
name = "Slime toast"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
@@ -106,7 +106,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime
category = CAT_FOOD
-/datum/table_recipe/jelliedyoast
+/datum/crafting_recipe/food/jelliedyoast
name = "Jellied toast"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -115,7 +115,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry
category = CAT_FOOD
-/datum/table_recipe/twobread
+/datum/crafting_recipe/food/twobread
name = "Two bread"
reqs = list(
/datum/reagent/consumable/ethanol/wine = 5,
@@ -124,7 +124,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/twobread
category = CAT_FOOD
-/datum/table_recipe/burrito
+/datum/crafting_recipe/food/burrito
name ="Burrito"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
@@ -133,7 +133,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/burrito
category = CAT_FOOD
-/datum/table_recipe/cheesyburrito
+/datum/crafting_recipe/food/cheesyburrito
name ="Cheesy burrito"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
@@ -143,7 +143,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cheesyburrito
category = CAT_FOOD
-/datum/table_recipe/carneburrito
+/datum/crafting_recipe/food/carneburrito
name ="Carne de asada burrito"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
@@ -153,7 +153,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/carneburrito
category = CAT_FOOD
-/datum/table_recipe/fuegoburrito
+/datum/crafting_recipe/food/fuegoburrito
name ="Fuego plasma burrito"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
@@ -163,7 +163,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito
category = CAT_FOOD
-/datum/table_recipe/melonfruitbowl
+/datum/crafting_recipe/food/melonfruitbowl
name ="Melon fruit bowl"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = 1,
@@ -176,7 +176,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl
category = CAT_FOOD
-/datum/table_recipe/spacefreezy
+/datum/crafting_recipe/food/spacefreezy
name ="Space freezy"
reqs = list(
/datum/reagent/consumable/bluecherryjelly = 5,
@@ -186,7 +186,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/spacefreezy
category = CAT_FOOD
-/datum/table_recipe/sundae
+/datum/crafting_recipe/food/sundae
name ="Sundae"
reqs = list(
/datum/reagent/consumable/cream = 5,
@@ -197,7 +197,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/sundae
category = CAT_FOOD
-/datum/table_recipe/honkdae
+/datum/crafting_recipe/food/honkdae
name ="Honkdae"
reqs = list(
/datum/reagent/consumable/cream = 5,
@@ -209,7 +209,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/honkdae
category = CAT_FOOD
-/datum/table_recipe/nachos
+/datum/crafting_recipe/food/nachos
name ="Nachos"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
@@ -218,7 +218,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/nachos
category = CAT_FOOD
-/datum/table_recipe/cheesynachos
+/datum/crafting_recipe/food/cheesynachos
name ="Cheesy nachos"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
@@ -228,7 +228,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cheesynachos
category = CAT_FOOD
-/datum/table_recipe/cubannachos
+/datum/crafting_recipe/food/cubannachos
name ="Cuban nachos"
reqs = list(
/datum/reagent/consumable/ketchup = 5,
@@ -238,7 +238,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cubannachos
category = CAT_FOOD
-/datum/table_recipe/melonkeg
+/datum/crafting_recipe/food/melonkeg
name ="Melon keg"
reqs = list(
/datum/reagent/consumable/ethanol/vodka = 25,
@@ -249,7 +249,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/melonkeg
category = CAT_FOOD
-/datum/table_recipe/honeybar
+/datum/crafting_recipe/food/honeybar
name = "Honey nut bar"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1,
@@ -259,7 +259,7 @@
category = CAT_FOOD
-/datum/table_recipe/stuffedlegion
+/datum/crafting_recipe/stuffedlegion
name = "Stuffed legion"
time = 40
reqs = list(
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
index 99305007696..850eb46b620 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////DONUTS////////////////////////////////////////////////
-/datum/table_recipe/chaosdonut
+/datum/crafting_recipe/food/chaosdonut
name = "Chaos donut"
reqs = list(
/datum/reagent/consumable/frostoil = 5,
@@ -13,7 +13,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos
category = CAT_FOOD
-/datum/table_recipe/donut
+/datum/crafting_recipe/food/donut
time = 15
name = "Donut"
reqs = list(
@@ -23,7 +23,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/donut
category = CAT_FOOD
-/datum/table_recipe/jellydonut
+/datum/crafting_recipe/food/jellydonut
name = "Jelly donut"
reqs = list(
/datum/reagent/consumable/berryjuice = 5,
@@ -32,7 +32,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly
category = CAT_FOOD
-/datum/table_recipe/cherryjellydonut
+/datum/crafting_recipe/food/cherryjellydonut
name = "Cherry jelly donut"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -41,7 +41,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/cherryjelly
category = CAT_FOOD
-/datum/table_recipe/slimejellydonut
+/datum/crafting_recipe/food/slimejellydonut
name = "Slime jelly donut"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
@@ -52,7 +52,7 @@
////////////////////////////////////////////////WAFFLES////////////////////////////////////////////////
-/datum/table_recipe/waffles
+/datum/crafting_recipe/food/waffles
time = 15
name = "Waffles"
reqs = list(
@@ -62,7 +62,7 @@
category = CAT_FOOD
-/datum/table_recipe/soylenviridians
+/datum/crafting_recipe/food/soylenviridians
name = "Soylent viridians"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2,
@@ -71,7 +71,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soylenviridians
category = CAT_FOOD
-/datum/table_recipe/soylentgreen
+/datum/crafting_recipe/food/soylentgreen
name = "Soylent green"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2,
@@ -81,7 +81,7 @@
category = CAT_FOOD
-/datum/table_recipe/rofflewaffles
+/datum/crafting_recipe/food/rofflewaffles
name = "Roffle waffles"
reqs = list(
/datum/reagent/mushroomhallucinogen = 5,
@@ -92,7 +92,7 @@
////////////////////////////////////////////////DONKPOCCKETS////////////////////////////////////////////////
-/datum/table_recipe/donkpocket
+/datum/crafting_recipe/food/donkpocket
time = 15
name = "Donkpocket"
reqs = list(
@@ -105,7 +105,7 @@
////////////////////////////////////////////////MUFFINS////////////////////////////////////////////////
-/datum/table_recipe/muffin
+/datum/crafting_recipe/food/muffin
time = 15
name = "Muffin"
reqs = list(
@@ -115,7 +115,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/muffin
category = CAT_FOOD
-/datum/table_recipe/berrymuffin
+/datum/crafting_recipe/food/berrymuffin
name = "Berry muffin"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -125,7 +125,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/muffin/berry
category = CAT_FOOD
-/datum/table_recipe/booberrymuffin
+/datum/crafting_recipe/food/booberrymuffin
name = "Booberry muffin"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -136,7 +136,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/muffin/booberry
category = CAT_FOOD
-/datum/table_recipe/chawanmushi
+/datum/crafting_recipe/food/chawanmushi
name = "Chawanmushi"
reqs = list(
/datum/reagent/water = 5,
@@ -149,7 +149,7 @@
////////////////////////////////////////////OTHER////////////////////////////////////////////
-/datum/table_recipe/hotdog
+/datum/crafting_recipe/food/hotdog
name = "Hot dog"
reqs = list(
/datum/reagent/consumable/ketchup = 5,
@@ -159,7 +159,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/hotdog
category = CAT_FOOD
-/datum/table_recipe/meatbun
+/datum/crafting_recipe/food/meatbun
name = "Meat bun"
reqs = list(
/datum/reagent/consumable/soysauce = 5,
@@ -170,7 +170,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/meatbun
category = CAT_FOOD
-/datum/table_recipe/sugarcookie
+/datum/crafting_recipe/food/sugarcookie
time = 15
name = "Sugar cookie"
reqs = list(
@@ -180,7 +180,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie
category = CAT_FOOD
-/datum/table_recipe/fortunecookie
+/datum/crafting_recipe/food/fortunecookie
time = 15
name = "Fortune cookie"
reqs = list(
@@ -193,7 +193,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie
category = CAT_FOOD
-/datum/table_recipe/poppypretzel
+/datum/crafting_recipe/food/poppypretzel
time = 15
name = "Poppy pretzel"
reqs = list(
@@ -203,7 +203,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
category = CAT_FOOD
-/datum/table_recipe/plumphelmetbiscuit
+/datum/crafting_recipe/food/plumphelmetbiscuit
time = 15
name = "Plumphelmet biscuit"
reqs = list(
@@ -213,7 +213,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
category = CAT_FOOD
-/datum/table_recipe/cracker
+/datum/crafting_recipe/food/cracker
time = 15
name = "Cracker"
reqs = list(
@@ -223,7 +223,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cracker
category = CAT_FOOD
-/datum/table_recipe/chococornet
+/datum/crafting_recipe/food/chococornet
name = "Choco cornet"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
@@ -233,7 +233,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/chococornet
category = CAT_FOOD
-/datum/table_recipe/oatmealcookie
+/datum/crafting_recipe/food/oatmealcookie
name = "Oatmeal cookie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
@@ -241,7 +241,7 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/oatmealcookie
-/datum/table_recipe/raisincookie
+/datum/crafting_recipe/food/raisincookie
name = "Raisin cookie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1,
@@ -251,7 +251,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/raisincookie
category = CAT_FOOD
-/datum/table_recipe/cherrycupcake
+/datum/crafting_recipe/food/cherrycupcake
name = "Cherry cupcake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
@@ -260,7 +260,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/cherrycupcake
category = CAT_FOOD
-/datum/table_recipe/bluecherrycupcake
+/datum/crafting_recipe/food/bluecherrycupcake
name = "Blue cherry cupcake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
@@ -269,7 +269,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake
category = CAT_FOOD
-/datum/table_recipe/honeybun
+/datum/crafting_recipe/food/honeybun
name = "Honey bun"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
index 19c72203735..f6e938ae478 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////PIES////////////////////////////////////////////////
-/datum/table_recipe/bananacreampie
+/datum/crafting_recipe/food/bananacreampie
name = "Banana cream pie"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -13,7 +13,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/cream
category = CAT_FOOD
-/datum/table_recipe/meatpie
+/datum/crafting_recipe/food/meatpie
name = "Meat pie"
reqs = list(
/datum/reagent/consumable/blackpepper = 1,
@@ -24,7 +24,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/meatpie
category = CAT_FOOD
-/datum/table_recipe/tofupie
+/datum/crafting_recipe/food/tofupie
name = "Tofu pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -33,7 +33,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/tofupie
category = CAT_FOOD
-/datum/table_recipe/xenopie
+/datum/crafting_recipe/food/xenopie
name = "Xeno pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -42,7 +42,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/xemeatpie
category = CAT_FOOD
-/datum/table_recipe/cherrypie
+/datum/crafting_recipe/food/cherrypie
name = "Cherry pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -51,7 +51,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/cherrypie
category = CAT_FOOD
-/datum/table_recipe/berryclafoutis
+/datum/crafting_recipe/food/berryclafoutis
name = "Berry clafoutis"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -60,7 +60,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis
category = CAT_FOOD
-/datum/table_recipe/bearypie
+/datum/crafting_recipe/food/bearypie
name = "Beary Pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -70,7 +70,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/bearypie
category = CAT_FOOD
-/datum/table_recipe/amanitapie
+/datum/crafting_recipe/food/amanitapie
name = "Amanita pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -79,7 +79,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/amanita_pie
category = CAT_FOOD
-/datum/table_recipe/plumppie
+/datum/crafting_recipe/food/plumppie
name = "Plump pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -88,7 +88,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie
category = CAT_FOOD
-/datum/table_recipe/applepie
+/datum/crafting_recipe/food/applepie
name = "Apple pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
@@ -97,7 +97,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/applepie
category = CAT_FOOD
-/datum/table_recipe/pumpkinpie
+/datum/crafting_recipe/food/pumpkinpie
name = "Pumpkin pie"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -108,7 +108,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie
category = CAT_FOOD
-/datum/table_recipe/goldenappletart
+/datum/crafting_recipe/food/goldenappletart
name = "Golden apple tart"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -119,7 +119,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/appletart
category = CAT_FOOD
-/datum/table_recipe/grapetart
+/datum/crafting_recipe/food/grapetart
name = "Grape tart"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -130,7 +130,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/grapetart
category = CAT_FOOD
-/datum/table_recipe/blumpkinpie
+/datum/crafting_recipe/food/blumpkinpie
name = "Blumpkin pie"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -141,7 +141,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie
category = CAT_FOOD
-/datum/table_recipe/dulcedebatata
+/datum/crafting_recipe/food/dulcedebatata
name = "Dulce de batata"
reqs = list(
/datum/reagent/consumable/vanilla = 5,
@@ -151,7 +151,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata
category = CAT_FOOD
-/datum/table_recipe/frostypie
+/datum/crafting_recipe/food/frostypie
name = "Frosty pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
index 3d34dcd93d6..f7627e2e07f 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////PIZZA!!!////////////////////////////////////////////////
-/datum/table_recipe/margheritapizza
+/datum/crafting_recipe/food/margheritapizza
name = "Margherita pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
@@ -13,7 +13,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/margherita
category = CAT_FOOD
-/datum/table_recipe/meatpizza
+/datum/crafting_recipe/food/meatpizza
name = "Meat pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
@@ -24,7 +24,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meat
category = CAT_FOOD
-/datum/table_recipe/mushroompizza
+/datum/crafting_recipe/food/mushroompizza
name = "Mushroom pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
@@ -33,7 +33,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom
category = CAT_FOOD
-/datum/table_recipe/vegetablepizza
+/datum/crafting_recipe/food/vegetablepizza
name = "Vegetable pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
@@ -45,7 +45,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable
category = CAT_FOOD
-/datum/table_recipe/donpocketpizza
+/datum/crafting_recipe/food/donpocketpizza
name = "Donkpocket pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
@@ -56,7 +56,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket
category = CAT_FOOD
-/datum/table_recipe/dankpizza
+/datum/crafting_recipe/food/dankpizza
name = "Dank pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
@@ -67,7 +67,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pizza/dank
category = CAT_FOOD
-/datum/table_recipe/sassysagepizza
+/datum/crafting_recipe/food/sassysagepizza
name = "Sassysage pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
index 95752809085..fc4633253f0 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////SALADS////////////////////////////////////////////////
-/datum/table_recipe/herbsalad
+/datum/crafting_recipe/food/herbsalad
name = "Herb salad"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -13,7 +13,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/herbsalad
category = CAT_FOOD
-/datum/table_recipe/aesirsalad
+/datum/crafting_recipe/food/aesirsalad
name = "Aesir salad"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -23,7 +23,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/aesirsalad
category = CAT_FOOD
-/datum/table_recipe/validsalad
+/datum/crafting_recipe/food/validsalad
name = "Valid salad"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -34,7 +34,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/validsalad
category = CAT_FOOD
-/datum/table_recipe/monkeysdelight
+/datum/crafting_recipe/food/monkeysdelight
name = "Monkeys delight"
reqs = list(
/datum/reagent/consumable/flour = 5,
@@ -47,7 +47,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight
category = CAT_FOOD
-/datum/table_recipe/oatmeal
+/datum/crafting_recipe/food/oatmeal
name = "Oatmeal"
reqs = list(
/datum/reagent/consumable/milk = 10,
@@ -57,7 +57,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal
category = CAT_FOOD
-/datum/table_recipe/fruitsalad
+/datum/crafting_recipe/food/fruitsalad
name = "Fruit salad"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -70,7 +70,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/fruit
category = CAT_FOOD
-/datum/table_recipe/junglesalad
+/datum/crafting_recipe/food/junglesalad
name = "Jungle salad"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -83,7 +83,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/jungle
category = CAT_FOOD
-/datum/table_recipe/citrusdelight
+/datum/crafting_recipe/food/citrusdelight
name = "Citrus delight"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -95,7 +95,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight
category = CAT_FOOD
-/datum/table_recipe/ricepork
+/datum/crafting_recipe/food/ricepork
name = "Rice and pork"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1,
@@ -104,7 +104,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepork
category = CAT_FOOD
-/datum/table_recipe/eggbowl
+/datum/crafting_recipe/food/eggbowl
name = "Egg bowl"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1,
@@ -115,7 +115,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl
category = CAT_FOOD
-/datum/table_recipe/ricepudding
+/datum/crafting_recipe/food/ricepudding
name = "Rice pudding"
reqs = list(
/datum/reagent/consumable/milk = 5,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
index a4f14d0a280..630430e2d36 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -6,7 +6,7 @@
////////////////////////////////////////////////SANDWICHES////////////////////////////////////////////////
-/datum/table_recipe/sandwich
+/datum/crafting_recipe/food/sandwich
name = "Sandwich"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
@@ -16,7 +16,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/sandwich
category = CAT_FOOD
-/datum/table_recipe/grilledcheesesandwich
+/datum/crafting_recipe/food/grilledcheesesandwich
name = "Grilled cheese sandwich"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
@@ -25,7 +25,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/grilledcheese
category = CAT_FOOD
-/datum/table_recipe/slimesandwich
+/datum/crafting_recipe/food/slimesandwich
name = "Jelly sandwich"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
@@ -34,7 +34,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
category = CAT_FOOD
-/datum/table_recipe/cherrysandwich
+/datum/crafting_recipe/food/cherrysandwich
name = "Jelly sandwich"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -43,7 +43,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
category = CAT_FOOD
-/datum/table_recipe/icecreamsandwich
+/datum/crafting_recipe/food/icecreamsandwich
name = "Icecream sandwich"
reqs = list(
/datum/reagent/consumable/cream = 5,
@@ -53,7 +53,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich
category = CAT_FOOD
-/datum/table_recipe/notasandwich
+/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
index 082fb2b352f..3df5c6b8ca8 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////SOUP////////////////////////////////////////////////
-/datum/table_recipe/meatballsoup
+/datum/crafting_recipe/food/meatballsoup
name = "Meatball soup"
reqs = list(
/datum/reagent/water = 10,
@@ -15,7 +15,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/meatball
category = CAT_FOOD
-/datum/table_recipe/vegetablesoup
+/datum/crafting_recipe/food/vegetablesoup
name = "Vegetable soup"
reqs = list(
/datum/reagent/water = 10,
@@ -28,7 +28,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/vegetable
category = CAT_FOOD
-/datum/table_recipe/nettlesoup
+/datum/crafting_recipe/food/nettlesoup
name = "Nettle soup"
reqs = list(
/datum/reagent/water = 10,
@@ -40,7 +40,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/nettle
category = CAT_FOOD
-/datum/table_recipe/wingfangchu
+/datum/crafting_recipe/food/wingfangchu
name = "Wingfangchu"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -50,7 +50,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu
category = CAT_FOOD
-/datum/table_recipe/wishsoup
+/datum/crafting_recipe/food/wishsoup
name = "Wish soup"
reqs = list(
/datum/reagent/water = 20,
@@ -59,7 +59,7 @@
result= /obj/item/weapon/reagent_containers/food/snacks/soup/wish
category = CAT_FOOD
-/datum/table_recipe/hotchili
+/datum/crafting_recipe/food/hotchili
name = "Hot chili"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -70,7 +70,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/hotchili
category = CAT_FOOD
-/datum/table_recipe/coldchili
+/datum/crafting_recipe/food/coldchili
name = "Cold chili"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -81,7 +81,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/coldchili
category = CAT_FOOD
-/datum/table_recipe/tomatosoup
+/datum/crafting_recipe/food/tomatosoup
name = "Tomato soup"
reqs = list(
/datum/reagent/water = 10,
@@ -91,7 +91,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato
category = CAT_FOOD
-/datum/table_recipe/milosoup
+/datum/crafting_recipe/food/milosoup
name = "Milo soup"
reqs = list(
/datum/reagent/water = 10,
@@ -102,7 +102,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/milo
category = CAT_FOOD
-/datum/table_recipe/bloodsoup
+/datum/crafting_recipe/food/bloodsoup
name = "Blood soup"
reqs = list(
/datum/reagent/blood = 10,
@@ -112,7 +112,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/blood
category = CAT_FOOD
-/datum/table_recipe/slimesoup
+/datum/crafting_recipe/food/slimesoup
name = "Slime soup"
reqs = list(
/datum/reagent/water = 10,
@@ -122,7 +122,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/slime
category = CAT_FOOD
-/datum/table_recipe/clownstears
+/datum/crafting_recipe/food/clownstears
name = "Clowns tears"
reqs = list(
/datum/reagent/water = 10,
@@ -133,7 +133,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/clownstears
category = CAT_FOOD
-/datum/table_recipe/mysterysoup
+/datum/crafting_recipe/food/mysterysoup
name = "Mystery soup"
reqs = list(
/datum/reagent/water = 10,
@@ -146,7 +146,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/mystery
category = CAT_FOOD
-/datum/table_recipe/mushroomsoup
+/datum/crafting_recipe/food/mushroomsoup
name = "Mushroom soup"
reqs = list(
/datum/reagent/consumable/milk = 5,
@@ -157,7 +157,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/mushroom
category = CAT_FOOD
-/datum/table_recipe/beetsoup
+/datum/crafting_recipe/food/beetsoup
name = "Beet soup"
reqs = list(
/datum/reagent/water = 10,
@@ -168,7 +168,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet
category = CAT_FOOD
-/datum/table_recipe/stew
+/datum/crafting_recipe/food/stew
name = "Stew"
reqs = list(
/datum/reagent/water = 10,
@@ -183,7 +183,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/stew
category = CAT_FOOD
-/datum/table_recipe/spacylibertyduff
+/datum/crafting_recipe/food/spacylibertyduff
name = "Spacy liberty duff"
reqs = list(
/datum/reagent/consumable/ethanol/vodka = 5,
@@ -193,7 +193,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/spacylibertyduff
category = CAT_FOOD
-/datum/table_recipe/amanitajelly
+/datum/crafting_recipe/food/amanitajelly
name = "Amanita jelly"
reqs = list(
/datum/reagent/consumable/ethanol/vodka = 5,
@@ -203,7 +203,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly
category = CAT_FOOD
-/datum/table_recipe/sweetpotatosoup
+/datum/crafting_recipe/food/sweetpotatosoup
name = "Sweet potato soup"
reqs = list(
/datum/reagent/water = 10,
@@ -214,7 +214,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato
category = CAT_FOOD
-/datum/table_recipe/redbeetsoup
+/datum/crafting_recipe/food/redbeetsoup
name = "Red beet soup"
reqs = list(
/datum/reagent/water = 10,
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
index cbbcf0e6b1e..fb0ba863409 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////SPAGHETTI////////////////////////////////////////////////
-/datum/table_recipe/tomatopasta
+/datum/crafting_recipe/food/tomatopasta
name = "Tomato pasta"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
@@ -12,7 +12,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/pastatomato
category = CAT_FOOD
-/datum/table_recipe/copypasta
+/datum/crafting_recipe/food/copypasta
name = "Copypasta"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastatomato = 2
@@ -20,7 +20,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/copypasta
category = CAT_FOOD
-/datum/table_recipe/spaghettimeatball
+/datum/crafting_recipe/food/spaghettimeatball
name = "Spaghetti meatball"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
@@ -29,7 +29,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti
category = CAT_FOOD
-/datum/table_recipe/spesslaw
+/datum/crafting_recipe/food/spesslaw
name = "Spesslaw"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
@@ -38,7 +38,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/spesslaw
category = CAT_FOOD
-/datum/table_recipe/beefnoodle
+/datum/crafting_recipe/food/beefnoodle
name = "Beef noodle"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
@@ -49,7 +49,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/beefnoodle
category = CAT_FOOD
-/datum/table_recipe/chowmein
+/datum/crafting_recipe/food/chowmein
name = "Chowmein"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm
index 8f1616f882e..ebf6a8bd4a8 100644
--- a/code/modules/games/cas.dm
+++ b/code/modules/games/cas.dm
@@ -13,7 +13,7 @@ var/global/list/cards_against_space
icon_state = "deck_caswhite_full"
deckstyle = "caswhite"
var/card_face = "cas_white"
- var/blanks = 10
+ var/blanks = 25
var/decksize = 150
var/card_text_file = "strings/cas_white.txt"
var/list/allcards = list()
@@ -116,7 +116,7 @@ var/global/list/cards_against_space
set name = "Flip Card"
set category = "Object"
set src in range(1)
- if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
+ if(!usr.canUseTopic(src,1))
return
if(!flipped)
name = "CAS card"
@@ -125,6 +125,11 @@ var/global/list/cards_against_space
flipped = !flipped
update_icon()
+obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user)
+ if(!user.canUseTopic(src,1))
+ return
+ Flip()
+
/obj/item/toy/cards/singlecard/cas/update_icon()
if(flipped)
icon_state = "[card_face]_flipped"
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 2cb75a65e7c..d233ea1362c 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -151,7 +151,7 @@
desc = "The Cross represents the Assistants that died for your sins."
icon_state = "hotcrossbun"
-/datum/table_recipe/hotcrossbun
+/datum/crafting_recipe/food/food/hotcrossbun
name = "Hot-Cross Bun"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
@@ -175,7 +175,7 @@
icon_state = "briochecake_slice"
filling_color = "#FFD700"
-/datum/table_recipe/briochecake
+/datum/crafting_recipe/food/food/briochecake
name = "Brioche cake"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
@@ -193,7 +193,7 @@
filling_color = "#FFFFF0"
list_reagents = list("nutriment" = 6)
-/datum/table_recipe/scotchegg
+/datum/crafting_recipe/food/scotchegg
name = "Scotch egg"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
@@ -211,7 +211,7 @@
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 8, "vitamin" = 1)
-/datum/table_recipe/mammi
+/datum/crafting_recipe/food/mammi
name = "Mämmi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
@@ -229,7 +229,7 @@
list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
filling_color = "#A0522D"
-/datum/table_recipe/chocolatebunny
+/datum/crafting_recipe/food/chocolatebunny
name = "Chocolate bunny"
reqs = list(
/datum/reagent/consumable/sugar = 2,
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 399cae5df69..25dcce3a9fb 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -174,6 +174,11 @@
/obj/structure/closet/crate/secure/loot/attack_animal(mob/user)
boom(user)
+/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
+ if(!user.canUseTopic(src))
+ return
+ attack_hand(user)
+
/obj/structure/closet/crate/secure/loot/attackby(obj/item/weapon/W, mob/user)
if(locked)
if(istype(W, /obj/item/weapon/card/emag))
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 4ff2c3d0c03..e367f1d425a 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -15,8 +15,7 @@
if(1)
new /obj/item/device/shared_storage/red(src)
if(2)
- new /obj/item/clothing/suit/space/cult(src)
- new /obj/item/clothing/head/helmet/space/cult(src)
+ new /obj/item/clothing/suit/space/hardsuit/cult(src)
if(3)
new /obj/item/device/soulstone/anybody(src)
if(4)
@@ -368,14 +367,14 @@
w_class = 3
burn_state = LAVA_PROOF
-/datum/table_recipe/oar
+/datum/crafting_recipe/oar
name = "goliath bone oar"
result = /obj/item/weapon/oar
reqs = list(/obj/item/stack/sheet/bone = 2)
time = 15
category = CAT_PRIMAL
-/datum/table_recipe/boat
+/datum/crafting_recipe/boat
name = "goliath hide boat"
result = /obj/vehicle/lavaboat
reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9187f04b1ab..b8c454bdc41 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -47,8 +47,13 @@
martial_art = default_martial_art
+ handcrafting = new()
+
..()
+/mob/living/carbon/human/OpenCraftingMenu()
+ handcrafting.craft(src)
+
/mob/living/carbon/human/prepare_data_huds()
//Update med hud images...
..()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 150dfeca61b..4a1699d80e1 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -54,3 +54,4 @@ var/global/default_martial_art = new/datum/martial_art
var/heart_attack = 0
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
+ var/datum/personal_crafting/handcrafting
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index a7beebc5857..9b0f635152f 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -412,16 +412,8 @@
blacklisted = 1
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
+ mutant_organs = list(/obj/item/organ/tongue/bone)
specflags = list(NOBREATH,RESISTHEAT,RESISTCOLD,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE)
- var/list/myspan = null
-
-/datum/species/skeleton/New()
- ..()
- myspan = list(pick(SPAN_SANS,SPAN_PAPYRUS)) //pick a span and stick with it for the round
-
-/datum/species/skeleton/get_spans()
- return myspan
-
/*
ZOMBIES
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index 9f940c4e5ce..0b6c2cae108 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -18,3 +18,9 @@
if(silent)
return 0
return ..()
+
+/mob/living/carbon/get_spans()
+ . = ..()
+ var/obj/item/organ/tongue/T = getorganslot("tongue")
+ if(T)
+ . |= T.get_spans()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index aff9f035297..a04bb808579 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -49,6 +49,9 @@ Sorry Giacom. Please don't be mad :(
return QDEL_HINT_HARDDEL_NOW
+/mob/living/proc/OpenCraftingMenu()
+ return
+
/mob/living/proc/generateStaticOverlay()
staticOverlays.Add(list("static", "blank", "letter", "animal"))
var/image/staticOverlay = image(getStaticIcon(new/icon(icon,icon_state)), loc = src)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index 0b680f72a48..951868c61ca 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -61,7 +61,7 @@
var/seeStatic = 1 //Whether we see static instead of mobs
var/visualAppearence = MAINTDRONE //What we appear as
var/hacked = 0 //If we have laws to destroy the station
-
+ var/datum/personal_crafting/handcrafting
/mob/living/simple_animal/drone/New()
..()
@@ -86,6 +86,8 @@
var/datum/action/generic/drone/select_filter/SF = new(src)
SF.Grant(src)
+
+ handcrafting = new()
var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
@@ -103,6 +105,8 @@
else
holder.icon_state = "hudstat"
+/mob/living/simple_animal/drone/OpenCraftingMenu()
+ handcrafting.craft(src)
/mob/living/simple_animal/drone/Destroy()
qdel(access_card) //Otherwise it ends up on the floor!
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index c93db65fd7e..c2da9e8e227 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -117,7 +117,8 @@
var/see_ghosts = 0 //for the spoop of it
-/obj/item/device/camera/CheckParts()
+/obj/item/device/camera/CheckParts(list/parts_list)
+ ..()
var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents
if(C)
pictures_max = C.pictures_max
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 5ebc0c032d8..3d245ea9956 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -177,3 +177,9 @@ obj/item/ammo_casing/energy/net
/obj/item/ammo_casing/energy/instakill/red
projectile_type = /obj/item/projectile/beam/instakill/red
+
+/obj/item/ammo_casing/energy/shock_revolver
+ fire_sound = 'sound/magic/lightningbolt.ogg'
+ e_cost = 200
+ select_name = "stun"
+ projectile_type = /obj/item/projectile/energy/shock_revolver
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 1679cc941c8..25a8fa2a00b 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -78,7 +78,8 @@
build_zooming()
-/obj/item/weapon/gun/CheckParts()
+/obj/item/weapon/gun/CheckParts(list/parts_list)
+ ..()
var/obj/item/weapon/gun/G = locate(/obj/item/weapon/gun) in contents
if(G)
G.loc = loc
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index ddd2bab6064..32e1413a173 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -7,40 +7,14 @@
ammo_x_offset = 3
/obj/item/weapon/gun/energy/shock_revolver
- name = "tesla revolver"
- desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
- icon_state = "stunrevolver"
- item_state = "gun"
+ name = "tesla gun"
+ desc = "An experimental gun based on an experimental engine, it's about as likely to kill it's operator as it is the target."
+ icon_state = "tesla"
+ item_state = "tesla"
ammo_type = list(/obj/item/ammo_casing/energy/shock_revolver)
can_flashlight = 0
pin = null
- ammo_x_offset = 1
-
-
-/obj/item/ammo_casing/energy/shock_revolver
- fire_sound = 'sound/weapons/gunshot.ogg'
- e_cost = 200
- select_name = "stun"
- projectile_type = /obj/item/projectile/energy/shock_revolver
-
-
-/obj/item/projectile/energy/shock_revolver
- name = "shock bolt"
- icon_state = "purple_laser"
- var/chain
-
-/obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- ..()
- var/obj/item/projectile/hook/P = BB
- spawn(1)
- P.chain = P.Beam(user,icon_state="purple_lightning",icon = 'icons/effects/effects.dmi',time=1000, maxdistance = 30)
-
-/obj/item/projectile/energy/shock_revolver/on_hit(atom/target)
- . = ..()
- if(isliving(target))
- tesla_zap(src, 3, 10000)
- qdel(chain)
-
+ shaded_charge = 1
/obj/item/weapon/gun/energy/gun/advtaser
name = "hybrid taser"
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 2cf416fdf08..4dde9cc6fc8 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -145,4 +145,21 @@
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
\ No newline at end of file
+ projectile_type = /obj/item/projectile/plasma/adv
+
+/obj/item/projectile/energy/shock_revolver
+ name = "shock bolt"
+ icon_state = "purple_laser"
+ var/chain
+
+/obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ ..()
+ var/obj/item/projectile/hook/P = BB
+ spawn(1)
+ P.chain = P.Beam(user,icon_state="purple_lightning",icon = 'icons/effects/effects.dmi',time=1000, maxdistance = 30)
+
+/obj/item/projectile/energy/shock_revolver/on_hit(atom/target)
+ . = ..()
+ if(isliving(target))
+ tesla_zap(src, 3, 10000)
+ qdel(chain)
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index b028b1d8bc1..d1af9041bc8 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -634,6 +634,9 @@ var/const/INJECT = 5 //injection
return trans_data
+/datum/reagents/proc/get_reagent(type)
+ . = locate(type) in reagent_list
+
///////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index 3adfc081740..54c5a5a6b93 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -115,10 +115,10 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
H << "I don't feel strong enough without my hat."
return 0
if(cult_req) //CULT_REQ CLOTHES CHECK
- if(!istype(H.wear_suit, /obj/item/clothing/suit/magusred) && !istype(H.wear_suit, /obj/item/clothing/suit/space/cult))
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/magusred) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/cult))
H << "I don't feel strong enough without my armor."
return 0
- if(!istype(H.head, /obj/item/clothing/head/magus) && !istype(H.head, /obj/item/clothing/head/helmet/space/cult))
+ if(!istype(H.head, /obj/item/clothing/head/magus) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/cult))
H << "I don't feel strong enough without my helmet."
return 0
else
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index 238c78f6d74..d5666f99223 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -36,7 +36,7 @@
action_icon_state = "lesserconstruct"
action_background_icon_state = "bg_cult"
- summon_type = list(/turf/closed/wall/cult)
+ summon_type = list(/turf/closed/wall/cult/artificer) //we don't want artificer-based runed metal farms
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
name = "Greater Construction"
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index c7a170e356a..af104113c34 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -261,6 +261,9 @@
var/say_mod = null
attack_verb = list("licked", "slobbered", "slapped", "frenched", "tongued")
+/obj/item/organ/tongue/get_spans()
+ return list()
+
/obj/item/organ/tongue/proc/TongueSpeech(var/message)
return message
@@ -358,6 +361,43 @@
playsound(owner, "hiss", 25, 1, 1)
return message
+/obj/item/organ/tongue/bone
+ name = "bone \"tongue\""
+ desc = "Apparently skeletons alter the sounds they produce \
+ through oscillation of their teeth, hence their characteristic \
+ rattling."
+ icon_state = "tonguebone"
+ say_mod = "rattles"
+ attack_verb = list("bitten", "chattered", "chomped", "enamelled", "boned")
+
+ var/chatter = FALSE
+ var/phomeme_type = "sans"
+ var/list/phomeme_types = list("sans", "papyrus")
+
+/obj/item/organ/tongue/bone/New()
+ . = ..()
+ phomeme_type = pick(phomeme_types)
+
+/obj/item/organ/tongue/bone/TongueSpeech(var/message)
+ . = message
+
+ if(chatter)
+ //Annoy everyone nearby with your chattering.
+ return
+
+/obj/item/organ/tongue/bone/get_spans()
+ . = ..()
+ // Feature, if the tongue talks directly, it will speak with its span
+ switch(phomeme_type)
+ if("sans")
+ . |= SPAN_SANS
+ if("papyrus")
+ . |= SPAN_PAPYRUS
+
+/obj/item/organ/tongue/bone/chatter
+ name = "chattering bone \"tongue\""
+ chatter = TRUE
+
/obj/item/organ/appendix
name = "appendix"
icon_state = "appendix"
@@ -419,4 +459,4 @@
health++
if(health <= 0)
visible_message("[src] collapses in on itself!")
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/html/changelog.html b/html/changelog.html
index 5ad38330cd5..0927b728d82 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,26 @@
-->
+
09 May 2016
+
Joan updated:
+
+ - Sporing Pods produces spores when expanding slightly more often.
+ - Replicating Foam now only expands when hit with burn damage, from all damage, but does so at a higher chance. Free expansion from it is, however, more rare.
+ - Penetrating Spines does slightly more brute damage, and Poisonous Strands does its damage 50% faster.
+
+
KorPhaeron updated:
+
+ - The AI no longer has a tracking delay because artificial lag is the most miserable thing in the world.
+
+
Razharas updated:
+
+ - crafting can now be done everywhere, little button near the intents with hammer on it(its not T) opens the crafting menu, if you are in a locker or mech only things in your hands will be considered for crafting
+
+
coiax updated:
+
+ - Skeletons now have bone "tongues"
+
+
08 May 2016
CoreOverload updated:
@@ -603,27 +623,6 @@
- The Detective is now bringing his personalized flask to work, due to the grim work he has to do.
- The Booze-O-Mat now stocks 3 flasks.
-
-
11 April 2016
-
Joan updated:
-
- - Blob cores will take slight brute damage from explosions.
-
-
RandomMarine updated:
-
- - Additional luxuries have been added to golem ships. Including new rewards. Praise be to The Liberator!
- - However, jaunters are no longer easily obtained by free golems.
-
-
RemieRichards updated:
-
- - The Station Blueprints now display the piping/wiring and some of the machinery the station started with, to assist in repairs
-
-
coiax updated:
-
- - Emagging the cargo console also unlocks regular contraband, in addition to syndicate gear
- - A working drone shell dispenser is now on display in MetaStation's museum, displaying the virtue of the tireless little workers!
- - Dreamstation now has a drone shell dispenser in the Toxins Launch Room
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 03e7e973731..1ce8f776f27 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -4969,3 +4969,19 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: When a demon gains enough souls, It's form will mutate to a more demonic
looking form. The Arch-demon form is known to be on par with an ascended shadowling
in power.
+2016-05-09:
+ Joan:
+ - tweak: Sporing Pods produces spores when expanding slightly more often.
+ - tweak: Replicating Foam now only expands when hit with burn damage, from all damage,
+ but does so at a higher chance. Free expansion from it is, however, more rare.
+ - tweak: Penetrating Spines does slightly more brute damage, and Poisonous Strands
+ does its damage 50% faster.
+ KorPhaeron:
+ - rscadd: The AI no longer has a tracking delay because artificial lag is the most
+ miserable thing in the world.
+ Razharas:
+ - tweak: crafting can now be done everywhere, little button near the intents with
+ hammer on it(its not T) opens the crafting menu, if you are in a locker or mech
+ only things in your hands will be considered for crafting
+ coiax:
+ - tweak: Skeletons now have bone "tongues"
diff --git a/html/changelogs/AutoChangeLog-pr-17406.yml b/html/changelogs/AutoChangeLog-pr-17406.yml
deleted file mode 100644
index 217cf8bbf99..00000000000
--- a/html/changelogs/AutoChangeLog-pr-17406.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: KorPhaeron
-delete-after: True
-changes:
- - rscadd: "The AI no longer has a tracking delay because artificial lag is the most miserable thing in the world."
diff --git a/html/changelogs/AutoChangeLog-pr-17464.yml b/html/changelogs/AutoChangeLog-pr-17464.yml
deleted file mode 100644
index cbd068535c0..00000000000
--- a/html/changelogs/AutoChangeLog-pr-17464.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Joan
-delete-after: True
-changes:
- - tweak: "Sporing Pods produces spores when expanding slightly more often."
- - tweak: "Replicating Foam now only expands when hit with burn damage, from all damage, but does so at a higher chance. Free expansion from it is, however, more rare."
- - tweak: "Penetrating Spines does slightly more brute damage, and Poisonous Strands does its damage 50% faster."
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 94f1d9d735c..d48ca7ff01f 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 29b33d19e34..7cee79b55d4 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index f05e516a86e..f2fcba5bdf0 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 6d044b9f3a6..83fd34c03a9 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi
index 25a9c6a0ba7..64fd70f2d23 100644
Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ
diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi
index dcc14d4c02a..d6f99ea8574 100644
Binary files a/icons/mob/screen_operative.dmi and b/icons/mob/screen_operative.dmi differ
diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi
index ec39083d844..a3334dc8b51 100644
Binary files a/icons/mob/screen_plasmafire.dmi and b/icons/mob/screen_plasmafire.dmi differ
diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi
index e3622f43c8b..088b44f2396 100644
Binary files a/icons/mob/screen_retro.dmi and b/icons/mob/screen_retro.dmi differ
diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi
index 7df6854513d..69787bb2299 100644
Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index fcb1d97a784..51b53ab2149 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/cult.dmi b/icons/obj/cult.dmi
index 95712fe106c..4b28d871c3e 100644
Binary files a/icons/obj/cult.dmi and b/icons/obj/cult.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 644b4a66584..8286c6adc0d 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 916d550ce23..318eb947598 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/strings/cas_black.txt b/strings/cas_black.txt
index a3274c5be44..ba078abea46 100644
--- a/strings/cas_black.txt
+++ b/strings/cas_black.txt
@@ -8,6 +8,7 @@ Cargo: There's a galaxy-wide shortage of _______.
I don't care what they called me back on the station, I'm not a traitor. I'm a man of _________.
The Syndicate is offering crew members _________ to defect.
Cargo ordered a crate full of _____.
+What is the gray tide protesting this time?
If the Space Gods didn't want _________ they wouldn't have given us __________.
Why was the death squad sent in?
Current Active Laws: ________ is the only human.
@@ -33,6 +34,7 @@ What brought the space orgy to a grinding halt?
Scientists are no longer allowed to make _____.
What was the clown's best joke?
The HoP is now hiring assistants for __________.
+What happens when you emag an emag?
Our gang doesn't wear uniforms. Our gang wears ___________.
No matter how many lizards you have, _____ is never acceptable.
No, the AI's second law is NOT to serve _____.
@@ -40,10 +42,11 @@ First CentComm came for the ________. Now they're coming for the __________.
The borgs are not slaves for your _____.
You can never have too many _____ on the station.
Why can't I find a space relationship?
+The assistants gathered around the brig, with toolboxes and ___________.
Confirmed outbreak of _____ aboard the station.
The AI Was horrified to discover security was executing prisoners via ________.
Attention crew: the word _____ is now a punishable offense.
-The chemist laughed as he labeled ________ pills as __________.
+The chemist cackled as he labeled ________ pills as __________.
The Space Wizard Federation has regrettably begun to summon _____.
Who's the real seat of power on the station?
__________ was called into the Captain's office because of ______.
@@ -84,10 +87,13 @@ SECURITY! Cargo's ordering 20 crates of ________!
On the nearly empty station, all that could be heard were the sounds of __________.
I cannot comply with that order, meatbag. My _____ module is malfunctioning.
_______ was thrown out the airlock after ___________.
+Real men accomplish their objectives by _________.
How did I pass the time during a slow shift?
Why did the lizard cross the road?
+Space lag is primarily caused by ___________.
Back in my day, we had to clone people with ________.
What's the worst thing a wizard can summon?
+What is the rarest substance known to Nanotrasen?
The chaplain stopped performing marriages after seeing ___________.
The gods were too busy with _______ to respond to _______.
The Roboticist was fired after naming the borgs ______ and _________.
diff --git a/strings/cas_white.txt b/strings/cas_white.txt
index 4e5e920a959..506f6f6c652 100644
--- a/strings/cas_white.txt
+++ b/strings/cas_white.txt
@@ -3,12 +3,12 @@ Having sex in the maintenance tunnels.
Space 'Nam.
Space lesbians.
Space Hitler.
+Space Asshole.
Ragin' mages.
Very ragin' bullshit mages.
Tunnel clowns.
Corgi puppies!
A loose cannon detective.
-A catsplosion.
Mime porn.
That fukken disk.
G-g-g-ghosts!
@@ -17,12 +17,14 @@ Woody-chan.
Meaty ores.
Yet another explosion in Toxins.
The Captain thinking they're a badass.
+Ahhhhhhperatives.
Mech bumper cars.
Purrbation.
Baymed.
Being in a cult.
Racially biased lawsets.
Abusing Law 2 to get laid.
+Harm, a small rural town in Germany.
Xeno fetishists.
Running naked through a plasma fire.
Gibtonite.
@@ -34,21 +36,24 @@ Her smuggler's satchel.
Ian and Lisa fucking like rabbits.
A Chief Engineer who can't set up the engine.
Being sucked out into space.
+A whole bunch of spiders in a SWAT suit.
Getting robusted with a toolbox.
Officer Beepsky.
Lying to the AI about human harm.
The grey tide.
ASS BLAST USA.
-Fucking plasmamen.
+The mechanics of plasmaman sex.
Lavaland.
Chainsaws for hands.
Photocopies of the entire crew's asses.
Venus human traps.
Clown's Tears.
Walking mushroom cockfights.
+Improper comdom use.
Greentext.
Coating the whole station in blood.
Defusing a syndicate bomb with another bomb.
+Going braindead mid-murder.
A petsplosion.
Meat spikes.
Collecting the crew's brains.
@@ -63,6 +68,7 @@ Catgirls.
An escape pod cuddle puddle.
Code Delta.
Supermatter undergarments.
+A permaban.
Stealing all the miners' ore.
Bluespace artillery.
Poly reading porn over the radio again.
@@ -74,6 +80,7 @@ Five hundred ice spiders.
Cablecuffs.
Hulk, TK and X-Ray.
Paranoia.
+Putting the boots to him, medium style.
ERP-seeking meteors.
Paperwork HoPs.
A sexy clown.
@@ -102,6 +109,7 @@ Gyrating slimes.
A motherfucking sorcerer.
Ash storms.
Telescience.
+Nuke ops buying nothing but soap.
Anatomically correct borgs.
The dixel.
Friendly neighborhood death squads.
@@ -130,7 +138,7 @@ Forgetting you're a traitor.
Itching powder.
Some overpowered bullshit.
Griff.
-Ash walkers.
+Ash drakes.
A fascist captain.
FREE DRONE.
Memes.
@@ -188,8 +196,9 @@ Doctor's Delight.
Plasmaman strippers.
A Quartermaster who WON'T STOP ordering guns.
Space lag.
+Polishing the captain's laser rifle.
That one asshole double agent.
-The Beepsky Rant.
+A surprise visit from Nanotrasen's CEO.
The bleeding, dismembered, beautiful corpse of the clown.
A glass of ...what?
Teaching a silicon the Birds and the Bees.
@@ -217,15 +226,19 @@ Enough morphine to put the entire station down.
A defective comdom.
Cleanbot.
A beaker of dried space carp penis.
+An Ian storm.
voxtest2.
Nuking it from orbit.
+My senpAI.
Harmbatonning.
A Nanotrasen D-Notice.
TALKING MIMES.
The lusty xenomorph maid,
Using assistants as human shields.
Sentient securitrons.
+Piloting the station into the nearest sun.
Decorative C4.
+Lizard rights.
A universal recorder endlessly reciting porn.
The suicide HoPline.
Cultism.
@@ -233,6 +246,7 @@ A corgi orgy.
Medbay stutterwhores.
The scrubbers uncontrollably spewing cum.
The lawyer's job.
+Emoting slowly drawing a gun, then slowly cocking the trigger, then slowly preparing to shoot...
NAR-SIE HAS RISEN.
Pierrot's Throat.
A clown bomb.
@@ -243,6 +257,7 @@ The best cookie.
The wizard with his staff inserted into his anus.
The chef masturbating with a bowl of lukewarm spaghetti.
Writing out Woody's Got Wood in crayon.
+Dismemberment.
Begging the gods for free stuff.
Whining to the gods after getting robusted.
Committing sudoku.
diff --git a/tgstation.dme b/tgstation.dme
index 92203edee82..c33fc2d2edd 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1011,9 +1011,9 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
+#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
#include "code\modules\crafting\recipes.dm"
-#include "code\modules\crafting\table.dm"
#include "code\modules\detectivework\detective_work.dm"
#include "code\modules\detectivework\evidence.dm"
#include "code\modules\detectivework\footprints_and_rag.dm"