Add Snails! (#26176)
* Add snails! * Shitty inhands, bugs * recoil icon * me & mickael * eggs and inhands * garlic => shrooms
@@ -302,6 +302,12 @@
|
||||
amount = 1 //Only the back left foot is considered lucky.
|
||||
butcher_time = 10
|
||||
|
||||
/datum/butchering_product/snail_carapace
|
||||
result = /obj/item/clothing/head/helmet/snail_helm
|
||||
verb_name = "remove carapace"
|
||||
verb_gerund = "removing the carapace from"
|
||||
butcher_time = 10
|
||||
|
||||
|
||||
#define TEETH_FEW /datum/butchering_product/teeth/few //4-8
|
||||
#define TEETH_BUNCH /datum/butchering_product/teeth/bunch //8-16
|
||||
@@ -327,6 +333,7 @@ var/global/list/animal_butchering_products = list(
|
||||
/mob/living/simple_animal/hostile/deer/flesh = list(/datum/butchering_product/skin/deer, /datum/butchering_product/deer_head),
|
||||
/mob/living/carbon/monkey = list(/datum/butchering_product/skin/monkey, TEETH_FEW),
|
||||
/mob/living/simple_animal/rabbit = list(/datum/butchering_product/rabbit_ears, /datum/butchering_product/rabbit_foot),
|
||||
/mob/living/simple_animal/snail = list(/datum/butchering_product/snail_carapace),
|
||||
|
||||
/mob/living/carbon/human = list(TEETH_HUMAN, /datum/butchering_product/skin/human),
|
||||
/mob/living/carbon/human/unathi = list(TEETH_LOTS, /datum/butchering_product/skin/lizard/lots),
|
||||
|
||||
@@ -2165,6 +2165,14 @@ var/list/all_supply_groups = list("Supplies","Clothing","Security","Hospitality"
|
||||
containername = "cat crate"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/snails
|
||||
name = "Snails"
|
||||
contains = list()
|
||||
cost = 25
|
||||
containertype = /obj/structure/largecrate/snails
|
||||
containername = "snail crate"
|
||||
group = "Hydroponics"
|
||||
|
||||
/datum/supply_packs/weedcontrol
|
||||
name = "Weed control equipment"
|
||||
contains = list(/obj/item/weapon/scythe,
|
||||
|
||||
@@ -115,4 +115,15 @@
|
||||
/obj/structure/largecrate/cat/attackby(obj/item/weapon/W, mob/user)
|
||||
if(iscrowbar(W))
|
||||
new /mob/living/simple_animal/cat/Proc(loc)
|
||||
..()
|
||||
..()
|
||||
|
||||
/obj/structure/largecrate/snails
|
||||
icon_state = "lisacrate"
|
||||
|
||||
/obj/structure/largecrate/snails/attackby(obj/item/weapon/W, mob/user)
|
||||
if(iscrowbar(W))
|
||||
new /mob/living/simple_animal/snail(loc)
|
||||
new /mob/living/simple_animal/snail(loc)
|
||||
new /mob/living/simple_animal/snail(loc)
|
||||
new /mob/living/simple_animal/snail(loc)
|
||||
..()
|
||||
|
||||
@@ -297,4 +297,14 @@
|
||||
item_state = "chainmail_head"
|
||||
armor = list(melee = 10, bullet = 15, laser = 2,energy = 2, bomb = 2, bio = 2, rad = 0)
|
||||
flags = FPRINT
|
||||
siemens_coefficient = 1
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/head/helmet/snail_helm
|
||||
name = "snail helmet"
|
||||
desc = "You feel arrogant and important just by wearing it."
|
||||
icon_state = "snail_helm"
|
||||
item_state = "snail_helm"
|
||||
armor = list(melee = 10, bullet = 5, laser = 2,energy = 2, bomb = 2, bio = 2, rad = 0)
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/hats.dmi', "right_hand" = 'icons/mob/in-hand/right/hats.dmi')
|
||||
flags = FPRINT
|
||||
siemens_coefficient = 1
|
||||
|
||||
@@ -2738,14 +2738,14 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pear
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/winepear
|
||||
|
||||
|
||||
/datum/recipe/suppermatter
|
||||
reagents = list(PLASMA = 5, NITROGEN = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/caramelcake
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/suppermatter
|
||||
|
||||
|
||||
/datum/recipe/excitingsuppermatter
|
||||
reagents = list(PLASMA = 5, OXYGEN = 5)
|
||||
items = list(
|
||||
@@ -2775,3 +2775,25 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/peanut,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/peanutbutter
|
||||
|
||||
/datum/recipe/escargot
|
||||
reagents = list (SODIUMCHLORIDE = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/snail,
|
||||
/obj/item/clothing/head/helmet/snail_helm,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/peanutbutter,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/escargot
|
||||
|
||||
/datum/recipe/es_cargo
|
||||
reagents = list (SODIUMCHLORIDE = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/snail,
|
||||
/obj/item/clothing/head/helmet/snail_helm,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/garlic,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet,
|
||||
/obj/item/stack/sheet/cardboard,
|
||||
/obj/item/weapon/paper,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/es_cargo
|
||||
|
||||
@@ -167,6 +167,14 @@
|
||||
item_state = "frog"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
//SNAIL
|
||||
|
||||
/obj/item/weapon/holder/animal/snail
|
||||
name = "snail holder"
|
||||
desc = "Eh, it's all gooey and sticky."
|
||||
item_state = "snail"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
//SALEM
|
||||
|
||||
/obj/item/weapon/holder/animal/salem
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
idle_vision_range = 6
|
||||
search_objects = 1
|
||||
|
||||
var/static/list/edibles = list(/mob/living/simple_animal/cockroach, /obj/item/weapon/reagent_containers/food/snacks/roach_eggs, /mob/living/simple_animal/bee) //Add bugs to this as they get added in
|
||||
var/static/list/edibles = list(/mob/living/simple_animal/cockroach, /obj/item/weapon/reagent_containers/food/snacks/roach_eggs, /mob/living/simple_animal/bee, /mob/living/simple_animal/snail) //Add bugs to this as they get added in
|
||||
|
||||
/mob/living/simple_animal/hostile/lizard/UnarmedAttack(var/atom/A)
|
||||
if(is_type_in_list(A, edibles))
|
||||
@@ -93,4 +93,5 @@
|
||||
icon_living = "smallfrog"
|
||||
icon_dead = "smallfrog_dead"
|
||||
speak_emote = list("ribbits")
|
||||
holder_type = /obj/item/weapon/holder/animal/frog
|
||||
holder_type = /obj/item/weapon/holder/animal/frog
|
||||
|
||||
|
||||
135
code/modules/mob/living/simple_animal/snail.dm
Normal file
@@ -0,0 +1,135 @@
|
||||
//snail
|
||||
/mob/living/simple_animal/snail
|
||||
species_type = /mob/living/simple_animal/snail
|
||||
name = "space snail"
|
||||
desc = "Taking on the world at its own pace. Larger than its cousins down on Earth."
|
||||
icon_state = "snail"
|
||||
icon_living = "snail"
|
||||
icon_dead = "snail_dead"
|
||||
speak_emote = list("") // Silent
|
||||
response_help = "pets"
|
||||
response_disarm = "pokes"
|
||||
response_harm = "stomps on"
|
||||
maxHealth = 12
|
||||
health = 12
|
||||
|
||||
holder_type = /obj/item/weapon/holder/animal/snail
|
||||
|
||||
size = SIZE_TINY
|
||||
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMACHINE
|
||||
stop_automated_movement_when_pulled = 1
|
||||
|
||||
turns_per_move = 8 //8 life ticks / move
|
||||
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/snail
|
||||
|
||||
var/in_shell = 0
|
||||
var/being_romantic = 0
|
||||
var/mob/living/simple_animal/snail/loving_partner = null
|
||||
|
||||
/mob/living/simple_animal/snail/Destroy()
|
||||
if (loving_partner)
|
||||
loving_partner.loving_partner = null
|
||||
loving_partner = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/bite_act(mob/living/carbon/human/H)
|
||||
if(size >= H.size)
|
||||
return
|
||||
|
||||
playsound(H,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
H.visible_message("<span class='warning'>[H] tries to eat \the [src], but hurts \his teeth doing so! The idiot!</span>", "<span class='warning'>You break your teeth on \the [src]! Imbecile!</span>")
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/snail/Life()
|
||||
if (timestopped)
|
||||
return 0
|
||||
if (in_shell)
|
||||
in_shell--
|
||||
return
|
||||
if (!in_shell)
|
||||
icon_state = initial(icon_state)
|
||||
if (being_romantic)
|
||||
being_romantic--
|
||||
if (being_romantic == 0)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/egg/snail(get_turf(src))
|
||||
visible_message("<span class='notice'>\The [src] gently goes off its partner.</span>")
|
||||
loving_partner.being_romantic = 0
|
||||
loving_partner.loving_partner = null
|
||||
loving_partner = null
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/Crossed(mob/living/O)
|
||||
if (!in_shell)
|
||||
recoil()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/proc/recoil()
|
||||
if (loving_partner)
|
||||
loving_partner.being_romantic = 0
|
||||
loving_partner.loving_partner = null
|
||||
loving_partner.recoil()
|
||||
being_romantic = 0
|
||||
loving_partner = null
|
||||
icon_state = "snail_recoil"
|
||||
visible_message("<span class = 'notice'>\The [src] stops whatever it was doing and recoils into its shell.</span>")
|
||||
in_shell = 5 // Shy for some cycles
|
||||
|
||||
/mob/living/simple_animal/snail/wander_move(turf/dest)
|
||||
..()
|
||||
for(var/mob/living/simple_animal/snail/partner in loc)
|
||||
if (partner.being_romantic)
|
||||
return // the other snail is busy
|
||||
|
||||
if (prob(80))
|
||||
return
|
||||
|
||||
being_romantic = 15
|
||||
loving_partner = partner
|
||||
partner.being_romantic = 15
|
||||
partner.loving_partner = src
|
||||
visible_message("<span class='notice'>\The [src] begins to softly approach \the [partner]...</span>")
|
||||
|
||||
/mob/living/simple_animal/snail/examine(var/mob/user)
|
||||
. = ..()
|
||||
if (in_shell)
|
||||
to_chat(user, "It's currently hiding in its shell.")
|
||||
if (being_romantic)
|
||||
to_chat(user, "It looks pretty busy.")
|
||||
|
||||
/mob/living/simple_animal/snail/attackby(var/obj/item/O, var/mob/user, var/no_delay = FALSE, var/originator = null)
|
||||
if (!in_shell)
|
||||
recoil()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/kick_act(mob/living/carbon/human/M)
|
||||
if (!in_shell)
|
||||
recoil()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/airflow_stun()
|
||||
if (!in_shell)
|
||||
recoil()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/airflow_hit(atom/A)
|
||||
if (!in_shell)
|
||||
recoil()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/snail/adjustBruteLoss(var/damage)
|
||||
if (in_shell)
|
||||
return ..(damage/2)
|
||||
return ..()
|
||||
|
||||
// -- Greasy snail. Lube up hallways as he go. Tougher than its regular counterpart
|
||||
/mob/living/simple_animal/snail/greasy
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
|
||||
/mob/living/simple_animal/snail/greasy/wander_move(turf/simulated/dest)
|
||||
if (istype(dest) && prob(20))
|
||||
dest.wet(800, TURF_WET_LUBE)
|
||||
return ..()
|
||||
@@ -6241,3 +6241,56 @@ obj/item/weapon/reagent_containers/food/snacks/butterfingers_l
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/breadslice/paibread/attackby(obj/item/I,mob/user,params)
|
||||
return ..() //sorry no custom pai sandwiches
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/escargot
|
||||
icon_state = "escargot"
|
||||
name = "cooked escargot"
|
||||
desc = "A fine treat and an exquisite cuisine."
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/food.dmi', "right_hand" = 'icons/mob/in-hand/right/food.dmi')
|
||||
bitesize = 1
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/escargot/New()
|
||||
. = ..()
|
||||
reagents.add_reagent(NUTRIMENT,10)
|
||||
reagents.add_reagent(SODIUMCHLORIDE, 2)
|
||||
reagents.add_reagent(HOLYWATER, 2)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/es_cargo
|
||||
icon_state = "es_cargo_closed"
|
||||
name = "es-cargo"
|
||||
desc = "Je-ne-veux-pas-travailler !"
|
||||
bitesize = 1
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/food.dmi', "right_hand" = 'icons/mob/in-hand/right/food.dmi')
|
||||
var/open = FALSE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/es_cargo/New()
|
||||
. = ..()
|
||||
reagents.add_reagent(NUTRIMENT,10)
|
||||
reagents.add_reagent(SODIUMCHLORIDE, 2)
|
||||
reagents.add_reagent(HOLYWATER, 2)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/es_cargo/can_consume(mob/living/carbon/eater, mob/user)
|
||||
if (!open)
|
||||
visible_message("<span class='notice'>\The [eater] cannot eat from \the [src] if it's closed, imbecile!</span>","<span class='notice'>You must first open it!</span>", drugged_message = "<span class='danger'>Oh lalala, this is not it, not it at all !</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/es_cargo/attack_self(var/mob/user)
|
||||
if (!open)
|
||||
open = TRUE
|
||||
icon_state = "es_cargo_opened"
|
||||
visible_message("<span class='notice'>\The [user] opens \the [src]!</span>", drugged_message = "<span class='notice'>This smells très bon !</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/es_cargo/verb/toggle_open()
|
||||
set name = "Toggle open"
|
||||
set category = "Object"
|
||||
if (!open)
|
||||
open = TRUE
|
||||
icon_state = "es_cargo_opened"
|
||||
visible_message("<span class='notice'>\The [usr] opens \the [src]!</span>", drugged_message = "<span class='notice'>This smells très bon !</span>")
|
||||
else
|
||||
open = FALSE
|
||||
icon_state = "es_cargo_closed"
|
||||
visible_message("<span class='notice'>\The [usr] closes \the [src]!</span>", drugged_message = "<span class='notice'>Enough for today !</span>")
|
||||
|
||||
@@ -143,3 +143,10 @@
|
||||
new choice(get_turf(src))
|
||||
processing_objects.Remove(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/snail
|
||||
name = "snail egg"
|
||||
desc = "Proud and arrogant, even before birth."
|
||||
icon_state = "egg-snail"
|
||||
can_color = FALSE
|
||||
hatch_type = /mob/living/simple_animal/snail
|
||||
|
||||
@@ -319,3 +319,14 @@ var/global/list/valid_random_food_types = existing_typesof(/obj/item/weapon/reag
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/slime/New()
|
||||
..()
|
||||
reagents.add_reagent(SLIMEJELLY, 10)
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/snail
|
||||
icon_state = "snail_meat"
|
||||
name = "snail meat"
|
||||
desc = "How uncivilised ! You cannot be expected to eat that without cooking it, mon Dieu !"
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/food.dmi', "right_hand" = 'icons/mob/in-hand/right/food.dmi')
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/snail/New()
|
||||
. = ..()
|
||||
reagents.add_reagent(NUTRIMENT,5)
|
||||
|
||||
|
Before Width: | Height: | Size: 521 KiB After Width: | Height: | Size: 522 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
BIN
icons/mob/in-hand/left/hats.dmi
Normal file
|
After Width: | Height: | Size: 425 B |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
BIN
icons/mob/in-hand/right/hats.dmi
Normal file
|
After Width: | Height: | Size: 419 B |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 202 KiB |
@@ -1865,6 +1865,7 @@
|
||||
#include "code\modules\mob\living\simple_animal\shade.dm"
|
||||
#include "code\modules\mob\living\simple_animal\shade_powers.dm"
|
||||
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
|
||||
#include "code\modules\mob\living\simple_animal\snail.dm"
|
||||
#include "code\modules\mob\living\simple_animal\vox.dm"
|
||||
#include "code\modules\mob\living\simple_animal\worm.dm"
|
||||
#include "code\modules\mob\living\simple_animal\bees\bees_datums.dm"
|
||||
|
||||