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