/obj/structure/window name = "window" desc = "A window." icon_state = "window" density = TRUE layer = ABOVE_OBJ_LAYER //Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = TRUE flags = ON_BORDER flags_2 = RAD_PROTECT_CONTENTS_2 receive_ricochet_chance_mod = 0.5 can_be_unanchored = TRUE max_integrity = 25 resistance_flags = ACID_PROOF armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 80, ACID = 100) rad_insulation_beta = RAD_MEDIUM_INSULATION cares_about_temperature = TRUE var/ini_dir = null var/state = WINDOW_OUT_OF_FRAME var/reinf = FALSE var/heat_resistance = 800 var/decon_speed = null var/fulltile = FALSE var/shardtype = /obj/item/shard var/glass_decal = /obj/effect/decal/cleanable/glass var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 var/mutable_appearance/crack_overlay var/real_explosion_block //ignore this, just use explosion_block var/breaksound = "shatter" var/hitsound = 'sound/effects/Glasshit.ogg' /// Used to restore colours from polarised glass var/old_color /// Used to define what file the edging sprite is contained within var/edge_overlay_file /// Tracks the edging appearence sprite var/mutable_appearance/edge_overlay /// Minimum environment smash level (found on simple animals) to break through this instantly var/env_smash_level = ENVIRONMENT_SMASH_STRUCTURES /// How well this window resists superconductivity. var/superconductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT /// How much we get activated by gamma radiation var/rad_conversion_amount = 0 /obj/structure/window/rad_act(atom/source, amount, emission_type) if(emission_type == GAMMA_RAD && amount * rad_conversion_amount > RAD_BACKGROUND_RADIATION) AddComponent(/datum/component/radioactive, amount * rad_conversion_amount, src, BETA_RAD, 60) /obj/structure/window/examine(mob/user) . = ..() if(reinf) if(anchored && state == WINDOW_SCREWED_TO_FRAME) . += "The window is screwed to the frame." else if(anchored && state == WINDOW_IN_FRAME) . += "The window is unscrewed but pried into the frame." else if(anchored && state == WINDOW_OUT_OF_FRAME) . += "The window is out of the frame, but could be pried in. It is screwed to the floor." else if(!anchored) . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." else if(anchored) . += "The window is screwed to the floor." else . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." if(!anchored && !fulltile) . += "Alt-Click to rotate it." /obj/structure/window/Initialize(mapload, direct) . = ..() if(direct) setDir(direct) if(reinf && anchored) state = WINDOW_SCREWED_TO_FRAME ini_dir = dir if(fulltile) setDir() if(decon_speed == null && fulltile) decon_speed = 2 SECONDS //windows only block while reinforced and fulltile, so we'll use the proc real_explosion_block = explosion_block explosion_block = EXPLOSION_BLOCK_PROC var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_atom_exit), ) AddElement(/datum/element/connect_loc, loc_connections) recalculate_atmos_connectivity() /obj/structure/window/proc/toggle_polarization() if(opacity) if(!old_color) old_color = "#FFFFFF" animate(src, color = old_color, time = 0.5 SECONDS) set_opacity(FALSE) else old_color = color animate(src, color = "#222222", time = 0.5 SECONDS) set_opacity(TRUE) /obj/structure/window/narsie_act() color = NARSIE_WINDOW_COLOUR /obj/structure/window/rpd_act() return /obj/structure/window/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) /obj/structure/window/setDir(direct) if(!fulltile) ..() else ..(FULLTILE_WINDOW_DIR) /obj/structure/window/CanPass(atom/movable/mover, border_dir) if(istype(mover) && mover.checkpass(PASSGLASS)) return 1 if(dir == FULLTILE_WINDOW_DIR) return 0 //full tile window, you can't move into it! if(border_dir & dir) return !density if(istype(mover, /obj/structure/window)) var/obj/structure/window/W = mover if(!valid_window_location(loc, W.ini_dir)) return FALSE else if(istype(mover, /obj/structure/windoor_assembly)) var/obj/structure/windoor_assembly/W = mover if(!valid_window_location(loc, W.ini_dir)) return FALSE else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) return FALSE return 1 /obj/structure/window/proc/on_atom_exit(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER // COMSIG_ATOM_EXIT if(istype(leaving) && leaving.checkpass(PASSGLASS)) return if(leaving == src) return if(dir == FULLTILE_WINDOW_DIR) return if(direction & dir) leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT return /obj/structure/window/CanPathfindPass(to_dir, datum/can_pass_info/pass_info) if(!density) return TRUE if((dir == FULLTILE_WINDOW_DIR) || (dir & to_dir) || fulltile) return FALSE return TRUE /obj/structure/window/attack_tk(mob/user) user.changeNext_move(CLICK_CD_MELEE) user.visible_message("Something knocks on [src].") add_fingerprint(user) playsound(src, 'sound/effects/glassknock.ogg', 50, 1) /obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(!can_be_reached(user)) return 1 . = ..() /obj/structure/window/attack_hand(mob/user) if(!can_be_reached(user)) return if(user.a_intent == INTENT_HARM) user.changeNext_move(CLICK_CD_MELEE) playsound(src, 'sound/effects/glassbang.ogg', 100, 1) user.visible_message("[user] bangs against [src]!", \ "You bang against [src]!", \ "You hear a banging sound.") add_fingerprint(user) else user.changeNext_move(CLICK_CD_MELEE) playsound(src, 'sound/effects/glassknock.ogg', 50, 1) user.visible_message("[user] knocks on [src].", \ "You knock on [src].", \ "You hear a knocking sound.") add_fingerprint(user) /obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime if(!can_be_reached(user)) return return ..() /obj/structure/window/attack_animal(mob/living/simple_animal/M) if(!can_be_reached(M)) return . = ..() if(. && M.environment_smash >= env_smash_level) deconstruct(FALSE) M.visible_message("[M] smashes through [src]!", "You smash through [src].", "You hear glass breaking.") /obj/structure/window/handle_basic_attack(mob/living/basic/attacker, modifiers) if(!can_be_reached(attacker)) return . = ..() if(. && attacker.environment_smash >= env_smash_level) deconstruct(FALSE) attacker.visible_message("[attacker] smashes through [src]!", "You smash through [src].", "You hear glass breaking.") /obj/structure/window/item_interaction(mob/living/user, obj/item/I, list/modifiers) . = ITEM_INTERACT_COMPLETE if(!can_be_reached(user)) return add_fingerprint(user) if(istype(I, /obj/item/stack/rods) && user.a_intent == INTENT_HELP) for(var/obj/structure/grille/G in get_turf(src)) if(!G.broken) continue to_chat(user, "You start rebuilding the broken grille.") if(do_after(user, 4 SECONDS, FALSE, G)) G.repair(user, I) else if(istype(I, /obj/item/grab) && get_dist(src, user) < 2) var/obj/item/grab/G = I if(isliving(G.affecting)) var/mob/living/M = G.affecting var/state = G.state qdel(I) //gotta delete it here because if window breaks, it won't get deleted switch(state) if(1) M.visible_message("[user] slams [M] against \the [src]!") M.apply_damage(7) take_damage(10) if(2) M.visible_message("[user] bashes [M] against \the [src]!") if(prob(50)) M.Weaken(2 SECONDS) M.apply_damage(10) take_damage(25) if(3) M.visible_message("[user] crushes [M] against \the [src]!") M.Weaken(10 SECONDS) M.apply_damage(20) take_damage(50) if(4) visible_message("[user] smashes [M] against \the [src]!") M.Weaken(10 SECONDS) M.apply_damage(30) take_damage(75) else return ..() /obj/structure/window/crowbar_act(mob/user, obj/item/I) if(!reinf) return if(state != WINDOW_OUT_OF_FRAME && state != WINDOW_IN_FRAME) return if(!anchored) return if(flags & NODECONSTRUCT) return . = TRUE if(!can_be_reached(user)) return if(decon_speed) // Only show this if it actually takes time to_chat(user, "You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...") if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) return state = (state == WINDOW_OUT_OF_FRAME ? WINDOW_IN_FRAME : WINDOW_OUT_OF_FRAME) to_chat(user, "You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.") /obj/structure/window/screwdriver_act(mob/user, obj/item/I) if(flags & NODECONSTRUCT) return . = TRUE if(!can_be_reached(user)) return if(reinf) if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME) if(decon_speed) to_chat(user, "You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...") if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) return state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME) to_chat(user, "You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.") else if(state == WINDOW_OUT_OF_FRAME) if(decon_speed) to_chat(user, "You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...") if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) return anchored = !anchored recalculate_atmos_connectivity() update_nearby_icons() to_chat(user, "You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.") else //if we're not reinforced, we don't need to check or update state if(decon_speed) to_chat(user, "You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...") if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, PROC_REF(check_anchored), anchored))) return anchored = !anchored recalculate_atmos_connectivity() update_nearby_icons() to_chat(user, "You [anchored ? "fasten the window to":"unfasten the window from"] the floor.") /obj/structure/window/wrench_act(mob/user, obj/item/I) if(flags & NODECONSTRUCT) return if(anchored) return . = TRUE if(!can_be_reached(user)) return if(decon_speed) TOOL_ATTEMPT_DISMANTLE_MESSAGE if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) return var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount) G.add_fingerprint(user) playsound(src, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You successfully disassemble [src].") qdel(src) /obj/structure/window/welder_act(mob/user, obj/item/I) if(user.a_intent != INTENT_HELP) return . = TRUE if(!can_be_reached(user)) return if(obj_integrity >= max_integrity) to_chat(user, "[src] is already in good condition!") return if(!I.tool_use_check(user, 0)) return WELDER_ATTEMPT_REPAIR_MESSAGE if(I.use_tool(src, user, 40, volume = I.tool_volume)) obj_integrity = max_integrity update_nearby_icons() WELDER_REPAIR_SUCCESS_MESSAGE /obj/structure/window/proc/check_state(checked_state) if(state == checked_state) return TRUE /obj/structure/window/proc/check_anchored(checked_anchored) if(anchored == checked_anchored) return TRUE /obj/structure/window/proc/check_state_and_anchored(checked_state, checked_anchored) return check_state(checked_state) && check_anchored(checked_anchored) /obj/structure/window/mech_melee_attack(obj/mecha/M) if(!can_be_reached()) return ..() /obj/structure/window/proc/can_be_reached(mob/user) if(!fulltile) if(get_dir(user, src) & dir) for(var/obj/O in loc) if(!O.CanPass(user, get_dir(src, user))) return 0 return 1 /obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() if(.) //received damage update_nearby_icons() /obj/structure/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) if(damage_amount) playsound(src, hitsound, 75, TRUE) else playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) if(BURN) playsound(src, 'sound/items/Welder.ogg', 100, TRUE) /obj/structure/window/deconstruct(disassembled = TRUE) if(QDELETED(src)) return if(!disassembled) playsound(src, breaksound, 70, 1) if(!(flags & NODECONSTRUCT)) for(var/obj/item/shard/debris in spawnDebris(drop_location())) transfer_fingerprints_to(debris) // transfer fingerprints to shards only qdel(src) update_nearby_icons() /obj/structure/window/proc/spawnDebris(location) . = list() . += new shardtype(location) . += new glass_decal(location) if(reinf) . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) if(fulltile) . += new shardtype(location) /obj/structure/window/AltClick(mob/user) if(fulltile) // Can't rotate these. return ..() if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(anchored) to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") return FALSE var/target_dir = turn(dir, 270) if(!valid_window_location(loc, target_dir)) target_dir = turn(dir, 90) if(!valid_window_location(loc, target_dir)) to_chat(user, "There is no room to rotate [src].") return FALSE setDir(target_dir) ini_dir = dir add_fingerprint(user) /obj/structure/window/Destroy() density = FALSE recalculate_atmos_connectivity() update_nearby_icons() return ..() /obj/structure/window/Move() var/turf/T = loc . = ..() setDir(ini_dir) move_update_air(T) /obj/structure/window/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) . = ..() anchored = FALSE QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/window/CanAtmosPass(direction) if(!anchored || !density) return TRUE return !(FULLTILE_WINDOW_DIR == dir || (dir & direction)) /obj/structure/window/get_superconductivity(direction) if(dir == FULLTILE_WINDOW_DIR || dir & direction) return superconductivity return ..() //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() update_icon(UPDATE_ICON_STATE) if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/window/update_icon_state() . = ..() if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH(src) /obj/structure/window/update_overlays() . = ..() if(QDELETED(src)) return if(!fulltile) return var/ratio = obj_integrity / max_integrity ratio = CEILING(ratio * 4, 1) * 25 if(ratio <= 75) crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer + 0.01), appearance_flags = RESET_COLOR) . += crack_overlay if(!edge_overlay_file) return edge_overlay = mutable_appearance(edge_overlay_file, "[smoothing_junction]", layer + 0.1, appearance_flags = RESET_COLOR) . += edge_overlay /obj/structure/window/smooth_icon() ..() update_icon(UPDATE_OVERLAYS) /obj/structure/window/temperature_expose(exposed_temperature, exposed_volume) ..() if(exposed_temperature > (T0C + heat_resistance)) take_damage(round(exposed_volume / 100), BURN, 0, 0) /obj/structure/window/hit_by_thrown_mob(mob/living/C, datum/thrownthing/throwingdatum, damage, mob_hurt, self_hurt) var/shattered = FALSE if(damage * 2 >= obj_integrity && shardtype && !mob_hurt) shattered = TRUE var/obj/item/shard = new shardtype(loc) shard.embedded_ignore_throwspeed_threshold = TRUE shard.throw_impact(C) shard.embedded_ignore_throwspeed_threshold = FALSE damage *= (4/3) //Inverts damage loss from being a structure, since glass breaking on you hurts var/turf/T = get_turf(src) for(var/obj/structure/grille/G in T.contents) var/obj/structure/cable/SC = T.get_cable_node() if(SC) playsound(G, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) tesla_zap(G, 3, SC.get_queued_available_power() * 0.05, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_ALLOW_DUPLICATES) //Zap for 1/20 of the amount of power, because I am evil. SC.add_queued_power_demand(SC.get_queued_available_power() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. qdel(G) //We don't want the grille to block the way, we want rule of cool of throwing people into space! if(!self_hurt) take_damage(damage * 2, BRUTE) //Makes windows more vunerable to being thrown so they'll actually shatter in a reasonable ammount of time. self_hurt = TRUE ..() if(shattered) C.throw_at(locateUID(throwingdatum.initial_target_uid), throwingdatum.maxrange - 1, throwingdatum.speed - 1) //Annnnnnnd yeet them into space, but slower, now that everything is dealt with /obj/structure/window/GetExplosionBlock() return reinf && fulltile ? real_explosion_block : 0 /obj/structure/window/basic desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it. Lacks protection from radiation." /obj/structure/window/reinforced name = "reinforced window" desc = "It looks rather strong. Might take a few good hits to shatter it. Lacks protection from radiation." icon_state = "rwindow" reinf = TRUE heat_resistance = 1300 armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, RAD = 100, FIRE = 80, ACID = 100) max_integrity = 50 explosion_block = 1 glass_type = /obj/item/stack/sheet/rglass /obj/structure/window/reinforced/tinted name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." icon_state = "twindow" opacity = TRUE /obj/structure/window/reinforced/tinted/frosted name = "frosted window" desc = "It looks rather strong and frosted over. Looks like it might take a few less hits then a normal reinforced window." max_integrity = 30 /obj/structure/window/reinforced/polarized name = "electrochromic window" desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it." glass_amount = 2 var/id /obj/machinery/button/windowtint name = "window tint control" icon = 'icons/obj/power.dmi' icon_state = "light0" anchored = TRUE desc = "A remote control switch for polarized windows." /// The area where the button is located. var/area/button_area /// Windows in this range are controlled by this button. If it equals TINT_CONTROL_RANGE_AREA, the button controls only windows at button_area. var/range = TINT_CONTROL_RANGE_AREA /// If equals TINT_CONTROL_GROUP_NONE, only windows with 'null-like' id are controlled by this button. Otherwise, windows with corresponding or 'null-like' id are controlled by this button. var/id = TINT_CONTROL_GROUP_NONE /// The button toggle state. If range equals TINT_CONTROL_RANGE_AREA and id equals TINT_CONTROL_GROUP_NONE or is same with other button, it is shared between all such buttons in its area. var/active = FALSE /obj/machinery/button/windowtint/Initialize(mapload, w_dir = null) . = ..() switch(w_dir) if(NORTH) pixel_y = 25 if(SOUTH) pixel_y = -25 if(EAST) pixel_x = 25 if(WEST) pixel_x = -25 /obj/machinery/button/windowtint/New(turf/loc, direction) ..() button_area = get_area(src) /obj/machinery/button/windowtint/attack_hand(mob/user) if(..()) return TRUE toggle_tint() /obj/machinery/button/windowtint/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) /obj/machinery/button/windowtint/wrench_act(mob/user, obj/item/I) . = TRUE if(!I.tool_use_check(user, 0)) return user.visible_message("[user] starts unwrenching [src] from the wall...", "You are unwrenching [src] from the wall...", "You hear ratcheting.") if(!I.use_tool(src, user, 50, volume = I.tool_volume)) return WRENCH_UNANCHOR_WALL_MESSAGE new /obj/item/mounted/frame/light_switch/windowtint(get_turf(src)) qdel(src) /obj/machinery/button/windowtint/proc/toggle_tint() use_power(5) if(range == TINT_CONTROL_RANGE_AREA) button_area.window_tint = !button_area.window_tint for(var/obj/machinery/button/windowtint/button in button_area) if(button.range != TINT_CONTROL_RANGE_AREA || (button.id != id && button.id != TINT_CONTROL_GROUP_NONE)) continue button.active = button_area.window_tint button.update_icon() else active = !active update_icon() process_controlled_windows(range != TINT_CONTROL_RANGE_AREA ? range(src, range) : button_area) /obj/machinery/button/windowtint/proc/process_controlled_windows(control_area) for(var/obj/structure/window/reinforced/polarized/window in control_area) if(window.id == id || !window.id) window.toggle_polarization() for(var/obj/structure/window/full/reinforced/polarized/window in control_area) if(window.id == id || !window.id) window.toggle_polarization() for(var/obj/machinery/door/door in control_area) if(!door.polarized_glass) continue if(door.id == id || !door.id) door.toggle_polarization() /obj/machinery/button/windowtint/power_change() if(!..()) return if(active && (stat & NOPOWER)) toggle_tint() /obj/machinery/button/windowtint/update_icon_state() icon_state = "light[active]" /obj/structure/window/plasmabasic name = "plasma window" desc = "A window made out of a plasma-silicate alloy. It looks insanely tough to break and burn through. When hit with Gamma particles it will become charged and start emitting Beta particles" icon_state = "plasmawindow" glass_decal = /obj/effect/decal/cleanable/glass/plasma shardtype = /obj/item/shard/plasma glass_type = /obj/item/stack/sheet/plasmaglass heat_resistance = 32000 max_integrity = 150 explosion_block = 1 armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, RAD = 100, FIRE = 99, ACID = 100) rad_insulation_beta = RAD_NO_INSULATION rad_insulation_gamma = RAD_GAMMA_WINDOW superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT rad_conversion_amount = 2 /obj/structure/window/plasmareinforced name = "reinforced plasma window" desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof. When hit with Gamma particles it will become charged and start emitting Beta particles" icon_state = "plasmarwindow" glass_decal = /obj/effect/decal/cleanable/glass/plasma shardtype = /obj/item/shard/plasma glass_type = /obj/item/stack/sheet/plasmarglass reinf = TRUE heat_resistance = 32000 max_integrity = 500 explosion_block = 2 armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, RAD = 100, FIRE = 99, ACID = 100) rad_insulation_beta = RAD_NO_INSULATION rad_insulation_gamma = RAD_GAMMA_WINDOW damage_deflection = 21 env_smash_level = ENVIRONMENT_SMASH_WALLS // these windows are a fair bit tougher superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT rad_conversion_amount = 1.5 /obj/structure/window/plastitanium name = "plastitanium window" desc = "An evil looking window of plasma and titanium. When hit with Gamma particles it will become charged and start emitting Beta particles" icon_state = "plastitaniumwindow" glass_decal = /obj/effect/decal/cleanable/glass/plastitanium shardtype = /obj/item/shard/plasma glass_type = /obj/item/stack/sheet/plastitaniumglass reinf = TRUE heat_resistance = 32000 max_integrity = 600 explosion_block = 2 armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, RAD = 100, FIRE = 99, ACID = 100) rad_insulation_beta = RAD_NO_INSULATION rad_insulation_gamma = RAD_GAMMA_WINDOW damage_deflection = 21 env_smash_level = ENVIRONMENT_SMASH_WALLS // these windows are a fair bit tougher superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT rad_conversion_amount = 2.25 /obj/structure/window/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return /obj/structure/window/full glass_amount = 2 dir = FULLTILE_WINDOW_DIR level = 3 fulltile = TRUE flags = PREVENT_CLICK_UNDER smoothing_flags = SMOOTH_BITMASK smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_REGULAR_WALLS, SMOOTH_GROUP_REINFORCED_WALLS) //they are not walls but this lets walls smooth with them canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_WALLS) /obj/structure/window/full/basic desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it. Has very light protection from radiation" icon = 'icons/obj/smooth_structures/windows/window.dmi' icon_state = "window-0" base_icon_state = "window" max_integrity = 50 edge_overlay_file = 'icons/obj/smooth_structures/windows/window_edges.dmi' /obj/structure/window/full/plasmabasic name = "plasma window" desc = "A plasma-glass alloy window. It looks insanely tough to break. It appears it's also insanely tough to burn through. When hit with Gamma particles it will become charged and start emitting Beta particles" icon = 'icons/obj/smooth_structures/windows/plasma_window.dmi' icon_state = "plasma_window-0" base_icon_state = "plasma_window" glass_decal = /obj/effect/decal/cleanable/glass/plasma shardtype = /obj/item/shard/plasma glass_type = /obj/item/stack/sheet/plasmaglass heat_resistance = 32000 max_integrity = 300 explosion_block = 1 armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, RAD = 100, FIRE = 99, ACID = 100) edge_overlay_file = 'icons/obj/smooth_structures/windows/window_edges.dmi' env_smash_level = ENVIRONMENT_SMASH_WALLS // these windows are a fair bit tougher superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT rad_insulation_beta = RAD_NO_INSULATION rad_insulation_gamma = RAD_GAMMA_FULL_WINDOW rad_conversion_amount = 2.6 /obj/structure/window/full/plasmareinforced name = "reinforced plasma window" desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof. When hit with Gamma particles it will become charged and start emitting Beta particles" icon = 'icons/obj/smooth_structures/windows/rplasma_window.dmi' icon_state = "rplasma_window-0" base_icon_state = "rplasma_window" glass_decal = /obj/effect/decal/cleanable/glass/plasma shardtype = /obj/item/shard/plasma glass_type = /obj/item/stack/sheet/plasmarglass reinf = TRUE heat_resistance = 32000 max_integrity = 1000 explosion_block = 2 armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, RAD = 100, FIRE = 99, ACID = 100) edge_overlay_file = 'icons/obj/smooth_structures/windows/reinforced_window_edges.dmi' env_smash_level = ENVIRONMENT_SMASH_RWALLS // these ones are insanely tough superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT rad_insulation_beta = RAD_NO_INSULATION rad_insulation_gamma = RAD_GAMMA_FULL_WINDOW rad_conversion_amount = 2.2 /obj/structure/window/full/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) return /obj/structure/window/full/reinforced name = "reinforced window" desc = "It looks rather strong. Might take a few good hits to shatter it. Offers superior protection from radiation" icon = 'icons/obj/smooth_structures/windows/reinforced_window.dmi' icon_state = "reinforced_window-0" base_icon_state = "reinforced_window" max_integrity = 100 reinf = TRUE heat_resistance = 1600 armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, RAD = 100, FIRE = 80, ACID = 100) rad_insulation_beta = RAD_BETA_BLOCKER explosion_block = 1 glass_type = /obj/item/stack/sheet/rglass edge_overlay_file = 'icons/obj/smooth_structures/windows/reinforced_window_edges.dmi' /obj/structure/window/full/reinforced/polarized name = "electrochromic window" desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it." glass_amount = 4 var/id /obj/structure/window/full/reinforced/tinted name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." icon = 'icons/obj/smooth_structures/windows/tinted_window.dmi' icon_state = "tinted_window-0" base_icon_state = "tinted_window" opacity = TRUE /obj/structure/window/full/shuttle name = "shuttle window" desc = "A reinforced, air-locked pod window." icon = 'icons/obj/smooth_structures/windows/shuttle_window.dmi' icon_state = "shuttle_window-0" base_icon_state = "shuttle_window" max_integrity = 200 reinf = TRUE heat_resistance = 1600 explosion_block = 3 armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, RAD = 100, FIRE = 80, ACID = 100) smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE, SMOOTH_GROUP_TITANIUM_WALLS) canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE, SMOOTH_GROUP_TITANIUM_WALLS) glass_type = /obj/item/stack/sheet/titaniumglass env_smash_level = ENVIRONMENT_SMASH_RWALLS // shuttle windows should probably be a bit stronger, too // Mostly for the mining shuttle. superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT /obj/structure/window/full/shuttle/narsie_act() color = "#3C3434" /obj/structure/window/full/shuttle/tinted opacity = TRUE /obj/structure/window/full/plastitanium name = "plastitanium window" desc = "An evil looking window of plasma and titanium. When hit with Gamma particles it will become charged and start emitting Beta particles" icon = 'icons/obj/smooth_structures/windows/plastitanium_window.dmi' icon_state = "plastitanium_window-0" base_icon_state = "plastitanium_window" max_integrity = 1200 reinf = TRUE heat_resistance = 32000 armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, RAD = 100, FIRE = 99, ACID = 100) explosion_block = 3 glass_type = /obj/item/stack/sheet/plastitaniumglass smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_PLASTITANIUM_WALLS) canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS) env_smash_level = ENVIRONMENT_SMASH_RWALLS //used in shuttles, same reason as above superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT rad_insulation_beta = RAD_NO_INSULATION rad_insulation_gamma = RAD_GAMMA_FULL_WINDOW rad_conversion_amount = 3 /obj/structure/window/full/plastitanium/rad_protect name = "leaded plastitanium window" desc = "An evil looking window of plasma and titanium. It has been infused with lead and offers exceptional radiation resistance." flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2 rad_insulation_beta = RAD_BETA_BLOCKER rad_insulation_gamma = RAD_VERY_EXTREME_INSULATION rad_conversion_amount = 0 /obj/structure/window/reinforced/clockwork name = "brass window" desc = "A paper-thin pane of translucent yet reinforced brass." icon = 'icons/obj/smooth_structures/windows/clockwork_window.dmi' icon_state = "clockwork_window_single" resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 80 armor = list(MELEE = 60, BULLET = 25, LASER = 0, ENERGY = 0, BOMB = 25, RAD = 100, FIRE = 80, ACID = 100) explosion_block = 2 //fancy AND hard to destroy. the most useful combination. glass_type = /obj/item/stack/tile/brass reinf = FALSE var/made_glow = FALSE /obj/structure/window/reinforced/clockwork/spawnDebris(location) . = list() . += new /obj/item/stack/tile/brass(location, (fulltile ? 2 : 1)) /obj/structure/window/reinforced/clockwork/setDir(direct) if(!made_glow) if(fulltile) new /obj/effect/temp_visual/ratvar/window(get_turf(src)) else var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src)) E.setDir(direct) made_glow = TRUE ..() /obj/structure/window/reinforced/clockwork/narsie_act() take_damage(rand(25, 75), BRUTE) if(src) var/previouscolor = color color = "#960000" animate(src, color = previouscolor, time = 8) /obj/structure/window/reinforced/clockwork/fulltile icon_state = "clockwork_window-0" base_icon_state = "clockwork_window" smoothing_flags = SMOOTH_BITMASK smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_WINDOW_FULLTILE_BRASS) canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_BRASS) fulltile = TRUE flags = PREVENT_CLICK_UNDER dir = FULLTILE_WINDOW_DIR max_integrity = 120 level = 3 glass_amount = 2