diff --git a/code/__defines/planets.dm b/code/__defines/planets.dm index 3579cc804d8..0217a0ef1e2 100644 --- a/code/__defines/planets.dm +++ b/code/__defines/planets.dm @@ -13,6 +13,8 @@ #define WEATHER_ASH_STORM "ash storm" // Ripped from TG, like the above. Less harmless. #define WEATHER_ASH_STORM_SAFE "light ash storm" //Safe version of the ash storm. Dimmer. #define WEATHER_FALLOUT "fallout" // Modified emberfall, actually harmful. Admin only. +#define WEATHER_FALLOUT_TEMP "short-term fallout" // Nuclear fallout that actually ends. Firework-only +#define WEATHER_CONFETTI "confetti" // Firework-only #define MOON_PHASE_NEW_MOON "new moon" #define MOON_PHASE_WAXING_CRESCENT "waxing crescent" diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 75aee4b7d99..2b0c74e269b 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -140,12 +140,7 @@ return // Cache this since S may go away after use() - var/list/sheet_matter - if(istype(S, /obj/item/stack/material)) - var/obj/item/stack/material/MS = S - sheet_matter = list(MS.material.name = 2000) - else - sheet_matter = S.matter + var/list/sheet_matter = S.matter // Calculate total amount of material for one sheet var/matter_per_sheet = 0 diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index e6498926f52..bb69a511789 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -41,7 +41,7 @@ var/list/outfits_decls_by_type_ var/l_hand = null // In the list(path=count,otherpath=count) format var/list/uniform_accessories = list() // webbing, armbands etc - fits in slot_tie - var/list/backpack_contents = list() + var/list/backpack_contents = list() var/id_type var/id_desc diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm index 8fcfffdf26c..f80cfb7de1d 100644 --- a/code/game/jobs/job/captain_vr.dm +++ b/code/game/jobs/job/captain_vr.dm @@ -25,7 +25,7 @@ dept_time_required = 60 alt_titles = list("Crew Resources Officer" = /datum/alt_title/cro, "Deputy Manager" = /datum/alt_title/deputy_manager, "Staff Manager" = /datum/alt_title/staff_manager, - "Facility Steward" = /datum/alt_title/facility_steward) + "Facility Steward" = /datum/alt_title/facility_steward, "First Mate" = /datum/alt_title/first_mate) access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, @@ -49,6 +49,9 @@ /datum/alt_title/facility_steward title = "Facility Steward" +/datum/alt_title/first_mate + title = "First Mate" + /datum/job/hop/get_request_reasons() return list("ID modification", "Training crew") diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm index 70ee51c792d..d1d82b9cae9 100644 --- a/code/game/jobs/job/engineering_vr.dm +++ b/code/game/jobs/job/engineering_vr.dm @@ -50,7 +50,8 @@ /datum/job/atmos spawn_positions = 3 pto_type = PTO_ENGINEERING - alt_titles = list("Atmospheric Engineer" = /datum/alt_title/atmos_engi, "Atmospheric Maintainer" = /datum/alt_title/atmos_maint, "Disposals Technician" = /datum/alt_title/disposals_tech) + alt_titles = list("Atmospheric Engineer" = /datum/alt_title/atmos_engi, "Atmospheric Maintainer" = /datum/alt_title/atmos_maint, "Disposals Technician" = /datum/alt_title/disposals_tech, + "Fuel Technician" = /datum/alt_title/refuel_tech) /datum/alt_title/atmos_maint title = "Atmospheric Maintainer" @@ -62,5 +63,8 @@ title = "Disposals Technician" title_blurb = "A Disposals Technician is an Atmospheric Technician still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations." +/datum/alt_title/refuel_tech + title = "Fuel Technician" + /datum/job/atmos/get_request_reasons() return list("Construction project", "Repairs necessary") \ No newline at end of file diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm index 232c9be3324..c6657abec78 100644 --- a/code/game/jobs/job/security_vr.dm +++ b/code/game/jobs/job/security_vr.dm @@ -23,7 +23,7 @@ /datum/job/warden pto_type = PTO_SECURITY dept_time_required = 20 - alt_titles = list("Brig Sentry" = /datum/alt_title/brig_sentry, "Armory Superintendent" = /datum/alt_title/armory_superintendent) + alt_titles = list("Brig Sentry" = /datum/alt_title/brig_sentry, "Armory Superintendent" = /datum/alt_title/armory_superintendent, "Master-at-Arms" = /datum/alt_title/master_at_arms) /datum/alt_title/brig_sentry title = "Brig Sentry" @@ -31,6 +31,9 @@ /datum/alt_title/armory_superintendent title = "Armory Superintendent" +/datum/alt_title/master_at_arms + title = "Master-at-Arms" + /datum/job/warden/get_request_reasons() return list("Wildlife management") diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3e8cf00207a..cebc88566e7 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -104,7 +104,7 @@ if(shocked) shock(user, 50) - + tgui_interact(user) /obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) @@ -135,7 +135,7 @@ if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38) || istype (O,/obj/item/ammo_magazine/s44)/* VOREstation Edit*/) // Prevents ammo recycling exploit with speedloaders. to_chat(user, "\The [O] is too hazardous to recycle with the autolathe!") return - + return ..() /obj/machinery/autolathe/attack_hand(mob/user as mob) @@ -177,12 +177,12 @@ max_sheets = 0 //Build list of multipliers for sheets. multiplier = tgui_input_number(usr, "How many do you want to print? (0-[max_sheets])", null, null, max_sheets, 0) - if(!multiplier || multiplier <= 0 || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE) + if(!multiplier || multiplier <= 0 || (multiplier != round(multiplier)) || multiplier > max_sheets || tgui_status(usr, state) != STATUS_INTERACTIVE) return FALSE //Check if we still have the materials. var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient - + for(var/datum/material/used_material as anything in making.resources) var/amount_needed = making.resources[used_material] * coeff * multiplier materials_used[used_material] = amount_needed @@ -190,7 +190,7 @@ if(LAZYLEN(materials_used)) if(!materials.has_materials(materials_used)) return - + materials.use_materials(materials_used) busy = making.name diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index f1e81995963..58c5b054eda 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -683,34 +683,30 @@ seenturfs += T for(var/mob/M as anything in living_mob_list) - if(M.z != z) //Skip + if(M.z != z || !(get_turf(M) in seenturfs)) // Skip continue - if(get_turf(M) in seenturfs) - assess_and_assign(M, targets, secondarytargets) + switch(assess_living(M)) + if(TURRET_PRIORITY_TARGET) + targets += M + if(TURRET_SECONDARY_TARGET) + secondarytargets += M - /* This was dumb. Why do this and then check line of sight later? - for(var/mob/M in mobs_in_xray_view(world.view, src)) - assess_and_assign(M, targets, secondarytargets) - */ + for(var/obj/mecha/M as anything in mechas_list) + if(M.z != z || !(get_turf(M) in seenturfs)) // Skip + continue + switch(assess_mecha(M)) + if(TURRET_PRIORITY_TARGET) + targets += M + if(TURRET_SECONDARY_TARGET) + secondarytargets += M - if(!tryToShootAt(targets)) - if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets - timeout-- - if(timeout <= 0) - spawn() - popDown() // no valid targets, close the cover + if(!tryToShootAt(targets) && !tryToShootAt(secondarytargets) && --timeout <= 0) + popDown() // no valid targets, close the cover if(auto_repair && (health < maxhealth)) use_power(20000) health = min(health+1, maxhealth) // 1HP for 20kJ -/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets) - switch(assess_living(L)) - if(TURRET_PRIORITY_TARGET) - targets += L - if(TURRET_SECONDARY_TARGET) - secondarytargets += L - /obj/machinery/porta_turret/proc/assess_living(var/mob/living/L) if(!istype(L)) return TURRET_NOT_TARGET @@ -718,9 +714,6 @@ if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var return TURRET_NOT_TARGET - if(!L) - return TURRET_NOT_TARGET - if(faction && L.faction == faction) return TURRET_NOT_TARGET @@ -765,6 +758,15 @@ return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee +/obj/machinery/porta_turret/proc/assess_mecha(var/obj/mecha/M) + if(!istype(M)) + return TURRET_NOT_TARGET + + if(!M.occupant) + return check_all ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + + return assess_living(M.occupant) + /obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H) if(!H || !istype(H)) return 0 @@ -786,6 +788,7 @@ /obj/machinery/porta_turret/proc/popUp() //pops the turret up + set waitfor = FALSE if(disabled) return if(raising || raised) @@ -807,6 +810,7 @@ timeout = 10 /obj/machinery/porta_turret/proc/popDown() //pops the turret down + set waitfor = FALSE last_target = null if(disabled) return @@ -835,17 +839,16 @@ /obj/machinery/porta_turret/proc/target(var/mob/living/target) if(disabled) - return + return FALSE if(target) last_target = target - spawn() - popUp() //pop the turret up if it's not already up. + popUp() //pop the turret up if it's not already up. set_dir(get_dir(src, target)) //even if you can't shoot, follow the target playsound(src, 'sound/machines/turrets/turret_rotate.ogg', 100, 1) // Play rotating sound spawn() shootAt(target) - return 1 - return + return TRUE + return FALSE /obj/machinery/porta_turret/proc/shootAt(var/mob/living/target) //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power! @@ -857,9 +860,7 @@ sleep(shot_delay) last_fired = FALSE - var/turf/T = get_turf(src) - var/turf/U = get_turf(target) - if(!istype(T) || !istype(U)) + if(!isturf(get_turf(src)) || !isturf(get_turf(target))) return if(!raised) //the turret has to be raised in order to fire - makes sense, right? @@ -874,9 +875,12 @@ A = new projectile(loc) playsound(src, shot_sound, 75, 1) - // Lethal/emagged turrets use twice the power due to higher energy beams - // Emagged turrets again use twice as much power due to higher firing rates - use_power(reqpower * (2 * (emagged || lethal)) * (2 * emagged)) + var/power_mult = 1 + if(emagged) + power_mult = 4 // Lethal beams + higher rate of fire + else if(lethal) + power_mult = 2 // Lethal beams + use_power(reqpower * power_mult) //Turrets aim for the center of mass by default. //If the target is grabbing someone then the turret smartly aims for extremities diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3392d3cf6bc..d4df7c13a11 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -391,7 +391,7 @@ var/list/global/slot_flags_enumeration = list( //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. //Set disable_warning to 1 if you wish it to not give you outputs. //Should probably move the bulk of this into mob code some time, as most of it is related to the definition of slots and not item-specific -/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = FALSE) +/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = FALSE, var/ignore_obstruction = FALSE) if(!slot) return 0 if(!M) return 0 @@ -417,7 +417,7 @@ var/list/global/slot_flags_enumeration = list( //Next check if the slot is accessible. var/mob/_user = disable_warning? null : H - if(!H.slot_is_accessible(slot, src, _user)) + if(!H.slot_is_accessible(slot, src, _user) && !ignore_obstruction) return 0 //Lastly, check special rules for the desired slot. diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 94901ae26a5..cbfac3ae02e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -240,7 +240,7 @@ //Return 1 if an immediate subsequent call to use() would succeed. //Ensures that code dealing with stacks uses the same logic /obj/item/stack/proc/can_use(var/used) - if(used < 0 || used % 1) + if(used < 0 || (used != round(used))) stack_trace("Tried to use a bad stack amount: [used]") return 0 if(get_amount() < used) @@ -265,7 +265,7 @@ return 1 /obj/item/stack/proc/add(var/extra) - if(extra < 0 || extra % 1) + if(extra < 0 || (extra != round(extra))) stack_trace("Tried to add a bad stack amount: [extra]") return 0 if(!uses_charge) @@ -283,7 +283,7 @@ S.add_charge(charge_costs[i] * extra) /obj/item/stack/proc/set_amount(var/new_amount, var/no_limits = FALSE) - if(new_amount < 0 || new_amount % 1) + if(new_amount < 0 || (new_amount != round(new_amount))) stack_trace("Tried to set a bad stack amount: [new_amount]") return 0 @@ -321,7 +321,7 @@ if (isnull(tamount)) tamount = src.get_amount() - if(tamount < 0 || tamount % 1) + if(tamount < 0 || (tamount != round(tamount))) stack_trace("Tried to transfer a bad stack amount: [tamount]") return 0 @@ -347,7 +347,7 @@ if(uses_charge) return null - if(tamount < 0 || tamount % 1) + if(tamount < 0 || (tamount != round(tamount))) stack_trace("Tried to split a bad stack amount: [tamount]") return null @@ -403,6 +403,9 @@ /obj/item/stack/attack_hand(mob/user as mob) if (user.get_inactive_hand() == src) var/N = tgui_input_number(usr, "How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1, amount, 1) + if(N != round(N)) + to_chat(user, "You cannot separate a non-whole number of stacks!") + return if(N) var/obj/item/stack/F = src.split(N) if (F) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 5e93f2d0316..e2d9ad6a496 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -56,7 +56,7 @@ else user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ "You begin to apply \the [src].") - if(do_after(user, 20) && do_after(H, 20, 5, 0)) //user needs to keep their active hand, H does not. + if(do_after(user, 20, H)) //user needs to keep their active hand, H does not. user.visible_message("[user] does [H]'s lips with \the [src].", \ "You apply \the [src].") H.lip_style = colour diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index d7fcb01fce9..c30b47a7f4d 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -56,10 +56,7 @@ to_chat(user, "You cut open the present.") for(var/mob/M in src) //Should only be one but whatever. - M.loc = src.loc - if (M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE + M.forceMove(src.loc) qdel(src) @@ -180,11 +177,7 @@ var/obj/effect/spresent/present = new /obj/effect/spresent (H.loc) src.amount -= 2 - if (H.client) - H.client.perspective = EYE_PERSPECTIVE - H.client.eye = present - - H.loc = present + H.forceMove(present) add_attack_logs(user,H,"Wrapped with [src]") else diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 5db107b130d..c75c154e7df 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -16,7 +16,7 @@ for (var/obj/item/weapon/grab/G in H.grabbed_by) if (G.loc == user && G.state >= GRAB_AGGRESSIVE) return TRUE - + return FALSE /obj/item/weapon/tape_roll/attack(var/mob/living/carbon/human/H, var/mob/user) @@ -53,7 +53,7 @@ return user.visible_message("\The [user] has taped up \the [H]'s eyes!") - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses, ignore_obstructions = FALSE) H.update_inv_glasses() playsound(src, 'sound/effects/tape.ogg',25) @@ -83,7 +83,7 @@ user.visible_message("\The [user] has taped up \the [H]'s mouth!") - H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask, ignore_obstructions = FALSE) H.update_inv_wear_mask() playsound(src, 'sound/effects/tape.ogg',25) diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 9da82688c30..06c1e53e07e 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -99,6 +99,7 @@ playsound(src, 'sound/items/change_jaws.ogg', 50, 1) user.drop_item(src) counterpart.forceMove(get_turf(src)) + counterpart.persist_storable = persist_storable src.forceMove(counterpart) user.put_in_active_hand(counterpart) to_chat(user, "You attach the cutting jaws to [src].") diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 9d053be64f1..4598b698032 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -141,6 +141,7 @@ playsound(src,'sound/items/change_drill.ogg',50,1) user.drop_item(src) counterpart.forceMove(get_turf(src)) + counterpart.persist_storable = persist_storable src.forceMove(counterpart) user.put_in_active_hand(counterpart) to_chat(user, "You attach the bolt driver bit to [src].") diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index d40099de250..cadecb6c0db 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -126,6 +126,7 @@ playsound(src, 'sound/items/change_jaws.ogg', 50, 1) user.drop_item(src) counterpart.forceMove(get_turf(src)) + counterpart.persist_storable = persist_storable src.forceMove(counterpart) user.put_in_active_hand(counterpart) to_chat(user, "You attach the pry jaws to [src].") diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 634382ff119..8745e65a1c5 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -104,6 +104,7 @@ playsound(src,'sound/items/change_drill.ogg',50,1) user.drop_item(src) counterpart.forceMove(get_turf(src)) + counterpart.persist_storable = persist_storable src.forceMove(counterpart) user.put_in_active_hand(counterpart) to_chat(user, "You attach the screw driver bit to [src].") diff --git a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm index ed84103a38d..d0f6d1892a6 100644 --- a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm @@ -210,7 +210,7 @@ /obj/item/weapon/cell/device, /obj/item/device/radio, /obj/item/device/gps/explorer, - /obj/item/weapon/gun/energy/taser) + /obj/item/weapon/gun/energy/gun/protector/pilotgun/locked) /obj/structure/closet/secure_closet/pilot/Initialize() if(prob(50)) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index cc7cf8379a1..1bcf5dd147a 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -1,3 +1,8 @@ +/obj/structure/ghost_pod/proc/reset_ghostpod() //Makes the ghost pod usable again and re-adds it to the active ghost pod list if it is not on it. + active_ghost_pods |= src + used = FALSE + busy = FALSE + /obj/structure/ghost_pod/ghost_activated/maintpred name = "maintenance hole" desc = "Looks like some creature dug its way into station's maintenance..." @@ -48,23 +53,26 @@ /obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M) ..() var/choice - var/randomize var/finalized = "No" + if(jobban_isbanned(M, "GhostRoles")) + to_chat(M, "You cannot inhabit this creature because you are banned from playing ghost roles.") + reset_ghostpod() + return + while(finalized == "No" && M.client) - if(jobban_isbanned(M, "GhostRoles")) - to_chat(M, "You cannot inhabit this creature because you are banned from playing ghost roles.") - return choice = tgui_input_list(M, "What type of predator do you want to play as?", "Maintpred Choice", possible_mobs) - if(!choice) - randomize = TRUE - break + if(!choice) //We probably pushed the cancel button on the mob selection. Let's just put the ghost pod back in the list. + to_chat(M, "No mob selected, cancelling.") + reset_ghostpod() + return if(choice) finalized = tgui_alert(M, "Are you sure you want to play as [choice]?","Confirmation",list("No","Yes")) - if(randomize) - choice = pick(possible_mobs) + if(!choice) //If somehow we ended up here and we don't have a choice, let's just reset things! + reset_ghostpod() + return var/mobtype = possible_mobs[choice] var/mob/living/simple_mob/newPred = new mobtype(get_turf(src)) @@ -117,4 +125,4 @@ qdel(src) /obj/structure/ghost_pod/ghost_activated/morphspawn/no_announce - announce_prob = 0 \ No newline at end of file + announce_prob = 0 diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index f50ea247b5c..08b43c2c977 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -81,7 +81,7 @@ return // Making windows, different per subtype - else if(istype(W, /obj/item/stack/material/glass)) + else if(istype(W, /obj/item/stack/material/glass) || istype(W, /obj/item/stack/material/cyborg/glass)) handle_glass_use(user, W) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e453842124e..10b4bc7cc9d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -652,6 +652,21 @@ message_admins(log) log_admin(log) +/datum/admins/proc/toggle_firework_override() + set category = "Fun" + set name = "Toggle Weather Firework Override" + set desc = "Toggles ability for weather fireworks to affect weather on planet of choice." + + if(!check_rights(R_DEBUG)) + return + + var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to toggle firework effects on?", "Change Weather", SSplanets.planets) + if(istype(planet) && planet.weather_holder) + planet.weather_holder.firework_override = !(planet.weather_holder.firework_override) + var/log = "[key_name(src)] toggled [planet.name]'s firework override to [planet.weather_holder.firework_override ? "on" : "off"]." + message_admins(log) + log_admin(log) + /datum/admins/proc/change_time() set category = "Debug" set name = "Change Planet Time" diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 3ae5c0c73eb..60eee032656 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -15,7 +15,6 @@ var/airlock_wire = null var/datum/wires/connected = null var/datum/radio_frequency/radio_connection - var/deadman = FALSE /obj/item/device/assembly/signaler/Initialize() . = ..() @@ -131,27 +130,6 @@ frequency = new_frequency radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) -/obj/item/device/assembly/signaler/process() - if(!deadman) - STOP_PROCESSING(SSobj, src) - var/mob/M = src.loc - if(!M || !ismob(M)) - if(prob(5)) - signal() - deadman = FALSE - STOP_PROCESSING(SSobj, src) - else if(prob(5)) - M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!") - -/obj/item/device/assembly/signaler/verb/deadman_it() - set src in usr - set name = "Threaten to push the button!" - set desc = "BOOOOM!" - deadman = TRUE - START_PROCESSING(SSobj, src) - log_and_message_admins("is threatening to trigger a signaler deadman's switch") - usr.visible_message("[usr] moves their finger over [src]'s signal button...") - /obj/item/device/assembly/signaler/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) diff --git a/code/modules/blob2/overmind/powers.dm b/code/modules/blob2/overmind/powers.dm index 4177bac9912..5c1c4e17591 100644 --- a/code/modules/blob2/overmind/powers.dm +++ b/code/modules/blob2/overmind/powers.dm @@ -216,23 +216,31 @@ for(var/mob/living/L in view(src)) if(L.stat == DEAD) continue // Already dying or dead. - if(L.faction == blob_type.faction) - continue // No friendly fire. - if(locate(/obj/structure/blob) in L.loc) - continue // Already has a blob over them. + if(can_attack(L)) + potential_targets += L - var/obj/structure/blob/B = null - for(var/direction in cardinal) - var/turf/T = get_step(L, direction) - B = locate(/obj/structure/blob) in T - if(B && B.overmind == src) - break - if(!B) - continue - - potential_targets += L + for(var/obj/mecha/M in view(src)) + if(!M.occupant) + continue // Just a hunk of metal + if(can_attack(M.occupant)) + potential_targets += M if(potential_targets.len) var/mob/living/victim = pick(potential_targets) var/turf/T = get_turf(victim) expand_blob(T) + +/mob/observer/blob/proc/can_attack(var/mob/living/L) + if(!istype(L)) + return FALSE + if(L.faction == blob_type.faction) + return FALSE // No friendly fire. + if(locate(/obj/structure/blob) in get_turf(L)) + return FALSE // Already has a blob over them. + + for(var/direction in cardinal) + var/turf/T = get_step(L, direction) + var/obj/structure/blob/B = locate(/obj/structure/blob) in T + if(B && B.overmind == src) + return TRUE + return FALSE diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 631c46bdf52..39ca0b8c742 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -92,13 +92,13 @@ //Orange emergency space suit /obj/item/clothing/head/helmet/space/emergency - name = "Emergency Space Helmet" + name = "emergency soft helmet" icon_state = "syndicate-helm-orange" desc = "A simple helmet with a built in light, smells like mothballs." flash_protection = FLASH_PROTECTION_NONE /obj/item/clothing/suit/space/emergency - name = "Emergency Softsuit" + name = "emergency softsuit" icon_state = "syndicate-orange" desc = "A thin, ungainly softsuit colored in blaze orange for rescuers to easily locate, looks pretty fragile." slowdown = 2 diff --git a/code/modules/economy/coins.dm b/code/modules/economy/coins.dm index f64d027d57e..8b11b22023a 100644 --- a/code/modules/economy/coins.dm +++ b/code/modules/economy/coins.dm @@ -86,7 +86,7 @@ ..() return - var/obj/item/stack/cable_coil/CC = new (user.loc) + var/obj/item/stack/cable_coil/CC = new (user.loc, 1) CC.update_icon() cut_overlays() string_attached = null diff --git a/code/modules/fireworks/firework_launcher.dm b/code/modules/fireworks/firework_launcher.dm new file mode 100644 index 00000000000..26044f24456 --- /dev/null +++ b/code/modules/fireworks/firework_launcher.dm @@ -0,0 +1,124 @@ +/obj/machinery/firework_launcher + name = "firework launcher" + desc = "A machine for launching fireworks of varying practicality." + icon = 'icons/obj/machines/firework_launcher.dmi' + icon_state = "launcher01" + density = TRUE + anchored = TRUE + + circuit = /obj/item/weapon/circuitboard/firework_launcher + var/obj/item/weapon/firework_star/loaded_star + var/last_launch + var/launch_cooldown = 5 MINUTES + +/obj/machinery/firework_launcher/Initialize() + . = ..() + + default_apply_parts() + last_launch = world.time // Prevents cheesing cooldown by deconstructing and reconstructing + update_icon() + +/obj/machinery/firework_launcher/RefreshParts() + launch_cooldown = 5 MINUTES + var/rating = 0 + for(var/obj/item/weapon/stock_parts/micro_laser/laser in component_parts) + rating += laser.rating - 1 + launch_cooldown = max(0, (launch_cooldown - ((rating*30) SECONDS))) // For every part tier above 1 on the two lasers, reduce cooldown by 30 seconds. 1 minute cooldown on the tier 5 parts, 3 minutes on tier 3. + + . = ..() + +/obj/machinery/firework_launcher/update_icon() + icon_state = "launcher[loaded_star ? "1" : "0"][anchored ? "1" : "0"][panel_open ? "_open" : ""]" + +/obj/machinery/firework_launcher/attackby(var/obj/item/O, var/mob/user) + if(default_deconstruction_screwdriver(user, O)) + update_icon() + return + + if(default_deconstruction_crowbar(user, O)) + return + + if(default_part_replacement(user, O)) + return + + if(default_unfasten_wrench(user, O, 20)) + update_icon() + return + + if(istype(O, /obj/item/weapon/firework_star)) + loaded_star = O + user.drop_item() + O.forceMove(src) + to_chat(user, "You insert the firework star into the launcher.") + add_fingerprint(user) + update_icon() + return + + return ..() + +/obj/machinery/firework_launcher/verb/eject() + set category = "Object" + set name = "Eject Firework Star" + set src in oview(1) + + var/mob/living/user = usr + if(!user || user.stat != 0) + return + if(!loaded_star) + to_chat(user, "There is no firework star loaded in the launcher.") + return + else + loaded_star.forceMove(get_turf(src)) + loaded_star = null + add_fingerprint(user) + update_icon() + +/obj/machinery/firework_launcher/attack_hand(mob/user) // Maybe this proc could be better as entirely its own proc, called from attack_hand, but also I don't really see the point + if(panel_open) + to_chat(user, "Close the panel first!") + return + + if(!loaded_star) + to_chat(user, "There is no firework star loaded in the launcher.") + return + + if((world.time - last_launch) <= launch_cooldown) + to_chat(user, "The launcher is still re-priming for launch.") + return + + if(!anchored) + to_chat(user, "Launcher must be firmly secured to the ground before firework can be launched!") + return + + var/datum/planet/P = get_planet() + if(!P || !(P.weather_holder)) // There are potential cases of being outside but not on planet. And checking whether planet has weather at all is more sanity thing than anything. + to_chat(user, "Launcher beeps as its safeties seem to prevent launch in the current location.") + return + + var/datum/weather_holder/WH = P.weather_holder + if(WH.firework_override && istype(loaded_star, /obj/item/weapon/firework_star/weather)) // Enable weather-based events to not be ruined + to_chat(user, "Launcher beeps as it seems some interference is preventing launch of this type of firework.") + return + + to_chat(user, "You launch the firework!") + playsound(get_turf(src), 'sound/weapons/rpg.ogg', 75, 1) + loaded_star.trigger_firework(WH) + qdel(loaded_star) + loaded_star = null + last_launch = world.time + add_fingerprint(user) + update_icon() + flick("launcher_launch", src) + +/obj/machinery/firework_launcher/proc/get_planet() + var/turf/T = get_turf(src) + if(!T) + return + + if(!T.is_outdoors()) + return + + var/datum/planet/P = SSplanets.z_to_planet[T.z] + if(!P) + return + return P \ No newline at end of file diff --git a/code/modules/fireworks/firework_stars.dm b/code/modules/fireworks/firework_stars.dm new file mode 100644 index 00000000000..a276539424b --- /dev/null +++ b/code/modules/fireworks/firework_stars.dm @@ -0,0 +1,142 @@ +#define T_FIREWORK_WEATHER_STAR(name) "weather firework star (" + (name) + ")" + +/obj/item/weapon/firework_star + icon = 'icons/obj/firework_stars.dmi' + name = "firework star" + desc = "A very tightly compacted ball of chemicals for use with firework launcher." + icon_state = "star" + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 1) + +/obj/item/weapon/firework_star/proc/trigger_firework(var/datum/weather_holder/w_holder) + return + + +/obj/item/weapon/firework_star/weather + name = "weather firework star" + desc = "A firework star designed to alter a weather, rather than put on a show." + var/weather_type + origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 2) + +/obj/item/weapon/firework_star/weather/trigger_firework(var/datum/weather_holder/w_holder) + if(!w_holder) // Sanity + return + if(w_holder.firework_override) // Make sure weather-based events can't be interfered with + return + if(weather_type && (weather_type in w_holder.allowed_weather_types)) + w_holder.message_all_outdoor_players("Something seems to flash in the sky, as weather suddenly shifts!") + w_holder.change_weather(weather_type) + w_holder.rebuild_forecast() + +/obj/item/weapon/firework_star/weather/clear + name = T_FIREWORK_WEATHER_STAR("CLEAR SKY") + weather_type = WEATHER_CLEAR + icon_state = "clear" + +/obj/item/weapon/firework_star/weather/overcast + name = T_FIREWORK_WEATHER_STAR("CLOUDY") + weather_type = WEATHER_OVERCAST + icon_state = "cloudy" + +/obj/item/weapon/firework_star/weather/rain + name = T_FIREWORK_WEATHER_STAR("RAIN") + weather_type = WEATHER_RAIN + icon_state = "rain" + +/obj/item/weapon/firework_star/weather/storm + name = T_FIREWORK_WEATHER_STAR("STORM") + weather_type = WEATHER_STORM + icon_state = "rain" + +/obj/item/weapon/firework_star/weather/light_snow + name = T_FIREWORK_WEATHER_STAR("SNOW - LIGHT") + weather_type = WEATHER_LIGHT_SNOW + icon_state = "snow" + +/obj/item/weapon/firework_star/weather/snow + name = T_FIREWORK_WEATHER_STAR("SNOW - MEDIUM") + weather_type = WEATHER_SNOW + icon_state = "snow" + +/obj/item/weapon/firework_star/weather/blizzard + name = T_FIREWORK_WEATHER_STAR("SNOW - HEAVY") + weather_type = WEATHER_BLIZZARD + icon_state = "snow" + +/obj/item/weapon/firework_star/weather/hail + name = T_FIREWORK_WEATHER_STAR("HAIL") + weather_type = WEATHER_HAIL + icon_state = "snow" + origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 2, TECH_ILLEGAL = 1) + +/obj/item/weapon/firework_star/weather/fallout + name = T_FIREWORK_WEATHER_STAR("NUCLEAR") + desc = "This is the worst idea ever." + weather_type = WEATHER_FALLOUT_TEMP + icon_state = "nuclear" + origin_tech = list(TECH_MATERIAL = 7, TECH_ENGINEERING = 3, TECH_ILLEGAL = 5) + +/obj/item/weapon/firework_star/weather/confetti + name = T_FIREWORK_WEATHER_STAR("CONFETTI") + desc = "A firework star designed to alter a weather, rather than put on a show. This one makes colorful confetti rain from the sky." + weather_type = WEATHER_CONFETTI + icon_state = "confetti" + + +/obj/item/weapon/firework_star/aesthetic + name = "aesthetic firework star" + desc = "A firework star designed to paint the sky with pretty lights." + var/list/firework_adjectives = list("beautiful", "pretty", "fancy", "colorful", "bright", "shimmering") + var/list/firework_colors = list("red", "orange", "yellow", "green", "cyan", "blue", "purple", "pink", "beige", "white") + +/obj/item/weapon/firework_star/aesthetic/trigger_firework(var/datum/weather_holder/w_holder) + if(!w_holder) + return + w_holder.message_all_outdoor_players(get_firework_message()) + +/obj/item/weapon/firework_star/aesthetic/proc/get_firework_message() + return "You see a [pick(firework_adjectives)] explosion of [pick(firework_colors)] sparks in the sky!" + +/obj/item/weapon/firework_star/aesthetic/configurable + name = "configurable aesthetic firework star" + desc = "A firework star designed to paint the sky with pretty lights. This one's advanced and can be configured to specific shapes or colors." + icon_state = "config" + var/current_color = "white" + var/current_shape = "Random" + var/list/firework_shapes = list("none", "Random", + "a circle", "an oval", "a triangle", "a square", "a pentagon", "a hexagon", "an octagon", "a plus sign", "an x", "a star", "a spiral", "a heart", "a teardrop", + "a smiling face", "a winking face", "a mouse", "a cat", "a dog", "a fox", "a bird", "a fish", "a lizard", "a bug", "a butterfly", "a robot", "a dragon", "a teppi", "a catslug", + "a tree", "a leaf", "a flower", "a lightning bolt", "a cloud", "a sun", "a gemstone", "a flame", "a wrench", "a beaker", "a syringe", "a pickaxe", "a pair of handcuffs", "a crown", + "a bottle", "a boat", "a spaceship", + "Nanotrasen logo", "a geometric-looking letter S", "a dodecahedron") + +/obj/item/weapon/firework_star/aesthetic/configurable/attack_self(var/mob/user) + var/choice = tgui_alert(usr, "What setting do you want to adjust?", "Firework Star", list("Color", "Shape", "Nothing")) + if(src.loc != user) + return + + if(choice == "Color") + var/color_choice = tgui_input_list(user, "What color would you like firework to be?", "Firework Star", firework_colors) + if(src.loc != user) + return + if(color_choice) + current_color = color_choice + + if(choice == "Shape") + var/shape_choice = tgui_input_list(user, "What shape would you like firework to be?", "Firework Star", firework_shapes) + if(src.loc != user) + return + if(shape_choice) + current_shape = shape_choice + +/obj/item/weapon/firework_star/aesthetic/configurable/get_firework_message() + var/temp_shape = current_shape + if(temp_shape == "Random") + var/list/shapes_copy = firework_shapes.Copy() + shapes_copy -= "Random" + temp_shape = pick(shapes_copy) + + if(temp_shape == "none" || !temp_shape) + return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky!" + else + return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky, forming into shape of [current_shape]!" \ No newline at end of file diff --git a/code/modules/fireworks/launcher_construction.dm b/code/modules/fireworks/launcher_construction.dm new file mode 100644 index 00000000000..6ee81786940 --- /dev/null +++ b/code/modules/fireworks/launcher_construction.dm @@ -0,0 +1,8 @@ +/obj/item/weapon/circuitboard/firework_launcher + name = T_BOARD("firework launcher") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/firework_launcher + origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 2) + req_components = list ( + /obj/item/weapon/stock_parts/micro_laser = 2 + ) \ No newline at end of file diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm index 11ce0e461ec..4077d540815 100644 --- a/code/modules/food/kitchen/smartfridge/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm @@ -217,14 +217,14 @@ amount = params["amount"] else amount = tgui_input_number(usr, "How many items?", "How many items would you like to take out?", 1) - + if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src)) return FALSE - + var/index = text2num(params["index"]) if(index < 1 || index > LAZYLEN(item_records)) return TRUE - + vend(item_records[index], amount) return TRUE return FALSE @@ -257,7 +257,7 @@ if(stat & (NOPOWER|BROKEN)) return TRUE if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) - if(!allowed(usr) && !emagged && locked != -1 && action == "Release") + if((!allowed(usr) && scan_id) && !emagged && locked != -1 && action == "Release") to_chat(usr, "Access denied.") return TRUE return ..() diff --git a/code/modules/materials/materials/glass.dm b/code/modules/materials/materials/glass.dm index 9279e246218..940ac15eb19 100644 --- a/code/modules/materials/materials/glass.dm +++ b/code/modules/materials/materials/glass.dm @@ -132,13 +132,12 @@ display_name = "reinforced borosilicate glass" stack_type = /obj/item/stack/material/glass/phoronrglass stack_origin_tech = list(TECH_MATERIAL = 5) - composite_material = list() //todo window_options = list("One Direction" = 1, "Full Window" = 4) created_window = /obj/structure/window/phoronreinforced created_fulltile_window = /obj/structure/window/phoronreinforced/full hardness = 40 weight = 30 stack_origin_tech = list(TECH_MATERIAL = 2) - composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT / 2, "borosilicate glass" = SHEET_MATERIAL_AMOUNT) + composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT / 2, MAT_PGLASS = SHEET_MATERIAL_AMOUNT) rod_product = null flags = MATERIAL_UNMELTABLE diff --git a/code/modules/materials/materials/glass_vr.dm b/code/modules/materials/materials/glass_vr.dm index d20e0575f31..a7191ce70e4 100644 --- a/code/modules/materials/materials/glass_vr.dm +++ b/code/modules/materials/materials/glass_vr.dm @@ -13,7 +13,6 @@ created_fulltile_window = /obj/structure/window/titanium/full wire_product = null rod_product = /obj/item/stack/material/glass/titanium - composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT, MAT_GLASS = SHEET_MATERIAL_AMOUNT) /datum/material/glass/plastaniumglass name = MAT_PLASTITANIUMGLASS @@ -30,4 +29,3 @@ created_fulltile_window = /obj/structure/window/plastitanium/full wire_product = null rod_product = /obj/item/stack/material/glass/plastitanium - composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT, MAT_GLASS = SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/materials/materials/metals/hull.dm b/code/modules/materials/materials/metals/hull.dm index abf72e69a82..24a03fa07d4 100644 --- a/code/modules/materials/materials/metals/hull.dm +++ b/code/modules/materials/materials/metals/hull.dm @@ -7,6 +7,7 @@ icon_reinf = "reinf_mesh" icon_colour = "#666677" flags = MATERIAL_UNMELTABLE + composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT) /datum/material/steel/hull/place_sheet(var/turf/target) //Deconstructed into normal steel sheets. new /obj/item/stack/material/steel(target) @@ -20,6 +21,7 @@ icon_colour = "#777788" explosion_resistance = 40 flags = MATERIAL_UNMELTABLE + composite_material = list(MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT) /datum/material/plasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets. new /obj/item/stack/material/plasteel(target) @@ -33,6 +35,7 @@ explosion_resistance = 90 reflectivity = 0.9 flags = MATERIAL_UNMELTABLE + composite_material = list(MAT_DURASTEEL = SHEET_MATERIAL_AMOUNT) /datum/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets. new /obj/item/stack/material/durasteel(target) @@ -43,6 +46,7 @@ icon_base = "hull" icon_reinf = "reinf_mesh" flags = MATERIAL_UNMELTABLE + composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT) /datum/material/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets. new /obj/item/stack/material/titanium(target) @@ -53,6 +57,7 @@ icon_base = "hull" icon_reinf = "reinf_mesh" flags = MATERIAL_UNMELTABLE + composite_material = list(MAT_MORPHIUM = SHEET_MATERIAL_AMOUNT) /datum/material/morphium/hull/place_sheet(var/turf/target) new /obj/item/stack/material/morphium(target) \ No newline at end of file diff --git a/code/modules/materials/materials/metals/hull_vr.dm b/code/modules/materials/materials/metals/hull_vr.dm index 3c35b3cf398..8a7ebb22f35 100644 --- a/code/modules/materials/materials/metals/hull_vr.dm +++ b/code/modules/materials/materials/metals/hull_vr.dm @@ -5,6 +5,7 @@ icon_reinf = "reinf_mesh" icon_colour = "#585658" explosion_resistance = 50 + composite_material = list(MAT_PLASTITANIUM = SHEET_MATERIAL_AMOUNT) /datum/material/plastitanium/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets. new /obj/item/stack/material/plastitanium(target) @@ -15,6 +16,7 @@ icon_base = "hull" icon_reinf = "reinf_mesh" explosion_resistance = 50 + composite_material = list(MAT_GOLD = SHEET_MATERIAL_AMOUNT) /datum/material/gold/hull/place_sheet(var/turf/target) //Deconstructed into normal gold sheets. new /obj/item/stack/material/gold(target) diff --git a/code/modules/materials/materials/metals/metals.dm b/code/modules/materials/materials/metals/metals.dm index a36ffef5c1c..4dd8a6a9847 100644 --- a/code/modules/materials/materials/metals/metals.dm +++ b/code/modules/materials/materials/metals/metals.dm @@ -17,7 +17,6 @@ protectiveness = 60 // 75% reflectivity = 0.7 // Not a perfect mirror, but close. stack_origin_tech = list(TECH_MATERIAL = 8) - composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug supply_conversion_value = 9 /datum/material/titanium @@ -28,7 +27,6 @@ door_icon_base = "metal" icon_colour = "#D1E6E3" icon_reinf = "reinf_metal" - composite_material = null /datum/material/iron name = "iron" diff --git a/code/modules/materials/materials/metals/plasteel.dm b/code/modules/materials/materials/metals/plasteel.dm index 8ec47e84f21..315b897e59d 100644 --- a/code/modules/materials/materials/metals/plasteel.dm +++ b/code/modules/materials/materials/metals/plasteel.dm @@ -12,7 +12,6 @@ protectiveness = 20 // 50% conductivity = 13 // For the purposes of balance. stack_origin_tech = list(TECH_MATERIAL = 2) - composite_material = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo supply_conversion_value = 6 /datum/material/plasteel/generate_recipes() @@ -38,3 +37,4 @@ stack_type = /obj/item/stack/material/plasteel/rebar sheet_singular_name = "rod" sheet_plural_name = "rods" + composite_material = list(MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/materials/materials/metals/plasteel_vr.dm b/code/modules/materials/materials/metals/plasteel_vr.dm index bca3fdf27b8..f3d582213db 100644 --- a/code/modules/materials/materials/metals/plasteel_vr.dm +++ b/code/modules/materials/materials/metals/plasteel_vr.dm @@ -12,7 +12,6 @@ protectiveness = 30 conductivity = 7 stack_origin_tech = list(TECH_MATERIAL = 5) - composite_material = list(MAT_TITANIUM = SHEET_MATERIAL_AMOUNT, MAT_PLASTEEL = SHEET_MATERIAL_AMOUNT) supply_conversion_value = 8 /datum/material/plastitanium/generate_recipes() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 761ea371548..1f0ca2f0859 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -47,10 +47,10 @@ var/list/slot_equipment_priority = list( \ //set del_on_fail to have it delete W if it fails to equip //set disable_warning to disable the 'you are unable to equip that' warning. //unset redraw_mob to prevent the mob from being redrawn at the end. -/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1) +/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1, ignore_obstructions = 1) if(!W) return 0 - if(!W.mob_can_equip(src, slot, disable_warning)) + if(!W.mob_can_equip(src, slot, disable_warning, ignore_obstructions)) if(del_on_fail) qdel(W) @@ -68,8 +68,8 @@ var/list/slot_equipment_priority = list( \ return //This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such. -/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot) - return equip_to_slot_if_possible(W, slot, 1, 1, 0) +/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot, ignore_obstructions = 1) + return equip_to_slot_if_possible(W, slot, 1, 1, 0, ignore_obstructions) //hurgh. these feel hacky, but they're the only way I could get the damn thing to work. I guess they could be handy for antag spawners too? /mob/proc/equip_voidsuit_to_slot_or_del_with_refit(obj/item/clothing/suit/space/void/W as obj, slot, species = SPECIES_HUMAN) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 73305845247..a27962edbf3 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -101,14 +101,6 @@ /mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone) - //Being hit while using a deadman switch - if(istype(get_active_hand(),/obj/item/device/assembly/signaler)) - var/obj/item/device/assembly/signaler/signaler = get_active_hand() - if(signaler.deadman && prob(80)) - log_and_message_admins("has triggered a signaler deadman's switch") - src.visible_message("[src] triggers their deadman's switch!") - signaler.signal() - if(ai_holder && P.firer) ai_holder.react_to_attack(P.firer) diff --git a/code/modules/planet/virgo3b_vr.dm b/code/modules/planet/virgo3b_vr.dm index b3e6d136fbe..ffeaf4f2536 100644 --- a/code/modules/planet/virgo3b_vr.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -111,17 +111,19 @@ var/datum/planet/virgo3b/planet_virgo3b = null WEATHER_EMBERFALL = new /datum/weather/virgo3b/emberfall(), WEATHER_ASH_STORM = new /datum/weather/virgo3b/ash_storm(), WEATHER_ASH_STORM_SAFE = new /datum/weather/virgo3b/ash_storm_safe(), - WEATHER_FALLOUT = new /datum/weather/virgo3b/fallout() + WEATHER_FALLOUT = new /datum/weather/virgo3b/fallout(), + WEATHER_FALLOUT_TEMP = new /datum/weather/virgo3b/fallout/temp(), + WEATHER_CONFETTI = new /datum/weather/virgo3b/confetti() ) roundstart_weather_chances = list( - WEATHER_CLEAR = 30, - WEATHER_OVERCAST = 30, - WEATHER_LIGHT_SNOW = 20, - WEATHER_SNOW = 5, - WEATHER_BLIZZARD = 5, - WEATHER_RAIN = 5, - WEATHER_STORM = 2.5, - WEATHER_HAIL = 2.5 + WEATHER_CLEAR = 60, + WEATHER_OVERCAST = 60, + WEATHER_LIGHT_SNOW = 40, + WEATHER_SNOW = 10, + WEATHER_BLIZZARD = 10, + WEATHER_RAIN = 10, + WEATHER_STORM = 5, + WEATHER_HAIL = 5 ) /datum/weather/virgo3b @@ -550,3 +552,27 @@ var/datum/planet/virgo3b/planet_virgo3b = null if(T.is_outdoors()) SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) +/datum/weather/virgo3b/fallout/temp + name = "short-term fallout" + transition_chances = list( + WEATHER_FALLOUT = 10, + WEATHER_RAIN = 50, + WEATHER_STORM = 20, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/virgo3b/confetti + name = "confetti" + icon = 'icons/effects/weather_vr.dmi' + icon_state = "confetti" + + transition_chances = list( + WEATHER_CLEAR = 50, + WEATHER_OVERCAST = 20, + WEATHER_CONFETTI = 5 + ) + observed_message = "Confetti is raining from the sky." + transition_messages = list( + "Suddenly, colorful confetti starts raining from the sky." + ) + diff --git a/code/modules/planet/virgo3c_vr.dm b/code/modules/planet/virgo3c_vr.dm index c4bd17c84f7..e4cb8299816 100644 --- a/code/modules/planet/virgo3c_vr.dm +++ b/code/modules/planet/virgo3c_vr.dm @@ -131,7 +131,9 @@ var/datum/planet/virgo3c/planet_virgo3c = null WEATHER_EMBERFALL = new /datum/weather/virgo3c/emberfall(), WEATHER_ASH_STORM = new /datum/weather/virgo3c/ash_storm(), WEATHER_ASH_STORM_SAFE = new /datum/weather/virgo3c/ash_storm_safe(), - WEATHER_FALLOUT = new /datum/weather/virgo3c/fallout() + WEATHER_FALLOUT = new /datum/weather/virgo3c/fallout(), + WEATHER_FALLOUT_TEMP = new /datum/weather/virgo3c/fallout/temp(), + WEATHER_CONFETTI = new /datum/weather/virgo3c/confetti() ) roundstart_weather_chances = list( WEATHER_CLEAR = 50, @@ -548,6 +550,30 @@ var/datum/planet/virgo3c/planet_virgo3c = null if(T.is_outdoors()) SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) +/datum/weather/virgo3c/fallout/temp + name = "short-term fallout" + transition_chances = list( + WEATHER_FALLOUT = 10, + WEATHER_RAIN = 50, + WEATHER_STORM = 20, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/virgo3c/confetti + name = "confetti" + icon = 'icons/effects/weather_vr.dmi' + icon_state = "confetti" + + transition_chances = list( + WEATHER_CLEAR = 50, + WEATHER_OVERCAST = 20, + WEATHER_CONFETTI = 5 + ) + observed_message = "Confetti is raining from the sky." + transition_messages = list( + "Suddenly, colorful confetti starts raining from the sky." + ) + /turf/unsimulated/wall/planetary/virgo3c name = "impassable rock" desc = "It's quite impassable" diff --git a/code/modules/planet/virgo4_vr.dm b/code/modules/planet/virgo4_vr.dm index 9cb88591ad7..ed7e08d686d 100644 --- a/code/modules/planet/virgo4_vr.dm +++ b/code/modules/planet/virgo4_vr.dm @@ -110,7 +110,9 @@ var/datum/planet/virgo4/planet_virgo4 = null WEATHER_EMBERFALL = new /datum/weather/virgo4/emberfall(), WEATHER_ASH_STORM = new /datum/weather/virgo4/ash_storm(), WEATHER_ASH_STORM_SAFE = new /datum/weather/virgo4/ash_storm_safe(), - WEATHER_FALLOUT = new /datum/weather/virgo4/fallout() + WEATHER_FALLOUT = new /datum/weather/virgo4/fallout(), + WEATHER_FALLOUT_TEMP = new /datum/weather/virgo4/fallout/temp(), + WEATHER_CONFETTI = new /datum/weather/virgo4/confetti() ) roundstart_weather_chances = list( WEATHER_CLEAR = 50, @@ -160,7 +162,8 @@ var/datum/planet/virgo4/planet_virgo4 = null temp_low = 263.15 // -10c light_modifier = 0.7 transition_chances = list( - WEATHER_LIGHT_SNOW = 100 + WEATHER_LIGHT_SNOW = 15, + WEATHER_OVERCAST = 80 ) observed_message = "It is snowing lightly." transition_messages = list( @@ -178,7 +181,8 @@ var/datum/planet/virgo4/planet_virgo4 = null light_modifier = 0.5 flight_failure_modifier = 5 transition_chances = list( - WEATHER_LIGHT_SNOW = 100 + WEATHER_SNOW = 10, + WEATHER_LIGHT_SNOW = 80 ) observed_message = "It is snowing." transition_messages = list( @@ -210,7 +214,8 @@ var/datum/planet/virgo4/planet_virgo4 = null light_modifier = 0.3 flight_failure_modifier = 10 transition_chances = list( - WEATHER_BLIZZARD = 100 + WEATHER_BLIZZARD = 5, + WEATHER_SNOW = 80 ) observed_message = "A blizzard blows snow everywhere." transition_messages = list( @@ -294,7 +299,8 @@ var/datum/planet/virgo4/planet_virgo4 = null transition_chances = list( - WEATHER_STORM = 100 + WEATHER_STORM = 10, + WEATHER_RAIN = 80 ) /datum/weather/virgo4/storm/process_effects() @@ -341,7 +347,9 @@ var/datum/planet/virgo4/planet_virgo4 = null effect_message = "The hail smacks into you!" transition_chances = list( - WEATHER_HAIL = 100 + WEATHER_HAIL = 10, + WEATHER_SNOW = 40, + WEATHER_RAIN = 40 ) observed_message = "Ice is falling from the sky." transition_messages = list( @@ -524,6 +532,30 @@ var/datum/planet/virgo4/planet_virgo4 = null if(T.is_outdoors()) SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) +/datum/weather/virgo4/fallout/temp + name = "short-term fallout" + transition_chances = list( + WEATHER_FALLOUT = 10, + WEATHER_RAIN = 50, + WEATHER_STORM = 20, + WEATHER_OVERCAST = 5 + ) + +/datum/weather/virgo4/confetti + name = "confetti" + icon = 'icons/effects/weather_vr.dmi' + icon_state = "confetti" + + transition_chances = list( + WEATHER_CLEAR = 50, + WEATHER_OVERCAST = 20, + WEATHER_CONFETTI = 5 + ) + observed_message = "Confetti is raining from the sky." + transition_messages = list( + "Suddenly, colorful confetti starts raining from the sky." + ) + /turf/unsimulated/wall/planetary/normal/virgo4 name = "deep ocean" alpha = 0 diff --git a/code/modules/planet/weather_vr.dm b/code/modules/planet/weather_vr.dm index ebee7254782..71b3cd8fe18 100644 --- a/code/modules/planet/weather_vr.dm +++ b/code/modules/planet/weather_vr.dm @@ -1,3 +1,6 @@ +/datum/weather_holder + var/firework_override = FALSE + /datum/weather_holder/update_icon_effects() ..() if(current_weather.icon) diff --git a/code/modules/power/cells/device_cells_vr.dm b/code/modules/power/cells/device_cells_vr.dm index 54fd8965aa8..639130a6605 100644 --- a/code/modules/power/cells/device_cells_vr.dm +++ b/code/modules/power/cells/device_cells_vr.dm @@ -12,6 +12,7 @@ user.put_in_active_hand(newcell) var/percentage = charge/maxcharge newcell.charge = newcell.maxcharge * percentage + newcell.persist_storable = persist_storable qdel(src) //The machine cell @@ -36,8 +37,9 @@ user.put_in_active_hand(newcell) var/percentage = charge/maxcharge newcell.charge = newcell.maxcharge * percentage + newcell.persist_storable = persist_storable qdel(src) - + // Bloo friendlier hybrid tech /obj/item/weapon/cell/device/weapon/recharge/alien/hybrid icon = 'icons/obj/power_vr.dmi' diff --git a/code/modules/projectiles/guns/energy/protector_vr.dm b/code/modules/projectiles/guns/energy/protector_vr.dm index f4d1bfd0e1c..9324e654b64 100644 --- a/code/modules/projectiles/guns/energy/protector_vr.dm +++ b/code/modules/projectiles/guns/energy/protector_vr.dm @@ -27,6 +27,10 @@ light_state = "prot_light" flight_x_offset = 0 flight_y_offset = 0 + action_button_name = "Toggle gun-light" + var/gun_light_icon = TRUE + var/gun_light_on = FALSE + var/brightness_on = 5 w_class = ITEMSIZE_SMALL @@ -44,6 +48,17 @@ return ..() +/obj/item/weapon/gun/energy/gun/protector/ui_action_click(mob/user, actiontype) + gun_light_on = !gun_light_on + playsound(src, 'sound/weapons/empty.ogg', 40, TRUE) + update_brightness(user) + update_icon() + +/obj/item/weapon/gun/energy/gun/protector/proc/update_brightness(mob/user = null) + if(gun_light_on) + set_light(brightness_on) + else + set_light(0) /obj/item/weapon/gun/energy/gun/protector/emag_act(var/remaining_charges,var/mob/user) ..() @@ -86,11 +101,12 @@ else add_overlay("[icon_state]_[modifystate][ratio]") - if(can_flashlight & gun_light) + if(can_flashlight & gun_light_on) var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, light_state) flashlight_overlay.pixel_x = flight_x_offset flashlight_overlay.pixel_y = flight_y_offset - add_overlay(flashlight_overlay) + add_overlay(light_state) + /* Don't have one for this gun if(itemState) @@ -102,3 +118,43 @@ emagged = TRUE name = "small energy gun" desc = "The LAEP95 'Protector' is another firearm from Lawson Arms and "+TSC_HEPH+", unlike the Perun this is designed for issue to non-security staff. It contains a detachable cell. It also features an integrated flashlight!" + + +/obj/item/weapon/gun/energy/gun/protector/pilotgun/locked + name = "secure shuttle-protection pistol" + desc = "The LAEP97 'Defender' is a variant of another firearm from Lawson Arms and "+TSC_HEPH+", designed to be issued to pilots for defence of their craft from trespassers whilst in-flight. It contains a detachable cell, two modes of fire and a safety interlock to minimize workplace accidents. It also features an integrated flashlight!" + + description_info = "This gun can only fire non-lethally. Additionally, it's incapable of firing within the proximity of Nanotrasen facilities courtesy of the built-in safety interlock." + description_fluff = "A lighter weapon designed for pilots, this gun has a wireless connection to the computer's datacore to ensure it can't be used within the bounds of NT facilities without authorization from ranking members of security, or the Captain." + + firemodes = list( + list(mode_name="stunbeam", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="stun", charge_cost = 400), + list(mode_name="electrode", projectile_type=/obj/item/projectile/energy/electrode/strong, modifystate="zap", charge_cost = 800), + ) + + req_access = list(access_armory) //for toggling safety + var/locked = 1 + var/lockable = 1 + +/obj/item/weapon/gun/energy/gun/protector/pilotgun/locked/attackby(obj/item/I, mob/user) + var/obj/item/weapon/card/id/id = I.GetID() + if(istype(id) && lockable) + if(check_access(id)) + locked = !locked + to_chat(user, "You [locked ? "enable" : "disable"] the safety interlock on \the [src].") + else + to_chat(user, "Access denied.") + user.visible_message("[user] swipes \the [I] against \the [src].") + else + return ..() + +/obj/item/weapon/gun/energy/gun/protector/pilotgun/locked/emag_act(var/remaining_charges,var/mob/user) + return ..() + +/obj/item/weapon/gun/energy/gun/protector/pilotgun/locked/special_check(mob/user) + if(locked) + var/turf/T = get_turf(src) + if(T.z in using_map.station_levels) + to_chat(user, "The safety device prevents the gun from firing this close to the facility.") + return 0 + return ..() diff --git a/code/modules/research/designs/circuits/circuits_vr.dm b/code/modules/research/designs/circuits/circuits_vr.dm index 6d4b9b9d263..43fba27e7fb 100644 --- a/code/modules/research/designs/circuits/circuits_vr.dm +++ b/code/modules/research/designs/circuits/circuits_vr.dm @@ -169,6 +169,13 @@ build_path = /obj/item/weapon/circuitboard/machine/vitals_monitor sort_string = "HAAF" +/datum/design/circuit/firework_launcher + name = "firework launcher" + id = "fireworklauncher" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/firework_launcher + sort_string = "KBAAB" + /datum/design/circuit/pointdefense name = "point defense battery" id = "pointdefense" diff --git a/code/modules/research/designs/firework_stars.dm b/code/modules/research/designs/firework_stars.dm new file mode 100644 index 00000000000..6fb4e6f70f4 --- /dev/null +++ b/code/modules/research/designs/firework_stars.dm @@ -0,0 +1,112 @@ +// Firework Stars + +/datum/design/item/firework_star/AssembleDesignName() + name = "Firework star prototype ([item_name])" + +/datum/design/item/firework_star/aesthetic + name = "aesthetic" + desc = "A firework star, designed for use with launcher. Produces variable amount of joy." + id = "fireworkaesthetic" + req_tech = list(TECH_MATERIAL = 2) + materials = list(MAT_PLASTIC = 500, MAT_GLASS = 500) + build_path = /obj/item/weapon/firework_star/aesthetic + sort_string = "IFAAA" + +/datum/design/item/firework_star/aesthetic_config + name = "aesthetic - configurable" + desc = "A firework star, designed for use with launcher. Produces variable amount of joy. Can be modified to produce specific forms." + id = "fireworkaestheticconfig" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2) + materials = list(MAT_PLASTIC = 1000, MAT_GLASS = 1000) + build_path = /obj/item/weapon/firework_star/aesthetic/configurable + sort_string = "IFAAB" + +/datum/design/item/firework_star/weather_clear + name = "weather - CLEAR" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one clears the sky." + id = "fireworkclearsky" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_STEEL = 4000) + build_path = /obj/item/weapon/firework_star/weather/clear + sort_string = "IFABA" + +/datum/design/item/firework_star/weather_overcast + name = "weather - CLOUDY" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates some clouds." + id = "fireworkcloudy" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 1000) + build_path = /obj/item/weapon/firework_star/weather/overcast + sort_string = "IFABB" + +/datum/design/item/firework_star/weather_rain + name = "weather - RAIN" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates rain." + id = "fireworkrain" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 4000) + build_path = /obj/item/weapon/firework_star/weather/rain + sort_string = "IFABC" + +/datum/design/item/firework_star/weather_storm + name = "weather - STORM" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates a rainstorm." + id = "fireworkstorm" + req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 3000, MAT_GOLD = 1000) + build_path = /obj/item/weapon/firework_star/weather/storm + sort_string = "IFABD" + +/datum/design/item/firework_star/weather_light_snow + name = "weather - LIGHT SNOW" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates a light snowfall." + id = "fireworklightsnow" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_LEAD = 2000) + build_path = /obj/item/weapon/firework_star/weather/light_snow + sort_string = "IFABE" + +/datum/design/item/firework_star/weather_snow + name = "weather - MODERATE SNOW" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates a moderate snowfall." + id = "fireworksnow" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 3000, MAT_LEAD = 2000) + build_path = /obj/item/weapon/firework_star/weather/snow + sort_string = "IFABF" + +/datum/design/item/firework_star/weather_blizzard + name = "weather - HEAVY SNOW" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates a blizzard." + id = "fireworkblizzard" + req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 3000, MAT_LEAD = 3000) + build_path = /obj/item/weapon/firework_star/weather/blizzard + sort_string = "IFABG" + +/datum/design/item/firework_star/weather_hail + name = "weather - HAIL" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates a hailstorm. DANGEROUS." + id = "fireworkhail" + req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5, TECH_ILLEGAL = 2) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_SILVER = 3000, MAT_LEAD = 3000, MAT_PLASTEEL = 4000) + build_path = /obj/item/weapon/firework_star/weather/hail + sort_string = "IFABH" + +/datum/design/item/firework_star/weather_fallout + name = "weather - NUCLEAR" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one creates a heavy cloud of nuclear fallout. DANGEROUS." + id = "fireworkfallout" + req_tech = list(TECH_MATERIAL = 8, TECH_ENGINEERING = 6, TECH_ILLEGAL = 7) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 2000, MAT_URANIUM = 12000) + build_path = /obj/item/weapon/firework_star/weather/fallout + sort_string = "IFABI" + +/datum/design/item/firework_star/weather_confetti + name = "weather - CONFETTI" + desc = "A firework star, designed for use with launcher. Modifies current planetary weather effects. This one clears the sky and rains colorful confetti from it." + id = "fireworkconfetti" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) + materials = list(MAT_PLASTIC = 10000, MAT_GLASS = 10000) + build_path = /obj/item/weapon/firework_star/weather/confetti + sort_string = "IFABJ" diff --git a/code/modules/research/designs/medical.dm b/code/modules/research/designs/medical.dm index 7bd0eddd56e..abd3b584761 100644 --- a/code/modules/research/designs/medical.dm +++ b/code/modules/research/designs/medical.dm @@ -88,6 +88,15 @@ build_path = /obj/item/device/healthanalyzer/improved sort_string = "KBAAB" +/datum/design/item/medical/advanced_analyzer + name = "advanced health analyzer" + desc = "An even more advanced handheld health scanner, complete with a full biosign monitor and on-board radiation and neurological analysis suites." + id = "advanced_analyzer" + req_tech = list(TECH_MAGNET = 7, TECH_BIO = 7, TECH_DATA = 5) + materials = list(MAT_STEEL = 2000, MAT_GLASS = 4000, MAT_SILVER = 3500, MAT_GOLD = 2500, MAT_DIAMOND = 1250) + build_path = /obj/item/device/healthanalyzer/advanced + sort_string = "KBAAC" + /datum/design/item/medical/advanced_roller name = "advanced roller bed" desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system." @@ -95,4 +104,4 @@ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3) materials = list(MAT_STEEL = 4000, MAT_GLASS = 2000, MAT_PHORON = 2000) build_path = /obj/item/roller/adv - sort_string = "KCAAA" \ No newline at end of file + sort_string = "KCAAA" diff --git a/code/modules/resleeving/autoresleever.dm b/code/modules/resleeving/autoresleever.dm index 1e6753f4d77..f851ccbd1ad 100644 --- a/code/modules/resleeving/autoresleever.dm +++ b/code/modules/resleeving/autoresleever.dm @@ -165,7 +165,7 @@ for(var/lang in ghost_client.prefs.alternate_languages) var/datum/language/chosen_language = GLOB.all_languages[lang] if(chosen_language) - if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) + if(is_lang_whitelisted(ghost,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) new_character.add_language(lang) for(var/key in ghost_client.prefs.language_custom_keys) if(ghost_client.prefs.language_custom_keys[key]) diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index f5fc359436a..060ac056541 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -714,7 +714,7 @@ var/obj/item/I = M.get_equipped_item(slot = slot) if(I) M.unEquip(I,force = TRUE) - if(contaminates || istype(I, /obj/item/weapon/card/id)) + if(contaminates) I.gurgle_contaminate(contents, contamination_flavor, contamination_color) //We do an initial contamination pass to get stuff like IDs wet. if(item_digest_mode == IM_HOLD) items_preserved |= I diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 257f8f14be3..00a20092fc6 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2490,7 +2490,7 @@ Departamental Swimsuits, for general use //Pandora029:Seona Young /obj/item/clothing/under/fluff/foxoflightsuit - name = "padded flightsui" + name = "padded flightsuit" desc = "A ruddy-orange combination immersion-and-flight suit, fitted with extra padding across the front of its legs. Warm, waterproof and practical, seveal patches are scattered across it alongside a hard-wearing harness." icon = 'icons/vore/custom_clothes_vr.dmi' @@ -2562,4 +2562,4 @@ Departamental Swimsuits, for general use icon_override = 'icons/vore/custom_onmob_vr.dmi' item_state = "perrinrobes_s" - body_parts_covered = UPPER_TORSO|LOWER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/icons/_nanomaps/tether_nanomap_z1.png b/icons/_nanomaps/tether_nanomap_z1.png index cc281d14321..f6188b78814 100644 Binary files a/icons/_nanomaps/tether_nanomap_z1.png and b/icons/_nanomaps/tether_nanomap_z1.png differ diff --git a/icons/_nanomaps/tether_nanomap_z2.png b/icons/_nanomaps/tether_nanomap_z2.png index 5f1eacdb197..53492f77eec 100644 Binary files a/icons/_nanomaps/tether_nanomap_z2.png and b/icons/_nanomaps/tether_nanomap_z2.png differ diff --git a/icons/_nanomaps/tether_nanomap_z3.png b/icons/_nanomaps/tether_nanomap_z3.png index 974a1f01cf5..45438a40d92 100644 Binary files a/icons/_nanomaps/tether_nanomap_z3.png and b/icons/_nanomaps/tether_nanomap_z3.png differ diff --git a/icons/_nanomaps/tether_nanomap_z4.png b/icons/_nanomaps/tether_nanomap_z4.png index c2623219ee4..510d22b3d61 100644 Binary files a/icons/_nanomaps/tether_nanomap_z4.png and b/icons/_nanomaps/tether_nanomap_z4.png differ diff --git a/icons/_nanomaps/tether_nanomap_z5.png b/icons/_nanomaps/tether_nanomap_z5.png index 26843c06404..6d264b4a0db 100644 Binary files a/icons/_nanomaps/tether_nanomap_z5.png and b/icons/_nanomaps/tether_nanomap_z5.png differ diff --git a/icons/effects/weather_vr.dmi b/icons/effects/weather_vr.dmi index a72ff3b7b1b..0d977a2f15b 100644 Binary files a/icons/effects/weather_vr.dmi and b/icons/effects/weather_vr.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 3157dea03a7..25465b38910 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/obj/firework_stars.dmi b/icons/obj/firework_stars.dmi new file mode 100644 index 00000000000..e2d0cb1ee5e Binary files /dev/null and b/icons/obj/firework_stars.dmi differ diff --git a/icons/obj/machines/firework_launcher.dmi b/icons/obj/machines/firework_launcher.dmi new file mode 100644 index 00000000000..ab0910cad18 Binary files /dev/null and b/icons/obj/machines/firework_launcher.dmi differ diff --git a/icons/vore/custom_guns_vr.dmi b/icons/vore/custom_guns_vr.dmi index 05c146446d4..aabbcebfd64 100644 Binary files a/icons/vore/custom_guns_vr.dmi and b/icons/vore/custom_guns_vr.dmi differ diff --git a/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm b/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm index ff66758524d..bf12e599b78 100644 --- a/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm +++ b/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm @@ -48,6 +48,7 @@ /obj/machinery/computer/shuttle_control/aerostat_shuttle name = "aerostat ferry control console" shuttle_tag = "Aerostat Ferry" + ai_control = TRUE /obj/tether_away_spawner/aerostat_inside name = "Aerostat Indoors Spawner" diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm index 881bc666c32..7e8ee8e3144 100644 --- a/maps/groundbase/gb-z1.dmm +++ b/maps/groundbase/gb-z1.dmm @@ -6078,6 +6078,20 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, /area/groundbase/engineering/atmos/monitoring) +"np" = ( +/obj/machinery/hologram/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/obj/structure/flora/tree/pine/xmas/presents, +/turf/simulated/floor/tiled/dark, +/area/groundbase/civilian/bar) "nq" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -9460,19 +9474,6 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/civilian/bar) -"vF" = ( -/obj/machinery/hologram/holopad, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" - }, -/turf/simulated/floor/tiled/dark, -/area/groundbase/civilian/bar) "vH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_security{ @@ -11430,8 +11431,6 @@ /obj/structure/table/rack/shelf, /obj/item/device/cataloguer, /obj/item/device/cataloguer, -/obj/item/device/cataloguer/compact, -/obj/item/device/cataloguer/compact, /turf/simulated/floor/tiled, /area/groundbase/civilian/gateway) "Ao" = ( @@ -14815,7 +14814,7 @@ frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; - sensors = list("dist_main_meter"="Surface - Distribution Loop","scrub_main_meter"="Surface - Scrubbers Loop","mair_main_meter"="Surface - Mixed Air Tank","dist_aux_meter"="Station - Distribution Loop","scrub_aux_meter"="Station - Scrubbers Loop","mair_aux_meter"="Station - Mixed Air Tank","mair_mining_meter"="Mining Outpost - Mixed Air Tank") + sensors = list("dist_main_meter" = "Surface - Distribution Loop", "scrub_main_meter" = "Surface - Scrubbers Loop", "mair_main_meter" = "Surface - Mixed Air Tank", "dist_aux_meter" = "Station - Distribution Loop", "scrub_aux_meter" = "Station - Scrubbers Loop", "mair_aux_meter" = "Station - Mixed Air Tank", "mair_mining_meter" = "Mining Outpost - Mixed Air Tank") }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -17120,6 +17119,10 @@ req_access = list(43) }, /obj/item/device/mapping_unit, +/obj/item/device/cataloguer, +/obj/item/device/cataloguer, +/obj/item/device/cataloguer/compact, +/obj/item/device/cataloguer/compact, /turf/simulated/floor/tiled/dark, /area/groundbase/civilian/gateway) "Oj" = ( @@ -26705,7 +26708,7 @@ oe gF FB JX -vF +np Cy cN Bo diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index 8ea562814be..226d9f6bc59 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -208,6 +208,10 @@ }, /turf/simulated/floor/tiled, /area/groundbase/science/robotics) +"aw" = ( +/obj/machinery/firework_launcher, +/turf/simulated/floor/tiled, +/area/groundbase/science/hall) "ax" = ( /obj/structure/closet/secure_closet/personal, /obj/item/weapon/towel/random, @@ -2268,7 +2272,7 @@ name = "box of measuring cups"; pixel_x = 2; pixel_y = 3; - starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker/measuring_cup=7) + starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker/measuring_cup = 7) }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -23498,7 +23502,7 @@ aB PR lw Vr -Vr +aw Bl ag ag diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm index e6bd6d8cf6d..49b5ed048fc 100644 --- a/maps/groundbase/gb-z3.dmm +++ b/maps/groundbase/gb-z3.dmm @@ -388,7 +388,7 @@ req_one_access = null }, /obj/machinery/door/firedoor/glass/talon, -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "4-8" }, /turf/simulated/floor/tiled/steel_ridged, @@ -533,6 +533,9 @@ /obj/machinery/computer/ship/engines{ dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled/eris/dark/techfloor_grid, /area/shuttle/groundbase/exploration) "jp" = ( @@ -841,6 +844,9 @@ req_one_access = null }, /obj/effect/map_helper/airlock/door/simple, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled/steel_ridged, /area/shuttle/groundbase/exploration) "ok" = ( @@ -1189,6 +1195,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/shuttle/groundbase/exploration) "to" = ( @@ -1454,7 +1463,7 @@ dir = 8; req_access = list(11,67) }, -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "0-2" }, /turf/simulated/floor/tiled/eris/dark/panels, @@ -1582,6 +1591,15 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/paramedic) +"zS" = ( +/obj/structure/bed/chair/shuttle{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/eris/dark/techfloor_grid, +/area/shuttle/groundbase/exploration) "zW" = ( /obj/structure/bed/chair/backed_red{ dir = 4 @@ -1746,12 +1764,15 @@ }, /area/groundbase/level3/escapepad) "CU" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "1-2" }, /obj/structure/handrail{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/shuttle/groundbase/exploration) "De" = ( @@ -1868,7 +1889,9 @@ /turf/simulated/floor/bmarble, /area/groundbase/civilian/kitchen) "Es" = ( -/mob/living/simple_mob/vore/alienanimals/catslug/custom/pilotslug, +/mob/living/simple_mob/vore/alienanimals/catslug/custom/pilotslug{ + ghostjoin = 1 + }, /turf/simulated/floor/tiled, /area/groundbase/civilian/pilot) "Ev" = ( @@ -2073,7 +2096,7 @@ }, /area/groundbase/medical/patio) "HE" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "2-4" }, /obj/machinery/alarm{ @@ -2136,6 +2159,9 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, /turf/simulated/floor/tiled, /area/shuttle/groundbase/exploration) "ID" = ( @@ -2160,6 +2186,12 @@ edge_blending_priority = -1 }, /area/groundbase/level3/nw/open) +"IP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/shuttle/groundbase/exploration) "IS" = ( /turf/simulated/open/virgo3c, /area/groundbase/level3/ne/open) @@ -2180,7 +2212,7 @@ /turf/simulated/floor/tiled/eris/dark/panels, /area/shuttle/groundbase/exploration) "Jk" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "1-8" }, /turf/simulated/floor/tiled/eris/dark/panels, @@ -2317,7 +2349,7 @@ /turf/simulated/floor/tiled/white, /area/groundbase/medical/uhallway) "Ma" = ( -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "1-8" }, /obj/structure/closet/walllocker_double/east, @@ -2410,6 +2442,9 @@ name = "Excursion Shuttlepad" }, /obj/effect/overmap/visitable/ship/landable/gbexplo, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/shuttle/groundbase/exploration) "Nf" = ( @@ -2539,7 +2574,7 @@ /obj/machinery/power/smes/buildable{ charge = 500000 }, -/obj/structure/cable/yellow{ +/obj/structure/cable/cyan{ icon_state = "0-4" }, /obj/machinery/light, @@ -2995,6 +3030,9 @@ /obj/machinery/alarm{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled/eris/dark/panels, /area/shuttle/groundbase/exploration) "Vh" = ( @@ -3021,6 +3059,9 @@ /obj/structure/bed/chair/shuttle{ dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled/eris/dark/panels, /area/shuttle/groundbase/exploration) "VB" = ( @@ -3069,6 +3110,12 @@ /obj/structure/railing, /turf/simulated/floor/bmarble, /area/groundbase/civilian/kitchen) +"Wl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/wall/rshull, +/area/shuttle/groundbase/exploration) "Wr" = ( /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -7686,7 +7733,7 @@ pd vV PH gx -PH +Wl PH PH sL @@ -7970,7 +8017,7 @@ DE Ml Zx Hm -tY +zS PH PH rb @@ -8254,7 +8301,7 @@ DE fc zF Hm -tY +zS PH PH rb @@ -8538,7 +8585,7 @@ jX vV PH Ka -PH +Wl PH PH MP @@ -8822,7 +8869,7 @@ PH Bo PH Ef -XT +IP vV PH JI @@ -11509,9 +11556,9 @@ Zo Zo Zo Kr -Kr -Kr -Kr +QD +QD +QD QD QD QD @@ -11651,9 +11698,9 @@ vs Kr Kr Kr -Kr -Kr -Kr +QD +QD +QD QD QD QD @@ -11793,9 +11840,9 @@ Kr Kr Kr Kr -Kr -Kr -Kr +QD +QD +QD QD QD gs diff --git a/maps/groundbase/westwilds/westwilds1.dmm b/maps/groundbase/westwilds/westwilds1.dmm index f0c518f5269..b36d17619e2 100644 --- a/maps/groundbase/westwilds/westwilds1.dmm +++ b/maps/groundbase/westwilds/westwilds1.dmm @@ -3808,6 +3808,10 @@ }, /turf/simulated/floor, /area/groundbase/engineering/solarshed) +"Fr" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/shuttle/axolotl) "Fs" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 6 @@ -19309,7 +19313,7 @@ bs xg or iE -Ga +Fr Uf Uf qV diff --git a/maps/groundbase/westwilds/westwilds2.dmm b/maps/groundbase/westwilds/westwilds2.dmm index e84911964b2..e2413dff23f 100644 --- a/maps/groundbase/westwilds/westwilds2.dmm +++ b/maps/groundbase/westwilds/westwilds2.dmm @@ -1459,6 +1459,10 @@ "lh" = ( /turf/simulated/wall/shull, /area/shuttle/axolotl_cockpit) +"li" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/plating, +/area/shuttle/axolotl) "lk" = ( /obj/machinery/light{ dir = 8 @@ -21718,7 +21722,7 @@ oO BL Pw yC -Uh +li tX tX WD diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm index 623af619640..5674995a86d 100644 --- a/maps/stellar_delight/stellar_delight1.dmm +++ b/maps/stellar_delight/stellar_delight1.dmm @@ -9634,6 +9634,8 @@ req_access = list(43) }, /obj/item/device/bluespaceradio/sd_prelinked, +/obj/item/device/cataloguer/compact, +/obj/item/device/cataloguer/compact, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/exploequipment) "ue" = ( @@ -13704,10 +13706,6 @@ pixel_y = 32 }, /obj/structure/table/standard, -/obj/item/device/cataloguer, -/obj/item/device/cataloguer, -/obj/item/device/cataloguer/compact, -/obj/item/device/cataloguer/compact, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/exploequipment) "CU" = ( @@ -16954,6 +16952,8 @@ req_access = list(43) }, /obj/item/device/mapping_unit, +/obj/item/device/cataloguer, +/obj/item/device/cataloguer, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/exploequipment) "Kf" = ( diff --git a/maps/stellar_delight/stellar_delight_jobs.dm b/maps/stellar_delight/stellar_delight_jobs.dm index 696f4950f7f..928fb1f7b9c 100644 --- a/maps/stellar_delight/stellar_delight_jobs.dm +++ b/maps/stellar_delight/stellar_delight_jobs.dm @@ -1,34 +1,2 @@ -//The pathfinder doesn't have a OM shuttle that they are in charge of, and so, doesn't need pilot access. -//Mostly to prevent explo from just commandeering the Starstuff as the explo shuttle without involving a pilot every round. -/* -/datum/job/pathfinder - access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_explorer, access_gateway, access_pathfinder) - minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_explorer, access_gateway, access_pathfinder) - -//Same as above, to discorage explo from taking off with the small ship without asking, SAR should not need pilot access. -/datum/job/sar - access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_eva, access_maint_tunnels, access_external_airlocks) - minimal_access = list(access_medical, access_medical_equip, access_morgue) -*/ -/datum/job/hop - alt_titles = list("Crew Resources Officer" = /datum/alt_title/cro, "Deputy Manager" = /datum/alt_title/deputy_manager, "Staff Manager" = /datum/alt_title/staff_manager, - "Facility Steward" = /datum/alt_title/facility_steward, "First Mate" = /datum/alt_title/first_mate) - -/datum/alt_title/first_mate - title = "First Mate" - -/datum/job/atmos - alt_titles = list("Atmospheric Engineer" = /datum/alt_title/atmos_engi, "Atmospheric Maintainer" = /datum/alt_title/atmos_maint, "Disposals Technician" = /datum/alt_title/disposals_tech, - "Fuel Technician" = /datum/alt_title/refuel_tech) - -/datum/alt_title/refuel_tech - title = "Fuel Technician" - -/datum/job/warden - alt_titles = list("Brig Sentry" = /datum/alt_title/brig_sentry, "Armory Superintendent" = /datum/alt_title/armory_superintendent, "Master-at-Arms" = /datum/alt_title/master_at_arms) - -/datum/alt_title/master_at_arms - title = "Master-at-Arms" - /datum/job/pilot/get_request_reasons() return list("Moving Stellar Delight") diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index da9d835332e..e4813948a18 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -8995,6 +8995,11 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_one_hall) +"aoR" = ( +/obj/machinery/light/small, +/obj/machinery/firework_launcher, +/turf/simulated/floor/tiled, +/area/rnd/hardstorage) "aoS" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/simulated/floor/grass, @@ -32895,10 +32900,6 @@ /obj/effect/floor_decal/corner/red/border, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) -"fna" = ( -/obj/machinery/light/small, -/turf/simulated/floor/tiled, -/area/rnd/hardstorage) "fpU" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/hidden/green, @@ -47177,7 +47178,7 @@ abn abn acx afg -fna +aoR abm aCm akg diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 2ef7dd857ba..11c68057de7 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -9555,6 +9555,9 @@ pixel_x = 24; pixel_y = 24 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "api" = ( @@ -11646,6 +11649,9 @@ pixel_y = 28 }, /obj/machinery/camera/network/civilian, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "asC" = ( @@ -14046,6 +14052,12 @@ /obj/machinery/light{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "awU" = ( @@ -14289,6 +14301,9 @@ /obj/structure/sign/painting/library_secure{ pixel_x = 30 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "axp" = ( @@ -15143,6 +15158,9 @@ /obj/item/weapon/stool/padded{ dir = 1 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "ayK" = ( @@ -15651,6 +15669,10 @@ /obj/item/device/radio/intercom{ pixel_y = -24 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/lino, /area/crew_quarters/bar) "azu" = ( @@ -17876,6 +17898,9 @@ dir = 8; icon_state = "pipe-c" }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "aCU" = ( @@ -19996,6 +20021,12 @@ }, /obj/machinery/vending/snack, /obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/tiled/monotile, /area/crew_quarters/bar) "aGy" = ( @@ -20530,6 +20561,9 @@ /obj/item/weapon/stool/padded{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/carpet/turcarpet, /area/crew_quarters/bar) "aHt" = ( @@ -20634,6 +20668,9 @@ }, /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/bar) "aHz" = ( @@ -21460,6 +21497,9 @@ /area/crew_quarters/kitchen) "aIO" = ( /obj/effect/floor_decal/spline/plain, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/carpet/turcarpet, /area/crew_quarters/bar) "aIP" = ( @@ -21479,6 +21519,9 @@ dir = 4 }, /obj/machinery/smartfridge/drinks, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "aIR" = ( @@ -21491,6 +21534,7 @@ /obj/machinery/newscaster{ pixel_y = -28 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "aIT" = ( @@ -22103,6 +22147,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/bar) "aJW" = ( @@ -22674,14 +22721,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/tether/surfacebase/shuttle_pad) -"aLb" = ( -/obj/effect/floor_decal/corner/grey/diagonal, -/obj/machinery/smartfridge{ - req_access = list(28) - }, -/obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/white, -/area/crew_quarters/kitchen) "aLc" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/effect/landmark/start{ @@ -25199,6 +25238,9 @@ dir = 8 }, /obj/machinery/vending/cola, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/tiled/monotile, /area/crew_quarters/bar) "aQg" = ( @@ -26393,6 +26435,9 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 32 }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "aSz" = ( @@ -27413,6 +27458,14 @@ }, /turf/simulated/floor/tiled/monotile, /area/hallway/lower/third_south) +"aUq" = ( +/obj/effect/landmark{ + name = "Observer-Start" + }, +/obj/machinery/hologram/holopad, +/obj/structure/flora/tree/pine/xmas/presents, +/turf/simulated/floor/wood, +/area/crew_quarters/bar) "aUr" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -28063,6 +28116,7 @@ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "aVx" = ( @@ -30942,6 +30996,9 @@ /obj/item/weapon/stool/padded{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/carpet/turcarpet, /area/crew_quarters/bar) "baB" = ( @@ -31222,6 +31279,7 @@ dir = 1; pixel_y = -22 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "baU" = ( @@ -31238,6 +31296,7 @@ dir = 1; pixel_y = -25 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "baX" = ( @@ -31721,6 +31780,9 @@ /area/crew_quarters/bar) "bbT" = ( /obj/structure/table/woodentable, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bbU" = ( @@ -31802,6 +31864,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bcc" = ( @@ -32878,6 +32941,9 @@ dir = 4; icon_state = "pipe-c" }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bdQ" = ( @@ -32894,6 +32960,7 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bdR" = ( @@ -33000,6 +33067,9 @@ "bee" = ( /obj/structure/disposalpipe/segment, /obj/machinery/computer/arcade/orion_trail, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bef" = ( @@ -33043,6 +33113,7 @@ icon_state = "pipe-c" }, /obj/machinery/light, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bei" = ( @@ -33278,6 +33349,13 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, +/obj/structure/sign/christmas/lights, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "beB" = ( @@ -33340,6 +33418,9 @@ id = "bar"; layer = 3.3 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "beF" = ( @@ -33452,6 +33533,9 @@ }, /obj/machinery/vending/cigarette, /obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/tiled/monotile, /area/crew_quarters/bar) "beN" = ( @@ -33467,6 +33551,9 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "beP" = ( @@ -33544,6 +33631,12 @@ /area/tether/surfacebase/entertainment) "beZ" = ( /obj/structure/bed/chair/comfy/black, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bfa" = ( @@ -33962,6 +34055,7 @@ /area/tether/surfacebase/barbackmaintenance) "bfR" = ( /obj/machinery/media/jukebox, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bfS" = ( @@ -34004,6 +34098,9 @@ /obj/effect/floor_decal/spline/plain{ dir = 1 }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "bfY" = ( @@ -34031,6 +34128,12 @@ /obj/machinery/camera/network/civilian{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/bar) "bga" = ( @@ -34068,13 +34171,6 @@ /obj/structure/sign/botany, /turf/simulated/floor/plating, /area/hydroponics) -"bgd" = ( -/obj/effect/landmark{ - name = "Observer-Start" - }, -/obj/machinery/hologram/holopad, -/turf/simulated/floor/wood, -/area/crew_quarters/bar) "bge" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34091,6 +34187,9 @@ /obj/structure/noticeboard{ pixel_y = 29 }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/bar) "bgg" = ( @@ -34156,6 +34255,9 @@ dir = 2; icon_state = "pipe-c" }, +/obj/structure/sign/christmas/lights{ + dir = 1 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bgk" = ( @@ -34365,6 +34467,9 @@ /obj/machinery/camera/network/civilian{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bgE" = ( @@ -34384,6 +34489,7 @@ /obj/machinery/camera/network/civilian{ dir = 1 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bgG" = ( @@ -34453,6 +34559,9 @@ /obj/machinery/chemical_dispenser/bar_coffee/full{ dir = 8 }, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/lino, /area/crew_quarters/bar) "bgP" = ( @@ -35609,6 +35718,7 @@ dir = 1; pixel_y = -28 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "biV" = ( @@ -35757,6 +35867,7 @@ /area/tether/surfacebase/topairlock) "bjh" = ( /obj/machinery/light/small, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bji" = ( @@ -35806,6 +35917,7 @@ /area/tether/surfacebase/topairlock) "bjo" = ( /obj/structure/sign/poster, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bjp" = ( @@ -37889,6 +38001,10 @@ /obj/structure/bed/chair/comfy/black{ dir = 1 }, +/obj/structure/sign/christmas/lights, +/obj/structure/sign/christmas/lights{ + dir = 4 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bsb" = ( @@ -38131,6 +38247,12 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/tiled, /area/shuttle/tourbus/general) +"cev" = ( +/obj/structure/sign/christmas/lights{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/bar) "ceN" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -38241,6 +38363,7 @@ /obj/structure/sign/painting/library_secure{ pixel_y = -30 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "cFA" = ( @@ -38265,6 +38388,9 @@ /obj/effect/floor_decal/spline/plain{ dir = 1 }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/carpet/turcarpet, /area/crew_quarters/bar) "cGt" = ( @@ -40311,6 +40437,10 @@ /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/rnd/research/researchdivision) +"jta" = ( +/obj/structure/sign/christmas/lights, +/turf/simulated/floor/wood, +/area/crew_quarters/bar) "juj" = ( /obj/machinery/newscaster{ pixel_y = 30 @@ -41130,6 +41260,7 @@ /obj/item/device/radio/intercom{ pixel_y = -24 }, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "lFG" = ( @@ -41911,6 +42042,9 @@ /obj/item/weapon/stool/padded{ dir = 4 }, +/obj/structure/sign/christmas/lights{ + dir = 8 + }, /turf/simulated/floor/carpet/turcarpet, /area/crew_quarters/bar) "orc" = ( @@ -42691,6 +42825,7 @@ /area/tether/surfacebase/southhall) "qFD" = ( /obj/machinery/light, +/obj/structure/sign/christmas/lights, /turf/simulated/floor/wood, /area/crew_quarters/bar) "qFL" = ( @@ -59519,7 +59654,7 @@ baA oqI aIO bgD -asX +cev bdP beA aJs @@ -60225,7 +60360,7 @@ asX aLd aHl aIi -bgd +aUq aLd baC bcm @@ -61214,7 +61349,7 @@ bpC bge bgA bgA -aLb +aru bfX bgz bgz @@ -61508,7 +61643,7 @@ aJt aJt aGx bgH -asX +jta aGK qum sUg diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 636ecdfecb4..ae4346287cd 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -8415,7 +8415,8 @@ /obj/machinery/door/airlock/multi_tile/glass{ dir = 2; name = "Gateway/EVA Prep Room"; - req_access = list(18,19,43,67) + req_access = null; + req_one_access = list(18,19,43,67) }, /turf/simulated/floor/tiled/steel_ridged, /area/gateway/prep_room) @@ -14326,10 +14327,6 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/item/device/cataloguer, -/obj/item/device/cataloguer, -/obj/item/device/cataloguer/compact, -/obj/item/device/cataloguer/compact, /turf/simulated/floor/tiled, /area/ai_monitored/storage/eva) "bkU" = ( @@ -18669,8 +18666,6 @@ /turf/simulated/floor/tiled, /area/hallway/station/atrium) "frS" = ( -/obj/structure/closet/secure_closet/guncabinet/excursion, -/obj/item/weapon/pickaxe, /obj/machinery/light{ dir = 1 }, @@ -21718,6 +21713,8 @@ /obj/machinery/door/window/brigdoor{ req_access = list(43) }, +/obj/item/device/cataloguer/compact, +/obj/item/device/cataloguer/compact, /turf/simulated/floor/tiled/dark, /area/ai_monitored/storage/eva) "ifp" = ( @@ -22194,6 +22191,8 @@ /obj/machinery/door/window/brigdoor/eastright{ req_access = list(43) }, +/obj/item/device/cataloguer, +/obj/item/device/cataloguer, /turf/simulated/floor/tiled/dark, /area/ai_monitored/storage/eva) "iIf" = ( diff --git a/vorestation.dme b/vorestation.dme index e87c55185ba..8387774780a 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2270,6 +2270,9 @@ #include "code\modules\examine\descriptions\weapons.dm" #include "code\modules\ext_scripts\irc.dm" #include "code\modules\ext_scripts\python.dm" +#include "code\modules\fireworks\firework_launcher.dm" +#include "code\modules\fireworks\firework_stars.dm" +#include "code\modules\fireworks\launcher_construction.dm" #include "code\modules\fishing\fishing.dm" #include "code\modules\fishing\fishing_net.dm" #include "code\modules\fishing\fishing_rod.dm" @@ -3747,6 +3750,7 @@ #include "code\modules\research\designs\bio_devices_vr.dm" #include "code\modules\research\designs\circuit_assembly.dm" #include "code\modules\research\designs\engineering.dm" +#include "code\modules\research\designs\firework_stars.dm" #include "code\modules\research\designs\HUDs.dm" #include "code\modules\research\designs\HUDs_vr.dm" #include "code\modules\research\designs\implants.dm" @@ -4169,7 +4173,6 @@ #include "maps\expedition_vr\beach\submaps\mountains.dm" #include "maps\expedition_vr\beach\submaps\mountains_areas.dm" #include "maps\gateway_archive_vr\blackmarketpackers.dm" -#include "maps\groundbase\groundbase.dm" #include "maps\offmap_vr\om_ships\abductor.dm" #include "maps\offmap_vr\om_ships\lunaship.dm" #include "maps\southern_cross\items\clothing\sc_accessory.dm" @@ -4187,5 +4190,6 @@ #include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" +#include "maps\tether\tether.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE