diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index e8e75c132a..054a8e36eb 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -74,6 +74,7 @@ #define ADMIN_PUNISHMENT_MAZING "Puzzle" #define ADMIN_PUNISHMENT_PIE "Cream Pie" #define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie" +#define ADMIN_PUNISHMENT_PICKLE "Pickle-ify" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 889e1bb1c0..101330cc8b 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -76,6 +76,13 @@ #define VV_HK_ADDCOMPONENT "addcomponent" #define VV_HK_MODIFY_TRAITS "modtraits" +// /datum/gas_mixture +#define VV_HK_SET_MOLES "set_moles" +#define VV_HK_EMPTY "empty" +#define VV_HK_SET_TEMPERATURE "set_temp" +#define VV_HK_PARSE_GASSTRING "parse_gasstring" +#define VV_HK_SET_VOLUME "set_volume" + // /atom #define VV_HK_MODIFY_TRANSFORM "atom_transform" #define VV_HK_ADD_REAGENT "addreagent" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 93c1b9386b..9b36fd7a2a 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1269,7 +1269,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return - var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_CUSTOM_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD) + var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_CUSTOM_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_PICKLE) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1334,7 +1334,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(ADMIN_PUNISHMENT_PIE) var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target)) creamy.splat(target) - if (ADMIN_PUNISHMENT_CUSTOM_PIE) + if(ADMIN_PUNISHMENT_CUSTOM_PIE) var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/A = new() if(!A.reagents) var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num|null @@ -1347,6 +1347,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(amount) A.reagents.add_reagent(chosen_id, amount) A.splat(target) + if(ADMIN_PUNISHMENT_PICKLE) + target.turn_into_pickle() punish_log(target, punishment) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 43e54dc2c7..7af823e8a9 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -16,6 +16,8 @@ GLOBAL_LIST_INIT(meta_gas_dangers, meta_gas_danger_list()) GLOBAL_LIST_INIT(meta_gas_ids, meta_gas_id_list()) GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture + /// Never ever set this variable, hooked into vv_get_var for view variables viewing. + var/gas_list_view_only var/initial_volume = CELL_VOLUME //liters var/list/reaction_results var/list/analyzer_results //used for analyzer feedback - not initialized until its used @@ -29,9 +31,75 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) reaction_results = new /datum/gas_mixture/vv_edit_var(var_name, var_value) - if(var_name == "_extools_pointer_gasmixture") + if(var_name == NAMEOF(src, _extools_pointer_gasmixture)) return FALSE // please no. segfaults bad. + if(var_name == NAMEOF(src, gas_list_view_only)) + return FALSE return ..() + +/datum/gas_mixture/vv_get_var(var_name) + . = ..() + if(var_name == NAMEOF(src, gas_list_view_only)) + var/list/dummy = get_gases() + for(var/gas in dummy) + dummy[gas] = get_moles(gas) + return debug_variable("gases (READ ONLY)", dummy, 0, src) + +/datum/gas_mixture/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_PARSE_GASSTRING, "Parse Gas String") + VV_DROPDOWN_OPTION(VV_HK_EMPTY, "Empty") + VV_DROPDOWN_OPTION(VV_HK_SET_MOLES, "Set Moles") + VV_DROPDOWN_OPTION(VV_HK_SET_TEMPERATURE, "Set Temperature") + VV_DROPDOWN_OPTION(VV_HK_SET_VOLUME, "Set Volume") + +/datum/gas_mixture/vv_do_topic(list/href_list) + . = ..() + if(!.) + return + if(href_list[VV_HK_PARSE_GASSTRING]) + var/gasstring = input(usr, "Input Gas String (WARNING: Advanced. Don't use this unless you know how these work.", "Gas String Parse") as text|null + if(!istext(gasstring)) + return + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set to gas string [gasstring].") + parse_gas_string(gasstring) + if(href_list[VV_HK_EMPTY]) + log_admin("[key_name(usr)] emptied gas mixture [REF(src)].") + message_admins("[key_name(usr)] emptied gas mixture [REF(src)].") + clear() + if(href_list[VV_HK_SET_MOLES]) + var/list/gases = get_gases() + for(var/gas in gases) + gases[gas] = get_moles(gas) + var/gastype = input(usr, "What kind of gas?", "Set Gas") as null|anything in subtypesof(/datum/gas) + if(!ispath(gastype, /datum/gas)) + return + var/amount = input(usr, "Input amount", "Set Gas", gases[gastype] || 0) as num|null + if(!isnum(amount)) + return + amount = max(0, amount) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set gas type [gastype] to [amount] moles.") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set gas type [gastype] to [amount] moles.") + set_moles(gastype, amount) + if(href_list[VV_HK_SET_TEMPERATURE]) + var/temp = input(usr, "Set the temperature of this mixture to?", "Set Temperature", return_temperature()) as num|null + if(!isnum(temp)) + return + temp = max(2.7, temp) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed temperature to [temp].") + set_temperature(temp) + if(href_list[VV_HK_SET_VOLUME]) + var/volume = input(usr, "Set the volume of this mixture to?", "Set Volume", return_volume()) as num|null + if(!isnum(volume)) + return + volume = max(0, volume) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Changed volume to [volume].") + set_volume(volume) + /* /datum/gas_mixture/Del() __gasmixture_unregister() @@ -169,7 +237,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) set_moles(path, text2num(gas[id])) archive() return 1 - + /datum/gas_mixture/react(datum/holder) . = NO_REACTION if(!total_moles()) diff --git a/code/modules/mob/living/simple_animal/pickle.dm b/code/modules/mob/living/simple_animal/pickle.dm new file mode 100644 index 0000000000..09365fa7e2 --- /dev/null +++ b/code/modules/mob/living/simple_animal/pickle.dm @@ -0,0 +1,29 @@ +//funniest shit i've ever seen + +/mob/living/simple_animal/pickle + name = "pickle" + desc = "It's a pickle. It might just be the funniest thing you have ever seen." + health = 100 + maxHealth = 100 + icon = 'icons/mob/32x64.dmi' + icon_state = "pickle" + del_on_death = TRUE + deathmessage = "The pickle implodes into its own existential dread and disappears!" + friendly_verb_continuous = "tickles" + friendly_verb_simple = "tickle" + var/mob/living/original_body + +/mob/living/simple_animal/pickle/UnarmedAttack(atom/A) + ..() //we want the tickle emote to go before the laugh + if(ismob(A)) + var/mob/laugher = A + laugher.emote("laugh") + +/mob/living/simple_animal/pickle/Destroy(force, kill_body = TRUE) + if(original_body) + if(kill_body) + original_body.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200) //to be fair, you have to have a very high iq to understand- + original_body.forceMove(get_turf(src)) + if(mind) + mind.transfer_to(original_body) + ..() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 49b8a028dd..3b91e8828a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -591,6 +591,7 @@ . = new_mob qdel(src) + /* Certain mob types have problems and should not be allowed to be controlled by players. * * This proc is here to force coders to manually place their mob in this list, hopefully tested. @@ -631,3 +632,20 @@ return 0 #undef TRANSFORMATION_DURATION +======= +/mob/living/proc/turn_into_pickle() + //if they're already a pickle, turn them back instead + if(istype(src, /mob/living/simple_animal/pickle)) + qdel(src, FALSE) //this means the body inside the pickle will be dropped without killing it + else + //make a new pickle on the tile and move their mind into it if possible + var/mob/living/simple_animal/pickle/new_pickle = new /mob/living/simple_animal/pickle(get_turf(src)) + new_pickle.original_body = src + if(mind) + mind.transfer_to(new_pickle) + //give them their old access if any + var/obj/item/card/id/mob_access_card = get_idcard() + if(mob_access_card) + new_pickle.access_card = mob_access_card + //move old body inside the pickle for safekeeping (when they die, we'll return the corpse because we're nice) + src.forceMove(new_pickle) diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 994b0f7f01..ab180cb629 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -75,4 +75,9 @@ /obj/item/ammo_casing/energy/shrink projectile_type = /obj/item/projectile/beam/shrink select_name = "shrink ray" - e_cost = 200 \ No newline at end of file + e_cost = 200 + +/obj/item/ammo_casing/energy/pickle //ammo for an adminspawn gun + projectile_type = /obj/item/projectile/energy/pickle + select_name = "pickle ray" + e_cost = 0 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index b55e26b6a3..6489920b98 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -329,3 +329,11 @@ add_overlay("emitter_carbine_empty") else add_overlay("emitter_carbine") + +//the pickle ray +/obj/item/gun/energy/pickle_gun + name = "pickle ray" + desc = "funniest shit i've ever seen" + icon_state = "decloner" + no_pin_required = TRUE + ammo_type = list(/obj/item/ammo_casing/energy/pickle) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm index d5346b954d..bfa15e9ef8 100644 --- a/code/modules/projectiles/projectile/energy/misc.dm +++ b/code/modules/projectiles/projectile/energy/misc.dm @@ -13,3 +13,13 @@ damage_type = TOX knockdown = 100 range = 7 + +/obj/item/projectile/energy/pickle //projectile for adminspawn only gun + name = "pickle-izing beam" + icon_state = "declone" + +/obj/item/projectile/energy/pickle/on_hit(atom/target) + //we don't care if they blocked it, they're turning into a pickle + if(isliving(target)) + var/mob/living/living_target = target + living_target.turn_into_pickle() //yes this is a real proc diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 7ef52aef25..c9ca4e9ba3 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -207,7 +207,8 @@ /mob/living/simple_animal/pet/fox, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/pet/cat/cak, - /mob/living/simple_animal/chick) + /mob/living/simple_animal/chick, + /mob/living/simple_animal/pickle) new_mob = new path(M.loc) if("humanoid") diff --git a/html/changelogs/AutoChangeLog-pr-12791.yml b/html/changelogs/AutoChangeLog-pr-12791.yml new file mode 100644 index 0000000000..740e2b2c28 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12791.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "recent culinary and scientific advancements have brought forth new pickle related technologies" diff --git a/icons/mob/32x64.dmi b/icons/mob/32x64.dmi index 32b25ba739..79a4c8a7fd 100644 Binary files a/icons/mob/32x64.dmi and b/icons/mob/32x64.dmi differ diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi index b3c11be98f..b02f9d6ce4 100644 Binary files a/icons/obj/pet_carrier.dmi and b/icons/obj/pet_carrier.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 3c844bcfde..41852ce197 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2546,6 +2546,7 @@ #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\pickle.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_vr.dm"