diff --git a/aurorastation.dme b/aurorastation.dme index 7fe264dd487..fe6e31bb63a 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -794,7 +794,6 @@ #include "code\game\objects\items\draftingchalk.dm" #include "code\game\objects\items\eightball.dm" #include "code\game\objects\items\glassjar.dm" -#include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\paintkit.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\skrell.dm" diff --git a/code/controllers/subsystems/falling.dm b/code/controllers/subsystems/falling.dm index 58f20b974c5..af9daf1328e 100644 --- a/code/controllers/subsystems/falling.dm +++ b/code/controllers/subsystems/falling.dm @@ -80,6 +80,9 @@ // fall_collateral if the next turf is not open space. if (isopenturf(victim.loc) && victim.loc:is_hole) victim.forceMove(below) + if(victim.pulledby) + var/mob/M = victim.pulledby + M.stop_pulling() if (locate(/obj/structure/stairs) in victim.loc) // If there's stairs, we're probably going down them. if (falling[victim] <= 1) // Just moving down a flight, skip damage. diff --git a/code/controllers/subsystems/traumas.dm b/code/controllers/subsystems/traumas.dm index 294570cc136..8b5aedde91d 100644 --- a/code/controllers/subsystems/traumas.dm +++ b/code/controllers/subsystems/traumas.dm @@ -83,7 +83,7 @@ var/datum/controller/subsystem/traumas/SStraumas /obj/machinery/cryopod/robot, /obj/machinery/robotic_fabricator, /obj/effect/decal/cleanable/blood/gibs/robot, /obj/effect/decal/remains/robot, /obj/item/robot_parts, /obj/item/organ/internal/cell, /obj/item/organ/internal/data, /obj/item/toy/figure/borg)), - "nanotrasen" = typecacheof(list(/obj/item/toy/nanotrasenballoon, /obj/item/soap/nanotrasen, /obj/structure/sign/flag/nanotrasen, + "nanotrasen" = typecacheof(list(/obj/item/toy/balloon/nanotrasen, /obj/item/soap/nanotrasen, /obj/structure/sign/flag/nanotrasen, /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen, /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen, /obj/item/storage/toolbox/lunchbox/nt, /obj/structure/banner, /obj/structure/bed/chair/office/bridge, /obj/item/clothing/head/collectable/captain, /obj/item/clothing/head/helmet/space/void/captain, /obj/item/clothing/suit/space/void/captain, /obj/item/clothing/suit/storage/hooded/wintercoat/captain, diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm index 5e1571bf562..598d4b8a539 100644 --- a/code/datums/uplink/badassery.dm +++ b/code/datums/uplink/badassery.dm @@ -7,11 +7,11 @@ /datum/uplink_item/item/badassery/balloon name = "For showing that You Are The BOSS (Useless Balloon)" item_cost = DEFAULT_TELECRYSTAL_AMOUNT - path = /obj/item/toy/syndicateballoon + path = /obj/item/toy/balloon/syndicate /datum/uplink_item/item/badassery/balloon/NT name = "For showing that you love NT SOO much (Useless Balloon)" - path = /obj/item/toy/nanotrasenballoon + path = /obj/item/toy/balloon/nanotrasen /************** * Random Item * diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm index 430085636b1..624b0fcbd55 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm @@ -10,8 +10,8 @@ set category = "Hardware" set name = "Destroy Core" set desc = "Activates or deactivates self destruct sequence of your physical mainframe." - var/mob/living/silicon/ai/user = usr + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, 0, 1)) return @@ -49,8 +49,8 @@ set category = "Hardware" set name = "Toggle APU Generator" set desc = "Activates or deactivates your APU generator, allowing you to operate even without power." - var/mob/living/silicon/ai/user = usr + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, 0, 1)) return @@ -67,7 +67,12 @@ set category = "Hardware" set name = "Destroy Station" set desc = "Activates or deactivates self destruct sequence of this station. Sequence takes two minutes, and if you are shut down before timer reaches zero it will be cancelled." + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return + var/obj/item/device/radio/radio = new/obj/item/device/radio() var/datum/weakref/nuke //Time control for the self destruct diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm index 1d5381f74d2..5dd607ff8d7 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm @@ -100,6 +100,9 @@ /proc/ability_prechecks(var/mob/living/silicon/ai/user = null, var/check_price = 0, var/override = 0) if(!user) return 0 + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return FALSE if(!istype(user)) to_chat(user, "GAME ERROR: You tried to use ability that is only available for malfunctioning AIs, but you are not AI! Please report this.") return 0 diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm index bcf47f8593a..1905db667ca 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm @@ -48,6 +48,7 @@ set desc = "25 CPU - Sends termination signal to quantum relay aborting current shuttle call." set category = "Software" var/price = 25 + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return @@ -67,8 +68,8 @@ set desc = "125 CPU - Bypasses firewalls on Cyborg lock mechanism, allowing you to override lock command from robotics control console." set category = "Software" var/price = 125 - var/mob/living/silicon/ai/user = usr + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return @@ -137,7 +138,12 @@ set desc = "2500 CPU - Allows you to hack a random active maintenance drone which is slaved to you. Bringing them under your control." set category = "Software" var/price = 2500 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return + var/list/drone_list = list() var/hacked_num = 0 for(var/mob/living/silicon/robot/drone/D in mob_list) @@ -173,7 +179,11 @@ set desc = "350 CPU - Allows you to hack cyborgs which are not slaved to you, bringing them under your control." set category = "Software" var/price = 350 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return var/list/L = get_unlinked_cyborgs(user) if(!L.len) @@ -239,7 +249,11 @@ set desc = "600 CPU - Allows you to hack other AIs, slaving them under you." set category = "Software" var/price = 600 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return var/list/L = get_other_ais(user) if(!L.len) diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm index 1338248c180..06ed3ea8064 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm @@ -48,6 +48,7 @@ set desc = "50 CPU - Hacks a holopad shorting out its projector. Using a hacked holopad only turns on the audio feature." set category = "Software" var/price = 50 + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price) || !ability_pay(user,price)) return @@ -68,7 +69,11 @@ set desc = "100 CPU - Hacks existing camera, allowing you to add upgrade of your choice to it. Alternatively it lets you reactivate broken camera." set category = "Software" var/price = 100 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return if(target && !istype(target)) to_chat(user, "This is not a camera.") @@ -129,6 +134,7 @@ set desc = "275 CPU - Uses station's emergency shielding system to create temporary barrier which lasts for few minutes, but won't resist gunfire." set category = "Software" var/price = 275 + var/mob/living/silicon/ai/user = usr if(!T || !istype(T)) return @@ -148,8 +154,8 @@ set desc = "400 CPU - Causes cyclic short-circuit in machine, resulting in weak explosion after some time." set category = "Software" var/price = 400 - var/mob/living/silicon/ai/user = usr + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return @@ -226,7 +232,12 @@ set desc = "300 CPU - Hacks the gravity generator. Making gravity reverse for short moment and making victims fall down really hard on the floor." set category = "Software" var/price = 300 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return + var/area/Area = get_area(user?.eyeobj.loc) if(!Area) return diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index e063785d587..4f7d0272263 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -41,7 +41,11 @@ set name = "Basic Encryption Hack" set desc = "10 CPU - Basic encryption hack that allows you to overtake APCs on the station." var/price = 10 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return if(!A) return @@ -87,7 +91,11 @@ set name = "Advanced Encryption Hack" set desc = "75 CPU - Attempts to bypass encryption on the Command Quantum Relay, giving you ability to fake legitimate messages. Has chance of failing." var/price = 75 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return if(!ability_prechecks(user, price)) return @@ -183,6 +191,7 @@ set name = "Elite Encryption Hack" set desc = "200 CPU - Allows you to hack station's ALERTCON system, changing alert level. Has high chance of failing." var/price = 200 + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return @@ -210,7 +219,12 @@ set name = "System Override" set desc = "500 CPU - Begins hacking station's primary firewall, quickly overtaking remaining APC systems. When completed grants access to station's self-destruct mechanism. Network administrators will probably notice this." var/price = 500 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return + if (alert(user, "Begin system override? This cannot be stopped once started. The network administrators will probably notice this.", "System Override:", "Yes", "No") != "Yes") return if (!ability_prechecks(user, price) || !ability_pay(user, price) || user.system_override) diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm index 05176875da9..d493ffebdfe 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm @@ -43,6 +43,7 @@ set desc = "100 CPU - Forces a module reset on a cyborg that is enslaved to you. Has a chance of failing." set category = "Software" var/price = 100 + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return @@ -109,7 +110,11 @@ set desc = "125 CPU - Infect an APC which can cause an IPC to become slaved to you if they download the files by trying to charge off of it. " set category = "Software" var/price = 125 + var/mob/living/silicon/ai/user = usr + if(user.stat == DEAD) + to_chat(user, SPAN_WARNING("You are dead!")) + return if(!A) return @@ -152,8 +157,8 @@ set desc = "300 CPU - Allows you to overclock a slaved cyborg granting them various improvements to their systems." set category = "Software" var/price = 300 - var/mob/living/silicon/ai/user = usr + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return @@ -215,8 +220,8 @@ set desc = "450 CPU - Starts a takeover of the station enabling several abilities that relate to synthetic dominance." set category = "Software" var/price = 450 - var/mob/living/silicon/ai/user = usr + var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user,price)) return diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index b8ddbb7d003..58bc2c26f63 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -913,16 +913,22 @@ to_chat(T, SPAN_NOTICE("
You are currently being turned into a vampire. You will die in the course of this, but you will be revived by the end. Please do not ghost out of your body until the process is complete.")) + var/drained_all_blood = FALSE while(do_mob(src, T, 50)) if(!mind.vampire) to_chat(src, SPAN_WARNING("Your fangs have disappeared!")) return if(!T.vessel.get_reagent_amount(/datum/reagent/blood)) to_chat(src, SPAN_NOTICE("[T] is now drained of blood. You begin forcing your own blood into their body, spreading the corruption of the Veil to their body.")) + drained_all_blood = TRUE break T.vessel.remove_reagent(/datum/reagent/blood, 50) + if(!drained_all_blood) + vampire.status &= ~VAMP_DRAINING + return + T.revive() // You ain't goin' anywhere, bud. diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm deleted file mode 100644 index 5e91667c233..00000000000 --- a/code/game/objects/items/latexballoon.dm +++ /dev/null @@ -1,48 +0,0 @@ -/obj/item/latexballon - name = "latex glove" - desc = "A latex glove, usually used as a balloon." - icon_state = "latexballon" - item_state = "lgloves" - force = 0 - throwforce = 0 - w_class = ITEMSIZE_SMALL - throw_speed = 1 - throw_range = 15 - var/state - var/datum/gas_mixture/air_contents = null - -/obj/item/latexballon/proc/blow(obj/item/tank/tank) - if (icon_state == "latexballon_bursted") - return - src.air_contents = tank.remove_air_volume(3) - icon_state = "latexballon_blow" - item_state = "latexballon" - -/obj/item/latexballon/proc/burst() - if (!air_contents) - return - playsound(src, 'sound/weapons/gunshot/gunshot1.ogg', 100, 1) - icon_state = "latexballon_bursted" - item_state = "lgloves" - loc.assume_air(air_contents) - -/obj/item/latexballon/ex_act(severity) - burst() - switch(severity) - if (1) - qdel(src) - if (2) - if (prob(50)) - qdel(src) - -/obj/item/latexballon/bullet_act() - burst() - -/obj/item/latexballon/fire_act(datum/gas_mixture/air, temperature, volume) - if(temperature > T0C+100) - burst() - return - -/obj/item/latexballon/attackby(obj/item/W as obj, mob/user as mob) - if (can_puncture(W)) - burst() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b7ae136f4e4..3a686cb8151 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -33,25 +33,25 @@ pickup_sound = 'sound/items/pickup/gloves.ogg' /* - * Balloons + * Water Balloons */ -/obj/item/toy/balloon +/obj/item/toy/waterballoon name = "water balloon" desc = "A translucent balloon. There's nothing in it." icon_state = "waterballoon-e" - item_state = "balloon-empty" + item_state = "waterballoon-e" drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' -/obj/item/toy/balloon/New() +/obj/item/toy/waterballoon/New() var/datum/reagents/R = new/datum/reagents(10) reagents = R R.my_atom = src -/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob) +/obj/item/toy/waterballoon/attack(mob/living/carbon/human/M as mob, mob/user as mob) return -/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity) +/obj/item/toy/waterballoon/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(!proximity) return if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1) A.reagents.trans_to_obj(src, 10) @@ -60,7 +60,7 @@ src.update_icon() return -/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob) +/obj/item/toy/waterballoon/attackby(obj/O as obj, mob/user as mob) if(istype(O, /obj/item/reagent_containers/glass)) if(O.reagents) if(O.reagents.total_volume < 1) @@ -77,7 +77,7 @@ src.update_icon() return -/obj/item/toy/balloon/throw_impact(atom/hit_atom) +/obj/item/toy/waterballoon/throw_impact(atom/hit_atom) if(src.reagents.total_volume >= 1) src.visible_message("\The [src] bursts!","You hear a pop and a splash.") src.reagents.touch_turf(get_turf(hit_atom)) @@ -87,31 +87,191 @@ QDEL_IN(src, 5) return -/obj/item/toy/balloon/update_icon() +/obj/item/toy/waterballoon/update_icon() if(src.reagents.total_volume >= 1) icon_state = "waterballoon" - item_state = "balloon" else icon_state = "waterballoon-e" - item_state = "balloon-empty" + item_state = icon_state -/obj/item/toy/syndicateballoon - name = "criminal balloon" - desc = "There is a tag on the back that reads \"FUK NT!11!\"." +/* + * Balloons + */ + + #define BALLOON_NORMAL 0 + #define BALLOON_BLOW 1 + #define BALLOON_BURST 2 + +/obj/item/toy/balloon + name = "balloon" + desc_info = "You can fill it up with gas using a tank." + desc_fluff = "Thanks to the joint effort of the Research and Atmospherics teams, station enviroments have been set to allow balloons to float without helium. Look, it was the end of the month and we went under budget." + drop_sound = 'sound/items/drop/rubber.ogg' + pickup_sound = 'sound/items/pickup/rubber.ogg' + w_class = ITEMSIZE_HUGE + var/datum/gas_mixture/air_contents = null + var/status = 0 // 0 = normal, 1 = blow, 2 = burst + +/obj/item/toy/balloon/attack_self(mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(user.a_intent == I_HELP) + user.visible_message("\The [user] pokes [src]!","You poke [src]!") + else if (user.a_intent == I_HURT) + user.visible_message("\The [user] punches [src]!","You punch [src]!") + else if (user.a_intent == I_GRAB) + if(prob(66)) + user.visible_message("\The [user] attempts to pop [src]!","You attempt to pop [src]!") + else + user.visible_message("\The [user] pops [src]!","You pop [src]!") + burst() + else + user.visible_message("\The [user] lightly bats the [src].","You lightly bat the [src].") + +/obj/item/toy/balloon/update_icon() + switch(status) + if(BALLOON_BURST) + if(("[initial(icon_state)]_burst") in icon_states(icon)) + icon_state = "[initial(icon_state)]_burst" + item_state = icon_state + else + qdel(src) // Just qdel it if it doesn't have a burst state. + if(BALLOON_BLOW) + if(("[initial(icon_state)]_blow") in icon_states(icon)) //Only give blow icon_state if it has one. For those who can't be bothered to sprite. (Also a catch to prevent invisible sprites.) + icon_state = "[initial(icon_state)]_blow" + update_held_icon() + +/obj/item/toy/balloon/proc/blow(obj/item/tank/T) + if(status == BALLOON_BURST) + return + else + src.air_contents = T.remove_air_volume(3) + status = BALLOON_BLOW + update_icon() + +/obj/item/toy/balloon/proc/burst() + playsound(src, 'sound/weapons/gunshot/gunshot1.ogg', 100, 1) + status = BALLOON_BURST + update_icon() + if(air_contents) + loc.assume_air(air_contents) + +/obj/item/toy/balloon/ex_act(severity) + burst() + switch(severity) + if(1) + qdel(src) + if(2) + if(prob(50)) + qdel(src) + +/obj/item/toy/balloon/bullet_act() + burst() + +/obj/item/toy/balloon/fire_act(datum/gas_mixture/air, temperature, volume) + if(temperature > T0C+100) + burst() + return + +/obj/item/toy/balloon/attackby(obj/item/W as obj, mob/user as mob) + if(can_puncture(W)) + burst() + +/obj/item/toy/balloon/latex + desc = "Leaves a starchy taste in your mouth after blowing into it." + icon_state = "latexballoon" + item_state = "latexballoon" + +/obj/item/toy/balloon/latex/nitrile + desc = "I hope you aren't going to re-use these for medical purposes." + icon_state = "nitrileballoon" + item_state = "nitrileballoon" + +/obj/item/toy/balloon/syndicate + name = "'criminal' balloon" + desc = "Across the balloon is printed: \"FUK CAPITALISM!11!\"" icon_state = "syndballoon" item_state = "syndballoon" - drop_sound = 'sound/items/drop/rubber.ogg' - pickup_sound = 'sound/items/pickup/rubber.ogg' - w_class = ITEMSIZE_LARGE -/obj/item/toy/nanotrasenballoon - 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.\"" +/obj/item/toy/balloon/nanotrasen + name = "'motivational' balloon" + desc = "Across the balloon is printed: \"Man, I love corporate soooo much. I use only brand name products. You have NO idea.\"" icon_state = "ntballoon" item_state = "ntballoon" - w_class = ITEMSIZE_LARGE - drop_sound = 'sound/items/drop/rubber.ogg' - pickup_sound = 'sound/items/pickup/rubber.ogg' + +/obj/item/toy/balloon/fellowship + name = "fellowship balloon" + desc = "Across the balloon is printed: \"Fellowship R Friends!\"" + icon_state = "fellowshipballoon" + item_state = "fellowshipballoon" + +/obj/item/toy/balloon/fellowshiphead + name = "fellowship head balloon" + desc = "Across the balloon is printed: \"Follow Fellows Forwards With The Fellowship!\"" + icon_state = "fellowshipheadballoon" + item_state = "fellowshipheadballoon" + +/obj/item/toy/balloon/contender + name = "contender balloon" + desc = "Across the balloon is printed: \"Contenders R Cool!\"" + icon_state = "contenderballoon" + item_state = "contenderballoon" + +/obj/item/toy/balloon/contenderhead + name = "contender head balloon" + desc = "Across the balloon is printed: \"Converge With Comrades in the Contenders!\"" + icon_state = "contenderheadballoon" + item_state = "contenderheadballoon" + +/obj/item/toy/balloon/bat + name = "giant bat balloon" + desc = "A large, kitschy balloon in the shape of a spooky bat with orange eyes." + desc_fluff = "There's a tag that reads: \"Apparition Halloween LLC.\"" + icon_state = "batballoon" + +/obj/item/toy/balloon/ghost + name = "giant ghost balloon" + desc = "Oh no, it's a ghost! Oh wait, it's just a kitschy balloon. Phew!" + desc_fluff = "There's a tag that reads: \"Apparition Halloween LLC.\"" + icon_state = "ghostballoon" + +/obj/item/toy/balloon/xmastree + name = "giant christmas tree balloon" + desc = "Mandatory at inter-generational christmas gatherings and office parties." + desc_fluff = "There's a tag that reads: \"On behalf of employee relations, the CCIA Department wishes you a happy non-denominational holiday season.\"" + icon_state = "xmastreeballoon" + +/obj/item/toy/balloon/candycane + name = "giant candy cane balloon" + desc = "Kris Kringle ain't got nothing on this candied confection." + desc_fluff = "There's a tag that reads: \"On behalf of employee relations, the CCIA Department wishes you a happy non-denominational holiday season.\"" + icon_state = "candycaneballoon" + +/obj/item/toy/balloon/color /// To color it, VV the 'color' var with a hex color code with the # included. + desc = "It's a plain little balloon. Comes in many colors!" + icon_state = "colorballoon" + item_state = "colorballoon" + build_from_parts = TRUE + worn_overlay = "string" + randpixel = 5 + +/obj/item/toy/balloon/color/Initialize() + . = ..() + if(build_from_parts) + color = pick(COLOR_BLUE, COLOR_RED, COLOR_PURPLE, COLOR_BROWN, COLOR_GREEN, COLOR_CYAN, COLOR_YELLOW) + update_icon() + randpixel_xy() + +/obj/item/toy/balloon/color/update_icon() // Only color the balloon, not the string. + ..() + if(status == BALLOON_BURST) + worn_overlay = null + cut_overlay() + if(worn_overlay) + add_overlay(overlay_image(icon, "[initial(icon_state)]_[worn_overlay]", flags=RESET_COLOR)) + +#undef BALLOON_NORMAL +#undef BALLOON_BLOW +#undef BALLOON_BURST /* * Fake telebeacon diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 7ba197275fd..5f184b42062 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -83,7 +83,7 @@ /obj/item/bikehorn, /obj/item/beach_ball, /obj/item/beach_ball/holoball, - /obj/item/toy/balloon, + /obj/item/toy/waterballoon, /obj/item/toy/blink, /obj/item/toy/crossbow, /obj/item/gun/projectile/revolver/capgun, @@ -171,7 +171,7 @@ /obj/item/lipstick/random, /obj/item/clothing/shoes/carp, /obj/item/bikehorn, - /obj/item/toy/balloon, + /obj/item/toy/waterballoon, /obj/item/toy/blink, /obj/item/gun/projectile/revolver/capgun, /obj/item/toy/prize/deathripley, @@ -204,7 +204,7 @@ /obj/item/stack/material/animalhide/monkey, /obj/item/stack/material/animalhide/xeno, /obj/item/xmasgift/medium, - /obj/item/toy/syndicateballoon, + /obj/item/toy/balloon/syndicate, /obj/item/toy/xmastree, /obj/item/bluespace_crystal, /obj/item/gun/energy/mousegun, @@ -215,7 +215,7 @@ /obj/item/ore/coal, /obj/item/stamp/clown, /obj/item/organ/internal/heart/skrell, - /obj/item/latexballon) + /obj/item/toy/balloon/color) var/atom/movable/I = new gift_type(get_turf(user)) user.remove_from_mob(src) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 31872854a67..656ca223571 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -80,9 +80,10 @@ if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) var/obj/item/device/analyzer/A = W A.analyze_gases(src, user) - else if (istype(W,/obj/item/latexballon)) - var/obj/item/latexballon/LB = W - LB.blow(src) + + if (istype(W, /obj/item/toy/balloon)) + var/obj/item/toy/balloon/B = W + B.blow(src) src.add_fingerprint(user) if(istype(W, /obj/item/device/assembly_holder)) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 5d678364c5e..e54b3deb86f 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -342,6 +342,27 @@ /obj/item/toy/plushie/bearfire ) +/obj/random/balloon + name = "random balloon" + desc = "This is a random balloon." + icon = 'icons/obj/toy.dmi' + icon_state = "balloon" + spawnlist = list( + /obj/item/toy/balloon/color = 7, + /obj/item/toy/balloon/latex = 1, + /obj/item/toy/balloon/latex/nitrile = 1, + /obj/item/toy/balloon/syndicate = 2, + /obj/item/toy/balloon/nanotrasen = 2, + /obj/item/toy/balloon/fellowship = 1, + /obj/item/toy/balloon/fellowshiphead = 1, + /obj/item/toy/balloon/contender = 1, + /obj/item/toy/balloon/contenderhead = 1, + /obj/item/toy/balloon/bat = 1, + /obj/item/toy/balloon/ghost = 1, + /obj/item/toy/balloon/xmastree = 1, + /obj/item/toy/balloon/candycane = 1 + ) + /obj/random/smalltank name = "random small tank" @@ -1180,8 +1201,7 @@ /obj/random/action_figure = 11, /obj/random/plushie = 44, /obj/item/toy/cultsword = 5, - /obj/item/toy/syndicateballoon = 5, - /obj/item/toy/nanotrasenballoon = 5, + /obj/random/balloon = 22, /obj/item/toy/katana = 11, /obj/item/toy/bosunwhistle = 5, /obj/item/storage/belt/champion = 11, @@ -1218,8 +1238,7 @@ /obj/item/toy/crossbow = 11, /obj/random/action_figure = 11, /obj/item/toy/cultsword = 7, - /obj/item/toy/syndicateballoon = 10, - /obj/item/toy/nanotrasenballoon = 5, + /obj/random/balloon = 22, /obj/item/toy/katana = 11, /obj/random/plushie = 55, /obj/item/storage/belt/champion = 11, diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 1f41933ca3b..411c9d33efa 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -62,6 +62,7 @@ /obj/item/clothing/gloves/latex name = "latex gloves" desc = "Sterile latex gloves." + desc_info = "You can make balloons with these using some cable coil." icon_state = "latex" item_state = "latex" siemens_coefficient = 1.0 //thin latex gloves, much more conductive than fabric gloves (basically a capacitor for AC) @@ -70,12 +71,25 @@ fingerprint_chance = 75 drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' + var/balloon = /obj/item/toy/balloon/latex + +/obj/item/clothing/gloves/latex/attackby(var/obj/O, mob/user as mob) + if(istype(O, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = O + if(C.use(1)) + var/obj/item/L = new src.balloon + user.drop_from_inventory(L,get_turf(src)) + to_chat(user, "You make a balloon.") + qdel(src) + else + to_chat(user, "You need one length of cable to finish the balloon!") /obj/item/clothing/gloves/latex/nitrile name = "nitrile gloves" desc = "Sterile nitrile gloves." icon_state = "nitrile" item_state = "nitrile" + balloon = /obj/item/toy/balloon/latex/nitrile /obj/item/clothing/gloves/latex/nitrile/unathi name = "unathi nitrile gloves" diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index da03a6768c5..a84334b7a7e 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -57,12 +57,13 @@ if(51 to 52) // Uncommon, 2% each new /obj/item/melee/classic_baton(src) if(53 to 54) - new /obj/item/latexballon(src) + var/newitem = pick(typesof(/obj/item/toy/balloon) - /obj/item/toy/balloon) + new newitem(src) if(55 to 56) var/newitem = pick(typesof(/obj/item/toy/prize) - /obj/item/toy/prize) new newitem(src) if(57 to 58) - new /obj/item/toy/syndicateballoon(src) + new /obj/item/toy/balloon/syndicate(src) if(59 to 60) new /obj/item/rig/eva(src) if(61 to 62) diff --git a/code/modules/mob/abstract/observer/observer.dm b/code/modules/mob/abstract/observer/observer.dm index a723a2acc5d..9413f9d6f08 100644 --- a/code/modules/mob/abstract/observer/observer.dm +++ b/code/modules/mob/abstract/observer/observer.dm @@ -747,6 +747,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "You are now visible!") invisibility = invisibility == INVISIBILITY_OBSERVER ? 0 : INVISIBILITY_OBSERVER + mouse_opacity = invisibility == INVISIBILITY_OBSERVER ? 0 : initial(mouse_opacity) // Give the ghost a cult icon which should be visible only to itself toggle_icon("cult") diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 68f29587a75..cd0681a27e2 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -168,10 +168,19 @@ var/list/slot_equipment_priority = list( \ //Puts the item our active hand if possible. Failing that it tries our inactive hand. Returns 1 on success. //If both fail it drops it on the floor and returns 0. //This is probably the main one you need to know :) -/mob/proc/put_in_hands(var/obj/item/W) +/mob/proc/put_in_hands(var/obj/item/W, var/check_adjacency = FALSE) if(!W || !istype(W)) return 0 - W.forceMove(get_turf(src)) + var/move_to_src = TRUE + if(check_adjacency) + move_to_src = FALSE + var/turf/origin = get_turf(W) + if(Adjacent(origin)) + move_to_src = TRUE + if(move_to_src) + W.forceMove(get_turf(src)) + else + W.forceMove(get_turf(W)) W.layer = initial(W.layer) W.dropped() return 0 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 401735ed264..c0e2fcb6f38 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1485,4 +1485,3 @@ There are several things that need to be remembered: #undef UNDERSCORE_OR_NULL #undef GET_BODY_TYPE #undef GET_TAIL_LAYER - diff --git a/code/modules/mob/living/silicon/silicon_procs.dm b/code/modules/mob/living/silicon/silicon_procs.dm index ae6f52e5334..274e1acb8a5 100644 --- a/code/modules/mob/living/silicon/silicon_procs.dm +++ b/code/modules/mob/living/silicon/silicon_procs.dm @@ -7,4 +7,7 @@ return accent = chosen_accent - to_chat(src, SPAN_NOTICE("You have set your synthesizer to mimic the [chosen_accent] accent.")) \ No newline at end of file + to_chat(src, SPAN_NOTICE("You have set your synthesizer to mimic the [chosen_accent] accent.")) + +/mob/living/silicon/put_in_hands(obj/item/W) + ..(W, TRUE) \ No newline at end of file diff --git a/code/modules/organs/subtypes/vaurca.dm b/code/modules/organs/subtypes/vaurca.dm index 98a075439ae..f450ce59bfc 100644 --- a/code/modules/organs/subtypes/vaurca.dm +++ b/code/modules/organs/subtypes/vaurca.dm @@ -150,9 +150,9 @@ obj/item/organ/vaurca/neuralsocket/process() else to_chat(user, "Tank is empty!") src.add_fingerprint(user) - else if (istype(W,/obj/item/latexballon)) - var/obj/item/latexballon/LB = W - LB.blow(src) + else if (istype(W,/obj/item/toy/balloon)) + var/obj/item/toy/balloon/B = W + B.blow(src) src.add_fingerprint(user) /obj/item/organ/vaurca/preserve/attack_self(mob/user as mob) diff --git a/html/changelog.html b/html/changelog.html index ac1afbaf6df..a57513c256a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,12 @@ -->
+

10 December 2020

+

Wowzewow (Wezzy) updated:

+ +

09 December 2020

Geeves updated:

JohnWildkins updated: