From 33805e639b64c3cb35ebf539d087802e543f4572 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Mon, 25 Nov 2013 21:16:09 +0000 Subject: [PATCH 1/3] Implements hooks, an easier way to write code to be called at startup/roundstart/roundend. Current hooks are "startup", "roundstart", and "roundend". Most stuff in world/New() has been moved over to the startup hook. Roundstart and roundend have no hooks yet. Removed the unused "newbanjob.dm" file and associated verbs/topics. Bumped RECOMMENDED_VERSION up to 501. Signed-off-by: Mloc-Argent --- baystation12.dme | 2 +- code/ZAS/FEA_gas_mixture.dm | 14 ++++ code/__HELPERS/global_lists.dm | 4 +- code/datums/datacore.dm | 3 + code/datums/sun.dm | 4 + code/game/area/Space Station 13 areas.dm | 29 ++----- code/game/communications.dm | 4 + .../gamemodes/events/holidays/Holidays.dm | 4 + code/game/gamemodes/gameticker.dm | 3 + code/game/jobs/whitelist.dm | 14 +++- code/modules/admin/NewBan.dm | 3 + code/modules/admin/admin.dm | 8 -- code/modules/admin/admin_investigate.dm | 4 + code/modules/admin/admin_ranks.dm | 4 + code/modules/admin/admin_verbs.dm | 4 +- code/modules/admin/banjob.dm | 13 +-- code/modules/admin/topic.dm | 13 --- code/modules/ext_scripts/irc.dm | 13 ++- .../modules/mob/living/silicon/pai/recruit.dm | 4 + code/modules/power/power.dm | 5 ++ code/world.dm | 84 +++++++------------ 21 files changed, 119 insertions(+), 117 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 35a7237aa1..2f11011c1f 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -77,6 +77,7 @@ #include "code\controllers\_DynamicAreaLighting_TG.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" +#include "code\controllers\hooks.dm" #include "code\controllers\lighting_controller.dm" #include "code\controllers\master_controller.dm" #include "code\controllers\shuttle_controller.dm" @@ -650,7 +651,6 @@ #include "code\modules\admin\holder2.dm" #include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\newbanjob.dm" #include "code\modules\admin\player_notes.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\topic.dm" diff --git a/code/ZAS/FEA_gas_mixture.dm b/code/ZAS/FEA_gas_mixture.dm index 3eccad7e91..9a829633e2 100644 --- a/code/ZAS/FEA_gas_mixture.dm +++ b/code/ZAS/FEA_gas_mixture.dm @@ -14,6 +14,20 @@ What are the archived variables for? #define QUANTIZE(variable) (round(variable,0.0001)) #define TRANSFER_FRACTION 5 //What fraction (1/#) of the air difference to try and transfer +/hook/startup/proc/createGasOverlays() + plmaster = new /obj/effect/overlay() + plmaster.icon = 'icons/effects/tile_effects.dmi' + plmaster.icon_state = "plasma" + plmaster.layer = FLY_LAYER + plmaster.mouse_opacity = 0 + + slmaster = new /obj/effect/overlay() + slmaster.icon = 'icons/effects/tile_effects.dmi' + slmaster.icon_state = "sleeping_agent" + slmaster.layer = FLY_LAYER + slmaster.mouse_opacity = 0 + return 1 + /datum/gas/sleeping_agent/specific_heat = 40 //These are used for the "Trace Gases" stuff, but is buggy. /datum/gas/oxygen_agent_b/specific_heat = 300 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ce8d788f25..07a22f5693 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -42,7 +42,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al /////Initial Building///// ////////////////////////// -/proc/make_datum_references_lists() +/hook/startup/proc/makeDatumRefLists() var/list/paths //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name @@ -97,6 +97,8 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al if(S.flags & WHITELISTED) whitelisted_species += S.name + return 1 + /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 1a7d97e99c..2be4c6e82a 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,3 +1,6 @@ +/hook/startup/proc/createDatacore() + data_core = new /obj/effect/datacore() + return 1 /obj/effect/datacore/proc/manifest(var/nosleep = 0) spawn() diff --git a/code/datums/sun.dm b/code/datums/sun.dm index 9ce8a73cb7..82acfa0cff 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -14,6 +14,10 @@ if(prob(50)) rate = -rate +/hook/startup/proc/createSun() + sun = new /datum/sun() + return 1 + // calculate the sun's position given the time of day /datum/sun/proc/calc_position() diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 9ba221c64d..9ff5a6e0cd 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -56,7 +56,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/ var/list/teleportlocs = list() -proc/process_teleport_locs() +/hook/startup/proc/setupTeleportLocs() for(var/area/AR in world) if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue if(teleportlocs.Find(AR.name)) continue @@ -65,20 +65,13 @@ proc/process_teleport_locs() teleportlocs += AR.name teleportlocs[AR.name] = AR - var/not_in_order = 0 - do - not_in_order = 0 - if(teleportlocs.len <= 1) - break - for(var/i = 1, i <= (teleportlocs.len - 1), i++) - if(sorttext(teleportlocs[i], teleportlocs[i+1]) == -1) - teleportlocs.Swap(i, i+1) - not_in_order = 1 - while(not_in_order) + teleportlocs = sortAssoc(teleportlocs) + + return 1 var/list/ghostteleportlocs = list() -proc/process_ghost_teleport_locs() +/hook/startup/proc/setupGhostTeleportLocs() for(var/area/AR in world) if(ghostteleportlocs.Find(AR.name)) continue if(istype(AR, /area/turret_protected/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome)) @@ -89,17 +82,9 @@ proc/process_ghost_teleport_locs() ghostteleportlocs += AR.name ghostteleportlocs[AR.name] = AR - var/not_in_order = 0 - do - not_in_order = 0 - if(ghostteleportlocs.len <= 1) - break - for(var/i = 1, i <= (ghostteleportlocs.len - 1), i++) - if(sorttext(ghostteleportlocs[i], ghostteleportlocs[i+1]) == -1) - ghostteleportlocs.Swap(i, i+1) - not_in_order = 1 - while(not_in_order) + ghostteleportlocs = sortAssoc(ghostteleportlocs) + return 1 /*-----------------------------------------------------------------------------*/ diff --git a/code/game/communications.dm b/code/game/communications.dm index 32d8ca6934..3bc3ee7009 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -140,6 +140,10 @@ var/const/RADIO_MAGNETS = "9" var/global/datum/controller/radio/radio_controller +/hook/startup/proc/createRadioController() + radio_controller = new /datum/controller/radio() + return 1 + datum/controller/radio var/list/datum/radio_frequency/frequencies = list() diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index d2481eae44..2cd06199bd 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -12,6 +12,10 @@ var/global/Holiday = null ////////////////////////////////////////////////////////////////////////////////////////////////////////// // ~Carn +/hook/startup/proc/updateHoliday() + Get_Holiday() + return 1 + //sets up the Holiday global variable. Shouldbe called on game configuration or something. /proc/Get_Holiday() if(!Holiday) return // Holiday stuff was not enabled in the config! diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index a03068371f..73d61637f8 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -131,6 +131,7 @@ var/global/datum/controller/gameticker/ticker data_core.manifest() current_state = GAME_STATE_PLAYING + callHook("roundstart") //here to initialize the random events nicely at round start setup_economy() @@ -323,6 +324,8 @@ var/global/datum/controller/gameticker/ticker declare_completion() spawn(50) + callHook("roundend") + if (mode.station_was_nuked) feedback_set_details("end_proper","nuke") if(!delay_end) diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index f28de56dc4..98efaf9273 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -2,6 +2,11 @@ var/list/whitelist = list() +/hook/startup/proc/loadWhitelist() + if(config.usewhitelist) + load_whitelist() + return 1 + /proc/load_whitelist() whitelist = file2list(WHITELISTFILE) if(!whitelist.len) whitelist = null @@ -11,9 +16,14 @@ var/list/whitelist = list() return 0 return ("[M.ckey]" in whitelist) -var/list/alien_whitelist = list() +/var/list/alien_whitelist = list() -proc/load_alienwhitelist() +/hook/startup/proc/loadAlienWhitelist() + if(config.usealienwhitelist) + load_alienwhitelist() + return 1 + +/proc/load_alienwhitelist() var/text = file2text("config/alienwhitelist.txt") if (!text) diary << "Failed to load config/alienwhitelist.txt\n" diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 83447d1a23..035b2d2309 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -58,6 +58,9 @@ var/savefile/Banlist CMinutes = (world.realtime / 10) / 60 return 1 +/hook/startup/proc/loadBans() + return LoadBans() + /proc/LoadBans() Banlist = new("data/banlist.bdb") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e2bf6f7be2..c6dcc662a6 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1014,14 +1014,6 @@ var/global/floorIsLava = 0 message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/unjobban_panel() - set name = "Unjobban Panel" - set category = "Admin" - if (src.holder) - src.holder.unjobbanpanel() - feedback_add_details("admin_verb","UJBP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - /datum/admins/proc/output_ai_laws() var/ai_number = 0 for(var/mob/living/silicon/S in mob_list) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index e601f069c6..a062788438 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -11,6 +11,10 @@ /proc/investigate_subject2file(var/subject) return file("[INVESTIGATE_DIR][subject].html") +/hook/startup/proc/resetInvestigate() + investigate_reset() + return 1 + /proc/investigate_reset() if(fdel(INVESTIGATE_DIR)) return 1 return 0 diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 115fafba82..86624e0bd2 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -53,6 +53,10 @@ var/list/admin_ranks = list() //list of all ranks with associated rights #endif +/hook/startup/proc/loadAdmins() + load_admins() + return 1 + /proc/load_admins() //clear the datums references admin_datums.Cut() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 606a6e82ff..8a74a48317 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -74,9 +74,7 @@ var/list/admin_verbs_admin = list( ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, - /client/proc/jobbans, - /client/proc/unjobban_panel, - // /client/proc/DB_ban_panel + /client/proc/jobbans ) var/list/admin_verbs_sounds = list( /client/proc/play_local_sound, diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index b6d1ea53b6..42326711d3 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -50,6 +50,10 @@ DEBUG jobban_loadbanfile() */ +/hook/startup/proc/loadJobBans() + jobban_loadbanfile() + return 1 + /proc/jobban_loadbanfile() if(config.ban_legacy_system) var/savefile/S=new("data/job_full.ban") @@ -101,15 +105,6 @@ DEBUG text2file(formatted_log,"data/ban_unban_log.txt") -/proc/jobban_updatelegacybans() - if(!jobban_runonce) - log_admin("Updating jobbanfile!") - // Updates bans.. Or fixes them. Either way. - for(var/T in jobban_keylist) - if(!T) continue - jobban_runonce++ //don't run this update again - - /proc/jobban_remove(X) for (var/i = 1; i <= length(jobban_keylist); i++) if( findtext(jobban_keylist[i], "[X]") ) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f1c911488a..671908259c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -874,19 +874,6 @@ if("Cancel") return - else if(href_list["unjobbanf"]) - if(!check_rights(R_BAN)) return - - var/banfolder = href_list["unjobbanf"] - Banlist.cd = "/base/[banfolder]" - var/key = Banlist["key"] - if(alert(usr, "Are you sure you want to unban [key]?", "Confirmation", "Yes", "No") == "Yes") - if (RemoveBanjob(banfolder)) - unjobbanpanel() - else - alert(usr,"This ban has already been lifted / does not exist.","Error","Ok") - unjobbanpanel() - else if(href_list["mute"]) if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm index f4e94f3ffc..3976904efb 100644 --- a/code/modules/ext_scripts/irc.dm +++ b/code/modules/ext_scripts/irc.dm @@ -4,11 +4,16 @@ return /proc/send2mainirc(var/msg) - if(config.use_irc_bot && config.main_irc && config.irc_bot_host) - ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [config.main_irc] [msg]") + if(config.main_irc) + send2irc(config.main_irc, msg) return /proc/send2adminirc(var/msg) - if(config.use_irc_bot && config.admin_irc && config.irc_bot_host) - ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [config.admin_irc] [msg]") + if(config.admin_irc) + send2irc(config.admin_irc, msg) return + + +/hook/startup/proc/ircNotify() + send2mainirc("Server starting up on [config.server? "byond://[config.server]" : "byond://[world.address]:[world.port]"]") + return 1 diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 93271aadaf..87d6a169b6 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -13,6 +13,10 @@ var/datum/paiController/paiController // Global handler for pAI candidates var/ready = 0 +/hook/startup/proc/paiControllerSetup() + paiController = new /datum/paiController() + return 1 + /datum/paiController var/list/pai_candidates = list() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index b94901a637..986f81d6c8 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -79,6 +79,9 @@ // rebuild all power networks from scratch +/hook/startup/proc/buildPowernets() + return makepowernets() + /proc/makepowernets() for(var/datum/powernet/PN in powernets) del(PN) @@ -101,6 +104,8 @@ if(!M.powernet) continue // APCs have powernet=0 so they don't count as network nodes directly M.powernet.nodes[M] = M + return 1 + // returns a list of all power-related objects (nodes, cable, junctions) in turf, // excluding source, that match the direction d diff --git a/code/world.dm b/code/world.dm index abc4997699..9545324343 100644 --- a/code/world.dm +++ b/code/world.dm @@ -7,7 +7,7 @@ -#define RECOMMENDED_VERSION 495 +#define RECOMMENDED_VERSION 501 /world/New() //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") @@ -22,59 +22,13 @@ if(byond_version < RECOMMENDED_VERSION) world.log << "Your server's byond version does not meet the recommended requirements for this server. Please update BYOND" - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - load_configuration() - load_mode() - load_motd() - load_admins() - load_mods() - LoadBansjob() - if(config.usewhitelist) - load_whitelist() - if(config.usealienwhitelist) - load_alienwhitelist() - jobban_loadbanfile() - jobban_updatelegacybans() - LoadBans() if(config && config.server_name != null && config.server_suffix && world.port > 0) // dumb and hardcoded but I don't care~ config.server_name += " #[(world.port % 1000) / 100]" - investigate_reset() - Get_Holiday() //~Carn, needs to be here when the station is named so :P - - src.update_status() - - makepowernets() - - sun = new /datum/sun() - radio_controller = new /datum/controller/radio() - data_core = new /obj/effect/datacore() - paiController = new /datum/paiController() - - if(!setup_database_connection()) - world.log << "Your server failed to establish a connection with the feedback database." - else - world.log << "Feedback database connection established." - - if(!setup_old_database_connection()) - world.log << "Your server failed to establish a connection with the SQL database." - else - world.log << "SQL database connection established." - - plmaster = new /obj/effect/overlay() - plmaster.icon = 'icons/effects/tile_effects.dmi' - plmaster.icon_state = "plasma" - plmaster.layer = FLY_LAYER - plmaster.mouse_opacity = 0 - - slmaster = new /obj/effect/overlay() - slmaster.icon = 'icons/effects/tile_effects.dmi' - slmaster.icon_state = "sleeping_agent" - slmaster.layer = FLY_LAYER - slmaster.mouse_opacity = 0 + callHook("startup") src.update_status() @@ -82,15 +36,10 @@ sleep_offline = 1 - send2mainirc("Server starting up on [config.server? "byond://[config.server]" : "byond://[world.address]:[world.port]"]") - master_controller = new /datum/controller/game_controller() spawn(1) master_controller.setup() - process_teleport_locs() //Sets up the wizard teleport locations - process_ghost_teleport_locs() //Sets up ghost teleport locations. - spawn(3000) //so we aren't adding to the round-start lag if(config.ToRban) ToRban_autoupdate() @@ -184,6 +133,10 @@ #undef INACTIVITY_KICK +/hook/startup/proc/loadMode() + world.load_mode() + return 1 + /world/proc/load_mode() var/list/Lines = file2list("data/mode.txt") if(Lines.len) @@ -196,9 +149,15 @@ fdel(F) F << the_mode + +/hook/startup/proc/loadMOTD() + world.load_motd() + return 1 + /world/proc/load_motd() join_motd = file2text("config/motd.txt") + /world/proc/load_configuration() config = new /datum/configuration() config.load("config/config.txt") @@ -208,6 +167,11 @@ // apply some settings from config.. abandon_allowed = config.respawn + +/hook/startup/proc/loadMods() + world.load_mods() + return 1 + /world/proc/load_mods() if(config.admin_legacy_system) var/text = file2text("config/moderators.txt") @@ -290,6 +254,13 @@ var/failed_db_connections = 0 var/failed_old_db_connections = 0 +/hook/startup/proc/connectDB() + if(!setup_database_connection()) + world.log << "Your server failed to establish a connection with the feedback database." + else + world.log << "Feedback database connection established." + return 1 + proc/setup_database_connection() if(failed_db_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to conenct anymore. @@ -325,7 +296,12 @@ proc/establish_db_connection() return 1 - +/hook/startup/proc/connectOldDB() + if(!setup_old_database_connection()) + world.log << "Your server failed to establish a connection with the SQL database." + else + world.log << "SQL database connection established." + return 1 //These two procs are for the old database, while it's being phased out. See the tgstation.sql file in the SQL folder for more information. proc/setup_old_database_connection() From 5e34c0e0564129865a196faf64701483959931ae Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Mon, 25 Nov 2013 21:19:58 +0000 Subject: [PATCH 2/3] Hmm hmm, it could help to actually commit the hooks.dm file, couldn't it? Signed-off-by: Mloc-Argent --- code/controllers/hooks.dm | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 code/controllers/hooks.dm diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm new file mode 100644 index 0000000000..5045da7592 --- /dev/null +++ b/code/controllers/hooks.dm @@ -0,0 +1,39 @@ +/** + * @file hooks.dm + * Implements hooks, a simple way to run code on pre-defined events. + */ + +/** @page hooks Code hooks + * @section hooks Hooks + * A hook is defined under /hook in the type tree. + * + * To add some code to be called by the hook, define a proc under the type, as so: + * @code + /hook/foo/proc/bar() + if(1) + return 1 //Sucessful + else + return 0 //Error, or runtime. + * @endcode + * All hooks must return nonzero on success, as runtimes will force return null. + */ + +/** + * Calls a hook, executing every piece of code that's attached to it. + * @param hook Identifier of the hook to call. + * @returns 1 if all hooked code runs successfully, 0 otherwise. + */ +/proc/callHook(hook) + var/hook_path = text2path("/hook/[hook]") + if(!hook_path) + error("Invalid hook '/hook/[hook]' called.") + return 0 + + var/caller = new hook_path + var/status = 1 + for(var/P in typesof("[hook_path]/proc")) + if(!call(caller, P)()) + error("Hook '[P]' failed or runtimed.") + status = 0 + + return status From 6afa23a62e4c70a8e35fb011733be1b7715dbaad Mon Sep 17 00:00:00 2001 From: Jeremy Liberman Date: Thu, 28 Nov 2013 03:42:11 -0600 Subject: [PATCH 3/3] Adds tofurkey and stuffing food items --- code/modules/food/recipes_microwave.dm | 17 ++++++++++++++++- .../reagent_containers/food/snacks.dm | 18 ++++++++++++++++++ icons/obj/food.dmi | Bin 87357 -> 89145 bytes 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index ec4ccf50f5..a297cb6183 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -1142,4 +1142,19 @@ I said no! /datum/recipe/cracker reagents = list("flour" = 5, "sodiumchloride" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/cracker \ No newline at end of file + result = /obj/item/weapon/reagent_containers/food/snacks/cracker + +/datum/recipe/stuffing + reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/stuffing + +/datum/recipe/tofurkey + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/stuffing, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/tofurkey diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 771d49a2da..5d22bdf8a0 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -542,6 +542,24 @@ reagents.add_reagent("nutriment", 3) src.bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/tofurkey + name = "Tofurkey" + desc = "A fake turkey made from tofu." + icon_state = "tofurkey" + New() + ..() + reagents.add_reagent("nutriment", 12) + reagents.add_reagent("stoxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/stuffing + name = "Stuffing" + desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!" + icon_state = "stuffing" + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/carpmeat name = "carp fillet" diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 9c31373db126b801d15789e4852f3b8edcdaecab..96f50c2df305d580d744a8098e74a257006251d3 100644 GIT binary patch delta 17203 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 YAo^3f;THDr4TKV91$FrvS@VzoAE=L18UO$Q