diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 0dbe652c39d..4116f610ad0 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -4,7 +4,7 @@
/obj/machinery/atmospherics/unary/freezer
name = "gas cooling system"
desc = "Cools gas when connected to pipe network"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/sleeper.dmi'
icon_state = "freezer_0"
density = 1
anchored = 1
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index 4f324a717e0..556615901f1 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -4,7 +4,7 @@
/obj/machinery/atmospherics/unary/heater
name = "gas heating system"
desc = "Heats gas when connected to a pipe network"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/sleeper.dmi'
icon_state = "heater_0"
density = 1
anchored = 1
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 4d3e651c4d5..981fd9c257c 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -460,3 +460,6 @@ Define for getting a bitfield of adjacent turfs that meet a condition.
#define GET_BELOW(A) (HAS_BELOW(A:z) ? get_step(A, DOWN) : null)
#define NULL_OR_EQUAL(self,other) (!(self) || (self) == (other))
+
+//Lying animation
+#define ANIM_LYING_TIME 2
diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm
index 83020a3bc75..0668ca76b91 100644
--- a/code/datums/progressbar.dm
+++ b/code/datums/progressbar.dm
@@ -1,7 +1,9 @@
#define PROGRESSBAR_HEIGHT 6
+#define PROGRESSBAR_ANIMATION_TIME 5
/datum/progressbar
var/goal = 1
+ var/last_progress = 0
var/image/bar
var/shown = 0
var/mob/user
@@ -14,7 +16,7 @@
EXCEPTION("Invalid target given")
if (goal_number)
goal = goal_number
- bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0", 21)
+ bar = image('icons/effects/progressbar.dmi', target, "prog_bar_0", 21)
bar.appearance_flags = RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA
user = User
if(user)
@@ -25,11 +27,13 @@
var/list/bars = user.progressbars[bar.loc]
bars += src
listindex = bars.len
- bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1))
+ bar.pixel_y = 0
+ bar.alpha = 0
+ animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING)
/datum/progressbar/proc/update(progress)
if (!user || !user.client)
- shown = 0
+ shown = FALSE
return
if (user.client != client)
if (client)
@@ -41,13 +45,17 @@
bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
if (!shown)
user.client.images += bar
- shown = 1
+ shown = TRUE
/datum/progressbar/proc/shiftDown()
--listindex
- bar.pixel_y -= PROGRESSBAR_HEIGHT
+ bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1))
+ var/dist_to_travel = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) - PROGRESSBAR_HEIGHT
+ animate(bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING)
/datum/progressbar/Destroy()
+ if(last_progress != goal)
+ bar.icon_state = "[bar.icon_state]_fail"
for(var/I in user.progressbars[bar.loc])
var/datum/progressbar/P = I
if(P != src && P.listindex > listindex)
@@ -58,10 +66,15 @@
if(!bars.len)
LAZYREMOVE(user.progressbars, bar.loc)
- if (client)
- client.images -= bar
-
- QDEL_NULL(bar)
+ animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME)
+ addtimer(CALLBACK(src, .proc/remove_from_client), PROGRESSBAR_ANIMATION_TIME, TIMER_CLIENT_TIME)
+ QDEL_IN(bar, PROGRESSBAR_ANIMATION_TIME * 2) //for garbage collection safety
. = ..()
-#undef PROGRESSBAR_HEIGHT
+/datum/progressbar/proc/remove_from_client()
+ if(client)
+ client.images -= bar
+ client = null
+
+#undef PROGRESSBAR_ANIMATION_TIME
+#undef PROGRESSBAR_HEIGHT
\ No newline at end of file
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 38e4559d3f0..918cbb4e283 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -15,6 +15,7 @@
var/mob/pulledby = null
var/item_state = null // Base name of the image used for when the item is worn. Suffixes are added to this.
//Also used on holdable mobs for the same info related to their held version
+ var/does_spin = TRUE // Does the atom spin when thrown (of course it does :P)
var/can_hold_mob = FALSE
var/list/contained_mobs
@@ -101,6 +102,10 @@
if(HULK in usr.mutations)
src.throwing = 2 // really strong throw!
+ var/dist_travelled = 0
+ var/dist_since_sleep = 0
+ var/area/a = get_area(src.loc)
+
var/dist_x = abs(target.x - src.x)
var/dist_y = abs(target.y - src.y)
@@ -115,71 +120,49 @@
dy = NORTH
else
dy = SOUTH
- var/dist_travelled = 0
- var/dist_since_sleep = 0
- var/area/a = get_area(src.loc)
+ var/error
+ var/major_dir
+ var/major_dist
+ var/minor_dir
+ var/minor_dist
if(dist_x > dist_y)
- var/error = dist_x/2 - dist_y
-
-
-
- while(src && target &&((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a && a.has_gravity() == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
- // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
- if(error < 0)
- var/atom/step = get_step(src, dy)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error += dist_x
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- else
- var/atom/step = get_step(src, dx)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error -= dist_y
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- a = get_area(src.loc)
+ error = dist_x/2 - dist_y
+ major_dir = dx
+ major_dist = dist_x
+ minor_dir = dy
+ minor_dist = dist_y
else
- var/error = dist_y/2 - dist_x
- while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a && a.has_gravity() == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
- // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
- if(error < 0)
- var/atom/step = get_step(src, dx)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error += dist_y
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
- else
- var/atom/step = get_step(src, dy)
- if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
- break
- src.Move(step)
- hit_check(speed)
- error -= dist_x
- dist_travelled++
- dist_since_sleep++
- if(dist_since_sleep >= speed)
- dist_since_sleep = 0
- sleep(1)
+ error = dist_y/2 - dist_x
+ major_dir = dy
+ major_dist = dist_y
+ minor_dir = dx
+ minor_dist = dist_x
- a = get_area(src.loc)
+ while(src && target && src.throwing && istype(src.loc, /turf) \
+ && ((abs(target.x - src.x)+abs(target.y - src.y) > 0 && dist_travelled < range) \
+ || (a && a.has_gravity == 0) \
+ || istype(src.loc, /turf/space)))
+ // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
+ var/atom/step
+ if(error >= 0)
+ step = get_step(src, major_dir)
+ error -= minor_dist
+ else
+ step = get_step(src, minor_dir)
+ error += major_dist
+ if(!step) // going off the edge of the map makes get_step return null, don't let things go off the edge
+ break
+ src.Move(step)
+ hit_check(speed)
+ dist_travelled++
+ dist_since_sleep++
+ if(dist_since_sleep >= speed)
+ dist_since_sleep = 0
+ sleep(1)
+ a = get_area(src.loc)
+ // and yet it moves
+ if(src.does_spin)
+ src.SpinAnimation(speed = 4, loops = 1)
//done throwing, either because it hit something or it finished moving
if(isobj(src)) src.throw_impact(get_turf(src),speed)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index f76454f07cd..4dde8e57cc8 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -40,7 +40,7 @@
/obj/machinery/dna_scannernew
name = "\improper DNA modifier"
desc = "It scans DNA structures."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/sleeper.dmi'
icon_state = "scanner_0"
density = 1
anchored = 1.0
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index f3218faf3bd..c2d018729c5 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -1,8 +1,8 @@
/obj/machinery/sleeper
name = "sleeper"
desc = "A fancy bed with built-in injectors, a dialysis machine, and a limited health scanner."
- icon = 'icons/obj/Cryogenic2.dmi'
- icon_state = "sleeper_0"
+ icon = 'icons/obj/sleeper.dmi'
+ icon_state = "sleeper"
density = 1
anchored = 1
var/mob/living/carbon/human/occupant = null
@@ -43,7 +43,11 @@
toggle_filter()
/obj/machinery/sleeper/update_icon()
- icon_state = "sleeper_[occupant ? "1" : "0"]"
+ if(occupant)
+ icon_state = "[initial(icon_state)]-closed"
+ return
+ else
+ icon_state = initial(icon_state)
/obj/machinery/sleeper/RefreshParts()
..()
@@ -181,8 +185,12 @@
qdel(G)
return
else if(I.isscrewdriver())
- to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
- panel_open = !panel_open
+ src.panel_open = !src.panel_open
+ to_chat(user, "You [src.panel_open ? "open" : "close"] the maintenance panel.")
+ cut_overlays()
+ if(src.panel_open)
+ add_overlay("[initial(icon_state)]-o")
+
else if(default_part_replacement(user, I))
return
@@ -238,6 +246,7 @@
M.forceMove(src)
update_use_power(2)
occupant = M
+ flick("[initial(icon_state)]-anim", src)
update_icon()
/obj/machinery/sleeper/proc/go_out()
@@ -253,6 +262,7 @@
continue
A.forceMove(loc)
update_use_power(1)
+ flick("[initial(icon_state)]-anim", src)
update_icon()
toggle_filter()
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 38858a8a5a0..e49d18c8ab3 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -21,8 +21,8 @@
)
name = "Body Scanner"
desc = "A state-of-the-art medical diagnostics machine. Guaranteed detection of all your bodily ailments or your money back!"
- icon = 'icons/obj/Cryogenic2.dmi'
- icon_state = "body_scanner_0"
+ icon = 'icons/obj/sleeper.dmi'
+ icon_state = "body_scanner"
density = 1
anchored = 1
@@ -36,6 +36,13 @@
connected.connected = null
return ..()
+/obj/machinery/bodyscanner/update_icon()
+ if(occupant)
+ icon_state = "[initial(icon_state)]-closed"
+ return
+ else
+ icon_state = initial(icon_state)
+
/obj/machinery/bodyscanner/relaymove(mob/user as mob)
if (user.stat)
return
@@ -72,7 +79,8 @@
usr.forceMove(src)
src.occupant = usr
update_use_power(2)
- src.icon_state = "body_scanner_1"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
for(var/obj/O in src)
//O = null
qdel(O)
@@ -94,7 +102,8 @@
src.occupant.forceMove(src.loc)
src.occupant = null
update_use_power(1)
- src.icon_state = "body_scanner_0"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
return
/obj/machinery/bodyscanner/attackby(obj/item/weapon/grab/G, mob/user)
@@ -124,7 +133,8 @@
M.forceMove(src)
src.occupant = M
update_use_power(2)
- src.icon_state = "body_scanner_1"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
for(var/obj/O in src)
O.forceMove(loc)
//Foreach goto(154)
@@ -167,7 +177,8 @@
M.forceMove(src)
src.occupant = M
update_use_power(2)
- src.icon_state = "body_scanner_1"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
playsound(src.loc, 'sound/machines/medbayscanner1.ogg', 50)
for(var/obj/Obj in src)
Obj.forceMove(src.loc)
@@ -236,7 +247,7 @@
var/collapse_desc = ""
name = "Body Scanner Console"
desc = "A control panel for some kind of medical device."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/sleeper.dmi'
icon_state = "body_scannerconsole"
density = 0
anchored = 1
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 55b0711286d..1dbb8c34f64 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -12,7 +12,7 @@
/obj/machinery/computer/cryopod
name = "cryogenic oversight console"
desc = "An interface between crew and the cryogenic storage oversight systems."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/sleeper.dmi'
icon_state = "cellconsole"
light_color = LIGHT_COLOR_GREEN
circuit = /obj/item/weapon/circuitboard/cryopodcontrol
@@ -145,7 +145,7 @@
name = "cryogenic feed"
desc = "A bewildering tangle of machinery and pipes."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/sleeper.dmi'
icon_state = "cryo_rear"
anchored = 1
dir = WEST
@@ -154,14 +154,14 @@
/obj/machinery/cryopod
name = "cryogenic freezer"
desc = "A man-sized pod for entering suspended animation."
- icon = 'icons/obj/Cryogenic2.dmi'
- icon_state = "body_scanner_0"
+ icon = 'icons/obj/sleeper.dmi'
+ icon_state = "body_scanner"
density = 1
anchored = 1
dir = WEST
- var/base_icon_state = "body_scanner_0"
- var/occupied_icon_state = "body_scanner_1"
+ var/base_icon_state = "body_scanner"
+ var/occupied_icon_state = "body_scanner-closed"
var/on_store_message = "has entered long-term storage."
var/on_store_name = "Cryogenic Oversight"
var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward."
@@ -364,6 +364,7 @@
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
+ flick("[initial(icon_state)]-anim", src)
icon_state = occupied_icon_state
to_chat(M, "[on_enter_occupant_message]")
@@ -425,6 +426,7 @@
to_chat(user, "You stop [L == user ? "climbing into" : "putting [L] into"] \the [name].")
return
+ flick("[initial(icon_state)]-anim", src)
icon_state = occupied_icon_state
to_chat(L, "You feel cool air surround you. You go numb as your senses turn inward.")
@@ -449,6 +451,7 @@
if(usr.stat != 0)
return
+ flick("[initial(icon_state)]-anim", src)
icon_state = base_icon_state
//Eject any items that aren't meant to be in the pod.
@@ -499,6 +502,7 @@
usr.forceMove(src)
set_occupant(usr)
+ flick("[initial(icon_state)]-anim", src)
icon_state = occupied_icon_state
to_chat(usr, "[on_enter_occupant_message]")
@@ -522,6 +526,7 @@
occupant.forceMove(get_turf(src))
set_occupant(null)
+ flick("[initial(icon_state)]-anim", src)
icon_state = base_icon_state
return
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 86df1feb459..a1c80720237 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -1,8 +1,8 @@
/obj/item/mecha_parts/mecha_equipment/tool/sleeper
name = "mounted sleeper"
desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
- icon = 'icons/obj/Cryogenic2.dmi'
- icon_state = "sleeper_0"
+ icon = 'icons/obj/sleeper.dmi'
+ icon_state = "sleeper"
origin_tech = list(TECH_DATA = 2, TECH_BIO = 3)
energy_drain = 20
range = MELEE
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index b1a28bb9766..3d5ec6e38cb 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -20,11 +20,12 @@
/obj/item/toy
+ icon = 'icons/obj/toy.dmi'
throwforce = 0
throw_speed = 4
throw_range = 20
force = 0
-
+ drop_sound = 'sound/items/drop/gloves.ogg'
/*
* Balloons
@@ -32,9 +33,9 @@
/obj/item/toy/balloon
name = "water balloon"
desc = "A translucent balloon. There's nothing in it."
- icon = 'icons/obj/toy.dmi'
icon_state = "waterballoon-e"
item_state = "balloon-empty"
+ drop_sound = 'sound/items/drop/rubber.ogg'
/obj/item/toy/balloon/New()
var/datum/reagents/R = new/datum/reagents(10)
@@ -91,26 +92,18 @@
/obj/item/toy/syndicateballoon
name = "criminal balloon"
desc = "There is a tag on the back that reads \"FUK NT!11!\"."
- throwforce = 0
- throw_speed = 4
- throw_range = 20
- force = 0
- icon = 'icons/obj/weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
+ drop_sound = 'sound/items/drop/rubber.ogg'
w_class = ITEMSIZE_LARGE
/obj/item/toy/nanotrasenballoon
- name = "criminal balloon"
+ name = "nanotrasen balloon"
desc = "Across the balloon the following is printed: \"Man, I love NanoTrasen soooo much. I use only NT products. You have NO idea.\""
- throwforce = 0
- throw_speed = 4
- throw_range = 20
- force = 0
- icon = 'icons/obj/weapons.dmi'
icon_state = "ntballoon"
item_state = "ntballoon"
w_class = ITEMSIZE_LARGE
+ drop_sound = 'sound/items/drop/rubber.ogg'
/*
* Fake telebeacon
@@ -141,6 +134,7 @@
icon = 'icons/obj/gun.dmi'
icon_state = "crossbow"
item_state = "crossbow"
+ drop_sound = 'sound/items/drop/gun.ogg'
item_icons = list(//ITEM_ICONS ARE DEPRECATED. USE CONTAINED SPRITES IN FUTURE
icon_l_hand = 'icons/mob/items/lefthand_guns.dmi',
icon_r_hand = 'icons/mob/items/righthand_guns.dmi'
@@ -240,6 +234,7 @@
icon_state = "foamdart"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
+ drop_sound = 'sound/items/drop/food.ogg'
/obj/effect/foam_dart_dummy
name = ""
@@ -259,6 +254,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "sword0"
item_state = "sword0"
+ drop_sound = 'sound/items/drop/gun.ogg'
var/active = 0.0
var/colorvar = "blue"
w_class = ITEMSIZE_SMALL
@@ -297,6 +293,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "katana"
item_state = "katana"
+ drop_sound = 'sound/items/drop/gun.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT | SLOT_BACK
force = 5
@@ -313,6 +310,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
w_class = ITEMSIZE_TINY
+ drop_sound = 'sound/items/drop/food.ogg'
throw_impact(atom/hit_atom)
..()
@@ -340,9 +338,9 @@
/obj/item/toy/waterflower
name = "water flower"
desc = "A seemingly innocent sunflower...with a twist."
- icon = 'icons/obj/device.dmi'
icon_state = "sunflower"
item_state = "sunflower"
+ drop_sound = 'sound/items/drop/herb.ogg'
var/empty = 0
flags
@@ -409,8 +407,8 @@
/obj/item/toy/bosunwhistle
name = "bosun's whistle"
desc = "A genuine Admiral Krush Bosun's Whistle, for the aspiring ship's captain! Suitable for ages 8 and up, do not swallow."
- icon = 'icons/obj/toy.dmi'
icon_state = "bosunwhistle"
+ drop_sound = 'sound/items/drop/card.ogg'
var/cooldown = 0
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
@@ -425,10 +423,10 @@
* Mech prizes
*/
/obj/item/toy/prize
- icon = 'icons/obj/toy.dmi'
icon_state = "ripleytoy"
var/cooldown = 0
w_class = ITEMSIZE_SMALL
+ drop_sound = 'sound/mecha/mechstep.ogg'
//all credit to skasi for toy mech fun ideas
/obj/item/toy/prize/attack_self(mob/user as mob)
@@ -507,9 +505,9 @@
/obj/item/toy/figure
name = "completely glitched action figure"
desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death."
- icon_state = "assistant"
- icon = 'icons/obj/toy.dmi'
+ icon_state = "glitched"
w_class = ITEMSIZE_TINY
+ drop_sound = 'sound/items/drop/accessory.ogg'
/obj/item/toy/figure/cmo
name = "chief medical officer action figure"
@@ -705,54 +703,25 @@
name = "emergency response team commander action figure"
desc = "A \"Space Life\" brand emergency response team commander action figure."
icon_state = "ert"
-
-/obj/item/toy/therapy_red
- name = "red therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is red."
- icon = 'icons/obj/weapons.dmi'
+/*
+ * Therapy Dolls
+ */
+/obj/item/toy/plushie/therapy
+ name = "therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is in red."
+ icon = 'icons/obj/toy.dmi'
icon_state = "therapyred"
- item_state = "egg4" // It's the red egg in items_left/righthand
+ item_state = "therapyred"
+ var/active = 0.0
+ var/colorvar = "red"
w_class = ITEMSIZE_TINY
-/obj/item/toy/therapy_purple
- name = "purple therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is purple."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapypurple"
- item_state = "egg1" // It's the magenta egg in items_left/righthand
- w_class = ITEMSIZE_TINY
-
-/obj/item/toy/therapy_blue
- name = "blue therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is blue."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapyblue"
- item_state = "egg2" // It's the blue egg in items_left/righthand
- w_class = ITEMSIZE_TINY
-
-/obj/item/toy/therapy_yellow
- name = "yellow therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is yellow."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapyyellow"
- item_state = "egg5" // It's the yellow egg in items_left/righthand
- w_class = ITEMSIZE_TINY
-
-/obj/item/toy/therapy_orange
- name = "orange therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is orange."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapyorange"
- item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
- w_class = ITEMSIZE_TINY
-
-/obj/item/toy/therapy_green
- name = "green therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is green."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "therapygreen"
- item_state = "egg3" // It's the green egg in items_left/righthand
- w_class = ITEMSIZE_TINY
+/obj/item/toy/plushie/therapy/Initialize()
+ . = ..()
+ colorvar = pick("red","orange","yellow","green","blue","purple")
+ icon_state = "therapy[colorvar]"
+ item_state = "egg_[colorvar]"
+ desc = "A toy for therapeutic and recreational purposes. This one is in [colorvar]."
/*
* Plushies
@@ -761,8 +730,8 @@
/obj/item/toy/plushie
name = "generic small plush"
desc = "A very generic small plushie. It seems to not want to exist."
- icon = 'icons/obj/toy.dmi'
icon_state = "nymphplushie"
+ drop_sound = 'sound/items/drop/plushie.ogg'
var/phrase = "Hewwo!"
/obj/item/toy/plushie/attack_self(mob/user as mob)
@@ -774,6 +743,7 @@
user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!")
else
user.visible_message("\The [user] pokes the [src].","You poke the [src].")
+ playsound(src, 'sound/items/drop/plushie.ogg', 25, 0)
visible_message("[src] says, \"[phrase]\"")
//Large plushies.
@@ -856,48 +826,22 @@
//Squid Plushies
-/obj/item/toy/plushie/squid/green
- name = "green squid plushie"
- desc = "A small, cute and loveable squid friend. This one is green."
- icon = 'icons/obj/toy.dmi'
- icon_state = "greensquid"
- slot_flags = SLOT_HEAD
-
-/obj/item/toy/plushie/squid/mint
- name = "mint squid plushie"
- desc = "A small, cute and loveable squid friend. This one is mint coloured."
- icon = 'icons/obj/toy.dmi'
- icon_state = "mintsquid"
- slot_flags = SLOT_HEAD
-
-/obj/item/toy/plushie/squid/blue
- name = "blue squid plushie"
- desc = "A small, cute and loveable squid friend. This one is blue."
- icon = 'icons/obj/toy.dmi'
- icon_state = "bluesquid"
- slot_flags = SLOT_HEAD
-
-/obj/item/toy/plushie/squid/orange
- name = "orange squid plushie"
- desc = "A small, cute and loveable squid friend. This one is orange."
- icon = 'icons/obj/toy.dmi'
- icon_state = "orangesquid"
- slot_flags = SLOT_HEAD
-
-/obj/item/toy/plushie/squid/yellow
- name = "yellow squid plushie"
- desc = "A small, cute and loveable squid friend. This one is yellow."
- icon = 'icons/obj/toy.dmi'
- icon_state = "yellowsquid"
- slot_flags = SLOT_HEAD
-
-/obj/item/toy/plushie/squid/pink
- name = "pink squid plushie"
- desc = "A small, cute and loveable squid friend. This one is pink."
+/obj/item/toy/plushie/squid
+ name = "squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is pink coloured."
icon = 'icons/obj/toy.dmi'
icon_state = "pinksquid"
+ item_state = "pinksquid"
+ var/active = 0.0
+ var/colorvar = "pink"
slot_flags = SLOT_HEAD
+/obj/item/toy/plushie/squid/Initialize()
+ . = ..()
+ colorvar = pick("pink","blue","mint","green","yellow","orange")
+ icon_state = "[colorvar]squid"
+ item_state = "[colorvar]squid"
+ desc = "A small, cute and loveable squid friend. This one is in [colorvar]."
//Toy cult sword
/obj/item/toy/cultsword
@@ -928,12 +872,14 @@
item_state = "inflatable"
icon = 'icons/obj/clothing/belts.dmi'
slot_flags = SLOT_BELT
+ drop_sound = 'sound/items/drop/rubber.ogg'
+
/obj/item/toy/xmastree
name = "miniature Christmas tree"
desc = "Now with 99% less pine needles."
- icon = 'icons/obj/toy.dmi'
icon_state = "tinyxmastree"
w_class = ITEMSIZE_TINY
force = 1
throwforce = 1
+ drop_sound = 'sound/items/drop/box.ogg'
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 6977668f0bc..2c0e6f206a5 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -317,23 +317,9 @@
/obj/item/toy/plushie/kitten,
/obj/item/toy/plushie/lizard,
/obj/item/toy/plushie/farwa,
+ /obj/item/toy/plushie/squid,
/obj/item/toy/plushie/bear,
- /obj/item/toy/plushie/bearfire,
- /obj/random/squid_plushie
- )
-
-/obj/random/squid_plushie
- name = "random squid plushie"
- desc = "This is a random squid plushie."
- icon = 'icons/obj/toy.dmi'
- icon_state = "greensquid"
- spawnlist = list(
- /obj/item/toy/plushie/squid/green,
- /obj/item/toy/plushie/squid/mint,
- /obj/item/toy/plushie/squid/blue,
- /obj/item/toy/plushie/squid/orange,
- /obj/item/toy/plushie/squid/yellow,
- /obj/item/toy/plushie/squid/pink
+ /obj/item/toy/plushie/bearfire
)
/obj/random/smalltank
diff --git a/code/game/objects/structures/therapy.dm b/code/game/objects/structures/therapy.dm
index 5a4c6f376a8..70ccf628bc0 100644
--- a/code/game/objects/structures/therapy.dm
+++ b/code/game/objects/structures/therapy.dm
@@ -226,8 +226,8 @@
/obj/machinery/chakrapod
name = "Crystal Therapy Pod"
desc = "A state-of-the-art crystal therapy pod. Designed to utilize phoron enhanced quartz crystals to remove mental trauma from the body. Proven to be 100% effective 30% of the time!"
- icon = 'icons/obj/Cryogenic2.dmi'
- icon_state = "syndipod_0"
+ icon = 'icons/obj/sleeper.dmi'
+ icon_state = "sleeper_s"
density = 1
anchored = 1
@@ -254,6 +254,13 @@
src.go_out()
return
+/obj/machinery/chakrapod/update_icon()
+ if(occupant)
+ icon_state = "[initial(icon_state)]-closed"
+ return
+ else
+ icon_state = initial(icon_state)
+
/obj/machinery/chakrapod/verb/eject()
set src in oview(1)
set category = "Object"
@@ -290,7 +297,8 @@
usr.forceMove(src)
src.occupant = WEAKREF(usr)
update_use_power(2)
- src.icon_state = "syndipod_1"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
for(var/obj/O in src)
O.forceMove(get_turf(src))
src.add_fingerprint(usr)
@@ -316,7 +324,8 @@
H.forceMove(get_turf(src))
occupant = null
update_use_power(1)
- src.icon_state = "syndipod_0"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
return
/obj/machinery/chakrapod/attackby(obj/item/weapon/grab/G, mob/user)
@@ -351,7 +360,8 @@
occupant = WEAKREF(L)
update_use_power(2)
- icon_state = "syndipod_1"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
for(var/obj/O in src)
O.forceMove(get_turf(src))
@@ -392,7 +402,8 @@
H.forceMove(src)
occupant = WEAKREF(H)
update_use_power(2)
- src.icon_state = "syndipod_1"
+ flick("[initial(icon_state)]-anim", src)
+ update_icon()
for(var/obj/Obj in src)
Obj.forceMove(get_turf(src))
src.add_fingerprint(user)
@@ -401,8 +412,8 @@
/obj/machinery/chakraconsole
name = "Therapy Pod Console"
desc = "A control panel for some kind of medical device."
- icon = 'icons/obj/Cryogenic2.dmi'
- icon_state = "syndipod_scannerconsole"
+ icon = 'icons/obj/sleeper.dmi'
+ icon_state = "sleeper_s_scannerconsole"
density = 0
anchored = 1
var/obj/machinery/chakrapod/connected
@@ -432,7 +443,7 @@
/obj/machinery/chakraconsole/power_change()
..()
if((stat & BROKEN) || (stat & NOPOWER))
- icon_state = "syndipod_scannerconsole-p"
+ icon_state = "sleeper_s_scannerconsole-p"
else
icon_state = initial(icon_state)
diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm
index 4d94bb361e3..135620a952d 100644
--- a/code/modules/mob/animations.dm
+++ b/code/modules/mob/animations.dm
@@ -213,8 +213,16 @@ note dizziness decrements automatically in the mob's Life() proc.
if(!direction) // Attacked self?!
I.pixel_z = 16
+ var/matrix/M = new
+ M.Turn(pick(-20, 20))
// And animate the attack!
- animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
+ animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 2, easing = CUBIC_EASING)
+ sleep(2)
+ animate(I, transform = M, time = 1) // apply the fancy matrix
+ sleep(1)
+ animate(I, transform = matrix(), time = 1) // back to a default matrix
+ sleep(1)
+ animate(I, alpha = 0, time = 1)
/mob/proc/spin(spintime, speed)
spawn()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 38b0f993098..6dd60c49ef6 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -155,12 +155,12 @@ There are several things that need to be remembered:
M.Turn(90)
M.Scale(size_multiplier)
M.Translate(1,-6)
- src.transform = M
+ animate(src, transform = M, time = ANIM_LYING_TIME)
else
var/matrix/M = matrix()
M.Scale(size_multiplier)
M.Translate(0, 16*(size_multiplier-1))
- src.transform = M
+ animate(src, transform = M, time = ANIM_LYING_TIME)
compile_overlays()
lying_prev = lying
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d9dd3857711..65208f074ba 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -274,7 +274,7 @@ proc/get_radio_key_from_channel(var/channel)
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
- INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, speech_bubble, hear_clients, 30)
+ INVOKE_ASYNC(GLOBAL_PROC, /proc/animate_speechbubble, speech_bubble, hear_clients, 30)
for(var/obj/O in listening_obj)
spawn(0)
@@ -284,6 +284,20 @@ proc/get_radio_key_from_channel(var/channel)
log_say("[key_name(src)] : ([get_lang_name(speaking)]) [message]",ckey=key_name(src))
return 1
+/proc/animate_speechbubble(image/I, list/show_to, duration)
+ var/matrix/M = matrix()
+ M.Scale(0,0)
+ I.transform = M
+ I.alpha = 0
+ for(var/client/C in show_to)
+ C.images += I
+ animate(I, transform = 0, alpha = 255, time = 5, easing = ELASTIC_EASING)
+ sleep(duration-5)
+ animate(I, alpha = 0, time = 5, easing = EASE_IN)
+ sleep(5)
+ for(var/client/C in show_to)
+ C.images -= I
+
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
log_say("[key_name(src)] : ([get_lang_name(language)]) [message]",ckey=key_name(src))
diff --git a/code/modules/power/lights/bulbs.dm b/code/modules/power/lights/bulbs.dm
index ad3924f4a29..2b8cd3a75c4 100644
--- a/code/modules/power/lights/bulbs.dm
+++ b/code/modules/power/lights/bulbs.dm
@@ -102,7 +102,7 @@
name = "fire bulb"
desc = "A replacement fire bulb."
icon_state = "flight"
- item_state = "egg4"
+ item_state = "egg_red"
matter = list("glass" = 100)
brightness_range = 8
brightness_power = 0.8
diff --git a/html/changelogs/wezzycool_animations.yml b/html/changelogs/wezzycool_animations.yml
new file mode 100644
index 00000000000..f7c07c3d7c3
--- /dev/null
+++ b/html/changelogs/wezzycool_animations.yml
@@ -0,0 +1,41 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: Wowzewow
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added animations for lying down, speech bubbles, throwing things, picking up and putting stuff down."
diff --git a/html/changelogs/wezzymob_fix.yml b/html/changelogs/wezzymob_fix.yml
new file mode 100644
index 00000000000..37ff1975266
--- /dev/null
+++ b/html/changelogs/wezzymob_fix.yml
@@ -0,0 +1,41 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: Wowzewow
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added animations for lying down, speech bubbles, throwing things, progress bars, sleepers, and an improved attack animation."
diff --git a/icons/effects/progessbar.dmi b/icons/effects/progessbar.dmi
deleted file mode 100644
index 99284060aa6..00000000000
Binary files a/icons/effects/progessbar.dmi and /dev/null differ
diff --git a/icons/effects/progressbar.dmi b/icons/effects/progressbar.dmi
new file mode 100644
index 00000000000..f055a07ba14
Binary files /dev/null and b/icons/effects/progressbar.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 182bae6a87f..dcff32f12ef 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 60815326d3b..1def8282f20 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/npc/aibots.dmi b/icons/mob/npc/aibots.dmi
new file mode 100644
index 00000000000..0721b868359
Binary files /dev/null and b/icons/mob/npc/aibots.dmi differ
diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi
deleted file mode 100644
index 938ed0161d9..00000000000
Binary files a/icons/obj/Cryogenic2.dmi and /dev/null differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 5bb8ba66673..676342afa51 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 4ba1643a761..7f4dca21090 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/sleeper.dmi b/icons/obj/sleeper.dmi
new file mode 100644
index 00000000000..22428a26c98
Binary files /dev/null and b/icons/obj/sleeper.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 7301baa3d01..b2a597b7eeb 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 9264956d615..e942a025f6d 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 977c4c95cfb..d8d04231449 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1026,6 +1026,7 @@ window "mainwindow"
background-color = none
is-default = true
saved-params = "pos;size;is-minimized;is-maximized"
+ icon = 'icons\\ss13_64.png'
title = "Space Station 13 - Aurora Station"
macro = "macro"
menu = "menu"
diff --git a/sound/items/drop/plushie.ogg b/sound/items/drop/plushie.ogg
new file mode 100644
index 00000000000..a6d0f290b69
Binary files /dev/null and b/sound/items/drop/plushie.ogg differ