birdboat now chokes on plastic (#47551)

* birdboat now chokes on plastic

* update maps

* Update goose.dm

* cleanup and fixes

* more improvements, goose will eat any item with plastic now

* limit goose to only eating 10 food per turf

* End this nightmare

* more sanity

* Die in your own vomit you broken goose

Co-Authored-By: skoglol <33292112+kriskog@users.noreply.github.com>
This commit is contained in:
Couls
2019-12-01 10:14:06 +01:00
committed by skoglol
co-authored by skoglol
parent 9752829d84
commit af0eb8e935
13 changed files with 277 additions and 217 deletions
@@ -275,7 +275,7 @@
dir = 8
},
/obj/machinery/iv_drip,
/obj/item/reagent_containers/glass/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aR" = (
@@ -1428,21 +1428,21 @@
"ft" = (
/obj/effect/turf_decal/box/white/corners,
/obj/structure/closet/crate,
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large,
/obj/item/reagent_containers/glass/waterbottle/large,
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
+6 -6
View File
@@ -1003,25 +1003,25 @@
/obj/structure/closet/crate{
name = "food crate"
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -5;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 2;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -2
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 5
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 1;
pixel_y = -3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 8;
pixel_y = -3
},
+3 -3
View File
@@ -140,12 +140,12 @@
pixel_x = 3;
pixel_y = -3
},
/obj/item/reagent_containers/glass/waterbottle{
/obj/item/reagent_containers/food/drinks/waterbottle{
pixel_x = -3;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle,
/obj/item/reagent_containers/glass/waterbottle{
/obj/item/reagent_containers/food/drinks/waterbottle,
/obj/item/reagent_containers/food/drinks/waterbottle{
pixel_x = 3;
pixel_y = -3
},
+9 -9
View File
@@ -336,12 +336,12 @@
locked = 0;
name = "fridge"
},
/obj/item/reagent_containers/glass/waterbottle{
/obj/item/reagent_containers/food/drinks/waterbottle{
pixel_x = -3;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle,
/obj/item/reagent_containers/glass/waterbottle{
/obj/item/reagent_containers/food/drinks/waterbottle,
/obj/item/reagent_containers/food/drinks/waterbottle{
pixel_x = 3;
pixel_y = -3
},
@@ -529,25 +529,25 @@
/obj/structure/closet/crate{
name = "food crate"
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -5;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 2;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -2
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 5
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 1;
pixel_y = -3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 8;
pixel_y = -3
},
+6 -6
View File
@@ -201,21 +201,21 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/bot_white,
/obj/structure/closet/crate,
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large,
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
/obj/item/reagent_containers/glass/waterbottle{
/obj/item/reagent_containers/food/drinks/waterbottle{
pixel_x = -3;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle,
/obj/item/reagent_containers/glass/waterbottle{
/obj/item/reagent_containers/food/drinks/waterbottle,
/obj/item/reagent_containers/food/drinks/waterbottle{
pixel_x = 3;
pixel_y = -3
},
+6 -6
View File
@@ -295,25 +295,25 @@
/obj/structure/closet/crate{
name = "food crate"
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -5;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 2;
pixel_y = 3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = -2
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 5
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 1;
pixel_y = -3
},
/obj/item/reagent_containers/glass/waterbottle/large{
/obj/item/reagent_containers/food/drinks/waterbottle/large{
pixel_x = 8;
pixel_y = -3
},
@@ -593,9 +593,9 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20), \
new /datum/stack_recipe("folding plastic chair", /obj/structure/chair/plastic, 2), \
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/waterbottle/large/empty, 3), \
new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/glass/colocup, 1), \
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/large/empty, 3), \
new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/food/drinks/colocup, 1), \
new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2), \
new /datum/stack_recipe("blank sign", /obj/item/sign_backing, 1)))
+1 -1
View File
@@ -365,7 +365,7 @@
/obj/item/reagent_containers/pill,
/obj/item/reagent_containers/glass/beaker,
/obj/item/reagent_containers/glass/bottle,
/obj/item/reagent_containers/glass/waterbottle,
/obj/item/reagent_containers/food/drinks/waterbottle,
/obj/item/reagent_containers/medigel,
/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/dropper,
+154 -4
View File
@@ -23,14 +23,14 @@
if(!reagents || !reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty!</span>")
return 0
return FALSE
if(!canconsume(M, user))
return 0
return FALSE
if (!is_drainable())
to_chat(user, "<span class='warning'>[src]'s lid hasn't been opened!</span>")
return 0
return FALSE
if(M == user)
user.visible_message("<span class='notice'>[user] swallows a gulp of [src].</span>", \
@@ -54,7 +54,7 @@
reagents.reaction(M, INGEST, fraction)
reagents.trans_to(M, gulp_size, transfered_by = user)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
return 1
return TRUE
/obj/item/reagent_containers/food/drinks/afterattack(obj/target, mob/user , proximity)
. = ..()
@@ -258,6 +258,137 @@
isGlass = FALSE
custom_price = 38
/obj/item/reagent_containers/food/drinks/waterbottle
name = "bottle of water"
desc = "A bottle of water filled at an old Earth bottling facility."
icon = 'icons/obj/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard
custom_materials = list(/datum/material/plastic=1000)
volume = 50
amount_per_transfer_from_this = 10
fill_icon_thresholds = list(0, 10, 25, 50, 75, 80, 90)
isGlass = FALSE
// The 2 bottles have separate cap overlay icons because if the bottle falls over while bottle flipping the cap stays fucked on the moved overlay
var/cap_icon_state = "bottle_cap_small"
var/cap_on = TRUE
var/cap_lost = FALSE
var/mutable_appearance/cap_overlay
var/flip_chance = 10
/obj/item/reagent_containers/food/drinks/waterbottle/Initialize()
. = ..()
cap_overlay = mutable_appearance(icon, cap_icon_state)
if(cap_on)
spillable = FALSE
add_overlay(cap_overlay, TRUE)
/obj/item/reagent_containers/food/drinks/waterbottle/examine(mob/user)
. = ..()
if(cap_lost)
. += "<span class='notice'>The cap seems to be missing.</span>"
else if(cap_on)
. += "<span class='notice'>The cap is firmly on to prevent spilling. Alt-click to remove the cap.</span>"
else
. += "<span class='notice'>The cap has been taken off. Alt-click to put a cap on.</span>"
/obj/item/reagent_containers/food/drinks/waterbottle/AltClick(mob/user)
. = ..()
if(cap_lost)
to_chat(user, "<span class='warning'>The cap seems to be missing! Where did it go?</span>")
return
var/fumbled = HAS_TRAIT(user, TRAIT_CLUMSY) && prob(5)
if(cap_on || fumbled)
cap_on = FALSE
spillable = TRUE
cut_overlay(cap_overlay, TRUE)
animate(src, transform = null, time = 2, loop = 0)
if(fumbled)
to_chat(user, "<span class='warning'>You fumble with [src]'s cap! The cap falls onto the ground and simply vanishes. Where the hell did it go?</span>")
cap_lost = TRUE
else
to_chat(user, "<span class='notice'>You remove the cap from [src].</span>")
else
cap_on = TRUE
spillable = FALSE
add_overlay(cap_overlay, TRUE)
to_chat(user, "<span class='notice'>You put the cap on [src].</span>")
update_icon()
/obj/item/reagent_containers/food/drinks/waterbottle/is_refillable()
if(cap_on)
return FALSE
. = ..()
/obj/item/reagent_containers/food/drinks/waterbottle/is_drainable()
if(cap_on)
return FALSE
. = ..()
/obj/item/reagent_containers/food/drinks/waterbottle/attack(mob/M, mob/user, obj/target)
if(cap_on && reagents.total_volume && istype(M))
to_chat(user, "<span class='warning'>You must remove the cap before you can do that!</span>")
return
. = ..()
/obj/item/reagent_containers/food/drinks/waterbottle/afterattack(obj/target, mob/user, proximity)
if(cap_on && (target.is_refillable() || target.is_drainable() || (reagents.total_volume && user.a_intent == INTENT_HARM)))
to_chat(user, "<span class='warning'>You must remove the cap before you can do that!</span>")
return
else if(istype(target, /obj/item/reagent_containers/food/drinks/waterbottle))
var/obj/item/reagent_containers/food/drinks/waterbottle/WB = target
if(WB.cap_on)
to_chat(user, "<span class='warning'>[WB] has a cap firmly twisted on!</span>")
. = ..()
// heehoo bottle flipping
/obj/item/reagent_containers/food/drinks/waterbottle/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(cap_on && reagents.total_volume)
if(prob(flip_chance)) // landed upright
src.visible_message("<span class='notice'>[src] lands upright!</span>")
SEND_SIGNAL(throwingdatum.thrower, COMSIG_ADD_MOOD_EVENT, "bottle_flip", /datum/mood_event/bottle_flip)
else // landed on it's side
animate(src, transform = matrix(prob(50)? 90 : -90, MATRIX_ROTATE), time = 3, loop = 0)
/obj/item/reagent_containers/food/drinks/waterbottle/pickup(mob/user)
. = ..()
animate(src, transform = null, time = 1, loop = 0)
/obj/item/reagent_containers/food/drinks/waterbottle/empty
list_reagents = list()
cap_on = FALSE
/obj/item/reagent_containers/food/drinks/waterbottle/large
desc = "A fresh commercial-sized bottle of water."
icon_state = "largebottle"
custom_materials = list(/datum/material/plastic=3000)
list_reagents = list(/datum/reagent/water = 100)
volume = 100
amount_per_transfer_from_this = 20
cap_icon_state = "bottle_cap"
/obj/item/reagent_containers/food/drinks/waterbottle/large/empty
list_reagents = list()
cap_on = FALSE
// Admin spawn
/obj/item/reagent_containers/food/drinks/waterbottle/relic
name = "mysterious bottle"
desc = "A bottle quite similar to a water bottle, but with some words scribbled on with a marker. It seems to be radiating some kind of energy."
flip_chance = 100 // FLIPP
/obj/item/reagent_containers/food/drinks/waterbottle/relic/Initialize()
var/reagent_id = get_random_reagent_id()
var/datum/reagent/random_reagent = new reagent_id
list_reagents = list(random_reagent.type = 50)
. = ..()
desc += "<span class='notice'>The writing reads '[random_reagent.name]'.</span>"
update_icon()
/obj/item/reagent_containers/food/drinks/beer
name = "space beer"
desc = "Beer. In space."
@@ -355,6 +486,25 @@
desc = "A small carton, intended for holding drinks."
/obj/item/reagent_containers/food/drinks/colocup
name = "colo cup"
desc = "A cheap, mass produced style of cup, typically used at parties. They never seem to come out red, for some reason..."
icon = 'icons/obj/drinks.dmi'
icon_state = "colocup"
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
item_state = "colocup"
custom_materials = list(/datum/material/plastic = 1000)
possible_transfer_amounts = list(5, 10, 15, 20)
volume = 20
amount_per_transfer_from_this = 5
isGlass = FALSE
/obj/item/reagent_containers/food/drinks/colocup/Initialize()
.=..()
icon_state = "colocup[rand(0, 6)]"
pixel_x = rand(-4,4)
pixel_y = rand(-4,4)
//////////////////////////drinkingglass and shaker//
//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink
@@ -1,5 +1,4 @@
#define GOOSE_SATIATED 50
/mob/living/simple_animal/hostile/retaliate/goose
name = "goose"
desc = "It's loose"
@@ -9,7 +8,7 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
speak_chance = 0
turns_per_move = 5
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 2)
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "gently pushes aside"
@@ -36,13 +35,48 @@
var/icon_vomit = "vomit"
var/icon_vomit_end = "vomit_end"
var/message_cooldown = 0
var/list/nummies = list()
var/choking = FALSE
/mob/living/simple_animal/hostile/retaliate/goose/handle_automated_movement()
/mob/living/simple_animal/hostile/retaliate/goose/Initialize()
. = ..()
if (stat == DEAD)
RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/goosement)
/mob/living/simple_animal/hostile/retaliate/goose/proc/goosement(atom/movable/AM, OldLoc, Dir, Forced)
if(stat == DEAD)
return
if(prob(5) && random_retaliate == TRUE)
Retaliate()
nummies.Cut()
nummies += loc.contents
if(prob(5) && random_retaliate)
Retaliate()
/mob/living/simple_animal/hostile/retaliate/goose/handle_automated_action()
if(length(nummies))
var/obj/item/E = locate() in nummies
if(E && E.loc == loc)
feed(E)
nummies -= E
/mob/living/simple_animal/hostile/retaliate/goose/vomit/handle_automated_action()
if(length(nummies))
var/obj/item/E = pick(nummies)
if(!(E.custom_materials && E.custom_materials[getmaterialref(/datum/material/plastic)]))
nummies -= E // remove non-plastic item from queue
E = locate(/obj/item/reagent_containers/food) in nummies // find food
if(E && E.loc == loc)
feed(E)
nummies -= E
/mob/living/simple_animal/hostile/retaliate/goose/proc/feed(obj/item/suffocator)
if(stat == DEAD || choking) // plapatin I swear to god
return FALSE
if(suffocator.custom_materials && suffocator.custom_materials[getmaterialref(/datum/material/plastic)]) // dumb goose'll swallow food or drink with plastic in it
visible_message("<span class='danger'>[src] hungrily gobbles up \the [suffocator]! </span>")
visible_message("<span class='boldwarning'>[src] is choking on \the [suffocator]! </span>")
suffocator.forceMove(src)
choke(suffocator)
choking = TRUE
return TRUE
/mob/living/simple_animal/hostile/retaliate/goose/vomit
name = "Birdboat"
@@ -66,7 +100,6 @@
. = ..()
goosevomit = new
goosevomit.Grant(src)
RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/goosement)
// 5% chance every round to have anarchy mode deadchat control on birdboat.
if(prob(5))
desc = "[initial(desc)] It's waddling more than usual. It seems to be possessed."
@@ -81,35 +114,67 @@
. = ..()
. += "<span class='notice'>Somehow, it still looks hungry.</span>"
/mob/living/simple_animal/hostile/retaliate/goose/vomit/attacked_by(obj/item/O, mob/user)
/mob/living/simple_animal/hostile/retaliate/goose/attackby(obj/item/O, mob/user)
. = ..()
if(istype(O, /obj/item/reagent_containers/food))
feed(O)
if(feed(O))
return TRUE
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/feed(obj/item/reagent_containers/food/tasty)
if (stat == DEAD) // plapatin I swear to god
return
/mob/living/simple_animal/hostile/retaliate/goose/vomit/feed(obj/item/reagent_containers/food/tasty)
. = ..()
if(. || !istype(tasty))
return FALSE
if (contents.len > GOOSE_SATIATED)
if(message_cooldown < world.time)
visible_message("<span class='notice'>[src] looks too full to eat \the [tasty]!</span>")
message_cooldown = world.time + 5 SECONDS
return
return FALSE
if (tasty.foodtype & GROSS)
visible_message("<span class='notice'>[src] hungrily gobbles up \the [tasty]!</span>")
tasty.forceMove(src)
playsound(src,'sound/items/eatfood.ogg', 70, TRUE)
vomitCoefficient += 3
vomitTimeBonus += 2
return TRUE
else
if(message_cooldown < world.time)
visible_message("<span class='notice'>[src] refuses to eat \the [tasty].</span>")
message_cooldown = world.time + 5 SECONDS
return FALSE
/mob/living/simple_animal/hostile/retaliate/goose/proc/choke(obj/item/reagent_containers/food/plastic)
if(stat == DEAD || choking)
return
addtimer(CALLBACK(src, .proc/suffocate), 300)
/mob/living/simple_animal/hostile/retaliate/goose/vomit/choke(obj/item/reagent_containers/food/plastic)
if(stat == DEAD || choking)
return
if(prob(25))
visible_message("<span class='warning'>[src] is gagging on \the [plastic]!</span>")
emote("me", 1, "gags!")
addtimer(CALLBACK(src, .proc/vomit), 300)
else
addtimer(CALLBACK(src, .proc/suffocate), 300)
/mob/living/simple_animal/hostile/retaliate/goose/Life()
. = ..()
if(choking && !stat)
do_jitter_animation(50)
if(prob(20))
emote("gasp")
/mob/living/simple_animal/hostile/retaliate/goose/proc/suffocate()
if(!choking)
return
deathmessage = "lets out one final oxygen-deprived honk before they go limp and lifeless.."
death()
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit()
if (stat == DEAD)
return
var/turf/T = get_turf(src)
var/obj/item/reagent_containers/food/consumed = locate() in contents //Barf out a single food item from our guts
choking = FALSE // assume birdboat is vomiting out whatever he was choking on
if (prob(50) && consumed)
barf_food(consumed)
else
@@ -157,18 +222,11 @@
vomiting = FALSE
icon_state = initial(icon_state)
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/goosement(atom/movable/AM, OldLoc, Dir, Forced)
if(stat == DEAD)
return
/mob/living/simple_animal/hostile/retaliate/goose/vomit/goosement(atom/movable/AM, OldLoc, Dir, Forced)
. = ..()
if(vomiting)
vomit() // its supposed to keep vomiting if you move
return
var/turf/currentTurf = get_turf(src)
while (currentTurf == get_turf(src))
var/obj/item/reagent_containers/food/tasty = locate() in currentTurf
if (tasty)
feed(tasty)
stoplag(2)
if(prob(vomitCoefficient * 0.2))
vomit_prestart(vomitTimeBonus + 25)
vomitCoefficient = 1
@@ -287,135 +287,6 @@
return
return ..()
/obj/item/reagent_containers/glass/waterbottle
name = "bottle of water"
desc = "A bottle of water filled at an old Earth bottling facility."
icon = 'icons/obj/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard
custom_materials = list(/datum/material/plastic=1000)
volume = 50
amount_per_transfer_from_this = 10
fill_icon_thresholds = list(0, 10, 25, 50, 75, 80, 90)
// The 2 bottles have separate cap overlay icons because if the bottle falls over while bottle flipping the cap stays fucked on the moved overlay
var/cap_icon_state = "bottle_cap_small"
var/cap_on = TRUE
var/cap_lost = FALSE
var/mutable_appearance/cap_overlay
var/flip_chance = 10
/obj/item/reagent_containers/glass/waterbottle/Initialize()
. = ..()
cap_overlay = mutable_appearance(icon, cap_icon_state)
if(cap_on)
spillable = FALSE
add_overlay(cap_overlay, TRUE)
/obj/item/reagent_containers/glass/waterbottle/examine(mob/user)
. = ..()
if(cap_lost)
. += "<span class='notice'>The cap seems to be missing.</span>"
else if(cap_on)
. += "<span class='notice'>The cap is firmly on to prevent spilling. Alt-click to remove the cap.</span>"
else
. += "<span class='notice'>The cap has been taken off. Alt-click to put a cap on.</span>"
/obj/item/reagent_containers/glass/waterbottle/AltClick(mob/user)
. = ..()
if(cap_lost)
to_chat(user, "<span class='warning'>The cap seems to be missing! Where did it go?</span>")
return
var/fumbled = HAS_TRAIT(user, TRAIT_CLUMSY) && prob(5)
if(cap_on || fumbled)
cap_on = FALSE
spillable = TRUE
cut_overlay(cap_overlay, TRUE)
animate(src, transform = null, time = 2, loop = 0)
if(fumbled)
to_chat(user, "<span class='warning'>You fumble with [src]'s cap! The cap falls onto the ground and simply vanishes. Where the hell did it go?</span>")
cap_lost = TRUE
else
to_chat(user, "<span class='notice'>You remove the cap from [src].</span>")
else
cap_on = TRUE
spillable = FALSE
add_overlay(cap_overlay, TRUE)
to_chat(user, "<span class='notice'>You put the cap on [src].</span>")
update_icon()
/obj/item/reagent_containers/glass/waterbottle/is_refillable()
if(cap_on)
return FALSE
. = ..()
/obj/item/reagent_containers/glass/waterbottle/is_drainable()
if(cap_on)
return FALSE
. = ..()
/obj/item/reagent_containers/glass/waterbottle/attack(mob/M, mob/user, obj/target)
if(cap_on && reagents.total_volume && istype(M))
to_chat(user, "<span class='warning'>You must remove the cap before you can do that!</span>")
return
. = ..()
/obj/item/reagent_containers/glass/waterbottle/afterattack(obj/target, mob/user, proximity)
if(cap_on && (target.is_refillable() || target.is_drainable() || (reagents.total_volume && user.a_intent == INTENT_HARM)))
to_chat(user, "<span class='warning'>You must remove the cap before you can do that!</span>")
return
else if(istype(target, /obj/item/reagent_containers/glass/waterbottle))
var/obj/item/reagent_containers/glass/waterbottle/WB = target
if(WB.cap_on)
to_chat(user, "<span class='warning'>[WB] has a cap firmly twisted on!</span>")
. = ..()
// heehoo bottle flipping
/obj/item/reagent_containers/glass/waterbottle/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(cap_on && reagents.total_volume)
if(prob(flip_chance)) // landed upright
src.visible_message("<span class='notice'>[src] lands upright!</span>")
SEND_SIGNAL(throwingdatum.thrower, COMSIG_ADD_MOOD_EVENT, "bottle_flip", /datum/mood_event/bottle_flip)
else // landed on it's side
animate(src, transform = matrix(prob(50)? 90 : -90, MATRIX_ROTATE), time = 3, loop = 0)
/obj/item/reagent_containers/glass/waterbottle/pickup(mob/user)
. = ..()
animate(src, transform = null, time = 1, loop = 0)
/obj/item/reagent_containers/glass/waterbottle/empty
list_reagents = list()
cap_on = FALSE
/obj/item/reagent_containers/glass/waterbottle/large
desc = "A fresh commercial-sized bottle of water."
icon_state = "largebottle"
custom_materials = list(/datum/material/plastic=3000)
list_reagents = list(/datum/reagent/water = 100)
volume = 100
amount_per_transfer_from_this = 20
cap_icon_state = "bottle_cap"
/obj/item/reagent_containers/glass/waterbottle/large/empty
list_reagents = list()
cap_on = FALSE
// Admin spawn
/obj/item/reagent_containers/glass/waterbottle/relic
name = "mysterious bottle"
desc = "A bottle quite similar to a water bottle, but with some words scribbled on with a marker. It seems to be radiating some kind of energy."
flip_chance = 100 // FLIPP
/obj/item/reagent_containers/glass/waterbottle/relic/Initialize()
var/datum/reagent/random_reagent = get_random_reagent_id()
list_reagents = list(random_reagent = 50)
. = ..()
desc += "<span class='notice'>The writing reads '[random_reagent.name]'.</span>"
/obj/item/pestle
name = "pestle"
desc = "An ancient, simple tool used in conjunction with a mortar to grind or juice items."
@@ -480,22 +351,3 @@
name = "saline canister"
volume = 5000
list_reagents = list(/datum/reagent/medicine/salglu_solution = 5000)
/obj/item/reagent_containers/glass/colocup
name = "colo cup"
desc = "A cheap, mass produced style of cup, typically used at parties. They never seem to come out red, for some reason..."
icon = 'icons/obj/drinks.dmi'
icon_state = "colocup"
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
item_state = "colocup"
custom_materials = list(/datum/material/plastic = 1000)
possible_transfer_amounts = list(5, 10, 15, 20)
volume = 20
amount_per_transfer_from_this = 5
/obj/item/reagent_containers/glass/colocup/Initialize()
.=..()
icon_state = "colocup[rand(0, 6)]"
pixel_x = rand(-4,4)
pixel_y = rand(-4,4)
+1 -1
View File
@@ -12,7 +12,7 @@
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,
/obj/item/reagent_containers/glass/waterbottle = 10)
/obj/item/reagent_containers/food/drinks/waterbottle = 10)
contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,