mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-23 05:06:50 +01:00
Merge remote-tracking branch 'upstream/master' into tgui_engineering
This commit is contained in:
@@ -789,7 +789,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
drop_sound = 'sound/items/drop/device.ogg'
|
||||
|
||||
//Worn icon generation for on-mob sprites
|
||||
/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer)
|
||||
/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null)
|
||||
//Get the required information about the base icon
|
||||
var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands)
|
||||
var/state2use = get_worn_icon_state(slot_name = slot_name)
|
||||
@@ -817,6 +817,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
standing.color = color
|
||||
standing.layer = layer2use
|
||||
|
||||
if(istype(clip_mask)) //For taur bodies/tails clipping off parts of uniforms and suits.
|
||||
standing.filters += filter(type = "alpha", icon = clip_mask)
|
||||
|
||||
//Apply any special features
|
||||
if(!inhands)
|
||||
apply_blood(standing) //Some items show blood when bloodied
|
||||
@@ -940,3 +943,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
|
||||
/obj/item/proc/openTip(location, control, params, user)
|
||||
openToolTip(user, src, params, title = name, content = desc)
|
||||
|
||||
// These procs are for RPEDs and part ratings. The concept for this was borrowed from /vg/station.
|
||||
// Gets the rating of the item, used in stuff like machine construction.
|
||||
/obj/item/proc/get_rating()
|
||||
return FALSE
|
||||
|
||||
// Like the above, but used for RPED sorting of parts.
|
||||
/obj/item/proc/rped_rating()
|
||||
return get_rating()
|
||||
@@ -1,70 +1,75 @@
|
||||
/obj/item/stack/animalhide
|
||||
name = "hide"
|
||||
desc = "The hide of some creature."
|
||||
icon_state = "sheet-hide"
|
||||
drop_sound = 'sound/items/drop/cloth.ogg'
|
||||
pickup_sound = 'sound/items/pickup/cloth.ogg'
|
||||
amount = 1
|
||||
stacktype = "hide"
|
||||
no_variants = TRUE
|
||||
|
||||
var/process_type = /obj/item/stack/hairlesshide
|
||||
|
||||
/obj/item/stack/animalhide/human
|
||||
name = "human skin"
|
||||
desc = "The by-product of human farming."
|
||||
singular_name = "human skin piece"
|
||||
name = "skin"
|
||||
desc = "The by-product of sapient farming."
|
||||
singular_name = "skin piece"
|
||||
icon_state = "sheet-hide"
|
||||
no_variants = FALSE
|
||||
drop_sound = 'sound/items/drop/leather.ogg'
|
||||
pickup_sound = 'sound/items/pickup/leather.ogg'
|
||||
|
||||
/obj/item/stack/animalhide/human
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-human"
|
||||
|
||||
/obj/item/stack/animalhide/corgi
|
||||
name = "corgi hide"
|
||||
desc = "The by-product of corgi farming."
|
||||
singular_name = "corgi hide piece"
|
||||
icon_state = "sheet-corgi"
|
||||
|
||||
/obj/item/stack/animalhide/corgi
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-corgi"
|
||||
|
||||
/obj/item/stack/animalhide/cat
|
||||
name = "cat hide"
|
||||
desc = "The by-product of cat farming."
|
||||
singular_name = "cat hide piece"
|
||||
icon_state = "sheet-cat"
|
||||
|
||||
/obj/item/stack/animalhide/cat
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-cat"
|
||||
|
||||
/obj/item/stack/animalhide/monkey
|
||||
name = "monkey hide"
|
||||
desc = "The by-product of monkey farming."
|
||||
singular_name = "monkey hide piece"
|
||||
icon_state = "sheet-monkey"
|
||||
|
||||
/obj/item/stack/animalhide/monkey
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-monkey"
|
||||
|
||||
/obj/item/stack/animalhide/lizard
|
||||
name = "lizard skin"
|
||||
desc = "Sssssss..."
|
||||
singular_name = "lizard skin piece"
|
||||
icon_state = "sheet-lizard"
|
||||
|
||||
/obj/item/stack/animalhide/lizard
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-lizard"
|
||||
|
||||
/obj/item/stack/animalhide/xeno
|
||||
name = "alien hide"
|
||||
desc = "The skin of a terrible creature."
|
||||
singular_name = "alien hide piece"
|
||||
icon_state = "sheet-xeno"
|
||||
|
||||
/obj/item/stack/animalhide/xeno
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-xeno"
|
||||
|
||||
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
|
||||
/obj/item/stack/xenochitin
|
||||
name = "alien chitin"
|
||||
desc = "A piece of the hide of a terrible creature."
|
||||
singular_name = "alien hide piece"
|
||||
singular_name = "alien chitin piece"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "chitin"
|
||||
|
||||
/obj/item/stack/xenochitin
|
||||
amount = 50
|
||||
amount = 1
|
||||
stacktype = "hide-chitin"
|
||||
|
||||
/obj/item/xenos_claw
|
||||
name = "alien claw"
|
||||
@@ -78,16 +83,66 @@
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "weed_extract"
|
||||
|
||||
//Step one - dehairing.
|
||||
/obj/item/stack/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(has_edge(W) || is_sharp(W))
|
||||
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
|
||||
user.visible_message("<span class='notice'>\The [user] starts cutting hair off \the [src]</span>", "<span class='notice'>You start cutting the hair off \the [src]</span>", "You hear the sound of a knife rubbing against flesh")
|
||||
if(do_after(user,50))
|
||||
to_chat(user, "<span class='notice'>You cut the hair from this [src.singular_name]</span>")
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/hairlesshide/HS in user.loc)
|
||||
if(HS.amount < 50 && istype(HS, process_type))
|
||||
HS.amount++
|
||||
src.use(1)
|
||||
return
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/HS = new process_type(usr.loc)
|
||||
if(istype(HS))
|
||||
HS.amount = 1
|
||||
src.use(1)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
//Step two - washing..... it's actually in washing machine code, and ere.
|
||||
|
||||
/obj/item/stack/hairlesshide
|
||||
name = "hairless hide"
|
||||
desc = "This hide was stripped of it's hair, but still needs tanning."
|
||||
singular_name = "hairless hide piece"
|
||||
icon_state = "sheet-hairlesshide"
|
||||
no_variants = FALSE
|
||||
amount = 1
|
||||
stacktype = "hairlesshide"
|
||||
var/cleaning = FALSE // Can we be water_acted, or are we busy? To prevent accidental hide duplication and the collapse of causality.
|
||||
|
||||
/obj/item/stack/hairlesshide
|
||||
amount = 50
|
||||
var/wet_type = /obj/item/stack/wetleather
|
||||
|
||||
/obj/item/stack/hairlesshide/water_act(var/wateramount)
|
||||
..()
|
||||
cleaning = TRUE
|
||||
while(amount > 0 && wateramount > 0)
|
||||
use(1)
|
||||
wateramount--
|
||||
new wet_type(get_turf(src))
|
||||
cleaning = FALSE
|
||||
|
||||
return
|
||||
|
||||
/obj/item/stack/hairlesshide/proc/rapidcure(var/stacknum = 1)
|
||||
stacknum = min(stacknum, amount)
|
||||
|
||||
while(stacknum)
|
||||
var/obj/item/stack/wetleather/I = new wet_type(get_turf(src))
|
||||
|
||||
if(istype(I))
|
||||
I.dry()
|
||||
|
||||
use(1)
|
||||
stacknum -= 1
|
||||
|
||||
//Step three - drying
|
||||
/obj/item/stack/wetleather
|
||||
name = "wet leather"
|
||||
desc = "This leather has been cleaned but still needs to be dried."
|
||||
@@ -96,51 +151,30 @@
|
||||
var/wetness = 30 //Reduced when exposed to high temperautres
|
||||
var/drying_threshold_temperature = 500 //Kelvin to start drying
|
||||
no_variants = FALSE
|
||||
amount = 1
|
||||
stacktype = "wetleather"
|
||||
|
||||
/obj/item/stack/wetleather
|
||||
amount = 50
|
||||
var/dry_type = /obj/item/stack/material/leather
|
||||
|
||||
//Step one - dehairing.
|
||||
/obj/item/stack/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if( istype(W, /obj/item/weapon/material/knife) || \
|
||||
istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \
|
||||
istype(W, /obj/item/weapon/material/knife/machete/hatchet) )
|
||||
|
||||
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
|
||||
usr.visible_message("<span class='notice'>\The [usr] starts cutting hair off \the [src]</span>", "<span class='notice'>You start cutting the hair off \the [src]</span>", "You hear the sound of a knife rubbing against flesh")
|
||||
if(do_after(user,50))
|
||||
to_chat(usr, "<span class='notice'>You cut the hair from this [src.singular_name]</span>")
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/hairlesshide/HS in usr.loc)
|
||||
if(HS.amount < 50)
|
||||
HS.amount++
|
||||
src.use(1)
|
||||
break
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/hairlesshide/HS = new(usr.loc)
|
||||
HS.amount = 1
|
||||
src.use(1)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
//Step two - washing..... it's actually in washing machine code.
|
||||
|
||||
//Step three - drying
|
||||
/obj/item/stack/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
..()
|
||||
if(exposed_temperature >= drying_threshold_temperature)
|
||||
wetness--
|
||||
if(wetness == 0)
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/material/leather/HS in src.loc)
|
||||
if(HS.amount < 50)
|
||||
HS.amount++
|
||||
src.use(1)
|
||||
wetness = initial(wetness)
|
||||
break
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/material/leather/HS = new(src.loc)
|
||||
HS.amount = 1
|
||||
dry()
|
||||
|
||||
/obj/item/stack/wetleather/proc/dry()
|
||||
//Try locating an exisitng stack on the tile and add to there if possible
|
||||
for(var/obj/item/stack/material/leather/HS in src.loc)
|
||||
if(HS.amount < 50)
|
||||
HS.amount++
|
||||
wetness = initial(wetness)
|
||||
src.use(1)
|
||||
return
|
||||
//If it gets to here it means it did not find a suitable stack on the tile.
|
||||
var/obj/item/stack/HS = new dry_type(src.loc)
|
||||
|
||||
if(istype(HS))
|
||||
HS.amount = 1
|
||||
wetness = initial(wetness)
|
||||
src.use(1)
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
|
||||
/obj/item/stack/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
|
||||
if(Adjacent(user))
|
||||
if(!uses_charge)
|
||||
. += "There are [src.amount] [src.singular_name]\s in the stack."
|
||||
@@ -170,8 +170,37 @@
|
||||
var/atom/O
|
||||
if(recipe.use_material)
|
||||
O = new recipe.result_type(user.loc, recipe.use_material)
|
||||
|
||||
if(istype(O, /obj))
|
||||
var/obj/Ob = O
|
||||
|
||||
if(LAZYLEN(Ob.matter)) // Law of equivalent exchange.
|
||||
Ob.matter.Cut()
|
||||
|
||||
else
|
||||
Ob.matter = list()
|
||||
|
||||
var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000
|
||||
|
||||
Ob.matter[recipe.use_material] = mattermult / produced * required
|
||||
|
||||
else
|
||||
O = new recipe.result_type(user.loc)
|
||||
|
||||
if(recipe.matter_material)
|
||||
if(istype(O, /obj))
|
||||
var/obj/Ob = O
|
||||
|
||||
if(LAZYLEN(Ob.matter)) // Law of equivalent exchange.
|
||||
Ob.matter.Cut()
|
||||
|
||||
else
|
||||
Ob.matter = list()
|
||||
|
||||
var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000
|
||||
|
||||
Ob.matter[recipe.use_material] = mattermult / produced * required
|
||||
|
||||
O.set_dir(user.dir)
|
||||
O.add_fingerprint(user)
|
||||
|
||||
@@ -379,8 +408,9 @@
|
||||
var/on_floor = 0
|
||||
var/use_material
|
||||
var/pass_color
|
||||
var/matter_material // Material type used for recycling. Default, uses use_material. For non-material-based objects however, matter_material is needed.
|
||||
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color)
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color, recycle_material = null)
|
||||
src.title = title
|
||||
src.result_type = result_type
|
||||
src.req_amount = req_amount
|
||||
@@ -392,6 +422,12 @@
|
||||
src.use_material = supplied_material
|
||||
src.pass_color = pass_stack_color
|
||||
|
||||
if(!recycle_material && src.use_material)
|
||||
src.matter_material = src.use_material
|
||||
|
||||
else if(recycle_material)
|
||||
src.matter_material = recycle_material
|
||||
|
||||
/*
|
||||
* Recipe list datum
|
||||
*/
|
||||
|
||||
@@ -114,6 +114,18 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
drop_sound = 'sound/items/drop/rubber.ogg'
|
||||
|
||||
/obj/item/toy/colorballoon /// To color it, VV the 'color' var with a hex color code with the # included.
|
||||
name = "balloon"
|
||||
desc = "It's a plain little balloon. Comes in many colors!"
|
||||
throwforce = 0
|
||||
throw_speed = 4
|
||||
throw_range = 20
|
||||
force = 0
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "colorballoon"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
drop_sound = 'sound/items/drop/rubber.ogg'
|
||||
|
||||
/*
|
||||
* Fake telebeacon
|
||||
*/
|
||||
@@ -1438,4 +1450,36 @@
|
||||
name = "purple king"
|
||||
desc = "A large king piece for playing chess. It's made of a purple-colored glass."
|
||||
description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
|
||||
icon_state = "b-king"
|
||||
icon_state = "b-king"
|
||||
|
||||
/// Balloon structures
|
||||
|
||||
/obj/structure/balloon
|
||||
name = "generic balloon"
|
||||
desc = "A generic balloon. How boring."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "ghostballoon"
|
||||
anchored = 0
|
||||
density = 0
|
||||
|
||||
/obj/structure/balloon/attack_hand(mob/user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
|
||||
if(user.a_intent == I_HELP)
|
||||
user.visible_message("<span class='notice'><b>\The [user]</b> pokes [src]!</span>","<span class='notice'>You poke [src]!</span>")
|
||||
else if (user.a_intent == I_HURT)
|
||||
user.visible_message("<span class='warning'><b>\The [user]</b> punches [src]!</span>","<span class='warning'>You punch [src]!</span>")
|
||||
else if (user.a_intent == I_GRAB)
|
||||
user.visible_message("<span class='warning'><b>\The [user]</b> attempts to pop [src]!</span>","<span class='warning'>You attempt to pop [src]!</span>")
|
||||
else
|
||||
user.visible_message("<span class='notice'><b>\The [user]</b> lightly bats the [src].</span>","<span class='notice'>You lightly bat the [src].</span>")
|
||||
|
||||
/obj/structure/balloon/bat
|
||||
name = "giant bat balloon"
|
||||
desc = "A large balloon in the shape of a spooky bat with orange eyes."
|
||||
icon_state = "batballoon"
|
||||
|
||||
/obj/structure/balloon/ghost
|
||||
name = "giant ghost balloon"
|
||||
desc = "Oh no, it's a ghost! Oh wait, it's just a balloon. Phew!"
|
||||
icon_state = "ghostballoon"
|
||||
@@ -101,6 +101,11 @@
|
||||
build_path = /obj/machinery/computer/arcade/orion_trail
|
||||
origin_tech = list(TECH_DATA = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/arcade/clawmachine
|
||||
name = T_BOARD("grab-a-gift arcade machine")
|
||||
build_path = /obj/machinery/computer/arcade/clawmachine
|
||||
origin_tech = list(TECH_DATA = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/turbine_control
|
||||
name = T_BOARD("turbine control console")
|
||||
build_path = /obj/machinery/computer/turbine_computer
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Banana Peals
|
||||
* Banana Peels
|
||||
*/
|
||||
/obj/item/weapon/bananapeel/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if (istype(AM, /mob/living))
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/M = AM
|
||||
M.slip("the [src.name]",4)
|
||||
/*
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/weapon/soap/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if (istype(AM, /mob/living))
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/M = AM
|
||||
M.slip("the [src.name]",3)
|
||||
|
||||
@@ -68,11 +68,20 @@
|
||||
/*
|
||||
* Bike Horns
|
||||
*/
|
||||
/obj/item/weapon/bikehorn
|
||||
var/honk_sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
/obj/item/weapon/bikehorn/attack_self(mob/user as mob)
|
||||
if (spam_flag == 0)
|
||||
if(spam_flag == 0)
|
||||
spam_flag = 1
|
||||
playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
|
||||
playsound(src, honk_sound, 50, 1)
|
||||
src.add_fingerprint(user)
|
||||
spawn(20)
|
||||
spam_flag = 0
|
||||
return
|
||||
|
||||
/obj/item/weapon/bikehorn/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(istype(AM, /mob/living))
|
||||
playsound(src, honk_sound, 50, 1)
|
||||
|
||||
@@ -163,3 +163,14 @@
|
||||
fragile = 1 //It's a haphazard thing of glass, wire, and steel
|
||||
reach = 2 // Spears are long.
|
||||
attackspeed = 14
|
||||
|
||||
/obj/item/weapon/material/twohanded/riding_crop
|
||||
name = "riding crop"
|
||||
desc = "A rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Used since the dawn of the West to control animals."
|
||||
force_divisor = 0.05 //Required in order for the X attacks Y message to pop up.
|
||||
unwielded_force_divisor = 1 // One here, too.
|
||||
applies_material_colour = 1
|
||||
unbreakable = 1
|
||||
base_icon = "riding_crop"
|
||||
icon_state = "riding_crop0"
|
||||
attack_verb = list("cropped","spanked","swatted","smacked","peppered")
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
to_chat(user, "<span class='notice'>You fill the [src].</span>")
|
||||
else if(!silent)
|
||||
to_chat(user, "<span class='notice'>You fail to pick anything up with \the [src].</span>")
|
||||
if(istype(user.pulling, /obj/structure/ore_box/)) //Bit of a crappy way to do this, as it doubles spam for the user, but it works.
|
||||
if(istype(user.pulling, /obj/structure/ore_box)) //Bit of a crappy way to do this, as it doubles spam for the user, but it works.
|
||||
var/obj/structure/ore_box/O = user.pulling
|
||||
O.attackby(src, user)
|
||||
|
||||
|
||||
@@ -523,9 +523,11 @@
|
||||
|
||||
if(((!(ishuman(usr) || isrobot(usr))) && (src.loc != usr)) || usr.stat || usr.restrained())
|
||||
return
|
||||
drop_contents()
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
/obj/item/weapon/storage/proc/drop_contents() // why is this a proc? literally just for RPEDs
|
||||
hide_from(usr)
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/obj/item/I in contents)
|
||||
remove_from_storage(I, T)
|
||||
|
||||
|
||||
@@ -343,9 +343,11 @@
|
||||
to_chat(user, "<span class='danger'>You go blind!</span>")
|
||||
user.Blind(5)
|
||||
user.eye_blurry = 5
|
||||
user.disabilities |= NEARSIGHTED
|
||||
spawn(100)
|
||||
user.disabilities &= ~NEARSIGHTED
|
||||
// Don't cure being nearsighted
|
||||
if(!(H.disabilities & NEARSIGHTED))
|
||||
user.disabilities |= NEARSIGHTED
|
||||
spawn(100)
|
||||
user.disabilities &= ~NEARSIGHTED
|
||||
return
|
||||
|
||||
/obj/item/weapon/weldingtool/is_hot()
|
||||
|
||||
@@ -240,6 +240,16 @@
|
||||
|
||||
removed.add_thermal_energy(heat_transfer)
|
||||
|
||||
for(var/mob/living/L in view(3, src))
|
||||
L.add_modifier(/datum/modifier/endothermic, 10 SECONDS, null, TRUE)
|
||||
|
||||
for(var/obj/item/stack/wetleather/WL in view(2, src))
|
||||
if(WL.wetness >= 0)
|
||||
WL.dry()
|
||||
continue
|
||||
|
||||
WL.wetness = max(0, WL.wetness - rand(1, 4))
|
||||
|
||||
env.merge(removed)
|
||||
|
||||
/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
/obj/structure/flora/pottedplant/attackby(obj/item/I, mob/user)
|
||||
if(issilicon(user))
|
||||
return // Don't try to put modules in here, you're a borg. TODO: Inventory refactor to not be ass.
|
||||
|
||||
|
||||
if(stored_item)
|
||||
to_chat(user, "<span class='notice'>[I] won't fit in. There already appears to be something in here...</span>")
|
||||
return
|
||||
@@ -494,3 +494,47 @@
|
||||
|
||||
/obj/structure/flora/sif/tendrils/get_harvestable_desc()
|
||||
return "<span class='notice'>\The [src] seems to be growing over something.</span>"
|
||||
|
||||
/datum/category_item/catalogue/flora/frostbelle
|
||||
name = "Sivian Flora - Frostbelle"
|
||||
desc = "A rare plant native to Sif, with very peculiar growing requirements. Rarely seen outside of their original habitat,\
|
||||
or the homes of the wealthy, the plant's unique vein structure is actually used to carry the plant's reproductive material \
|
||||
to forming buds, the petals of which secrete the luminescent sap containing the pollen at the time of blooming. Certain \
|
||||
horticulturists have found ways of halting this process prior to the secretion of the sap, leaving the flower's petals \
|
||||
bright, at the cost of making that bud sterile."
|
||||
value = CATALOGUER_REWARD_HARD
|
||||
|
||||
/obj/structure/flora/sif/frostbelle
|
||||
name = "gnarly shrub"
|
||||
desc = "A stocky plant with fins bearing luminescent veins along its branches."
|
||||
icon_state = "grass"
|
||||
randomize_size = TRUE
|
||||
catalogue_data = list(/datum/category_item/catalogue/flora/frostbelle)
|
||||
|
||||
harvest_tool = /obj/item/weapon/material/knife
|
||||
max_harvests = 2
|
||||
min_harvests = -4
|
||||
harvest_loot = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/frostbelle = 1
|
||||
)
|
||||
|
||||
var/variantnum = null
|
||||
|
||||
/obj/structure/flora/sif/frostbelle/Initialize()
|
||||
. = ..()
|
||||
|
||||
variantnum = rand(1,3)
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/structure/flora/sif/frostbelle/update_icon()
|
||||
..()
|
||||
|
||||
if(max_harvests > 0 && harvest_count < max_harvests)
|
||||
icon_state = "[initial(icon_state)][variantnum]"
|
||||
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/structure/flora/sif/frostbelle/get_harvestable_desc()
|
||||
return "<span class='notice'>\The [src] seems to be budding.</span>"
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper_1"
|
||||
icon_state_opened = "sleeper_0"
|
||||
density = TRUE
|
||||
density = FALSE
|
||||
ghost_query_type = /datum/ghost_query/stowaway
|
||||
anchored = FALSE
|
||||
anchored = TRUE
|
||||
invisibility = 60
|
||||
|
||||
var/occupant_type = "stowaway"
|
||||
|
||||
@@ -123,7 +124,9 @@
|
||||
if(allow_appearance_change)
|
||||
H.change_appearance(APPEARANCE_ALL, H, check_species_whitelist = 1)
|
||||
|
||||
visible_message("<span class='aliem'>\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!</span>")
|
||||
// visible_message("<span class='aliem'>\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!</span>")
|
||||
|
||||
qdel(src)
|
||||
|
||||
// Manual Variant
|
||||
// This one lacks the emag option due to the fact someone has to activate it, and they will probably help the person.
|
||||
|
||||
@@ -451,6 +451,7 @@
|
||||
busy = 0
|
||||
|
||||
O.clean_blood()
|
||||
O.water_act(rand(1,10))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>[user] washes \a [I] using \the [src].</span>", \
|
||||
"<span class='notice'>You wash \a [I] using \the [src].</span>")
|
||||
|
||||
Reference in New Issue
Block a user