diff --git a/aurorastation.dme b/aurorastation.dme index 118cd471f56..a407ac3bfbb 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1347,6 +1347,7 @@ #include "code\modules\client\preference_setup\loadout\loadout.dm" #include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" #include "code\modules\client\preference_setup\loadout\loadout_augments.dm" +#include "code\modules\client\preference_setup\loadout\loadout_belt.dm" #include "code\modules\client\preference_setup\loadout\loadout_computer.dm" #include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" #include "code\modules\client\preference_setup\loadout\loadout_ears.dm" @@ -2441,6 +2442,7 @@ #include "code\modules\projectiles\guns\energy\crank.dm" #include "code\modules\projectiles\guns\energy\cult.dm" #include "code\modules\projectiles\guns\energy\disrupter.dm" +#include "code\modules\projectiles\guns\energy\freezeray.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\lawgiver.dm" #include "code\modules\projectiles\guns\energy\magic.dm" @@ -2569,6 +2571,7 @@ #include "code\modules\reagents\reagent_containers\tooth_paste.dm" #include "code\modules\reagents\reagent_containers\food\cans.dm" #include "code\modules\reagents\reagent_containers\food\condiment.dm" +#include "code\modules\reagents\reagent_containers\food\custom_rolls.dm" #include "code\modules\reagents\reagent_containers\food\drinks.dm" #include "code\modules\reagents\reagent_containers\food\lunch.dm" #include "code\modules\reagents\reagent_containers\food\sandwich.dm" diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index aaef3ed1617..35c45a0c1e9 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -101,6 +101,7 @@ #define slot_r_hand_str "slot_r_hand" #define slot_w_uniform_str "slot_w_uniform" #define slot_head_str "slot_head" +#define slot_belt_str "slot_belt" #define slot_wear_suit_str "slot_suit" #define slot_l_ear_str "slot_l_ear" #define slot_r_ear_str "slot_r_ear" diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 0e35d176b31..f609c842c85 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -213,6 +213,7 @@ #define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi' #define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi' #define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi' +#define INV_BELT_DEF_ICON 'icons/mob/belt.dmi' #define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi' #define INV_L_EAR_DEF_ICON 'icons/mob/l_ear.dmi' #define INV_R_EAR_DEF_ICON 'icons/mob/r_ear.dmi' diff --git a/code/datums/trading/weaponry.dm b/code/datums/trading/weaponry.dm index 985a2c94116..78be7cbade3 100644 --- a/code/datums/trading/weaponry.dm +++ b/code/datums/trading/weaponry.dm @@ -74,6 +74,7 @@ /obj/item/gun/energy/pistol = TRADER_THIS_TYPE, /obj/item/gun/energy/gun/nuclear = TRADER_THIS_TYPE, /obj/item/gun/energy/laser/shotgun = TRADER_THIS_TYPE, + /obj/item/gun/energy/freeze = TRADER_THIS_TYPE, /obj/item/clothing/accessory/holster = TRADER_ALL, /obj/item/clothing/accessory/holster/thigh/fluff = TRADER_BLACKLIST_ALL ) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 40fdcac0842..0a60fea5778 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -12,24 +12,49 @@ attack_verb = list("whipped", "lashed", "disciplined") drop_sound = 'sound/items/drop/toolbelt.ogg' pickup_sound = 'sound/items/pickup/toolbelt.ogg' + var/flipped = FALSE + var/show_above_suit = FALSE - var/show_above_suit = 0 +/obj/item/storage/belt/proc/update_clothing_icon() + if(ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_belt() /obj/item/storage/belt/verb/toggle_layer() set name = "Switch Belt Layer" set category = "Object" if(show_above_suit == -1) - to_chat(usr, "\The [src] cannot be worn above your suit!") + to_chat(usr, SPAN_NOTICE("\The [src] cannot be worn above your suit!")) return show_above_suit = !show_above_suit - update_icon() + update_clothing_icon() -/obj/item/storage/update_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_belt() +/obj/item/storage/belt/Initialize() + ..() + update_flip_verb() +/obj/item/storage/belt/proc/update_flip_verb() + if(("[initial(icon_state)]_flip") in icon_states(icon)) // Check for whether it has a flipped icon. Prevents invisible sprites. + verbs += /obj/item/storage/belt/proc/flipbelt + +/obj/item/storage/belt/proc/flipbelt(mob/user, var/self = TRUE) + set category = "Object" + set name = "Flip Belt" + set src in usr + + if(self) + if(use_check_and_message(user)) + return + else + if(use_check_and_message(user, self ? USE_ALLOW_NON_ADJACENT : 0)) + return + + flipped = !flipped + icon_state = "[initial(icon_state)][flipped ? "_flip" : ""]" + item_state = icon_state + to_chat(usr, SPAN_NOTICE("You change \the [src] to be [src.flipped ? "behind" : "in front of"] you.")) + update_clothing_icon() /obj/item/storage/belt/utility name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing. @@ -194,7 +219,7 @@ item_state = "champion" storage_slots = 1 can_hold = list( - "/obj/item/clothing/mask/luchador" + /obj/item/clothing/mask/luchador ) /obj/item/storage/belt/security/tactical @@ -413,29 +438,23 @@ ) /obj/item/storage/belt/fannypack - name = "leather fannypack" + name = "fannypack" desc = "A dorky fannypack for keeping small items in." icon = 'icons/clothing/belts/fannypacks.dmi' - icon_state = "fannypack_leather" - item_state = "fannypack_leather" + icon_state = "fannypack" + item_state = "fannypack" max_w_class = ITEMSIZE_SMALL contained_sprite = TRUE storage_slots = null max_storage_space = 8 - var/flipped = FALSE -/obj/item/storage/belt/fannypack/verb/ToggleFanny() - set name = "Adjust Fannypack" - set category = "Object" - set src in usr +/obj/item/storage/belt/fannypack/recolorable + icon_state = "fannypack_colorable" + item_state = "fannypack_colorable" - if(use_check_and_message(usr)) - return 0 - - flipped = !flipped - item_state = "[initial(icon_state)][flipped ? "_flipped" : ""]" - to_chat(usr, "You flip the belt [flipped ? "behind you" : "infront of you"].") - update_icon() +/obj/item/storage/belt/fannypack/recolorable/random/Initialize() + . = ..() + color = get_random_colour(TRUE) /obj/item/storage/belt/fannypack/component name = "component pouch" @@ -443,51 +462,6 @@ starts_with = list(/obj/item/toy/snappop/syndi = 3, /obj/item/reagent_containers/glass/beaker/vial/random/toxin = 2, /obj/item/storage/pill_bottle/dice = 1) max_storage_space = 14 -/obj/item/storage/belt/fannypack/black - name = "black fannypack" - icon_state = "fannypack_black" - item_state = "fannypack_black" - -/obj/item/storage/belt/fannypack/blue - name = "blue fannypack" - icon_state = "fannypack_blue" - item_state = "fannypack_blue" - -/obj/item/storage/belt/fannypack/cyan - name = "cyan fannypack" - icon_state = "fannypack_cyan" - item_state = "fannypack_cyan" - -/obj/item/storage/belt/fannypack/green - name = "green fannypack" - icon_state = "fannypack_green" - item_state = "fannypack_green" - -/obj/item/storage/belt/fannypack/orange - name = "orange fannypack" - icon_state = "fannypack_orange" - item_state = "fannypack_orange" - -/obj/item/storage/belt/fannypack/purple - name = "purple fannypack" - icon_state = "fannypack_purple" - item_state = "fannypack_purple" - -/obj/item/storage/belt/fannypack/red - name = "red fannypack" - icon_state = "fannypack_red" - item_state = "fannypack_red" - -/obj/item/storage/belt/fannypack/white - name = "white fannypack" - icon_state = "fannypack_white" - item_state = "fannypack_white" - -/obj/item/storage/belt/fannypack/yellow - name = "yellow fannypack" - icon_state = "fannypack_yellow" - item_state = "fannypack_yellow" - /obj/item/storage/belt/shumaila_buckle name = "hammer buckle belt" desc = "A leather belt adorned by a hammer shaped buckle, worn by priesthood and worshippers of Shumaila." @@ -501,3 +475,10 @@ Holy Village's most important buildings. When Mata'ke's original hunting party had done battle with the King of Rraknarr, her beloved was killed in the fighting. Ever since then \ she has resolved to be eternally chaste in dedication to him. She is an M'sai who is depicted wearing modest dresses and carrying a hammer on a belt. She is not known for having \ much combat prowess despite her position as head of the town watch but is a capable commander for defensive tactics." + +/obj/item/storage/belt/generic + name = "belt" + desc = "Only useful for holding up your pants." // Useless belt is useless. + icon_state = "belt" + item_state = "belt" + storage_slots = 0 diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 0053c63654c..811f88e72bf 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -743,7 +743,8 @@ /obj/item/gun/energy/rifle/laser/xray, /obj/item/gun/energy/net, /obj/item/gun/energy/laser/shotgun, - /obj/item/gun/energy/decloner + /obj/item/gun/energy/decloner, + /obj/item/gun/energy/freeze ) /obj/random/colored_jumpsuit @@ -1612,7 +1613,8 @@ /obj/item/gun/projectile/shotgun/pump/combat/sol = 1, /obj/item/gun/projectile/automatic/rifle/adhomian = 1, /obj/item/gun/projectile/musket = 0.5, - /obj/item/gun/launcher/grenade = 1 + /obj/item/gun/launcher/grenade = 1, + /obj/item/gun/energy/freeze = 0.5 ) var/list/Epic = list( diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 13161be87c7..7fc55044f11 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -44,19 +44,7 @@ health = L.health + 300 //stoning damaged mobs will result in easier to shatter statues L.frozen = TRUE - appearance = L - dir = L.dir - color = list( - 0.30, 0.3, 0.25, - 0.30, 0.3, 0.25, - 0.30, 0.3, 0.25 - ) - name = "statue of [L.name]" - desc = "An incredibly lifelike stone carving." - - if(iscorgi(L)) - name = "statue of a corgi" - desc = "If it takes forever, I will wait for you..." + create_icon(L) var/mob/statue_mob/temporarymob = new (src) temporarymob.forceMove(src) @@ -85,6 +73,21 @@ /obj/structure/closet/statue/content_info() return +/obj/structure/closet/statue/proc/create_icon(var/mob/living/L) + appearance = L + dir = L.dir + color = list( + 0.30, 0.3, 0.25, + 0.30, 0.3, 0.25, + 0.30, 0.3, 0.25 + ) + name = "statue of [L.name]" + desc = "An incredibly lifelike stone carving." + + if(iscorgi(L)) + name = "statue of a corgi" + desc = "If it takes forever, I will wait for you..." + /obj/structure/closet/statue/dump_contents() for(var/obj/O in src) @@ -164,3 +167,28 @@ dump_contents() visible_message("[src] shatters!.") qdel(src) + + +/obj/structure/closet/statue/ice + name = "ice cube" + desc = "A large ice cube." + anchored = FALSE + +/obj/structure/closet/statue/ice/create_icon(var/mob/living/L) + appearance = L + dir = L.dir + var/image/I + I = image(icon = 'icons/obj/statue.dmi', icon_state = "icecube") + add_overlay(I) + +/obj/structure/closet/statue/ice/shatter(mob/user as mob) + if (user) + user.frozen = FALSE + if(isliving(user)) + var/mob/living/L = user + L.adjustBruteLoss(30) + L.bodytemperature -= 150 + + dump_contents() + visible_message("\The [src] shatters!") + qdel(src) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_belt.dm b/code/modules/client/preference_setup/loadout/loadout_belt.dm new file mode 100644 index 00000000000..4d157c101c5 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_belt.dm @@ -0,0 +1,18 @@ +/datum/gear/belt + display_name = "belt" + path = /obj/item/storage/belt/generic + slot = slot_belt + sort_category = "Belts" + flags = GEAR_HAS_COLOR_SELECTION + +/datum/gear/belt/fannypack + display_name = "fannypack" + cost = 2 + path = /obj/item/storage/belt/fannypack/recolorable + +/datum/gear/belt/toolbelt_alt + display_name = "tool-belt, alt" + cost = 0 + path = /obj/item/storage/belt/utility/alt + allowed_roles = list("Station Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice", "Roboticist") + flags = null diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index ce89460ef7b..2cdab346eee 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -79,32 +79,6 @@ display_name = "camera" path = /obj/item/device/camera -/datum/gear/utility/fannypack - display_name = "fannypack selection" - cost = 2 - path = /obj/item/storage/belt/fannypack - -/datum/gear/utility/fannypack/New() - ..() - var/list/fannys = list() - fannys["leather fannypack"] = /obj/item/storage/belt/fannypack - fannys["black fannypack"] = /obj/item/storage/belt/fannypack/black - fannys["blue fannypack"] = /obj/item/storage/belt/fannypack/blue - fannys["cyan fannypack"] = /obj/item/storage/belt/fannypack/cyan - fannys["green fannypack"] = /obj/item/storage/belt/fannypack/green - fannys["orange fannypack"] = /obj/item/storage/belt/fannypack/orange - fannys["purple fannypack"] = /obj/item/storage/belt/fannypack/purple - fannys["red fannypack"] = /obj/item/storage/belt/fannypack/red - fannys["white fannypack"] = /obj/item/storage/belt/fannypack/white - fannys["yellow fannypack"] = /obj/item/storage/belt/fannypack/yellow - gear_tweaks += new/datum/gear_tweak/path(fannys) - -/datum/gear/utility/toolbelt_alt - display_name = "tool-belt, alt" - cost = 0 - path = /obj/item/storage/belt/utility/alt - allowed_roles = list("Station Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice", "Roboticist") - /datum/gear/utility/himeo_kit display_name = "himean voidsuit kit" path = /obj/item/himeo_kit diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 73cb78eed68..f10a8a8701a 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -208,10 +208,13 @@ new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) -//rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel. +//rag must have a minimum of 2 units fuel and at least 80% of the reagents must be fuel. //maybe generalize flammable reagents someday /obj/item/reagent_containers/glass/rag/proc/can_ignite() - var/fuel = REAGENT_VOLUME(reagents, /decl/reagent/fuel) + var/fuel = 0 + for(var/fuel_type in reagents.reagent_volumes) + if(ispath(fuel_type, /decl/reagent/fuel) || ispath(fuel_type, /decl/reagent/alcohol)) + fuel += reagents.reagent_volumes[fuel_type] return (fuel >= 2 && fuel >= reagents.total_volume*0.8) /obj/item/reagent_containers/glass/rag/proc/ignite() @@ -244,8 +247,13 @@ //ensures players always have a few seconds of burn time left when they light their rag if(burn_time <= 5) visible_message(SPAN_WARNING("\The [src] falls apart!")) - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) + if(istype(loc, /obj/item/reagent_containers/food/drinks/bottle)) + var/obj/item/reagent_containers/food/drinks/bottle/B = loc + B.delete_rag() + else + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) + return update_name() update_icon() @@ -264,11 +272,18 @@ if(burn_time <= 0) STOP_PROCESSING(SSprocessing, src) - new /obj/effect/decal/cleanable/ash(location) - qdel(src) + if(istype(loc, /obj/item/reagent_containers/food/drinks/bottle)) + var/obj/item/reagent_containers/food/drinks/bottle/B = loc + B.delete_rag() + else + new /obj/effect/decal/cleanable/ash(location) + qdel(src) return - reagents.remove_reagent(/decl/reagent/fuel, reagents.maximum_volume/25) + for(var/fuel_type in reagents.reagent_volumes) + if(ispath(fuel_type, /decl/reagent/fuel) || ispath(fuel_type, /decl/reagent/alcohol)) + reagents.remove_reagent(reagents.reagent_volumes[fuel_type], reagents.maximum_volume/25) + break update_name() update_icon() burn_time-- diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index d93b9a29ea1..53bcae8cc34 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -471,6 +471,9 @@ light_range = 2 hunger_enabled = FALSE +/mob/living/simple_animal/penguin/holodeck/can_name(var/mob/living/M) + return FALSE + /mob/living/simple_animal/penguin/holodeck/baby icon_state = "penguin_baby" icon_living = "penguin_baby" diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 73edda9a5a7..44ff04222a1 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -21,6 +21,7 @@ var/list/holder_mob_icon_cache = list() var/last_loc_general //This stores a general location of the object. Ie, a container or a mob var/last_loc_specific //This stores specific extra information about the location, pocket, hand, worn on head, etc. Only relevant to mobs + var/no_name = FALSE //If true, removes the change animal name verb for holders that don't allow name changes /obj/item/holder/proc/setup_unsafe_list() unsafe_containers = typecacheof(list( @@ -39,6 +40,8 @@ var/list/holder_mob_icon_cache = list() item_state = icon_state flags_inv |= ALWAYSDRAW + if(no_name) + verbs -= /obj/item/holder/verb/change_animal_name START_PROCESSING(SSprocessing, src) @@ -334,6 +337,21 @@ var/list/holder_mob_icon_cache = list() ..() +/obj/item/holder/verb/change_animal_name() + set name = "Name Animal" + set category = "IC" + set src in usr + + if(isanimal(contained)) + var/mob/living/simple_animal/SA = contained + SA.change_name(usr) + sync(contained) + if(ishuman(contained)) + var/mob/living/carbon/human/H = contained + if(H.isMonkey()) + H.change_animal_name(usr) + sync(contained) + //#TODO-MERGE //Port the reduced-duplication holder method from baystation upstream: //https://github.com/Baystation12/Baystation12/blob/master/code/modules/mob/holder.dm @@ -350,6 +368,7 @@ var/list/holder_mob_icon_cache = list() origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5) slot_flags = SLOT_HEAD | SLOT_EARS | SLOT_HOLSTER w_class = ITEMSIZE_SMALL + no_name = TRUE /obj/item/holder/drone name = "maintenance drone" @@ -359,6 +378,7 @@ var/list/holder_mob_icon_cache = list() origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5) slot_flags = SLOT_HEAD w_class = ITEMSIZE_LARGE + no_name = TRUE /obj/item/holder/drone/heavy name = "construction drone" @@ -433,6 +453,7 @@ var/list/holder_mob_icon_cache = list() icon_state = "brainslug" origin_tech = list(TECH_BIO = 6) w_class = ITEMSIZE_TINY + no_name = TRUE /obj/item/holder/monkey name = "monkey" @@ -570,6 +591,7 @@ var/list/holder_mob_icon_cache = list() icon = 'icons/mob/npc/pai.dmi' dir = EAST slot_flags = SLOT_HEAD + no_name = TRUE /obj/item/holder/pai/drone icon_state = "repairbot_rest" diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 0781d8cdd3d..24ae0d24a20 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -1208,4 +1208,35 @@ mob/living/carbon/human/proc/change_monitor() return primary_martial_art = selected_martial_art - to_chat(src, SPAN_NOTICE("You will now use [primary_martial_art.name] when fighting barehanded.")) \ No newline at end of file + to_chat(src, SPAN_NOTICE("You will now use [primary_martial_art.name] when fighting barehanded.")) + +//Used to rename monkey mobs since they are humans with a monkey species applied +/mob/living/carbon/human/proc/change_animal_name() + set name = "Name Animal" + set desc = "Name a monkeylike animal." + set category = "IC" + set src in view(1) + + var/mob/living/M = usr + if(!M || usr == src) + return + + if(can_name(M)) + var/input = sanitizeSafe(input("What do you want to name \the [src]?","Choose a name") as text|null, MAX_NAME_LEN) + if(!input) + return + if(stat != DEAD && in_range(M,src)) + to_chat(M, SPAN_NOTICE("You rename \the [src] to [input].")) + name = "\proper [input]" + real_name = input + named = TRUE + +//Used only to check for renaming of monkey mobs +/mob/living/carbon/human/can_name(var/mob/living/M) + if(named) + to_chat(M, SPAN_NOTICE("\The [src] already has a name!")) + return FALSE + if(stat == DEAD) + to_chat(M, SPAN_WARNING("You can't name a corpse.")) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 7ceb394173b..40f376b4e5e 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -12,6 +12,7 @@ /mob/living/carbon/human/monkey/punpun/LateInitialize() name = "Pun Pun" real_name = name + named = TRUE w_uniform = new /obj/item/clothing/under/punpun(src) /obj/item/clothing/under/nupnup diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index cfb717a0a13..e268f1c9a8d 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -27,7 +27,7 @@ tail = "chimptail" unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) - inherent_verbs = list(/mob/living/proc/ventcrawl) + inherent_verbs = list(/mob/living/proc/ventcrawl, /mob/living/carbon/human/proc/change_animal_name) hud_type = /datum/hud_data/monkey meat_type = /obj/item/reagent_containers/food/snacks/meat/monkey @@ -143,7 +143,8 @@ deform = 'icons/mob/human_races/monkeys/r_vkrexi.dmi' inherent_verbs = list( - /mob/living/carbon/human/proc/bugbite + /mob/living/carbon/human/proc/bugbite, + /mob/living/carbon/human/proc/change_animal_name ) tail = "vkrexitail" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e6c1683f075..5dfc9664abd 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -959,35 +959,42 @@ There are several things that need to be remembered: if (QDELING(src)) return - overlays_raw[BELT_LAYER] = null - overlays_raw[BELT_LAYER_ALT] = null - if(belt) - belt.screen_loc = ui_belt //TODO - var/t_state = belt.item_state - var/t_icon = belt.icon || belt.icon_state - var/image/standing + belt.screen_loc = ui_belt + var/image/result_layer = null + + //Determine the icon to use + var/t_icon = INV_BELT_DEF_ICON if(belt.contained_sprite) belt.auto_adapt_species(src) - t_state = "[UNDERSCORE_OR_NULL(belt.icon_species_tag)][belt.item_state][WORN_BELT]" - - if(belt.icon_override) - t_icon = belt.icon_override + var/t_state = "[UNDERSCORE_OR_NULL(belt.icon_species_tag)][belt.item_state][WORN_BELT]" + result_layer = image(belt.icon_override || belt.icon, t_state) else if(belt.icon_override) t_icon = belt.icon_override else if(belt.sprite_sheets && belt.sprite_sheets[GET_BODY_TYPE]) t_icon = belt.sprite_sheets[GET_BODY_TYPE] + else if(belt.item_icons && (slot_belt_str in belt.item_icons)) + t_icon = belt.item_icons[slot_belt_str] else - t_icon = 'icons/mob/belt.dmi' + t_icon = INV_BELT_DEF_ICON + + if(!result_layer) //Create the image + result_layer = image(t_icon, belt.icon_state) + + if(belt.color) + result_layer.color = belt.color + + result_layer.appearance_flags = RESET_ALPHA + var/image/worn_overlays = belt.worn_overlays(t_icon) + if(worn_overlays) + result_layer.overlays.Add(worn_overlays) - standing = image(t_icon, t_state) - standing.appearance_flags = RESET_ALPHA var/list/ovr if(belt.contents.len && istype(belt, /obj/item/storage/belt)) - ovr = list(standing) + ovr = list(result_layer) for(var/obj/item/i in belt.contents) var/c_state var/c_icon @@ -995,23 +1002,31 @@ There are several things that need to be remembered: c_state = "[UNDERSCORE_OR_NULL(i.icon_species_tag)][i.item_state][WORN_BELT]" c_icon = belt.icon_override || belt.icon else - c_icon = 'icons/mob/belt.dmi' + c_icon = INV_BELT_DEF_ICON c_state = i.item_state || i.icon_state var/image/belt_item_image = image(c_icon, c_state) + if(i.color) + belt_item_image.color = i.color belt_item_image.appearance_flags = RESET_ALPHA ovr += image(c_icon, c_state) - var/beltlayer = BELT_LAYER + var/belt_layer = BELT_LAYER if(istype(belt, /obj/item/storage/belt)) - var/obj/item/storage/belt/ubelt = belt - if(ubelt.show_above_suit) - beltlayer = BELT_LAYER_ALT + var/obj/item/storage/belt/B = belt + if(B.show_above_suit) + belt_layer = BELT_LAYER_ALT - overlays_raw[beltlayer] = ovr || standing + overlays_raw[belt_layer] = ovr || result_layer + else + overlays_raw[BELT_LAYER] = null + overlays_raw[BELT_LAYER_ALT] = null if(update_icons) update_icon() + if (QDELING(src)) + return + /mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1) if (QDELING(src)) return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ef26a3375c6..b461677e4bb 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1014,4 +1014,7 @@ default behaviour is: hallucination += amount /mob/living/set_respawn_time() - set_death_time(CREW, world.time) \ No newline at end of file + set_death_time(CREW, world.time) +//Used by simple animals and monkey species for renaming. M is the one doing the renaming +/mob/living/proc/can_name(var/mob/living/M) + return FALSE \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 9465a6e9ae4..a11ace30a6b 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -71,4 +71,6 @@ var/brute_mod = 1 var/limb_breaking = FALSE // used to limit people from queuing up limb-breaks - var/list/obj/aura/auras //Basically a catch-all aura/force-field thing. \ No newline at end of file + var/list/obj/aura/auras //Basically a catch-all aura/force-field thing. + + var/named = FALSE //Affects renaming animals and monkey species. Set to TRUE for animals with unique names, such as station pets. Doesn't affect any other mob. \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm index 12dcb109ce1..73bfaaa85ff 100644 --- a/code/modules/mob/living/simple_animal/bees.dm +++ b/code/modules/mob/living/simple_animal/bees.dm @@ -35,6 +35,8 @@ target_mob = null return ..() +/mob/living/simple_animal/bee/can_name(var/mob/living/M) + return FALSE //Special death behaviour. When bees accumulate enough damage to 'die', they don't outright die. Thus no call to parent //Instead the swarm strength (ie, size, or quantity of bees) drops and their health is refilled diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index 82d293b8673..98cfe3243b2 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -60,6 +60,9 @@ SSghostroles.remove_spawn_atom("borer", src) return ..(gibbed,deathmessage) +/mob/living/simple_animal/borer/can_name(var/mob/living/M) + return FALSE + /mob/living/simple_animal/borer/Life() ..() if(host) diff --git a/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm b/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm index 9c1b7f92ff7..5aa22c7e33c 100644 --- a/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm +++ b/code/modules/mob/living/simple_animal/constructs/constructs/cult_construct.dm @@ -66,6 +66,11 @@ ghostize() qdel(src) +/mob/living/simple_animal/construct/can_name(var/mob/living/M) + if(iscultist(M)) + return ..() + return FALSE + /mob/living/simple_animal/construct/get_bullet_impact_effect_type(var/def_zone) return BULLET_IMPACT_METAL diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm index 7325b621894..a4955d46c6a 100644 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ b/code/modules/mob/living/simple_animal/familiars/familiars.dm @@ -28,6 +28,11 @@ /mob/living/simple_animal/familiar/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override) INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration) +/mob/living/simple_animal/familiar/can_name(var/mob/living/M) + if(M.is_wizard(TRUE)) + return ..() + return FALSE + /mob/living/simple_animal/familiar/carcinus name = "crab" desc = "A small crab said to be made of stone and starlight." diff --git a/code/modules/mob/living/simple_animal/friendly/adhomai.dm b/code/modules/mob/living/simple_animal/friendly/adhomai.dm index 771769cdca6..0ef99964732 100644 --- a/code/modules/mob/living/simple_animal/friendly/adhomai.dm +++ b/code/modules/mob/living/simple_animal/friendly/adhomai.dm @@ -101,6 +101,8 @@ attacktext = "bitten" attack_sound = 'sound/weapons/bite.ogg' + hostile_nameable = TRUE + butchering_products = list(/obj/item/stack/material/animalhide = 5) meat_amount = 8 diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 2e91000483f..a0ea4d2ff15 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -283,6 +283,7 @@ /mob/living/simple_animal/cat/fluff/Runtime name = "Runtime" desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally." + named = TRUE gender = FEMALE icon_state = "cat" item_state = "cat" @@ -317,6 +318,7 @@ /mob/living/simple_animal/cat/fluff/bones name = "Bones" desc = "He's a laid back, black cat. Meow." + named = TRUE gender = MALE icon_state = "cat3" item_state = "cat3" @@ -334,6 +336,7 @@ /mob/living/simple_animal/cat/penny name = "Penny" desc = "An important cat, straight from Central Command." + named = TRUE icon_state = "penny" item_state = "penny" icon_living = "penny" diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 58c20b6e9d4..2095ccab624 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -44,6 +44,7 @@ real_name = "Ian" //Intended to hold the name without altering it. gender = MALE desc = "It's a corgi." + named = TRUE //var/obj/movement_target response_help = "pets" response_disarm = "bops" @@ -127,6 +128,7 @@ real_name = "Lisa" gender = FEMALE desc = "It's a corgi with a cute pink bow." + named = TRUE icon_state = "lisa" icon_living = "lisa" icon_dead = "lisa_dead" diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 8620d0678b5..ede7756fc85 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -40,6 +40,7 @@ name = "Coffee" real_name = "Coffee" desc = "It's Coffee, the other pet!" + named = TRUE response_help = "pets" response_disarm = "gently pushes aside" response_harm = "stomps" diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 9b52595ec18..eb27b172e2c 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -29,6 +29,7 @@ canbrush = TRUE emote_sounds = list('sound/effects/creatures/goat.ogg') has_udder = TRUE + hostile_nameable = TRUE butchering_products = list(/obj/item/stack/material/animalhide = 3) diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index b76a08ab4ff..5dcdec3cf23 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -31,3 +31,4 @@ name = "Chauncey" real_name = "Chauncey" desc = "Chauncey, the Captain's trustworthy fox. I wonder what it says?" + named = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/ratking.dm b/code/modules/mob/living/simple_animal/friendly/ratking.dm index c35d5cc67e5..274c7faac51 100644 --- a/code/modules/mob/living/simple_animal/friendly/ratking.dm +++ b/code/modules/mob/living/simple_animal/friendly/ratking.dm @@ -47,6 +47,9 @@ ..() +/mob/living/simple_animal/rat/king/can_name(var/mob/living/M) + return FALSE + /mob/living/simple_animal/rat/king/Move() ..() diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 46316afe8f6..6eb0fcc8883 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -56,6 +56,9 @@ verbs |= /mob/living/simple_animal/spiderbot/proc/control_integrated_radio voice_name = name +/mob/living/simple_animal/spiderbot/can_name(var/mob/living/M) + return FALSE + /mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/device/mmi)) diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm index 50a3706b1eb..ff6dfbba095 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm @@ -33,6 +33,8 @@ tameable = FALSE + hostile_nameable = TRUE + meat_type = /obj/item/reagent_containers/food/snacks/bearmeat butchering_products = list(/obj/item/clothing/head/bearpelt = 1) meat_amount = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm index 93a7e069b36..b5cc94107c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/commanded.dm @@ -5,6 +5,7 @@ melee_damage_upper = 0 density = FALSE belongs_to_station = TRUE + hostile_nameable = TRUE var/short_name = null var/list/command_buffer = list() var/list/known_commands = list("stay", "stop", "attack", "follow") @@ -30,6 +31,18 @@ command_buffer.Add(lowertext(html_decode(message))) return 0 +/mob/living/simple_animal/hostile/commanded/can_name(var/mob/living/M) + if(master && (M != master)) + to_chat(M, SPAN_WARNING("You can't name \the [src] because you aren't their master!")) + return FALSE + return ..() + +/mob/living/simple_animal/hostile/commanded/do_nickname(var/mob/living/M) + var/input = sanitizeSafe(input("What nickname do you want to give \the [src]?","Choose a name") as null|text, MAX_NAME_LEN) + if(!input) + return + short_name = input + /mob/living/simple_animal/hostile/commanded/think() while(command_buffer.len > 0) var/mob/speaker = command_buffer[1] diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm index dc1754d6556..98671023c6e 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm @@ -44,8 +44,6 @@ known_commands = list("stay", "stop", "attack", "follow") - var/name_changed = 0 - destroy_surroundings = FALSE attack_emote = "growls at" @@ -71,31 +69,6 @@ return -/mob/living/simple_animal/hostile/commanded/dog/verb/change_name() - set name = "Name Dog" - set category = "IC" - set src in view(1) - - var/mob/M = usr - if(!M.mind) return 0 - - if(!name_changed) - - var/input = sanitizeSafe(input("What do you want to name the dog?", ,""), MAX_NAME_LEN) - var/short_input = sanitizeSafe(input("What nickname do you want to give the dog ?", , ""), MAX_NAME_LEN) - - if(src && input && !M.stat && in_range(M,src)) - name = input - real_name = input - if(short_input != "") - short_name = short_input - name_changed = 1 - return 1 - - else - to_chat(usr, "[src] already has a name!") - return - /mob/living/simple_animal/hostile/commanded/dog/amaskan desc = "A dog trained to listen and obey its owner commands, this one is a Tamaskan." @@ -107,12 +80,11 @@ name = "Lt. Columbo" short_name = "Columbo" desc = "A dog trained to listen and obey its owner commands. This one looks about three days from retirement." + named = TRUE melee_damage_lower = 5 melee_damage_upper = 10 - name_changed = 1 - icon_state = "columbo" icon_living = "columbo" icon_dead = "columbo_dead" diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm b/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm index b412bbebb62..bf81d4cc8a8 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/ives.dm @@ -1,6 +1,7 @@ /mob/living/simple_animal/hostile/commanded/baby_harvester name = "Ives" desc = "A mysterious docile hivebot, this type seems to be of a kind rarely seen in the Orion Spur. Look at its little tail!" + named = TRUE icon = 'icons/mob/npc/pets.dmi' icon_state = "ives" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index e223b316e41..86e595b4e00 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -29,6 +29,7 @@ var/smart_melee = TRUE // This makes melee mobs try to stay two tiles away from their target in combat, lunging in to attack only var/smart_ranged = FALSE // This makes ranged mob check for friendly fire and obstacles + var/hostile_nameable = FALSE //If we can rename this hostile mob. Mostly to prevent repeat checks with guard dogs and hostile/retaliate farm animals /mob/living/simple_animal/hostile/Initialize() . = ..() @@ -42,6 +43,14 @@ targets = null return ..() +/mob/living/simple_animal/hostile/can_name(var/mob/living/M) + if(hostile_nameable) + return ..() + if(faction && faction == M.faction) //In case the mob had a dociler used on it + return ..() + return FALSE + + /mob/living/simple_animal/hostile/proc/FindTarget() if(!faction) //No faction, no reason to attack anybody. return null @@ -202,6 +211,10 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH /mob/living/simple_animal/hostile/proc/PostAttack(var/atom/target) if(stat) return + for(var/grab in grabbed_by) + var/obj/item/grab/G = grab + if(G.state >= GRAB_AGGRESSIVE) + return facing_dir = get_dir(src, target) if(ishuman(target)) step_away(src, pick(RANGE_TURFS(2, target))) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index fb72721eae3..259145df5bc 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -41,6 +41,9 @@ new residue(loc) qdel(src) +/mob/living/simple_animal/shade/can_name(var/mob/living/M) + return FALSE + /mob/living/simple_animal/shade/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override) INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 5805ccbe2a4..92f42fd0e0e 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -181,6 +181,14 @@ else if (health < maxHealth) to_chat(user, "It looks wounded.") +/mob/living/simple_animal/can_name(var/mob/living/M) + if(named) + to_chat(M, SPAN_NOTICE("\The [src] already has a name!")) + return FALSE + if(stat == DEAD) + to_chat(M, SPAN_WARNING("You can't name a corpse.")) + return FALSE + return TRUE /mob/living/simple_animal/Life() ..() @@ -650,6 +658,33 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) sound_time = FALSE addtimer(CALLBACK(src, .proc/reset_sound_time), 2 SECONDS) +/mob/living/simple_animal/verb/change_name() + set name = "Name Animal" + set desc = "Rename an animal." + set category = "IC" + set src in view(1) + + var/mob/living/M = usr + if(!M) + return + + if(can_name(M)) + var/input = sanitizeSafe(input("What do you want to name \the [src]?","Choose a name") as null|text, MAX_NAME_LEN) + if(!input) + return + + //check for adjacent and dead in case something happened while naming. + if(in_range(M,src) && (stat != DEAD)) + to_chat(M, SPAN_NOTICE("You rename \the [src] to [input].")) + name = "\proper [input]" + real_name = input + named = TRUE + do_nickname(M) //This is for commanded mobs who can have a short name, like guard dogs + +//This is for commanded mobs who can have a short name, like guard dogs. Does nothing for other mobs for now +/mob/living/simple_animal/proc/do_nickname(var/mob/living/M) + + /mob/living/simple_animal/proc/reset_sound_time() sound_time = TRUE diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm index caa8e1dcd5a..caa0a0e53a4 100644 --- a/code/modules/mob/living/simple_animal/worm.dm +++ b/code/modules/mob/living/simple_animal/worm.dm @@ -198,3 +198,6 @@ loc.contents += stomachContent return + +/mob/living/simple_animal/space_worm/can_name(var/mob/living/M) + return FALSE diff --git a/code/modules/projectiles/guns/energy/freezeray.dm b/code/modules/projectiles/guns/energy/freezeray.dm new file mode 100644 index 00000000000..d1461de8234 --- /dev/null +++ b/code/modules/projectiles/guns/energy/freezeray.dm @@ -0,0 +1,20 @@ +/obj/item/gun/energy/freeze + name = "freeze ray gun" + desc = "A portable freezing ray gun designated to quickly lower temperatures." + icon = 'icons/obj/guns/freezeray.dmi' + icon_state = "icer" + item_state = "icer" + has_item_ratio = FALSE + fire_sound = 'sound/weapons/pulse3.ogg' + + max_shots = 5 + + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 4, TECH_POWER = 4) + slot_flags = SLOT_BELT + + projectile_type = /obj/item/projectile/beam/freezer + + firemodes = list( + list(mode_name="freeze", projectile_type= /obj/item/projectile/beam/freezer, fire_sound='sound/weapons/pulse3.ogg'), + list(mode_name="ice bolt", projectile_type= /obj/item/projectile/ice, fire_sound='sound/weapons/crossbow.ogg') + ) \ No newline at end of file diff --git a/code/modules/projectiles/modular/laser_components.dm b/code/modules/projectiles/modular/laser_components.dm index 59c6b5023c9..fb6a58635ff 100644 --- a/code/modules/projectiles/modular/laser_components.dm +++ b/code/modules/projectiles/modular/laser_components.dm @@ -445,3 +445,11 @@ icon_state = "xray" firing_sound = 'sound/weapons/plasma_cutter.ogg' origin_tech = list(TECH_COMBAT = 3, TECH_PHORON = 4, TECH_ILLEGAL = 4) + +/obj/item/laser_components/modulator/freeze + name = "freeze ray modulator" + desc = "Modulates the beam into freezing rays." + projectile = /obj/item/projectile/beam/freezer + icon_state = "blue" + firing_sound = 'sound/weapons/pulse3.ogg' + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 5, TECH_MATERIAL = 4) \ No newline at end of file diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d4fbc56be90..d14b5957fec 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -443,4 +443,28 @@ damage = 20 /obj/item/projectile/beam/tesla/paramount - damage = 25 \ No newline at end of file + damage = 25 + +/obj/item/projectile/beam/freezer + name = "freezing ray" + icon_state = "bluelaser" + pass_flags = PASSTABLE + damage = 15 + damage_type = BURN + check_armor = "energy" + + muzzle_type = /obj/effect/projectile/muzzle/laser/blue + tracer_type = /obj/effect/projectile/tracer/laser/blue + impact_type = /obj/effect/projectile/impact/laser/blue + +/obj/item/projectile/beam/freezer/on_impact(atom/target) + . = ..() + if(isliving(target)) + var/mob/living/L = target + L.bodytemperature -= 40 + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.bodytemperature <= H.species.cold_level_2) + new /obj/structure/closet/statue/ice(H.loc, H) + H.visible_message(SPAN_WARNING("\The [H] freezes!")) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 48fa4b7f632..2b3b1890ab5 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -300,3 +300,10 @@ else ..() return + +/obj/item/projectile/ice + name ="ice bolt" + icon_state= "icer_bolt" + damage = 15 + damage_type = BRUTE + check_armor = "energy" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/custom_rolls.dm b/code/modules/reagents/reagent_containers/food/custom_rolls.dm new file mode 100644 index 00000000000..7dd30babc97 --- /dev/null +++ b/code/modules/reagents/reagent_containers/food/custom_rolls.dm @@ -0,0 +1,15 @@ +/obj/item/reagent_containers/food/snacks/csandwich/roll + name = "roll" + desc = "Like a sandwich, but rounder." + icon_state = "roll" + bitesize = 2 + base_name = "roll" + topper = "roll_top" + +/obj/item/reagent_containers/food/snacks/csandwich/burger + name = "burger" + desc = "The cornerstone of every nutritious breakfast." + icon_state = "hburger" + bitesize = 2 + base_name = "burger" + topper = "burger_top" diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index f7f24209920..f9c29537be7 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -101,12 +101,20 @@ update_icon() /obj/item/reagent_containers/food/drinks/bottle/proc/remove_rag(mob/user) - if(!rag) return + if(!rag) + return user.put_in_hands(rag) rag = null flags |= (initial(flags) & OPENCONTAINER) update_icon() +/obj/item/reagent_containers/food/drinks/bottle/proc/delete_rag() + if(!rag) + return + QDEL_NULL(rag) + flags |= (initial(flags) & OPENCONTAINER) + update_icon() + /obj/item/reagent_containers/food/drinks/bottle/open(mob/user) if(rag) return @@ -114,13 +122,14 @@ /obj/item/reagent_containers/food/drinks/bottle/update_icon() underlays.Cut() + set_light(0) if(rag) var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay) underlays += underlay_image - set_light(2) - else - set_light(0) - ..() + if(rag.on_fire) + set_light(2, l_color = LIGHT_COLOR_FIRE) + return + ..() /obj/item/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user, var/hit_zone) var/blocked = ..() diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index c5096f0cb58..0e1d4cad281 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -14,6 +14,8 @@ bitesize = 2 var/list/ingredients = list() + var/base_name = "sandwich" + var/topper = "sandwich_top" /obj/item/reagent_containers/food/snacks/csandwich/attackby(obj/item/W as obj, mob/user) @@ -51,15 +53,15 @@ I.appearance_flags |= RESET_COLOR // You grill the bread, not the ingredients. ovr += I - var/image/T = new(src.icon, "sandwich_top") + var/image/T = new(src.icon, topper) T.pixel_x = pick(list(-1,0,1)) T.pixel_y = (ingredients.len * 2)+1 ovr += T add_overlay(ovr) - name = lowertext("[english_list(words)] sandwich") - if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" + name = lowertext("[english_list(words)] [base_name]") + if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] [base_name]" w_class = n_ceil(Clamp((ingredients.len/2),2,4)) /obj/item/reagent_containers/food/snacks/csandwich/Destroy() diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 6f5950b0612..310fc0af3f6 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -3412,6 +3412,7 @@ center_of_mass = list("x"=16, "y"=13) reagents_to_add = list(/decl/reagent/nutriment = 3) reagent_data = list(/decl/reagent/nutriment = list("uncooked dough" = 3)) + filling_color = "#EDE0AF" // Dough + rolling pin = flat dough /obj/item/reagent_containers/food/snacks/dough/attackby(obj/item/W as obj, mob/user as mob) @@ -3431,7 +3432,8 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 3) reagent_data = list(/decl/reagent/nutriment = list("uncooked dough" = 3)) - + filling_color = "#EDE0AF" + /obj/item/reagent_containers/food/snacks/doughslice name = "dough slice" desc = "A building block of an impressive dish." @@ -3443,6 +3445,7 @@ center_of_mass = list("x"=17, "y"=19) reagents_to_add = list(/decl/reagent/nutriment = 1) reagent_data = list(/decl/reagent/nutriment = list("uncooked dough" = 1)) + filling_color = "#EDE0AF" /obj/item/reagent_containers/food/snacks/bun name = "bun" @@ -3483,6 +3486,11 @@ if ("rodent") result = new /obj/item/reagent_containers/food/snacks/burger/mouse(src) to_chat(user, "You make a ratburger!") + + else if(istype(W,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/csandwich/roll/R = new(get_turf(src)) + R.attackby(W,user) + qdel(src) if (result) if (W.reagents) @@ -3501,13 +3509,17 @@ qdel(src) // Burger + cheese wedge = cheeseburger -/obj/item/reagent_containers/food/snacks/burger/attackby(obj/item/reagent_containers/food/snacks/cheesewedge/W as obj, mob/user as mob) - if(istype(W))// && !istype(src,/obj/item/reagent_containers/food/snacks/cheesewedge)) +/obj/item/reagent_containers/food/snacks/burger/attackby(obj/item/reagent_containers/food/snacks/W as obj, mob/user as mob) + if(istype(W,/obj/item/reagent_containers/food/snacks/cheesewedge))// && !istype(src,/obj/item/reagent_containers/food/snacks/cheesewedge)) new /obj/item/reagent_containers/food/snacks/burger/cheese(src) to_chat(user, "You make a cheeseburger.") qdel(W) qdel(src) return + else if(istype(W,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/csandwich/burger/B = new(get_turf(src)) + B.attackby(W,user) + qdel(src) else ..() @@ -3530,6 +3542,7 @@ center_of_mass = list("x"=21, "y"=12) reagents_to_add = list(/decl/reagent/nutriment = 4, /decl/reagent/nutriment/protein = 3) reagent_data = list(/decl/reagent/nutriment = list("taco shell with cheese")) + filling_color = "#EDE0AF" /obj/item/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -3540,6 +3553,7 @@ center_of_mass = list("x"=17, "y"=20) slice_path = /obj/item/reagent_containers/food/snacks/rawbacon slices_num = 2 + filling_color = "#D45D6B" /obj/item/reagent_containers/food/snacks/cutlet name = "cutlet" @@ -3548,6 +3562,7 @@ icon_state = "cutlet" bitesize = 2 center_of_mass = list("x"=17, "y"=20) + filling_color = "#D45D6B" reagents_to_add = list(/decl/reagent/nutriment/protein = 2) @@ -3558,6 +3573,7 @@ icon_state = "rawmeatball" bitesize = 2 center_of_mass = list("x"=16, "y"=15) + filling_color = "#D45D6B" reagents_to_add = list(/decl/reagent/nutriment/protein = 2) @@ -3567,6 +3583,7 @@ icon_state = "hotdog" bitesize = 2 center_of_mass = list("x"=16, "y"=17) + filling_color = "#D45D6B" reagents_to_add = list(/decl/reagent/nutriment/protein = 6) @@ -3579,6 +3596,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 3) reagent_data = list(/decl/reagent/nutriment = list("bread" = 3)) + filling_color = "#B89F61" // potato + knife = raw sticks /obj/item/reagent_containers/food/snacks/grown/potato/attackby(obj/item/W as obj, mob/user as mob) @@ -3598,7 +3616,8 @@ center_of_mass = list("x"=16, "y"=12) reagents_to_add = list(/decl/reagent/nutriment = 3) reagent_data = list(/decl/reagent/nutriment = list("uncooked potatos" = 3)) - + filling_color = "#EDF291" + /obj/item/reagent_containers/food/snacks/liquidfood name = "LiquidFood ration" desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy? Now with artificial flavoring!" @@ -3919,6 +3938,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 8) reagent_data = list(/decl/reagent/nutriment = list("pancake" = 8)) bitesize = 2 + filling_color = "#EDF291" /obj/item/reagent_containers/food/snacks/classichotdog name = "classic hotdog" @@ -3926,6 +3946,7 @@ icon_state = "hotcorgi" center_of_mass = "x=16;y=17" bitesize = 6 + filling_color = "#D45D6B" reagents_to_add = list(/decl/reagent/nutriment/protein = 16) @@ -3936,6 +3957,7 @@ trash = /obj/item/trash/grease drop_sound = /decl/sound_category/tray_hit_sound center_of_mass = list("x"=16, "y"=17) + filling_color = "#EDF291" reagents_to_add = list(/decl/reagent/nutriment = 12, /decl/reagent/nutriment/protein = 12) reagent_data = list(/decl/reagent/nutriment = list("pasta" = 4, "tomato" = 2)) @@ -3945,6 +3967,7 @@ name = "doner kebab" desc = "A delicious sandwich-like food from ancient Earth. The meat is typically cooked on a vertical rotisserie." icon_state = "doner_kebab" + filling_color = "#D45D6B" reagents_to_add = list(/decl/reagent/nutriment = 5, /decl/reagent/nutriment/protein = 4) reagent_data = list(/decl/reagent/nutriment = list("dough" = 4, "cabbage" = 2)) @@ -3955,6 +3978,7 @@ icon_state = "nugget_lump" bitesize = 3 reagents_to_add = list(/decl/reagent/nutriment/protein = 4) + filling_color = "#EDF291" /obj/item/reagent_containers/food/snacks/nugget/Initialize() . = ..() @@ -3978,6 +4002,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/honey = 3) reagent_data = list(/decl/reagent/nutriment = list("pastry" = 1)) bitesize = 3 + filling_color = "#A66829" // Chip update. /obj/item/reagent_containers/food/snacks/tortilla @@ -3988,6 +4013,7 @@ reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 1)) center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6) + filling_color = "#A66829" //chips /obj/item/reagent_containers/food/snacks/chip @@ -3999,6 +4025,8 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 2) reagent_data = list(/decl/reagent/nutriment = list("nacho chips" = 1)) + filling_color = "#EDF291" + /obj/item/reagent_containers/food/snacks/chip/on_consume(mob/M as mob) if(reagents && reagents.total_volume) @@ -4011,6 +4039,7 @@ icon_state = "chip_salsa" bitten_state = "chip_half" bitesize = 2 + filling_color = "#FF4D36" /obj/item/reagent_containers/food/snacks/chip/guac name = "guac chip" @@ -4018,6 +4047,7 @@ icon_state = "chip_guac" bitten_state = "chip_half" bitesize = 2 + filling_color = "#35961D" /obj/item/reagent_containers/food/snacks/chip/cheese name = "cheese chip" @@ -4025,6 +4055,7 @@ icon_state = "chip_cheese" bitten_state = "chip_half" bitesize = 2 + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/chip/nacho name = "nacho chip" @@ -4032,6 +4063,7 @@ icon_state = "chip_nacho" bitten_state = "chip_half" bitesize = 2 + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/chip/nacho/salsa name = "nacho chip" @@ -4039,6 +4071,7 @@ icon_state = "chip_nacho_salsa" bitten_state = "chip_half" bitesize = 2 + filling_color = "#FF4D36" /obj/item/reagent_containers/food/snacks/chip/nacho/guac name = "nacho chip" @@ -4046,6 +4079,7 @@ icon_state = "chip_nacho_guac" bitten_state = "chip_half" bitesize = 2 + filling_color = "#35961D" /obj/item/reagent_containers/food/snacks/chip/nacho/cheese name = "nacho chip" @@ -4053,6 +4087,7 @@ icon_state = "chip_nacho_cheese" bitten_state = "chip_half" bitesize = 2 + filling_color = "#FFF454" // chip plates /obj/item/reagent_containers/food/snacks/chipplate @@ -4065,6 +4100,7 @@ bitesize = 1 reagents_to_add = list(/decl/reagent/nutriment = 10) var/unitname = "chip" + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user as mob) var/obj/item/reagent_containers/food/snacks/returningitem = new vendingobject(loc) @@ -4098,6 +4134,7 @@ bitesize = 1 reagents_to_add = list(/decl/reagent/nutriment = 10) + //dips /obj/item/reagent_containers/food/snacks/dip name = "queso dip" @@ -4110,6 +4147,7 @@ reagent_data = list(/decl/reagent/nutriment = list("queso" = 20)) center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 20) + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/dip/attackby(obj/item/reagent_containers/food/snacks/item as obj, mob/user as mob) . = ..() @@ -4155,7 +4193,8 @@ icon_state = "dip_salsa" reagents_to_add = list(/decl/reagent/nutriment = 20) reagent_data = list(/decl/reagent/nutriment = list("salsa" = 20)) - + filling_color = "#FF4D36" + /obj/item/reagent_containers/food/snacks/dip/guac name = "guac dip" desc = "A recreation of the ancient Sol 'Guacamole' dip using tofu, limes, and spices. This recreation obviously leaves out mole meat." @@ -4164,6 +4203,7 @@ icon_state = "dip_guac" reagents_to_add = list(/decl/reagent/nutriment = 20) reagent_data = list(/decl/reagent/nutriment = list("guacmole" = 20)) + filling_color = "#35961D" //burritos /obj/item/reagent_containers/food/snacks/burrito @@ -4174,6 +4214,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 4) reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 6)) + filling_color = "#F06451" /obj/item/reagent_containers/food/snacks/burrito_vegan name = "vegan burrito" @@ -4192,6 +4233,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 6) reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 6)) + filling_color = "#F06451" /obj/item/reagent_containers/food/snacks/burrito_cheese name = "meat cheese burrito" @@ -4201,6 +4243,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 6) reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 6)) + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/burrito_cheese_spicy name = "spicy cheese meat burrito" @@ -4210,6 +4253,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 6) reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 6)) + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/burrito_hell name = "el diablo" @@ -4219,6 +4263,7 @@ center_of_mass = list("x"=16, "y"=16) reagent_data = list(/decl/reagent/nutriment = list("hellfire" = 6)) reagents_to_add = list(/decl/reagent/nutriment = 24)// 10 Chilis is a lot. + filling_color = "#F06451" /obj/item/reagent_containers/food/snacks/breakfast_wrap name = "breakfast wrap" @@ -4228,6 +4273,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 9, /decl/reagent/capsaicin/condensed = 20) //what could possibly go wrong reagent_data = list(/decl/reagent/nutriment = list("tortilla" = 6)) + filling_color = "#FFF454" /obj/item/reagent_containers/food/snacks/burrito_mystery name = "mystery meat burrito" @@ -4237,6 +4283,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 6) reagent_data = list(/decl/reagent/nutriment = list("regret" = 6)) + filling_color = "#B042FF" // Ligger food and also bacon /obj/item/reagent_containers/food/snacks/rawbacon @@ -4246,6 +4293,7 @@ icon_state = "rawbacon" bitesize = 1 center_of_mass = list("x"=16, "y"=16) + filling_color = "#FF3826" /obj/item/reagent_containers/food/snacks/bacon name = "bacon" @@ -4254,6 +4302,7 @@ icon_state = "bacon" bitesize = 2 center_of_mass = list("x"=16, "y"=16) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/bacon/oven name = "oven-cooked bacon" @@ -4263,6 +4312,7 @@ bitesize = 2 center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment/protein = 0.33, /decl/reagent/nutriment/triglyceride = 1) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/bacon/pan name = "pan-cooked bacon" @@ -4270,6 +4320,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "bacon" bitesize = 2 + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/chilied_eggs name = "chilied eggs" @@ -4277,6 +4328,7 @@ icon_state = "chilied_eggs" trash = /obj/item/trash/snack_bowl reagents_to_add = list(/decl/reagent/nutriment/protein/egg = 6, /decl/reagent/nutriment/protein = 2) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/hatchling_suprise name = "hatchling suprise" @@ -4284,22 +4336,23 @@ icon_state = "hatchling_suprise" trash = /obj/item/trash/snack_bowl reagents_to_add = list(/decl/reagent/nutriment/protein/egg = 2, /decl/reagent/nutriment/protein = 4) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/red_sun_special name = "red sun special" desc = "One lousey piece of sausage sitting on melted cheese curds. A cheap meal for the Unathi peasants of Moghes." icon_state = "red_sun_special" trash = /obj/item/trash/plate - reagents_to_add = list(/decl/reagent/nutriment/protein = 2) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/riztizkzi_sea name = "moghresian sea delight" desc = "Three raw eggs floating in a sea of blood. An authentic replication of an ancient Unathi delicacy." icon_state = "riztizkzi_sea" trash = /obj/item/trash/snack_bowl - reagents_to_add = list(/decl/reagent/nutriment/protein/egg = 4) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/father_breakfast name = "breakfast of champions" @@ -4307,12 +4360,14 @@ icon_state = "father_breakfast" trash = /obj/item/trash/plate reagents_to_add = list(/decl/reagent/nutriment/protein/egg = 4, /decl/reagent/nutriment/protein = 6) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/stuffed_meatball name = "stuffed meatball" //YES desc = "A meatball loaded with cheese." icon_state = "stuffed_meatball" reagents_to_add = list(/decl/reagent/nutriment/protein = 4) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/egg_pancake name = "meat pancake" @@ -4320,6 +4375,7 @@ icon_state = "egg_pancake" trash = /obj/item/trash/tray reagents_to_add = list(/decl/reagent/nutriment/protein = 6, /decl/reagent/nutriment/protein/egg = 2) + filling_color = "#FFFA6b" /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp name = "korlaaskak" @@ -4328,6 +4384,7 @@ slice_path = /obj/item/reagent_containers/food/snacks/grilled_carp_slice slices_num = 6 trash = /obj/item/trash/snacktray + filling_color = "#FFA8E5" reagents_to_add = list(/decl/reagent/nutriment/protein/seafood = 12) @@ -4336,6 +4393,7 @@ desc = "A well-dressed fillet of fish, seared to perfection and adorned with herbs and spices." icon_state = "grilled_carp_slice" trash = /obj/item/trash/plate + filling_color = "#FFA8E5" /obj/item/reagent_containers/food/snacks/sliceable/sushi_roll name = "ouerean fish log" @@ -4343,6 +4401,7 @@ icon_state = "sushi_roll" slice_path = /obj/item/reagent_containers/food/snacks/sushi_serve slices_num = 3 + filling_color = "#525252" reagents_to_add = list(/decl/reagent/nutriment/protein/seafood = 6) @@ -4350,6 +4409,7 @@ name = "ouerean fish cake" desc = "A serving of fish roll wrapped in special grass that combines unathi and human cooking techniques." icon_state = "sushi_serve" + filling_color = "#525252" /obj/item/reagent_containers/food/snacks/spreads name = "nutri-spread" @@ -4359,6 +4419,7 @@ center_of_mass = list("x"=16, "y"=16) reagents_to_add = list(/decl/reagent/nutriment = 20) reagent_data = list(/decl/reagent/nutriment = list("margarine" = 1)) + filling_color = "#FFFBB8" /obj/item/reagent_containers/food/snacks/spreads/butter name = "butter" @@ -4374,6 +4435,7 @@ desc = "A bacon wrapped boiled egg, conviently skewered on a wooden stick." icon_state = "bacon_stick" reagents_to_add = list(/decl/reagent/nutriment/protein = 3, /decl/reagent/nutriment/protein/egg = 1) + filling_color = "#FFFEE8" /obj/item/reagent_containers/food/snacks/cheese_cracker name = "supreme cheese toast" @@ -4381,13 +4443,15 @@ icon_state = "cheese_cracker" reagents_to_add = list(/decl/reagent/nutriment = 8) reagent_data = list(/decl/reagent/nutriment = list("cheese toast" = 8)) - + filling_color = "#FFF97D" + /obj/item/reagent_containers/food/snacks/bacon_and_eggs name = "bacon and eggs" desc = "A piece of bacon and two fried eggs." icon_state = "bacon_and_eggs" trash = /obj/item/trash/plate reagents_to_add = list(/decl/reagent/nutriment/protein = 3, /decl/reagent/nutriment/protein/egg = 1) + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/sweet_and_sour name = "sweet and sour pork" @@ -4396,6 +4460,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/protein = 3) reagent_data = list(/decl/reagent/nutriment = list("sweet and sour" = 6)) trash = /obj/item/trash/plate + filling_color = "#FC5647" /obj/item/reagent_containers/food/snacks/corn_dog name = "corn dog" @@ -4403,6 +4468,7 @@ icon_state = "corndog" reagents_to_add = list(/decl/reagent/nutriment = 4, /decl/reagent/nutriment/protein = 3) reagent_data = list(/decl/reagent/nutriment = list("corn batter" = 4)) + filling_color = "#FFF97D" /obj/item/reagent_containers/food/snacks/truffle name = "chocolate truffle" @@ -4410,6 +4476,7 @@ icon_state = "truffle" reagents_to_add = list(/decl/reagent/nutriment/coco = 6) bitesize = 4 + filling_color = "#9C6b1E" /obj/item/reagent_containers/food/snacks/truffle/random name = "mystery chocolate truffle" @@ -4426,6 +4493,7 @@ icon_state = "bacon_pizza" reagents_to_add = list(/decl/reagent/nutriment = 5, /decl/reagent/nutriment/protein = 5) reagent_data = list(/decl/reagent/nutriment = list("flatbread" = 5)) + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/meat_pocket name = "meat pocket" @@ -4433,6 +4501,7 @@ icon_state = "meat_pocket" reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein = 3) reagent_data = list(/decl/reagent/nutriment = list("flatbread" = 3)) + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/fish_taco name = "fish taco" @@ -4440,6 +4509,7 @@ icon_state = "fish_taco" reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein/seafood = 3) reagent_data = list(/decl/reagent/nutriment = list("flatbread" = 3)) + filling_color = "#FFF97D" /obj/item/reagent_containers/food/snacks/nt_muffin name = "\improper NtMuffin" @@ -4447,6 +4517,7 @@ icon_state = "nt_muffin" reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein = 5) reagent_data = list(/decl/reagent/nutriment = list("biscuit" = 3)) + filling_color = "#FFF97D" /obj/item/reagent_containers/food/snacks/pineapple_ring name = "pineapple ring" @@ -4454,6 +4525,7 @@ icon_state = "pineapple_ring" reagents_to_add = list(/decl/reagent/nutriment = 2, /decl/reagent/drink/pineapplejuice = 3) reagent_data = list(/decl/reagent/nutriment = list("sweetness" = 2)) + filling_color = "#FFF97D" /obj/item/reagent_containers/food/snacks/sliceable/pizza/pineapple name = "ham & pineapple pizza" @@ -4465,6 +4537,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 30, /decl/reagent/nutriment/protein = 4, /decl/reagent/nutriment/protein/cheese = 5, /decl/reagent/drink/tomatojuice = 6) reagent_data = list(/decl/reagent/nutriment = list("pizza crust" = 10, "tomato" = 10, "ham" = 10)) bitesize = 2 + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/pineappleslice name = "ham & pineapple pizza slice" @@ -4506,6 +4579,7 @@ desc_fluff = "Fishing and shellfish has a part in the diet of the population at the coastal areas, even if the ice can be an obstacle to most experienced fisherman. \ Spicy Ras'val clams, named after the sea, are a famous treat, being appreciated in other systems besides S'rand'marr." reagents_to_add = list(/decl/reagent/nutriment/protein/seafood = 2) + filling_color = "#FFE7C2" /obj/item/reagent_containers/food/snacks/spicy_clams name = "spicy Ras'val clams" @@ -4516,6 +4590,7 @@ desc_fluff = "Fishing and shellfish has a part in the diet of the population at the coastal areas, even if the ice can be an obstacle to most experienced fisherman. \ Spicy Ras'val clams, named after the sea, are a famous treat, being appreciated in other system besides S'rand'marr." reagents_to_add = list(/decl/reagent/nutriment/protein/seafood = 4, /decl/reagent/capsaicin = 1) + filling_color = "#FFE7C2" /obj/item/reagent_containers/food/snacks/tajaran_bread name = "adhomian bread" @@ -4526,6 +4601,7 @@ reagent_data = list(/decl/reagent/nutriment = list("bread" = 2)) desc_fluff = "While the People's republic territory includes several different regional cultures, it is possible to find common culinary traditions among its population. \ Bread, baked with flour produced from a variation of the Blizzard Ears, is considered an essential part of a worker's breakfast." + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/soup/earthenroot name = "earthen-root soup" @@ -4535,6 +4611,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 4) desc_fluff = "The Earth-Root soup is a common sight on the tables, of all social sectors, in the Northern Harr'masir. Prepared traditionally with water, Earth-Root and \ other plants, such as the Nif-Berries." + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/stew/tajaran name = "adhomian stew" @@ -4545,6 +4622,7 @@ reagent_data = list(/decl/reagent/nutriment = list("sweetness" = 2)) desc_fluff = "Traditional adhomian stews are made with diced vegetables, such as Nif-Berries, and meat, Snow Strider is commonly used by the rural population, while \ industrialized Fatshouters's beef is prefered by the city's inhabitants." + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/adhomian_can name = "canned fatshouters meat" @@ -4555,6 +4633,7 @@ desc_fluff = "While the People's republic territory includes several different regional cultures, it is possible to find common culinary traditions among its population. \ Salt-cured Fatshouters's meat also has been introduced widely, facilitated by the recent advances in the livestock husbandry techniques." reagents_to_add = list(/decl/reagent/nutriment/protein = 5, /decl/reagent/sodiumchloride = 2) + filling_color = "#D63C3C" /obj/item/reagent_containers/food/snacks/nomadskewer name = "nomad skewer" @@ -4672,6 +4751,7 @@ reagent_data = list(/decl/reagent/nutriment = list("savory butter" = 2)) bitesize = 2 trash = /obj/item/trash/plate + filling_color = "#FFA8E5" /obj/item/reagent_containers/food/snacks/banana_split name = "banana split" @@ -4682,6 +4762,7 @@ reagent_data = list(/decl/reagent/nutriment = list("icecream" = 2)) bitesize = 2 trash = /obj/item/trash/snack_bowl + filling_color = "#F7F786" /obj/item/reagent_containers/food/snacks/tuna name = "\improper Tuna Snax" @@ -4809,6 +4890,7 @@ throw_range = 5 throwforce = 10 w_class = ITEMSIZE_NORMAL + filling_color = "#BD8939" desc_fluff = "The adhomian hard bread is type of tajaran bread, made from Blizzard Ears's flour, water and spice, usually basked in the shape of a loaf. \ It is known for its hard crust, bland taste and for being long lasting. The hard bread was usually prepared for long journeys, hard winters or military campaigns, \ due to its shelf life. Certain folk stories and jokes claim that such food could also be used as an artillery ammunition or thrown at besieging armies during sieges." @@ -4831,6 +4913,7 @@ bitesize = 1 reagents_to_add = list(/decl/reagent/nutriment = 26) unitname = "candy" + filling_color = "#FCA03D" /obj/item/reagent_containers/food/snacks/chipplate/tajcandy/update_icon() switch(reagents.total_volume) @@ -4856,6 +4939,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 1, /decl/reagent/sugar = 3) reagent_data = list(/decl/reagent/nutriment = list("candy" = 3)) bitesize = 1 + filling_color = "#FCA03D" /obj/item/reagent_containers/food/snacks/lardwich name = "hro'zamal lard sandwhich" @@ -4864,6 +4948,7 @@ reagent_data = list(/decl/reagent/nutriment = list("bread" = 2)) reagents_to_add = list(/decl/reagent/nutriment = 6, /decl/reagent/nutriment/triglyceride = 5) bitesize = 2 + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/explorer_ration name = "m'sai scout ration" @@ -4873,6 +4958,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 4, /decl/reagent/nutriment/protein = 6 , /decl/reagent/nutriment/triglyceride = 5) bitesize = 1 var/wrap = TRUE + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/explorer_ration/update_icon() if(wrap) @@ -4898,6 +4984,7 @@ icon_state = "dionaestew" reagent_data = list(/decl/reagent/nutriment = list("diona delicacy" = 5)) reagents_to_add = list(/decl/reagent/nutriment = 8, /decl/reagent/drink/carrotjuice = 2, /decl/reagent/drink/potatojuice = 2, /decl/reagent/radium = 2) + filling_color = "#BD8939" /obj/item/reagent_containers/food/snacks/diona_bites name = "dionae bites" @@ -4907,3 +4994,4 @@ reagents_to_add = list(/decl/reagent/nutriment = 6) trash = /obj/item/trash/diona_bites bitesize = 3 + filling_color = "#BD8939" diff --git a/code/modules/research/designs/protolathe/modular_gun_designs.dm b/code/modules/research/designs/protolathe/modular_gun_designs.dm index aa9e32ff51b..ef25415e8e8 100644 --- a/code/modules/research/designs/protolathe/modular_gun_designs.dm +++ b/code/modules/research/designs/protolathe/modular_gun_designs.dm @@ -242,4 +242,9 @@ /datum/design/item/modular_weapon/modular_net req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4, TECH_ILLEGAL = 4) materials = list(DEFAULT_WALL_MATERIAL = 5000, MATERIAL_GLASS = 1000, MATERIAL_PHORON = 3000) - build_path = /obj/item/laser_components/modulator/net \ No newline at end of file + build_path = /obj/item/laser_components/modulator/net + +/datum/design/item/modular_weapon/freezing_ray + req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 5, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MATERIAL_GLASS = 1000, MATERIAL_URANIUM = 500) + build_path = /obj/item/laser_components/modulator/freeze \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 1453c0f98ec..5e43f69928a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,37 @@ -->