diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm
index afe6c059d6d..95575387fbe 100644
--- a/code/datums/recipe.dm
+++ b/code/datums/recipe.dm
@@ -34,108 +34,88 @@
* */
/datum/recipe
- var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
- var/list/items // example: = list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
- var/list/fruit // example: = list("fruit" = 3)
- var/result // example: = /obj/item/weapon/reagent_containers/food/snacks/donut
- var/time = 100 // 1/10 part of second
+ var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
+ var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
+ var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut
+ var/time = 100 // 1/10 part of second
var/byproduct // example: = /obj/item/weapon/kitchen/mould // byproduct to return, such as a mould or trash
-
/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
. = 1
- for(var/r_r in reagents)
+ for (var/r_r in reagents)
var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
- if(!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
- if(aval_r_amnt>reagents[r_r])
+ if (!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
+ if (aval_r_amnt>reagents[r_r])
. = -1
else
return 0
- if((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
+ if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
return -1
return .
-/datum/recipe/proc/check_fruit(obj/container)
+/datum/recipe/proc/check_items(obj/container) //1=precisely, 0=insufficiently, -1=superfluous
+ if (!items)
+ if (locate(/obj/) in container)
+ return -1
+ else
+ return 1
. = 1
- if(fruit && fruit.len)
- var/list/checklist = list()
- // You should trust Copy().
- checklist = fruit.Copy()
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in container)
- if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag]))
- continue
- checklist[G.seed.kitchen_tag]--
- for(var/ktag in checklist)
- if(!isnull(checklist[ktag]))
- if(checklist[ktag] < 0)
- . = 0
- else if(checklist[ktag] > 0)
- . = -1
- break
- return .
-
-/datum/recipe/proc/check_items(obj/container)
- . = 1
- if(items && items.len)
- var/list/checklist = list()
- checklist = items.Copy() // You should really trust Copy
- for(var/obj/O in container)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown))
- continue // Fruit is handled in check_fruit().
- var/found = 0
- for(var/i = 1; i < checklist.len+1; i++)
- var/item_type = checklist[i]
- if(istype(O,item_type))
- checklist.Cut(i, i+1)
- found = 1
- break
- if(!found)
- . = 0
- if(checklist.len)
+ var/list/checklist = items.Copy()
+ for (var/obj/O in container)
+ var/found = 0
+ for (var/type in checklist)
+ if (istype(O,type))
+ checklist-=type
+ found = 1
+ break
+ if (!found)
. = -1
+ if (checklist.len)
+ return 0
return .
//general version
/datum/recipe/proc/make(obj/container)
var/obj/result_obj = new result(container)
- for(var/obj/O in (container.contents-result_obj))
+ for (var/obj/O in (container.contents-result_obj))
O.reagents.trans_to(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
- score_meals++
return result_obj
// food-related
/datum/recipe/proc/make_food(obj/container)
var/obj/result_obj = new result(container)
- for(var/obj/O in (container.contents-result_obj))
- if(O.reagents)
+ for (var/obj/O in (container.contents-result_obj))
+ if (O.reagents)
O.reagents.del_reagent("nutriment")
O.reagents.update_total()
O.reagents.trans_to(result_obj, O.reagents.total_volume)
qdel(O)
container.reagents.clear_reagents()
- score_meals++
return result_obj
-/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1)
- if(!exact)
+/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1 as num)
+ if (!exact)
exact = -1
var/list/datum/recipe/possible_recipes = new
- for(var/datum/recipe/recipe in avaiable_recipes)
- if(recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact && recipe.check_fruit(obj)==exact)
+ for (var/datum/recipe/recipe in avaiable_recipes)
+ if (recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact)
possible_recipes+=recipe
- if(possible_recipes.len==0)
+ if (possible_recipes.len==0)
return null
- else if(possible_recipes.len==1)
+ else if (possible_recipes.len==1)
return possible_recipes[1]
else //okay, let's select the most complicated recipe
- var/highest_count = 0
+ var/r_count = 0
+ var/i_count = 0
. = possible_recipes[1]
- for(var/datum/recipe/recipe in possible_recipes)
- var/count = ((recipe.items)?(recipe.items.len):0) + ((recipe.reagents)?(recipe.reagents.len):0) + ((recipe.fruit)?(recipe.fruit.len):0)
- if(count >= highest_count)
- highest_count = count
+ for (var/datum/recipe/recipe in possible_recipes)
+ var/N_i = (recipe.items)?(recipe.items.len):0
+ var/N_r = (recipe.reagents)?(recipe.reagents.len):0
+ if (N_i > i_count || (N_i== i_count && N_r > r_count ))
+ r_count = N_r
+ i_count = N_i
. = recipe
return .
@@ -149,7 +129,4 @@
var/count = 0
if(items && items.len)
count += items.len
- if(fruit && fruit.len)
- for(var/ktag in fruit)
- count += fruit[ktag]
- return count
+ return count
\ No newline at end of file
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 2c5b9375918..d54311921fd 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -305,7 +305,7 @@ var/list/uplink_items = list()
name = "Ambrosia Cruciatus Seeds"
desc = "Part of the notorious Ambrosia family, this species is nearly indistinguishable from Ambrosia Vulgaris- but its' branches contain a revolting toxin. Eight units are enough to drive victims insane."
reference = "BRO"
- item = /obj/item/seeds/ambrosiavulgarisseed/cruciatus
+ item = /obj/item/seeds/ambrosia/cruciatus
cost = 2
job = list("Botanist")
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 5c82d07452c..546db62032c 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -128,7 +128,7 @@
/obj/item/stack/tape_roll = 10,
////////////////CONTRABAND STUFF//////////////////
/obj/item/weapon/grenade/clown_grenade = 3,
- /obj/item/seeds/ambrosiavulgarisseed/cruciatus = 3,
+ /obj/item/seeds/ambrosia/cruciatus = 3,
/obj/item/weapon/gun/projectile/automatic/pistol/empty = 1,
/obj/item/ammo_box/magazine/m10mm = 4,
/obj/item/weapon/soap/syndie = 7,
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 2c6d04b9c06..0bfb45e1151 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -152,32 +152,6 @@
icon_state = "burnkit"
heal_burn = 25
-
-
-//Medical Herbs//
-
-
-/obj/item/stack/medical/bruise_pack/comfrey
- name = "\improper Comfrey leaf"
- singular_name = "Comfrey leaf"
- desc = "A soft leaf that is rubbed on bruises."
- icon = 'icons/obj/hydroponics_products.dmi'
- icon_state = "alien3-product"
- color = "#378C61"
- heal_brute = 12
-
-
-/obj/item/stack/medical/ointment/aloe
- name = "\improper Aloe Vera leaf"
- singular_name = "Aloe Vera leaf"
- desc = "A cold leaf that is rubbed on burns."
- icon = 'icons/obj/hydroponics_products.dmi'
- icon_state = "ambrosia-product"
- color = "#4CC5C7"
- heal_burn = 12
-
-
-
//Splits//
diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm
index 8a15bc7f517..7d2b718da82 100644
--- a/code/game/objects/items/weapons/bee_briefcase.dm
+++ b/code/game/objects/items/weapons/bee_briefcase.dm
@@ -46,13 +46,10 @@
to_chat(user, "The buzzing inside the briefcase swells momentarily, then returns to normal. Guess it was too cramped...")
S.reagents.clear_reagents()
S.update_icon()
- else if(istype(I, /obj/item/weapon/plantspray))
- var/obj/item/weapon/plantspray/PS = I
- user.drop_item(PS)
- bees_left = max(0, (bees_left - PS.pest_kill_str))
- to_chat(user, "You spray [PS] into \the [src].")
+ else if(istype(I, /obj/item/weapon/reagent_containers/spray/pestspray))
+ bees_left = max(0, (bees_left - 6))
+ to_chat(user, "You spray [I] into [src].")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- qdel(PS)
/obj/item/weapon/bee_briefcase/attack_self(mob/user as mob)
if(!bees_left)
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 183f07bb21c..069bf06ddfb 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -152,6 +152,17 @@
origin_tech = "materials=2;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+/obj/item/weapon/kitchen/knife/carrotshiv
+ name = "carrot shiv"
+ icon_state = "carrotshiv"
+ item_state = "carrotshiv"
+ desc = "Unlike other carrots, you should probably keep this far away from your eyes."
+ force = 8
+ throwforce = 12 //fuck git
+ materials = list()
+ origin_tech = "biotech=3;combat=2"
+ attack_verb = list("shanked", "shivved")
+
/*
* Rolling Pins
*/
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 288dcfcd9c5..e86a08c9f4a 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -6,7 +6,6 @@
var/time = 30 //time in deciseconds
var/parts[] = list() //type paths of items that will be placed in the result
var/chem_catalists[] = list() //like tools but for reagents
- var/fruit[] = list() //grown products required by the recipe
var/category = CAT_MISC // Recipe category
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 13929b95c4c..5d626284fad 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -283,8 +283,7 @@
/datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder)
if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder))
- var/obj/structure/alien/resin/flower_bud_enemy/FBE = new /obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
- FBE.layer = holder.layer+0.1
+ new /obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
/datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
if(prob(25))
@@ -337,8 +336,8 @@
KZ.production = (master.spread_cap / initial(master.spread_cap)) * 5
mutations = list()
set_opacity(0)
- if(has_buckled_mobs())
- unbuckle_all_mobs(force=1)
+ if(buckled_mob)
+ unbuckle_mob()
return ..()
/obj/effect/spacevine/proc/on_chem_effect(datum/reagent/R)
@@ -500,7 +499,6 @@
icon_state = pick("Med1", "Med2", "Med3")
energy = 1
set_opacity(1)
- layer = 5
else
icon_state = pick("Hvy1", "Hvy2", "Hvy3")
energy = 2
@@ -509,10 +507,10 @@
SM.on_grow(src)
/obj/effect/spacevine/proc/entangle_mob()
- if(!has_buckled_mobs() && prob(25))
+ if(!buckled_mob && prob(25))
for(var/mob/living/V in loc)
entangle(V)
- if(has_buckled_mobs())
+ if(buckled_mob)
break //only capture one mob at a time
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
index c6b88b78c6c..81974b39c0e 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
@@ -213,12 +213,7 @@
for(var/i = 1, i <= slots.len, i++)
var/obj/item/O = slots[i]
if(istype(O, recipe.ingredients[i]))
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
- if(G.seed && G.seed.kitchen_tag == recipe.tags[i])
- number_matches++
- else
- number_matches++
+ number_matches++
if(number_matches == 3)
return recipe
return null
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm b/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm
index be7504afade..d79e93cb9cc 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler_recipes.dm
@@ -3,7 +3,6 @@
var/name = ""
var/description = ""
var/list/ingredients[3]
- var/list/tags[3]
var/datum/reagent/result = null
@@ -12,12 +11,10 @@
name = "Example"
description = "This is an example."
ingredients = list(thing_1, thing_2, thing_3)
- tags = list(null, "tag_2", null)
result = "water"
The ingredients list must have 3 non-null entries.
-The tags list must have 3 entries, using null where a tag is unused.
-Failing to ensure both lists have EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
+Failing to ensure the list has EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
There is no excuse to do this wrong now that there is an example for you. --FalseIncarnate
*/
diff --git a/code/modules/food_and_drinks/food/meat.dm b/code/modules/food_and_drinks/food/meat.dm
index 4635f6eb9b1..19d8307c906 100644
--- a/code/modules/food_and_drinks/food/meat.dm
+++ b/code/modules/food_and_drinks/food/meat.dm
@@ -44,4 +44,12 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/ham
name = "Ham"
desc = "Taste like bacon."
- list_reagents = list("protein" = 3, "porktonium" = 10)
\ No newline at end of file
+ list_reagents = list("protein" = 3, "porktonium" = 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/meat/meatwheat
+ name = "meatwheat clump"
+ desc = "This doesn't look like meat, but your standards aren't that high to begin with."
+ list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5)
+ filling_color = rgb(150, 0, 0)
+ icon_state = "meatwheat_clump"
+ bitesize = 4
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 1802fd0fce1..df02249c3d1 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -27,12 +27,8 @@
user.visible_message("[user] finishes eating \the [src].")
user.unEquip(src) //so icons update :[
Post_Consume(M)
- if(trash)
- if(ispath(trash,/obj/item))
- var/obj/item/TrashItem = new trash(user)
- user.put_in_hands(TrashItem)
- else if(istype(trash,/obj/item))
- user.put_in_hands(trash)
+ var/obj/item/trash_item = generate_trash(usr)
+ usr.put_in_hands(trash_item)
qdel(src)
return
@@ -175,6 +171,19 @@
return
+/obj/item/weapon/reagent_containers/food/snacks/proc/generate_trash(atom/location)
+ if(trash)
+ if(ispath(trash, /obj/item))
+ . = new trash(location)
+ trash = null
+ return
+ else if(istype(trash, /obj/item))
+ var/obj/item/trash_item = trash
+ trash_item.forceMove(location)
+ . = trash
+ trash = null
+ return
+
/obj/item/weapon/reagent_containers/food/snacks/Destroy()
if(contents)
for(var/atom/movable/something in contents)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 73607d4e3ab..d9b98c82724 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -48,11 +48,7 @@
return 0
for(var/Type in subtypesof(/datum/deepfryer_special))
var/datum/deepfryer_special/P = new Type()
- if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I
- if(G.seed.kitchen_tag != P.input)
- continue
- else if(!istype(I, P.input))
+ if(!istype(I, P.input))
continue
return P
return 0
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index ef7591e3955..5bae15b6b35 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -45,7 +45,7 @@
acceptable_items |= item
for(var/reagent in recipe.reagents)
acceptable_reagents |= reagent
- if(recipe.items || recipe.fruit)
+ if(recipe.items)
max_n_of_items = max(max_n_of_items,recipe.count_n_items())
else
qdel(recipe)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 5183fe6a4fa..8a4a154ea3d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -142,14 +142,10 @@
//END RECIPE DATUMS
-/obj/machinery/processor/proc/select_recipe(var/X)
+/obj/machinery/processor/proc/select_recipe(X)
for(var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob)
var/datum/food_processor_process/P = new Type()
- if(istype(X, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = X
- if(G.seed.kitchen_tag != P.input)
- continue
- else if(!istype(X, P.input))
+ if(!istype(X, P.input))
continue
return P
return 0
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 9af1c4869a0..c8810b3078e 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -14,9 +14,16 @@
/mob/living/simple_animal/hostile/poison/bees/bee_friendly()
return 1
+/mob/living/simple_animal/bot/bee_friendly()
+ if(paicard)
+ return 0
+ return 1
+
+/mob/living/simple_animal/diona/bee_friendly()
+ return 1
/mob/living/carbon/human/bee_friendly()
- if(dna && dna.species && dna.species.id == "pod") //bees pollinate plants, duh.
+ if(get_species() == "Diona") //bees pollinate plants, duh.
return 1
if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL)))
return 1
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index b3ee983459b..208d76fd2a2 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -237,7 +237,7 @@
update_genes()
update_icon()
else
- var/obj/item/I = usr.get_active_held_item()
+ var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/seeds))
if(!usr.drop_item())
return
@@ -251,7 +251,7 @@
disk = null
update_genes()
else
- var/obj/item/I = usr.get_active_held_item()
+ var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/weapon/disk/plantgene))
if(!usr.drop_item())
return
@@ -383,7 +383,7 @@
..()
if(istype(W, /obj/item/weapon/pen))
var/t = stripped_input(user, "What would you like the label to be?", name, null)
- if(user.get_active_held_item() != W)
+ if(user.get_active_hand() != W)
return
if(!in_range(src, user) && loc != user)
return
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index 554cba9f47e..95132f9ee1f 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -74,3 +74,13 @@
origin_tech = "biotech=6;materials=5"
light_range = 3
seed = /obj/item/seeds/ambrosia/gaia
+
+// Ambrosia Cruciatus
+/obj/item/seeds/ambrosia/cruciatus
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/cruciatus
+ potency = 10
+ mutatelist = list()
+ reagents_add = list("thc" = 0.15, "silver_sulfadiazine" = 0.15, "styptic_powder" = 0.1, "bath salts" = 0.20, "plantmatter" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/cruciatus
+ seed = /obj/item/seeds/ambrosia/cruciatus
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index fc9e01b2372..03f032111f3 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -25,7 +25,7 @@
bitesize = 5
/obj/item/weapon/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
- user.visible_message("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] is aiming the [src.name] at themself! It looks like \he's trying to commit suicide.")
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
sleep(25)
if(!user)
@@ -49,7 +49,7 @@
throw_range = 7
/obj/item/weapon/grown/bananapeel/suicide_act(mob/user)
- user.visible_message("[user] is deliberately slipping on [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like \he's trying to commit suicide.")
playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1)
return (BRUTELOSS)
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
index 66c5a17a841..fd5ea080ca3 100644
--- a/code/modules/hydroponics/grown/cereals.dm
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -83,7 +83,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user)
user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.")
playsound(user, 'sound/effects/blobattack.ogg', 50, 1)
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatwheat/M = new(get_turf(user))
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/meatwheat/M = new(get_turf(user))
user.drop_item()
qdel(src)
user.put_in_hands(M)
diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm
index 80d5089108d..81067dd17c0 100644
--- a/code/modules/hydroponics/grown/chili.dm
+++ b/code/modules/hydroponics/grown/chili.dm
@@ -74,22 +74,4 @@
var/mob/held_mob
filling_color = "#F8F8FF"
bitesize_mod = 4
- origin_tech = "biotech=4;magnets=5"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user)
- ..()
- if(ismob(loc))
- held_mob = loc
- processing_objects.Add(src)
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/process()
- if(held_mob && loc == held_mob)
- if(held_mob.is_holding(src))
- if(hasvar(held_mob,"gloves") && held_mob:gloves)
- return
- held_mob.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(10))
- to_chat(held_mob, "Your hand holding [src] burns!")
- else
- held_mob = null
- ..()
+ origin_tech = "biotech=4;magnets=5"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index c7715a8bee3..f113074911c 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -43,10 +43,8 @@
GT = new stacktype(user.loc)
GT.amount = grassAmt
for(var/obj/item/stack/tile/T in user.loc)
- if((T.type == stacktype) && (T.amount < T.max_amount))
- GT.merge(T)
- if(GT.amount <= 0)
- break
+ if((T.type == stacktype) && (T.amount < T.max_amount) && (T != GT))
+ T.attackby(GT, user)
qdel(src)
return
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index 5f9e596c828..a09e83ae955 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -22,7 +22,7 @@
return S
/obj/item/seeds/kudzu/suicide_act(mob/user)
- user.visible_message("[user] swallows the pack of kudzu seeds! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] swallows the pack of kudzu seeds! It looks like \he's trying to commit suicide..")
plant(user)
return (BRUTELOSS)
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 33d506a8c0d..7e9d318093c 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -44,24 +44,26 @@
attack_verb = list("stung")
/obj/item/weapon/grown/nettle/suicide_act(mob/user)
- user.visible_message("[user] is eating some of [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide.")
return (BRUTELOSS|TOXLOSS)
/obj/item/weapon/grown/nettle/pickup(mob/living/user)
..()
- if(!iscarbon(user))
+ if(!ishuman(user))
return 0
- var/mob/living/carbon/C = user
- if(C.gloves)
+ var/mob/living/carbon/human/H = user
+ if(H.gloves)
return 0
- var/hit_zone = (C.held_index_to_dir(C.active_hand_index) == "l" ? "l_":"r_") + "arm"
- var/obj/item/bodypart/affecting = C.get_bodypart(hit_zone)
+ var/organ = ((H.hand ? "l_":"r_") + "arm")
+ var/obj/item/organ/external/affecting = H.get_organ(organ)
if(affecting)
- if(affecting.receive_damage(0, force))
- C.update_damage_overlays()
- to_chat(C, "The nettle burns your bare hand!")
+ if(affecting.take_damage(0, force))
+ H.UpdateDamageIcon()
+ to_chat(H, "The nettle burns your bare hand!")
return 1
+
+
/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity)
if(!proximity) return
if(force > 0)
@@ -104,7 +106,7 @@
to_chat(M, "You are stunned by the powerful acid of the Deathnettle!")
add_logs(user, M, "attacked", src)
- M.adjust_blurriness(force/7)
+ M.AdjustEyeBlurry(force/7)
if(prob(20))
M.Paralyse(force / 6)
M.Weaken(force / 15)
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 3eb6fb3a890..710d92dfe49 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -6,7 +6,7 @@
icon_state = "seed-replicapod"
species = "replicapod"
plantname = "Replica Pod"
- product = /mob/living/carbon/human //verrry special -- Urist
+ product = /mob/living/carbon/human/diona //verrry special -- Urist
lifespan = 50
endurance = 8
maturation = 10
@@ -35,12 +35,12 @@
features = bloodSample.data["features"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
- user << "You inject the contents of the syringe into the seeds."
+ to_chat(user, "You inject the contents of the syringe into the seeds.")
contains_sample = 1
else
- user << "The seeds reject the sample!"
+ to_chat(user, "The seeds reject the sample!")
else
- user << "The seeds already contain a genetic sample!"
+ to_chat(user, "The seeds already contain a genetic sample!")
else
return ..()
@@ -66,30 +66,22 @@
else
if(M.ckey == ckey && M.stat == DEAD && !M.suiciding)
make_podman = 1
- if(isliving(M))
- var/mob/living/L = M
- make_podman = !L.hellbound
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in player_list)
- if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding)
+ if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == DEAD && !M.suiciding)
if(isobserver(M))
var/mob/dead/observer/O = M
if(!O.can_reenter_corpse)
break
make_podman = 1
- if(isliving(M))
- var/mob/living/L = M
- make_podman = !L.hellbound
ckey_holder = M.ckey
break
if(make_podman) //all conditions met!
- var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
+ var/mob/living/carbon/human/diona/podman = new /mob/living/carbon/human/diona(parent.loc)
if(realName)
podman.real_name = realName
- else
- podman.real_name = "Pod Person [rand(0,999)]"
mind.transfer_to(podman)
if(ckey)
podman.ckey = ckey
@@ -97,10 +89,6 @@
podman.ckey = ckey_holder
podman.gender = blood_gender
podman.faction |= factions
- if(!features["mcolor"])
- features["mcolor"] = "#59CE00"
- podman.hardset_dna(null,null,podman.real_name,blood_type,/datum/species/pod,features)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman
- podman.set_cloned_appearance()
else //else, one packet of seeds. maybe two
var/seed_count = 1
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 144115303c6..0af7d6d0732 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -52,7 +52,7 @@
/obj/item/weapon/grown/log/attackby(obj/item/weapon/W, mob/user, params)
- if(W.sharpness)
+ if(is_sharp(W))
user.show_message("You make [plank_name] out of \the [src]!", 1)
var/obj/item/stack/plank = new plank_type(user.loc, 1 + round(seed.potency / 25))
var/old_plank_amount = plank.amount
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index cc47dcccee0..64d2eff90b7 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -58,7 +58,4 @@
if(!..()) //was it caught by a mob?
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
- T.on_throw_impact(src, hit_atom)
-
-/obj/item/weapon/grown/microwave_act(obj/machine/microwave/M)
- return
\ No newline at end of file
+ T.on_throw_impact(src, hit_atom)
\ No newline at end of file
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index ea1977caeb7..8c85469c26d 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -33,7 +33,7 @@
reagents.add_reagent("weedkiller", 100)
/obj/item/weapon/reagent_containers/spray/weedspray/suicide_act(mob/user)
- user.visible_message("[user] is huffing [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.")
return (TOXLOSS)
/obj/item/weapon/reagent_containers/spray/pestspray // -- Skie
@@ -55,7 +55,7 @@
reagents.add_reagent("pestkiller", 100)
/obj/item/weapon/reagent_containers/spray/pestspray/suicide_act(mob/user)
- user.visible_message("[user] is huffing [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.")
return (TOXLOSS)
/obj/item/weapon/cultivator
@@ -92,10 +92,17 @@
edge = 1
/obj/item/weapon/hatchet/suicide_act(mob/user)
- user.visible_message("[user] is chopping at [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.visible_message("[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide.")
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return (BRUTELOSS)
+/obj/item/weapon/hatchet/unathiknife
+ name = "duelling knife"
+ desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "unathiknife"
+ attack_verb = list("ripped", "torn", "cut")
+
/obj/item/weapon/scythe
icon_state = "scythe0"
name = "scythe"
@@ -113,13 +120,13 @@
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/scythe/suicide_act(mob/user)
- user.visible_message("[user] is beheading [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- var/obj/item/bodypart/BP = C.get_bodypart("head")
- if(BP)
- BP.drop_limb()
- playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
+ user.visible_message("[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.droplimb(1, DROPLIMB_EDGE)
+ playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
return (BRUTELOSS)
// *************************************
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 5a2355df43d..b8b1e2346cc 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -313,10 +313,10 @@
/datum/plant_gene/trait/noreact/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
..()
- G.reagents.set_reacting(FALSE)
+ G.flags |= NOREACT
/datum/plant_gene/trait/noreact/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
- G.reagents.set_reacting(TRUE)
+ G.flags &= ~NOREACT
G.reagents.handle_reactions()
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index cce6c19c5e4..8b4a619b740 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -127,7 +127,7 @@
for(var/obj/machinery/hydroponics/tester in view(12,src))
considered[tester] = 1
- if(!tester.seed)
+ if(!tester.myseed)
considered[tester] += 50
if(tester.weedlevel > 0)
considered[tester] += 5
@@ -154,7 +154,7 @@
else
if(HP.harvest || HP.dead)
HP.attack_hand(src)
- else if(!HP.seed)
+ else if(!HP.myseed)
var/obj/item/seeds/SEED = new /obj/item/seeds/random(src)
custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] towards [TARGET], producing a [SEED]!")
HP.attackby(SEED, src)
@@ -403,26 +403,6 @@
ingredients += I
I.forceMove(null)
- for(var/P in R.fruit)
- for(var/i = 1 to R.fruit[P])
- var/obj/item/I = locate(P) in allContents
- if(I)
- ingredients += I
- I.forceMove(null)
- continue
-
- I = locate(P) in rangeCheck
- TARGET = I
- if(I && !Adjacent(I))
- tryWalk(get_turf(I))
- sleep(get_dist(src, I))
- if(!I || !(I in rangeCheck))
- refundrecipe(ingredients)
- return 0
- custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], picking up [I].")
- ingredients += I
- I.forceMove(null)
-
// cheaply cook the ingredients into result
sleep(R.time)
for(var/obj/I in ingredients)
@@ -579,8 +559,8 @@
var/highest_count = 0
var/datum/recipe/winner = null
for(var/datum/recipe/R in available_recipes)
- if(R.check_items(ingredientZone) >= 0 && R.check_fruit(ingredientZone) >= 0)
- var/count = (R.items ? R.items.len : 0) + (R.fruit ? R.fruit.len : 0)
+ if(R.check_items(ingredientZone) >= 0)
+ var/count = (R.items ? R.items.len : 0)
if(count > highest_count)
highest_count = count
winner = R
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 534ec607e6e..b1b31461b77 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -158,6 +158,7 @@
icon_living = "chick"
icon_dead = "chick_dead"
icon_gib = "chick_gib"
+ gender = FEMALE
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
emote_hear = list("cheeps")
@@ -201,9 +202,10 @@ var/global/chicken_count = 0
/mob/living/simple_animal/chicken
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
- icon_state = "chicken"
- icon_living = "chicken"
- icon_dead = "chicken_dead"
+ gender = FEMALE
+ icon_state = "chicken_brown"
+ icon_living = "chicken_brown"
+ icon_dead = "chicken_brown_dead"
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
speak_emote = list("clucks","croons")
emote_hear = list("clucks")
@@ -212,62 +214,68 @@ var/global/chicken_count = 0
speak_chance = 2
turns_per_move = 3
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 2)
+ var/egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg
+ var/food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/wheat
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
attacktext = "kicks"
- health = 10
- maxHealth = 10
+ health = 15
+ maxHealth = 15
+ ventcrawler = 2
var/eggsleft = 0
- var/chicken_color
+ var/eggsFertile = TRUE
+ var/body_color
+ var/icon_prefix = "chicken"
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
can_hide = 1
can_collar = 1
+ var/list/feedMessages = list("It clucks happily.","It clucks happily.")
+ var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
+ var/list/validColors = list("brown","black","white")
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/chicken/New()
..()
- if(!chicken_color)
- chicken_color = pick( list("brown","black","white") )
- icon_state = "chicken_[chicken_color]"
- icon_living = "chicken_[chicken_color]"
- icon_dead = "chicken_[chicken_color]_dead"
+ if(!body_color)
+ body_color = pick(validColors)
+ icon_state = "[icon_prefix]_[body_color]"
+ icon_living = "[icon_prefix]_[body_color]"
+ icon_dead = "[icon_prefix]_[body_color]_dead"
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
chicken_count += 1
/mob/living/simple_animal/chicken/death(gibbed)
- ..()
+ ..(gibbed)
chicken_count -= 1
-/mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) //feedin' dem chickens
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
- if(G.seed.kitchen_tag == "wheat")
- if(!stat && eggsleft < 8)
- user.visible_message("\blue [user] feeds [O] to [name]! It clucks happily.","\blue You feed [O] to [name]! It clucks happily.")
- user.drop_item()
- qdel(O)
- eggsleft += rand(1, 4)
-// to_chat(world, eggsleft)
- else
- to_chat(user, "\blue [name] doesn't seem hungry!")
+/mob/living/simple_animal/chicken/attackby(obj/item/O, mob/user, params)
+ if(istype(O, food_type)) //feedin' dem chickens
+ if(!stat && eggsleft < 8)
+ var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]"
+ user.visible_message(feedmsg)
+ user.drop_item()
+ qdel(O)
+ eggsleft += rand(1, 4)
+ //world << eggsleft
else
- to_chat(user, "\blue [name] doesn't seem interested in [O]!")
+ to_chat(user, "[name] doesn't seem hungry!")
else
..()
/mob/living/simple_animal/chicken/Life()
. = ..()
- if(. && prob(3) && eggsleft > 0)
- visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
+ if((. && prob(3) && eggsleft > 0) && egg_type)
+ visible_message("[src] [pick(layMessage)]")
eggsleft--
- var/obj/item/weapon/reagent_containers/food/snacks/egg/E = new(get_turf(src))
+ var/obj/item/E = new egg_type(get_turf(src))
E.pixel_x = rand(-6,6)
E.pixel_y = rand(-6,6)
- if(chicken_count < MAX_CHICKENS && prob(10))
- processing_objects.Add(E)
+ if(eggsFertile)
+ if(chicken_count < MAX_CHICKENS && prob(25))
+ processing_objects.Add(E)
/obj/item/weapon/reagent_containers/food/snacks/egg/var/amount_grown = 0
/obj/item/weapon/reagent_containers/food/snacks/egg/process()
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
new file mode 100644
index 00000000000..3033cdfc21e
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -0,0 +1,116 @@
+
+
+/obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures
+ name = "flower bud"
+ desc = "A large pulsating plant..."
+ icon = 'icons/effects/spacevines.dmi'
+ icon_state = "flower_bud"
+ layer = MOB_LAYER + 0.9
+ opacity = 0
+ canSmoothWith = list()
+ smooth = SMOOTH_FALSE
+ var/growth_time = 1200
+
+/obj/structure/alien/resin/flower_bud_enemy/New()
+ ..()
+ var/list/anchors = list()
+ anchors += locate(x-2,y+2,z)
+ anchors += locate(x+2,y+2,z)
+ anchors += locate(x-2,y-2,z)
+ anchors += locate(x+2,y-2,z)
+
+ for(var/turf/T in anchors)
+ var/datum/beam/B = Beam(T, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
+ B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow)
+ addtimer(src, "bear_fruit", growth_time)
+
+/obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit()
+ visible_message("the plant has borne fruit!")
+ new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src))
+ qdel(src)
+
+
+/obj/effect/ebeam/vine
+ name = "thick vine"
+ mouse_opacity = 1
+ desc = "A thick vine, painful to the touch."
+
+
+/obj/effect/ebeam/vine/Crossed(atom/movable/AM)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(!("vines" in L.faction))
+ L.adjustBruteLoss(5)
+ to_chat(L, "You cut yourself on the thorny vines.")
+
+
+
+/mob/living/simple_animal/hostile/venus_human_trap
+ name = "venus human trap"
+ desc = "Now you know how the fly feels."
+ icon_state = "venus_human_trap"
+ layer = MOB_LAYER + 0.9
+ health = 50
+ maxHealth = 50
+ ranged = 1
+ harm_intent_damage = 5
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ a_intent = I_HARM
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 0
+ faction = list("hostile","vines","plants")
+ var/list/grasping = list()
+ var/max_grasps = 4
+ var/grasp_chance = 20
+ var/grasp_pull_chance = 85
+ var/grasp_range = 4
+ del_on_death = 1
+
+/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
+ if(..())
+ for(var/mob/living/L in grasping)
+ if(L.stat == DEAD)
+ var/datum/beam/B = grasping[L]
+ if(B)
+ B.End()
+ grasping -= L
+
+ //Can attack+pull multiple times per cycle
+ if(L.Adjacent(src))
+ L.attack_animal(src)
+ else
+ if(prob(grasp_pull_chance))
+ dir = get_dir(src,L) //staaaare
+ step(L,get_dir(L,src)) //reel them in
+ L.Weaken(3) //you can't get away now~
+
+ if(grasping.len < max_grasps)
+ grasping:
+ for(var/mob/living/L in view(grasp_range, src))
+ if(L == src || faction_check(L) || (L in grasping) || L == target)
+ continue
+ for(var/t in getline(src,L))
+ for(var/a in t)
+ var/atom/A = a
+ if(A.density && A != L)
+ continue grasping
+ if(prob(grasp_chance))
+ L << "\The [src] has you entangled!"
+ grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
+
+ break //only take 1 new victim per cycle
+
+
+/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target)
+ var/dist = get_dist(src,the_target)
+ Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine)
+ the_target.attack_animal(src)
+
+
+/mob/living/simple_animal/hostile/venus_human_trap/CanAttack(atom/the_target)
+ . = ..()
+ if(.)
+ if(the_target in grasping)
+ return 0
diff --git a/icons/effects/spacevines.dmi b/icons/effects/spacevines.dmi
index a140679d3d8..ee612f345e6 100644
Binary files a/icons/effects/spacevines.dmi and b/icons/effects/spacevines.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 1003b7f7585..4a1265fd353 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 927a56bdaa3..7f9a07b6e14 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 301a990639e..fde65f1c949 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/paradise.dme b/paradise.dme
index ba34f8505bf..1a65a76fc0e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1396,6 +1396,7 @@
#include "code\modules\hydroponics\grown\potato.dm"
#include "code\modules\hydroponics\grown\pumpkin.dm"
#include "code\modules\hydroponics\grown\random.dm"
+#include "code\modules\hydroponics\grown\replicapod.dm"
#include "code\modules\hydroponics\grown\root.dm"
#include "code\modules\hydroponics\grown\tea_coffee.dm"
#include "code\modules\hydroponics\grown\tobacco.dm"
@@ -1694,6 +1695,7 @@
#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
+#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
#include "code\modules\mob\living\simple_animal\hostile\winter_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"