diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 3179e7c2d1..2d40396d91 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -415,6 +415,8 @@ desc = "It's an extra resilient airlock intended for spacefaring vessels." icon = 'icons/obj/doors/shuttledoors.dmi' explosion_resistance = 20 + opacity = 0 + glass = 1 assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft // Airlock opens from top-bottom instead of left-right. diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm new file mode 100644 index 0000000000..feb60ae3a3 --- /dev/null +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -0,0 +1,201 @@ +//Pilot + +/obj/item/clothing/head/pilot + name = "pilot helmet" + desc = "Standard pilot gear. Protects the head from impacts." + icon_state = "pilot_helmet1" + item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi') + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi' + ) + flags = THICKMATERIAL + armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0) + flags_inv = HIDEEARS + cold_protection = HEAD + min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = HEAD + max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE + w_class = ITEMSIZE_NORMAL + + var/obj/machinery/computer/shuttle_control/web/shuttle_comp + var/obj/screen/pilot_hud + var/list/images + var/list/raw_images + var/last_status + +/obj/item/clothing/head/pilot/initialize() + . = ..() + + images = list() + raw_images = list() + + pilot_hud = new(src) + pilot_hud.screen_loc = "1,1" + pilot_hud.icon = 'icons/obj/piloting_overlay.dmi' + pilot_hud.icon_state = "dimmer" + pilot_hud.layer = SCREEN_LAYER + pilot_hud.plane = PLANE_FULLSCREEN + pilot_hud.mouse_opacity = 0 + pilot_hud.alpha = 0 + + var/image/I + I = image(pilot_hud.icon,pilot_hud,"top_bar",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 145 + images["top_bar"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"top_dots",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 200 + images["topdots"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"words_discon",layer=SCREEN_LAYER+1) //words_standby, words_flying, words_spool, words_discon + I.appearance_flags = RESET_ALPHA + I.alpha = 200 + images["top_words"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 200 + images["charging"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"left_bar",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 0 + images["left_bar"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"right_bar",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 0 + images["right_bar"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"flyboxes",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 0 + images["flyboxes"] = I + raw_images += I + + I = image(pilot_hud.icon,pilot_hud,"horizon",layer=SCREEN_LAYER+1) + I.appearance_flags = RESET_ALPHA + I.alpha = 0 + images["horizon"] = I + raw_images += I + +/obj/item/clothing/head/pilot/proc/update_hud(var/status) + if(last_status == status) + return + + last_status = status + + if(status == SHUTTLE_INTRANSIT) + var/image/I = images["top_words"] + I.icon_state = "words_flying" + I = images["left_bar"] + I.alpha = 200 + I = images["right_bar"] + I.alpha = 200 + I = images["flyboxes"] + I.alpha = 200 + I = images["horizon"] + I.alpha = 200 + I = images["charging"] + I.icon_state = "" + animate(pilot_hud,alpha=255,time=3 SECONDS) + + else if(status == SHUTTLE_IDLE) + var/image/I = images["top_words"] + I.icon_state = "words_standby" + I = images["left_bar"] + I.alpha = 0 + I = images["right_bar"] + I.alpha = 0 + I = images["flyboxes"] + I.alpha = 0 + I = images["horizon"] + I.alpha = 0 + I = images["charging"] + I.icon_state = "" + animate(pilot_hud,alpha=0,time=3 SECONDS) + + else if(status == SHUTTLE_WARMUP) + var/image/I = images["top_words"] + I.icon_state = "words_spool" + I = images["left_bar"] + I.alpha = 200 + I = images["right_bar"] + I.alpha = 200 + I = images["flyboxes"] + I.alpha = 0 + I = images["horizon"] + I.alpha = 0 + I = images["charging"] + I.icon_state = "charging" + animate(pilot_hud,alpha=255,time=3 SECONDS) + + else if(status == "discon") + var/image/I = images["top_words"] + I.icon_state = "words_discon" + I = images["left_bar"] + I.alpha = 0 + I = images["right_bar"] + I.alpha = 0 + I = images["flyboxes"] + I.alpha = 0 + I = images["horizon"] + I.alpha = 0 + I = images["charging"] + I.icon_state = "" + animate(pilot_hud,alpha=0,time=3 SECONDS) + +/obj/item/clothing/head/pilot/verb/hud_colors() + set name = "Alter HUD color" + set desc = "Change the color of the piloting HUD." + set category = "Object" + set src in usr + + var/newcolor = input(usr,"Pick a color!","HUD Color") as null|color + if(newcolor) + for(var/img in list("top_words","left_bar","right_bar","flyboxes")) + var/image/I = images[img] + I.color = newcolor + +/obj/item/clothing/head/pilot/Destroy() + for(var/img in raw_images) + var/image/I = img + I.loc = null + shuttle_comp = null + qdel(pilot_hud) + return ..() + +/obj/item/clothing/head/pilot/equipped(var/mob/user,var/slot) + . = ..() + if(slot == slot_head && user.client) + user.client.screen |= pilot_hud + user.client.images |= raw_images + +/obj/item/clothing/head/pilot/dropped(var/mob/user) + . = ..() + if(user.client) + user.client.screen -= pilot_hud + user.client.images -= raw_images + +/obj/item/clothing/head/pilot/alt + name = "pilot helmet" + desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor" + icon_state = "pilot_helmet2" + action_button_name = "Toggle Visor" + +/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob) + if(src.icon_state == initial(icon_state)) + src.icon_state = "[icon_state]up" + user << "You raise the visor on the pilot helmet." + else + src.icon_state = initial(icon_state) + user << "You lower the visor on the pilot helmet." + update_clothing_icon() //so our mob-overlays update \ No newline at end of file diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 618ec3ff05..ed90e66c6a 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -90,7 +90,7 @@ make_sounds(origin, HYPERSPACE_END) return //someone cancelled the launch - on_shuttle_departure() + on_shuttle_departure(origin) moving_status = SHUTTLE_INTRANSIT //shouldn't matter but just to be safe move(origin, destination) @@ -127,10 +127,10 @@ depart_time = world.time - on_shuttle_departure(departing) - moving_status = SHUTTLE_INTRANSIT + on_shuttle_departure(departing) + move(departing, interim, direction) interim.shuttle_arrived() diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index a8ca493470..90e5141535 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -16,6 +16,7 @@ var/autopilot_first_delay = null // If your want your shuttle to stay for a different amount of time for the first time, set this. var/can_rename = TRUE // Lets the pilot rename the shuttle. Only available once. category = /datum/shuttle/web_shuttle + var/list/obj/item/clothing/head/pilot/helmets /datum/shuttle/web_shuttle/New() current_area = locate(current_area) @@ -27,10 +28,12 @@ autopilot_delay = autopilot_first_delay if(!visible_name) visible_name = name + helmets = list() ..() /datum/shuttle/web_shuttle/Destroy() qdel(web_master) + helmets.Cut() return ..() @@ -42,16 +45,30 @@ ..() last_move = world.time +/datum/shuttle/web_shuttle/short_jump() + . = ..() + update_helmets() + +/datum/shuttle/web_shuttle/long_jump() + . = ..() + update_helmets() + /datum/shuttle/web_shuttle/on_shuttle_departure() + . = ..() web_master.on_shuttle_departure() + update_helmets() /datum/shuttle/web_shuttle/on_shuttle_arrival() + . = ..() web_master.on_shuttle_arrival() + update_helmets() /datum/shuttle/web_shuttle/proc/build_destinations() return /datum/shuttle/web_shuttle/process() + update_helmets() + if(moving_status == SHUTTLE_IDLE) if(web_master.autopath) // We're currently flying a path. autopilot_say("Continuing route.") @@ -92,6 +109,20 @@ autopilot_say("Taking off.") web_master.process_autopath() +/datum/shuttle/web_shuttle/proc/update_helmets() + for(var/helm in helmets) + if(!helm) + helmets -= helm + continue + var/obj/item/clothing/head/pilot/H = helm + if(!H.shuttle_comp || get_area(H.shuttle_comp) != get_area(H)) + H.shuttle_comp = null + H.audible_message("\The [H] pings as it loses it's connection with the ship.") + H.update_hud("discon") + helmets -= H + else + H.update_hud(moving_status) + /datum/shuttle/web_shuttle/proc/adjust_autopilot(on) if(on) if(autopilot) @@ -154,6 +185,19 @@ for(var/lost in find_sensors) log_debug("[my_area] shuttle computer couldn't find [lost] sensor!") +/obj/machinery/computer/shuttle_control/web/attackby(obj/I, mob/user) + var/datum/shuttle/web_shuttle/shuttle = shuttle_controller.shuttles[shuttle_tag] + if(shuttle && istype(I,/obj/item/clothing/head/pilot)) + var/obj/item/clothing/head/pilot/H = I + H.shuttle_comp = src + shuttle.helmets |= I + to_chat(user,"You register the helmet with the ship's console.") + shuttle.update_helmets() + return + + return ..() + + // Fairly copypasta-y. /obj/machinery/computer/shuttle_control/web/attack_hand(mob/user) if(..(user)) diff --git a/maps/southern_cross/icons/mob/sc_head.dmi b/icons/mob/pilot_helmet.dmi similarity index 100% rename from maps/southern_cross/icons/mob/sc_head.dmi rename to icons/mob/pilot_helmet.dmi diff --git a/maps/southern_cross/icons/mob/species/teshari/sc_head.dmi b/icons/mob/species/seromi/pilot_helmet.dmi similarity index 100% rename from maps/southern_cross/icons/mob/species/teshari/sc_head.dmi rename to icons/mob/species/seromi/pilot_helmet.dmi diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 70594a801a..a0c2983ea7 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/piloting_overlay.dmi b/icons/obj/piloting_overlay.dmi new file mode 100644 index 0000000000..56074a5004 Binary files /dev/null and b/icons/obj/piloting_overlay.dmi differ diff --git a/maps/southern_cross/items/clothing/sc_head.dm b/maps/southern_cross/items/clothing/sc_head.dm deleted file mode 100644 index bcc1c98965..0000000000 --- a/maps/southern_cross/items/clothing/sc_head.dm +++ /dev/null @@ -1,37 +0,0 @@ -//Pilot - -/obj/item/clothing/head/pilot - name = "pilot helmet" - desc = "Standard pilot gear. Protects the head from impacts." - icon_state = "pilot_helmet1" - item_icons = list(slot_head_str = 'maps/southern_cross/icons/mob/sc_head.dmi') - icon = 'maps/southern_cross/icons/obj/sc_hats.dmi' - sprite_sheets = list( - "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi' - ) - flags = THICKMATERIAL - armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0) - flags_inv = HIDEEARS - cold_protection = HEAD - min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE - heat_protection = HEAD - max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE - w_class = ITEMSIZE_NORMAL - -/obj/item/clothing/head/pilot/alt - name = "pilot helmet" - desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor" - icon_state = "pilot_helmet2" - sprite_sheets = list( - "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi' - ) - action_button_name = "Toggle Visor" - -/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob) - if(src.icon_state == initial(icon_state)) - src.icon_state = "[icon_state]up" - user << "You raise the visor on the pilot helmet." - else - src.icon_state = initial(icon_state) - user << "You lower the visor on the pilot helmet." - update_clothing_icon() //so our mob-overlays update \ No newline at end of file diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm index 7ddc08f49d..29c4f295f2 100644 --- a/maps/southern_cross/southern_cross.dm +++ b/maps/southern_cross/southern_cross.dm @@ -25,7 +25,6 @@ #include "items/headset_sc.dm" #include "items/clothing/sc_suit.dm" #include "items/clothing/sc_under.dm" - #include "items/clothing/sc_head.dm" #include "items/clothing/sc_accessory.dm" #include "job/outfits.dm" #include "structures/closets/engineering.dm" diff --git a/polaris.dme b/polaris.dme index 189c3665ec..ec2d3c53df 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1358,6 +1358,7 @@ #include "code\modules\clothing\head\jobs.dm" #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\pilot_helmet.dm" #include "code\modules\clothing\head\soft_caps.dm" #include "code\modules\clothing\head\solgov.dm" #include "code\modules\clothing\masks\boxing.dm"