diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index af4d4f933b9..dcddd2c0bf7 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -26609,6 +26609,7 @@ /area/crew_quarters/heads/hop) "bqB" = ( /obj/machinery/holopad, +/obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) "bqC" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c5da27d96df..19891947c65 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -62768,6 +62768,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, +/obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "cmB" = ( diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 080776333e8..8a717fbdb27 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -3301,6 +3301,7 @@ /turf/closed/wall/r_wall, /area/crew_quarters/heads/hop) "aiP" = ( +/obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aiQ" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index e313354c2ee..7fdb19a239f 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -32646,6 +32646,7 @@ pixel_x = -25; pixel_y = 5 }, +/obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) "bsN" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index ab6a920cce0..91553c52279 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -54937,6 +54937,10 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"rKW" = ( +/obj/effect/mapping_helpers/ianbirthday, +/turf/open/floor/wood, +/area/crew_quarters/heads/hop) "rLi" = ( /obj/machinery/button/door{ id = "shootshut"; @@ -91021,7 +91025,7 @@ aaa aaa aAH aBC -aCS +rKW aDU aEN aAH diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 6f55431ba42..f1b83039831 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -95,6 +95,9 @@ */ var/list/implants = null + /// Any undershirt. While on humans it is a string, here we use paths to stay consistent with the rest of the equips. + var/datum/sprite_accessory/undershirt = null + /// Any clothing accessory item var/accessory = null @@ -179,6 +182,9 @@ if(suit_store) H.equip_to_slot_or_del(new suit_store(H),SLOT_S_STORE) + if(undershirt) + H.undershirt = initial(undershirt.name) + if(accessory) var/obj/item/clothing/under/U = H.w_uniform if(U) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 7e7909be5c9..f9e3a09a71c 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -200,3 +200,10 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + +/obj/effect/decal/cleanable/confetti + name = "confetti" + desc = "Tiny bits of colored paper thrown about for the janitor to enjoy!" + icon = 'icons/effects/confetti_and_decor.dmi' + icon_state = "confetti" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT //the confetti itself might be annoying enough diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 98a323617c8..74144d762e2 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -35,7 +35,7 @@ /* * Balloons */ -/obj/item/toy/balloon +/obj/item/toy/waterballoon name = "water balloon" desc = "A translucent balloon. There's nothing in it." icon = 'icons/obj/toy.dmi' @@ -43,14 +43,14 @@ item_state = "balloon-empty" -/obj/item/toy/balloon/Initialize() +/obj/item/toy/waterballoon/Initialize() . = ..() create_reagents(10) -/obj/item/toy/balloon/attack(mob/living/carbon/human/M, mob/user) +/obj/item/toy/waterballoon/attack(mob/living/carbon/human/M, mob/user) return -/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user, proximity) +/obj/item/toy/waterballoon/afterattack(atom/A as mob|obj, mob/user, proximity) . = ..() if(!proximity) return @@ -66,7 +66,7 @@ desc = "A translucent balloon with some form of liquid sloshing around in it." update_icon() -/obj/item/toy/balloon/attackby(obj/item/I, mob/user, params) +/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/glass)) if(I.reagents) if(I.reagents.total_volume <= 0) @@ -83,11 +83,11 @@ else return ..() -/obj/item/toy/balloon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/toy/waterballoon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? balloon_burst(hit_atom) -/obj/item/toy/balloon/proc/balloon_burst(atom/AT) +/obj/item/toy/waterballoon/proc/balloon_burst(atom/AT) if(reagents.total_volume >= 1) var/turf/T if(AT) @@ -101,7 +101,7 @@ icon_state = "burst" qdel(src) -/obj/item/toy/balloon/update_icon() +/obj/item/toy/waterballoon/update_icon() if(src.reagents.total_volume >= 1) icon_state = "waterballoon" item_state = "balloon" @@ -109,19 +109,44 @@ icon_state = "waterballoon-e" item_state = "balloon-empty" -/obj/item/toy/syndicateballoon - name = "syndicate balloon" - desc = "There is a tag on the back that reads \"FUK NT!11!\"." +#define BALLOON_COLORS list("red", "blue", "green", "yellow") + +/obj/item/toy/balloon + name = "balloon" + desc = "No birthday is complete without it." + icon = 'icons/obj/balloons.dmi' + icon_state = "balloon" + item_state = "balloon" + lefthand_file = 'icons/mob/inhands/balloons_lefthand.dmi' + righthand_file = 'icons/mob/inhands/balloons_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY throwforce = 0 throw_speed = 3 throw_range = 7 force = 0 - icon = 'icons/obj/items_and_weapons.dmi' + var/random_color = TRUE + +/obj/item/toy/balloon/Initialize(mapload) + . = ..() + if(random_color) + var/chosen_balloon_color = pick(BALLOON_COLORS) + name = "[chosen_balloon_color] [name]" + icon_state = "[icon_state]_[chosen_balloon_color]" + item_state = icon_state + +/obj/item/toy/balloon/corgi + name = "corgi balloon" + desc = "A balloon with a corgi face on it. For the all year good boys." + icon_state = "corgi" + item_state = "corgi" + random_color = FALSE + +/obj/item/toy/balloon/syndicate + name = "syndicate balloon" + desc = "There is a tag on the back that reads \"FUK NT!11!\"." icon_state = "syndballoon" item_state = "syndballoon" - lefthand_file = 'icons/mob/inhands/antag/balloons_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/balloons_righthand.dmi' - w_class = WEIGHT_CLASS_BULKY + random_color = FALSE /obj/item/toy/syndicateballoon/pickup(mob/user) . = ..() @@ -140,7 +165,6 @@ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) . = ..() - /* * Fake singularity */ diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index dea6989621e..9ab59318967 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -589,3 +589,11 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/easter/getStationPrefix() return pick("Fluffy","Bunny","Easter","Egg") + +/datum/holiday/ianbirthday + name = "Ian's Birthday" + begin_day = 15 + begin_month = MARCH + +/datum/holiday/ianbirthday/greet() + return "Happy birthday, Ian!" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 27fead7c9ce..76584454a0b 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -51,3 +51,9 @@ /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/hop) + +/datum/outfit/job/hop/pre_equip(mob/living/carbon/human/H) + ..() + if(locate(/datum/holiday/ianbirthday) in SSevents.holidays) + undershirt = /datum/sprite_accessory/undershirt/ian + diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 2af5c169966..125eb4331e9 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -18,7 +18,7 @@ /obj/effect/baseturf_helper/LateInitialize() if(!baseturf_to_replace) - baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) + baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) else if(!length(baseturf_to_replace)) baseturf_to_replace = list(baseturf_to_replace = TRUE) else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative @@ -230,3 +230,70 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) qdel(part) j.update_icon() qdel(src) + + +//On Ian's birthday, the hop's office is decorated. +/obj/effect/mapping_helpers/ianbirthday + name = "Ian's Bday Helper" + late = TRUE + icon_state = "iansbdayhelper" + var/balloon_clusters = 2 + +/obj/effect/mapping_helpers/ianbirthday/LateInitialize() + if(locate(/datum/holiday/ianbirthday) in SSevents.holidays) + birthday() + qdel(src) + +/obj/effect/mapping_helpers/ianbirthday/proc/birthday() + var/area/a = get_area(src) + var/list/table = list()//should only be one aka the front desk, but just in case... + var/list/openturfs = list() + + //confetti and a corgi balloon! (and some list stuff for more decorations) + for(var/thing in a.contents) + if(istype(thing, /obj/structure/table/reinforced)) + table += thing + if(isopenturf(thing)) + new /obj/effect/decal/cleanable/confetti(thing) + if(locate(/obj/structure/bed/dogbed/ian) in thing) + new /obj/item/toy/balloon/corgi(thing) + else + openturfs += thing + //cake + knife to cut it! + var/turf/food_turf = get_turf(pick(table)) + new /obj/item/kitchen/knife(food_turf) + var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf) + iancake.desc = "Happy birthday, Ian!" + //some balloons! this picks an open turf and pops a few balloons in and around that turf, yay. + for(var/i in 1 to balloon_clusters) + var/turf/clusterspot = pick_n_take(openturfs) + new /obj/item/toy/balloon(clusterspot) + var/balloons_left_to_give = 3 //the amount of balloons around the cluster + var/list/dirs_to_balloon = GLOB.cardinals.Copy() + while(balloons_left_to_give > 0) + balloons_left_to_give-- + var/chosen_dir = pick_n_take(dirs_to_balloon) + var/turf/balloonstep = get_step(clusterspot, chosen_dir) + var/placed = FALSE + if(isopenturf(balloonstep)) + var/obj/item/toy/balloon/B = new(balloonstep)//this clumps the cluster together + placed = TRUE + if(chosen_dir == NORTH) + B.pixel_y -= 10 + if(chosen_dir == SOUTH) + B.pixel_y += 10 + if(chosen_dir == EAST) + B.pixel_x -= 10 + if(chosen_dir == WEST) + B.pixel_x += 10 + if(!placed) + new /obj/item/toy/balloon(clusterspot) + //remind me to add wall decor! + +/obj/effect/mapping_helpers/ianbirthday/admin//so admins may birthday any room + name = "generic birthday setup" + icon_state = "bdayhelper" + +/obj/effect/mapping_helpers/ianbirthday/admin/LateInitialize() + birthday() + qdel(src) diff --git a/icons/effects/confetti_and_decor.dmi b/icons/effects/confetti_and_decor.dmi new file mode 100644 index 00000000000..ed74e4a56a8 Binary files /dev/null and b/icons/effects/confetti_and_decor.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index f8fbc2ee300..554d913925c 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/mob/inhands/antag/balloons_lefthand.dmi b/icons/mob/inhands/antag/balloons_lefthand.dmi deleted file mode 100644 index 1e1171822c2..00000000000 Binary files a/icons/mob/inhands/antag/balloons_lefthand.dmi and /dev/null differ diff --git a/icons/mob/inhands/antag/balloons_righthand.dmi b/icons/mob/inhands/antag/balloons_righthand.dmi deleted file mode 100644 index 3d026d516d0..00000000000 Binary files a/icons/mob/inhands/antag/balloons_righthand.dmi and /dev/null differ diff --git a/icons/mob/inhands/balloons_lefthand.dmi b/icons/mob/inhands/balloons_lefthand.dmi new file mode 100644 index 00000000000..0e9eda3194c Binary files /dev/null and b/icons/mob/inhands/balloons_lefthand.dmi differ diff --git a/icons/mob/inhands/balloons_righthand.dmi b/icons/mob/inhands/balloons_righthand.dmi new file mode 100644 index 00000000000..e42884d0481 Binary files /dev/null and b/icons/mob/inhands/balloons_righthand.dmi differ diff --git a/icons/obj/balloons.dmi b/icons/obj/balloons.dmi new file mode 100644 index 00000000000..0019c732e2f Binary files /dev/null and b/icons/obj/balloons.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 8e8447174bb..255ed8fb0ec 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ