diff --git a/_maps/map_files/templates/shelter_1.dmm b/_maps/map_files/templates/shelter_1.dmm index b260f0558a4..76276379e5b 100644 --- a/_maps/map_files/templates/shelter_1.dmm +++ b/_maps/map_files/templates/shelter_1.dmm @@ -1,18 +1,18 @@ -"a" = (/turf/simulated/wall/survival,/area/survivalpod) -"b" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/survival,/area/survivalpod) +"a" = (/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) +"b" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "c" = (/obj/structure/fans,/turf/simulated/floor/pod,/area/survivalpod) "d" = (/obj/machinery/smartfridge/survival_pod/loaded,/turf/simulated/floor/pod,/area/survivalpod) "e" = (/obj/item/device/gps/computer,/turf/simulated/floor/pod,/area/survivalpod) -"f" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/survival,/area/survivalpod) +"f" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "g" = (/obj/machinery/sleeper/survival_pod,/turf/simulated/floor/pod,/area/survivalpod) "h" = (/turf/simulated/floor/pod,/area/survivalpod) "i" = (/obj/structure/stool/bed/pod,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/pod,/area/survivalpod) -"j" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/survival,/area/survivalpod) +"j" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "k" = (/obj/structure/table/survival_pod,/turf/simulated/floor/pod,/area/survivalpod) "l" = (/obj/structure/tubes,/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/pod,/area/survivalpod) -"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/survival,/area/survivalpod) +"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "n" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod/glass,/turf/simulated/floor/pod,/area/survivalpod) -"o" = (/obj/structure/sign/mining,/turf/simulated/wall/survival,/area/survivalpod) +"o" = (/obj/structure/sign/mining,/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) (1,1,1) = {" aabaa diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm index b61f4f62a44..99fba63fcc4 100644 --- a/_maps/map_files/templates/shelter_2.dmm +++ b/_maps/map_files/templates/shelter_2.dmm @@ -1,16 +1,16 @@ -"a" = (/turf/simulated/wall/survival,/area/survivalpod) -"b" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/survival,/area/survivalpod) +"a" = (/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) +"b" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "c" = (/obj/machinery/smartfridge/survival_pod/loaded,/turf/simulated/floor/pod,/area/survivalpod) "d" = (/turf/simulated/floor/pod,/area/survivalpod) "e" = (/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod) "f" = (/obj/machinery/light,/turf/simulated/floor/carpet/black,/area/survivalpod) -"g" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/survival,/area/survivalpod) +"g" = (/obj/structure/sign/mining/survival{tag = "icon-survival (NORTH)"; icon_state = "survival"; dir = 1},/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "h" = (/obj/structure/fans,/turf/simulated/floor/pod,/area/survivalpod) "i" = (/obj/machinery/sleeper/survival_pod,/turf/simulated/floor/pod,/area/survivalpod) "j" = (/obj/structure/table/survival_pod,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/brute{pixel_x = 4; pixel_y = -2},/turf/simulated/floor/pod,/area/survivalpod) "k" = (/obj/structure/table/wood/fancy/black{pixel_y = -9},/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/machinery/microwave,/turf/simulated/floor/carpet/black,/area/survivalpod) "l" = (/obj/structure/sink/kitchen{dir = 4; pixel_x = -11},/turf/simulated/floor/carpet/black,/area/survivalpod) -"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/survival,/area/survivalpod) +"m" = (/obj/structure/sign/mining/survival,/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "n" = (/obj/structure/curtain/black,/obj/machinery/shower{pixel_y = 20},/turf/simulated/floor/pod{pixel_y = 0},/area/survivalpod) "o" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/machinery/door/window/survival_pod{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod) "p" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/simulated/floor/carpet/black,/area/survivalpod) @@ -21,13 +21,13 @@ "u" = (/obj/structure/tubes,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/pod,/area/survivalpod) "v" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/displaycase{desc = "A display case containing an expensive forgery, probably."; locked = 1; pixel_y = -4; req_access_txt = "48"; start_showpiece_type = /obj/item/fakeartefact},/turf/simulated/floor/carpet/black{dir = 1},/area/survivalpod) "w" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod/glass,/turf/simulated/floor/pod,/area/survivalpod) -"x" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/survival,/area/survivalpod) +"x" = (/obj/structure/sign/mining/survival{tag = "icon-survival (EAST)"; icon_state = "survival"; dir = 4},/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) "y" = (/obj/structure/toilet/secret{pixel_y = 12},/turf/simulated/floor/pod,/area/survivalpod) "z" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/item/cardboard_cutout{desc = "A cardboard cutout of a xenomorph maid."; icon_state = "cutout_lusty"; name = "lusty xenomorph maid"}, /turf/simulated/floor/carpet/black,/area/survivalpod) "A" = (/obj/structure/table/wood/fancy/black,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,/turf/simulated/floor/carpet/black,/area/survivalpod) "B" = (/obj/structure/table/wood/fancy/black,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass{pixel_x = -4; pixel_y = 1},/obj/effect/spawner/lootdrop/three_course_meal,/turf/simulated/floor/carpet/black,/area/survivalpod) "C" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/black,/area/survivalpod) -"D" = (/obj/structure/sign/mining,/turf/simulated/wall/survival,/area/survivalpod) +"D" = (/obj/structure/sign/mining,/turf/simulated/wall/mineral/titanium/survival,/area/survivalpod) (1,1,1) = {" agagaga diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index a7f5ee69d39..a2414d9cac3 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -318,7 +318,7 @@ to_chat(src, "The pressure sends you flying!") if(ishuman(src)) var/mob/living/carbon/human/H = src - H.Weaken(min(pressure_difference / 10, 10)) + H.Weaken(min(pressure_difference / 50, 2)) spawn() throw_at(general_direction, pressure_difference / 10, pressure_difference / 200, null, 0, 0, null) last_forced_movement = air_master.current_cycle diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index eda6c6d2699..fc7fc98e25f 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -26,3 +26,22 @@ //plastic flaps construction states #define PLASTIC_FLAPS_NORMAL 0 #define PLASTIC_FLAPS_DETACHED 1 + +//Material defines, for determining how much of a given material an item contains +#define MAT_METAL "$metal" +#define MAT_GLASS "$glass" +#define MAT_SILVER "$silver" +#define MAT_GOLD "$gold" +#define MAT_DIAMOND "$diamond" +#define MAT_URANIUM "$uranium" +#define MAT_PLASMA "$plasma" +#define MAT_BANANIUM "$bananium" +#define MAT_TRANQUILLITE "$tranquillite" +#define MAT_TITANIUM "$titanium" +#define MAT_BIOMASS "$biomass" +//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc +#define MINERAL_MATERIAL_AMOUNT 2000 +//The maximum size of a stack object. +#define MAX_STACK_SIZE 50 +//maximum amount of cable in a coil +#define MAXCOIL 30 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index b46427979fb..146d3bf27f0 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -15,8 +15,6 @@ #define FILE_DRM 16 // Some files want to not be copied/moved. This is them complaining that you tried. #define NETWORK_FAILURE 32 -#define MINERAL_MATERIAL_AMOUNT 2000 //The amount of materials you get from a sheet of mineral like iron/diamond/glass etc - #define IMPRINTER 1 //For circuits. Uses glass/chemicals. #define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals #define AUTOLATHE 4 //Uses glass/metal only. diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 867421d428c..f6cb33eb527 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -162,20 +162,6 @@ #define MIN_SUPPLIED_LAW_NUMBER 15 #define MAX_SUPPLIED_LAW_NUMBER 50 -//Material defines -#define MAT_METAL "$metal" -#define MAT_GLASS "$glass" -#define MAT_SILVER "$silver" -#define MAT_GOLD "$gold" -#define MAT_DIAMOND "$diamond" -#define MAT_URANIUM "$uranium" -#define MAT_PLASMA "$plasma" -#define MAT_BANANIUM "$bananium" -#define MAT_TRANQUILLITE "$tranquillite" -#define MAT_BIOMASS "$biomass" - -#define MAX_STACK_SIZE 50 - //check_target_facings() return defines #define FACING_FAILED 0 #define FACING_SAME_DIR 1 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 712c57b3b3e..7e131dcaa21 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -2,14 +2,15 @@ #define CHANNEL_LOBBYMUSIC 1024 #define CHANNEL_ADMIN 1023 #define CHANNEL_VOX 1022 -#define CHANNEL_HEARTBEAT 1021 //sound channel for heartbeats -#define CHANNEL_BUZZ 1020 -#define CHANNEL_AMBIENCE 1019 +#define CHANNEL_JUKEBOX 1021 +#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats +#define CHANNEL_BUZZ 1019 +#define CHANNEL_AMBIENCE 1018 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1018 +#define CHANNEL_HIGHEST_AVAILABLE 1017 #define SOUND_MINIMUM_PRESSURE 10 diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index aa73b686b9d..c0c22872a32 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -116,3 +116,8 @@ var/gaussian_next if(num < 0) return 0 return sqrt(num) + +/proc/round_down(num) + if(round(num) != num) + return round(num--) + else return num \ No newline at end of file diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 4f9c08a9dc5..ef2f8578783 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -505,6 +505,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") + text = replacetext(text, "\[time\]", "[gameTimestamp()]") // TO DO if(P) text = "[text]" else diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 4b71a2c7162..e4d834a35a0 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -69,4 +69,100 @@ proc/isDay(var/month, var/day) /proc/seconds_to_time(var/seconds as num) var/numSeconds = seconds % 60 var/numMinutes = (seconds - numSeconds) / 60 - return "[numMinutes] [numMinutes > 1 ? "minutes" : "minute"] and [numSeconds] seconds." \ No newline at end of file + return "[numMinutes] [numMinutes > 1 ? "minutes" : "minute"] and [numSeconds] seconds." + +//Takes a value of time in deciseconds. +//Returns a text value of that number in hours, minutes, or seconds. +/proc/DisplayTimeText(time_value) + var/second = time_value * 0.1 + var/second_adjusted = null + var/second_rounded = FALSE + var/minute = null + var/hour = null + var/day = null + + if(!second) + return "0 seconds" + if(second >= 60) + minute = round_down(second / 60) + second = round(second - (minute * 60), 0.1) + second_rounded = TRUE + if(second) //check if we still have seconds remaining to format, or if everything went into minute. + second_adjusted = round(second) //used to prevent '1 seconds' being shown + if(day || hour || minute) + if(second_adjusted == 1 && second >= 1) + second = " and 1 second" + else if(second > 1) + second = " and [second_adjusted] seconds" + else //shows a fraction if seconds is < 1 + if(second_rounded) //no sense rounding again if it's already done + second = " and [second] seconds" + else + second = " and [round(second, 0.1)] seconds" + else + if(second_adjusted == 1 && second >= 1) + second = "1 second" + else if(second > 1) + second = "[second_adjusted] seconds" + else + if(second_rounded) + second = "[second] seconds" + else + second = "[round(second, 0.1)] seconds" + else + second = null + + if(!minute) + return "[second]" + if(minute >= 60) + hour = round_down(minute / 60,1) + minute = (minute - (hour * 60)) + if(minute) //alot simpler from here since you don't have to worry about fractions + if(minute != 1) + if((day || hour) && second) + minute = ", [minute] minutes" + else if((day || hour) && !second) + minute = " and [minute] minutes" + else + minute = "[minute] minutes" + else + if((day || hour) && second) + minute = ", 1 minute" + else if((day || hour) && !second) + minute = " and 1 minute" + else + minute = "1 minute" + else + minute = null + + if(!hour) + return "[minute][second]" + if(hour >= 24) + day = round_down(hour / 24,1) + hour = (hour - (day * 24)) + if(hour) + if(hour != 1) + if(day && (minute || second)) + hour = ", [hour] hours" + else if(day && (!minute || !second)) + hour = " and [hour] hours" + else + hour = "[hour] hours" + else + if(day && (minute || second)) + hour = ", 1 hour" + else if(day && (!minute || !second)) + hour = " and 1 hour" + else + hour = "1 hour" + else + hour = null + + if(!day) + return "[hour][minute][second]" + if(day > 1) + day = "[day] days" + else + day = "1 day" + + return "[day][hour][minute][second]" \ No newline at end of file diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index 4636495489f..310593d0d6b 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -1,4 +1,3 @@ -#define MAXCOIL 30 /datum/cargoprofile var/name = "All Items" var/id = "all" // unique ID for the UI @@ -787,4 +786,3 @@ var/punches = punch(M,remaining / PUNCH_WORK) if(punches>1)master.sleep++ return punches * PUNCH_WORK -#undef MAXCOIL diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm index 2ae6da75863..8e31e8ae033 100644 --- a/code/datums/material_container.dm +++ b/code/datums/material_container.dm @@ -40,6 +40,8 @@ materials[MAT_BANANIUM] = new /datum/material/bananium() if(mat_list[MAT_TRANQUILLITE]) materials[MAT_TRANQUILLITE] = new /datum/material/tranquillite() + if(mat_list[MAT_TITANIUM]) + materials[MAT_TITANIUM] = new /datum/material/titanium() /datum/material_container/Destroy() QDEL_LIST_ASSOC_VAL(materials) @@ -276,6 +278,13 @@ material_type = MAT_TRANQUILLITE sheet_type = /obj/item/stack/sheet/mineral/tranquillite +/datum/material/titanium + +/datum/material/titanium/New() + ..() + material_type = MAT_TITANIUM + sheet_type = /obj/item/stack/sheet/mineral/titanium + /datum/material/biomass /datum/material/biomass/New() diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm new file mode 100644 index 00000000000..ea94aa6407b --- /dev/null +++ b/code/datums/mutable_appearance.dm @@ -0,0 +1,13 @@ +// Mutable appearances are an inbuilt byond datastructure. Read the documentation on them by hitting F1 in DM. +// Basically use them instead of images for overlays/underlays and when changing an object's appearance if you're doing so with any regularity. +// Unless you need the overlay/underlay to have a different direction than the base object. Then you have to use an image due to a bug. + +// Mutable appearances are children of images, just so you know. + +// Helper similar to image() +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER) + var/mutable_appearance/MA = new() + MA.icon = icon + MA.icon_state = icon_state + MA.layer = layer + return MA \ No newline at end of file diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 01d4e0ed3a7..ea796011e96 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -264,7 +264,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(!location) return 0 - if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph + if(istype(location, /turf/simulated/shuttle/floor4) || istype(location, /turf/simulated/floor/mineral/plastitanium/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph return 0 if(location.onCentcom() || location.onSyndieBase()) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm new file mode 100644 index 00000000000..a7ddc648df6 --- /dev/null +++ b/code/game/machinery/dance_machine.dm @@ -0,0 +1,479 @@ +/obj/machinery/disco + name = "radiant dance machine mark IV" + desc = "The first three prototypes were discontinued after mass casualty incidents." + icon = 'icons/obj/lighting.dmi' + icon_state = "disco0" + anchored = FALSE + atom_say_verb = "states" + density = TRUE + var/active = FALSE + var/list/rangers = list() + var/charge = 35 + var/stop = 0 + var/list/spotlights = list() + var/list/sparkles = list() + var/static/list/songs = list( + new /datum/track("Engineering's Basic Beat", 'sound/misc/disco.ogg', 600, 5), + new /datum/track("Engineering's Domination Dance", 'sound/misc/e1m1.ogg', 950, 6), + new /datum/track("Engineering's Superiority Shimmy", 'sound/misc/paradox.ogg', 2400, 4), + new /datum/track("Engineering's Ultimate High-Energy Hustle", 'sound/misc/boogie2.ogg', 1770, 5), + ) + var/datum/track/selection = null + +/datum/track + var/song_name = "generic" + var/song_path = null + var/song_length = 0 + var/song_beat = 0 + var/GBP_required = 0 + +/datum/track/New(name, path, length, beat) + song_name = name + song_path = path + song_length = length + song_beat = beat + +/obj/machinery/disco/proc/add_track(file, name, length, beat) + var/sound/S = file + if(!istype(S)) + return + if(!name) + name = "[file]" + if(!beat) + beat = 5 + if(!length) + length = 2400 //Unless there's a way to discern via BYOND. + var/datum/track/T = new /datum/track(name, file, length, beat) + songs += T + +/obj/machinery/disco/New() + . = ..() + selection = songs[1] + + +/obj/machinery/disco/Destroy() + dance_over() + selection = null + return ..() + +/obj/machinery/disco/attackby(obj/item/O, mob/user, params) + if(!active) + if(iswrench(O)) + if(!anchored && !isinspace()) + to_chat(user,"You secure [src] to the floor.") + anchored = TRUE + else if(anchored) + to_chat(user,"You unsecure and disconnect [src].") + anchored = FALSE + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + return + return ..() + +/obj/machinery/disco/update_icon() + if(active) + icon_state = "disco1" + else + icon_state = "disco0" + ..() + + +/obj/machinery/disco/attack_hand(mob/user) + if(..()) + return + + interact(user) + +/obj/machinery/disco/interact(mob/user) + if(!anchored) + to_chat(user,"This device must be anchored by a wrench!") + return + if(!Adjacent(user) && !isAI(user)) + return + user.set_machine(src) + var/list/dat = list() + dat +="
" + dat += "[!active ? "BREAK IT DOWN" : "SHUT IT DOWN"]
" + dat += "

" + dat += " Select Track
" + dat += "Track Selected: [selection.song_name]
" + dat += "Track Length: [DisplayTimeText(selection.song_length)]

" + dat += "
DJ's Soundboard:
" + dat +="
" + dat += "Air Horn " + dat += "Station Alert " + dat += "Warning Siren " + dat += "Honk
" + dat += "Shotgun Pump" + dat += "Gunshot" + dat += "Esword" + dat += "Harm Alarm" + var/datum/browser/popup = new(user, "vending", "Radiance Dance Machine - Mark IV", 400, 350) + popup.set_content(dat.Join()) + popup.open() + + +/obj/machinery/disco/Topic(href, href_list) + if(..()) + return + add_fingerprint(usr) + switch(href_list["action"]) + if("toggle") + if(qdeleted(src)) + return + if(!active) + if(stop > world.time) + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) + return + active = TRUE + update_icon() + dance_setup() + processing_objects.Add(src) + lights_spin() + updateUsrDialog() + else if(active) + stop = 0 + updateUsrDialog() + if("select") + if(active) + to_chat(usr, "Error: You cannot change the song until the current one is over.") + return + + var/list/available = list() + for(var/datum/track/S in songs) + available[S.song_name] = S + var/selected = input(usr, "Choose your song", "Track:") as null|anything in available + if(qdeleted(src) || !selected || !istype(available[selected], /datum/track)) + return + selection = available[selected] + updateUsrDialog() + if("horn") + deejay('sound/items/airhorn2.ogg') + if("alert") + deejay('sound/misc/notice1.ogg') + if("siren") + deejay('sound/machines/engine_alert1.ogg') + if("honk") + deejay('sound/items/bikehorn.ogg') + if("pump") + deejay('sound/weapons/shotgunpump.ogg') + if("pop") + deejay('sound/weapons/gunshot3.ogg') + if("saber") + deejay('sound/weapons/saberon.ogg') + if("harm") + deejay('sound/ai/harmalarm.ogg') + +/obj/machinery/disco/proc/deejay(S) + if(qdeleted(src) || !active || charge < 5) + to_chat(usr, "The device is not able to play more DJ sounds at this time.") + return + charge -= 5 + playsound(src, S, 300, 1) + +/obj/machinery/disco/proc/dance_setup() + stop = world.time + selection.song_length + var/turf/cen = get_turf(src) + FOR_DVIEW(var/turf/t, 3, get_turf(src),INVISIBILITY_LIGHTING) + if(t.x == cen.x && t.y > cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "red" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if(t.x == cen.x && t.y < cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "purple" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if(t.x > cen.x && t.y == cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "#ffff00" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if(t.x < cen.x && t.y == cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "green" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if((t.x+1 == cen.x && t.y+1 == cen.y) || (t.x+2==cen.x && t.y+2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "sw" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + if((t.x-1 == cen.x && t.y-1 == cen.y) || (t.x-2==cen.x && t.y-2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "ne" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + if((t.x-1 == cen.x && t.y+1 == cen.y) || (t.x-2==cen.x && t.y+2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "se" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + if((t.x+1 == cen.x && t.y-1 == cen.y) || (t.x+2==cen.x && t.y-2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "nw" + L.light_power = 30 - (get_dist(src, L) * 8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + continue + END_FOR_DVIEW + +/obj/machinery/disco/proc/hierofunk() + for(var/i in 1 to 10) + new /obj/effect/temp_visual/hierophant/telegraph/edge(get_turf(src)) + sleep(5) + +/obj/machinery/disco/proc/lights_spin() + for(var/i in 1 to 25) + if(qdeleted(src) || !active) + return + var/obj/effect/overlay/sparkles/S = new /obj/effect/overlay/sparkles(src) + S.alpha = 0 + sparkles += S + switch(i) + if(1 to 8) + spawn(0) + S.orbit(src, 30, TRUE, 60, 36, TRUE, FALSE) + if(9 to 16) + spawn(0) + S.orbit(src, 62, TRUE, 60, 36, TRUE, FALSE) + if(17 to 24) + spawn(0) + S.orbit(src, 95, TRUE, 60, 36, TRUE, FALSE) + if(25) + S.pixel_y = 7 + S.forceMove(get_turf(src)) + sleep(7) + if(selection.song_name == "Engineering's Ultimate High-Energy Hustle") + sleep(280) + for(var/obj/reveal in sparkles) + reveal.alpha = 255 + while(active) + for(var/obj/item/device/flashlight/spotlight/glow in spotlights) // The multiples reflects custom adjustments to each colors after dozens of tests + if(qdeleted(src) || !active || qdeleted(glow)) + return + if(glow.light_color == "red") + glow.light_color = "nw" + glow.light_power = glow.light_power * 1.48 + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "nw") + glow.light_color = "green" + glow.light_range = glow.range * 1.1 + glow.light_power = glow.light_power * 2 // Any changes to power must come in pairs to neutralize it for other colors + glow.update_light() + continue + if(glow.light_color == "green") + glow.light_color = "sw" + glow.light_power = glow.light_power * 0.5 + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "sw") + glow.light_color = "purple" + glow.light_power = glow.light_power * 2.27 + glow.light_range = glow.range * 1.15 + glow.update_light() + continue + if(glow.light_color == "purple") + glow.light_color = "se" + glow.light_power = glow.light_power * 0.44 + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "se") + glow.light_color = "#ffff00" + glow.light_range = glow.range * 0.9 + glow.update_light() + continue + if(glow.light_color == "#ffff00") + glow.light_color = "ne" + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "ne") + glow.light_color = "red" + glow.light_power = glow.light_power * 0.68 + glow.light_range = glow.range * 0.85 + glow.update_light() + continue + if(prob(2)) // Unique effects for the dance floor that show up randomly to mix things up + INVOKE_ASYNC(src, .proc/hierofunk) + sleep(selection.song_beat) + + +/obj/machinery/disco/proc/dance(mob/living/M) //Show your moves + set waitfor = FALSE + switch(rand(0,9)) + if(0 to 1) + dance2(M) + if(2 to 3) + dance3(M) + if(4 to 6) + dance4(M) + if(7 to 9) + dance5(M) + +/obj/machinery/disco/proc/dance2(mob/living/M) + for(var/i = 1, i < 10, i++) + for(var/d in list(NORTH, SOUTH, EAST, WEST, EAST, SOUTH, NORTH, SOUTH, EAST, WEST, EAST, SOUTH)) + M.setDir(d) + if(i == WEST && !M.incapacitated()) + M.SpinAnimation(7, 1) + sleep(1) + sleep(20) + +/obj/machinery/disco/proc/dance3(mob/living/M) + var/matrix/initial_matrix = matrix(M.transform) + for(var/i in 1 to 75) + if(!M) + return + switch(i) + if(1 to 15) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0, 1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(16 to 30) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(1, -1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(31 to 45) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-1, -1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(46 to 60) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-1, 1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(61 to 75) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(1, 0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + M.setDir(turn(M.dir, 90)) + switch(M.dir) + if(NORTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(SOUTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(EAST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(WEST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + sleep(1) + M.lying_fix() + + +/obj/machinery/disco/proc/dance4(mob/living/M) + var/speed = rand(1, 3) + set waitfor = 0 + var/time = 30 + while(time) + sleep(speed) + for(var/i in 1 to speed) + M.setDir(pick(cardinal)) + M.resting = !M.resting + M.update_canmove() + time-- + +/obj/machinery/disco/proc/dance5(mob/living/M) + animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) + var/matrix/initial_matrix = matrix(M.transform) + for(var/i in 1 to 60) + if(!M) + return + if(i<31) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(i>30) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + M.setDir(turn(M.dir, 90)) + switch(M.dir) + if(NORTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(SOUTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(EAST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if(WEST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + sleep(1) + M.lying_fix() + + + +/mob/living/proc/lying_fix() + animate(src, transform = null, time = 1, loop = 0) + lying_prev = 0 + +/obj/machinery/disco/proc/dance_over() + QDEL_LIST(spotlights) + QDEL_LIST(sparkles) + for(var/mob/living/L in rangers) + if(!L || !L.client) + continue + L.stop_sound_channel(CHANNEL_JUKEBOX) + rangers = list() + + + +/obj/machinery/disco/process() + if(charge < 35) + charge += 1 + if(world.time < stop && active) + var/sound/song_played = sound(selection.song_path) + + for(var/mob/M in range(10,src)) + if(!(M in rangers)) + rangers[M] = TRUE + M.playsound_local(get_turf(M), null, 100, channel = CHANNEL_JUKEBOX, S = song_played) + if(prob(5+(allowed(M) * 4)) && M.canmove) + dance(M) + for(var/mob/L in rangers) + if(get_dist(src, L) > 10) + rangers -= L + if(!L || !L.client) + continue + L.stop_sound_channel(CHANNEL_JUKEBOX) + else if(active) + active = FALSE + processing_objects.Remove(src) + dance_over() + playsound(src,'sound/machines/terminal_off.ogg',50,1) + icon_state = "disco0" + stop = world.time + 100 diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 7aef6a05999..223a3f1d50e 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -234,6 +234,16 @@ opacity = 0 glass = TRUE +/obj/machinery/door/airlock/titanium + name = "shuttle airlock" + assemblytype = /obj/structure/door_assembly/door_assembly_titanium + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + +/obj/machinery/door/airlock/titanium/glass + opacity = 0 + glass = TRUE + ////////////////////////////////// /* Station2 Airlocks diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index f7272e8e29a..a67580d0ebb 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -4,6 +4,7 @@ /datum/feed_message var/author = "" + var/title = "" var/body = "" var/message_type = "Story" var/backup_body = "" @@ -42,8 +43,10 @@ is_admin_channel = 0 total_view_count = 0 -/datum/feed_channel/proc/announce_news() - return "Breaking news from [channel_name]!" +/datum/feed_channel/proc/announce_news(title="") + if(title) + return "Breaking news from [channel_name]: [title]" + return "Breaking news from [channel_name]" /datum/feed_channel/station/announce_news() return "New Station Announcement Available" @@ -87,6 +90,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co // 1 = there has var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster var/msg = "" //Feed message + var/msg_title = "" // Feed message title var/obj/item/weapon/photo/photo = null var/channel_name = "" //the feed channel which will be receiving the feed, or being created var/c_locked = 0 //Will our new channel be locked to public submissions? @@ -213,6 +217,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(3) data["scanned_user"] = scanned_user data["channel_name"] = channel_name + data["title"] = msg_title data["msg"] = msg data["photo"] = photo ? 1 : 0 if(4) @@ -236,7 +241,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/list/messages = list() data["messages"] = messages for(var/datum/feed_message/M in viewing_channel.messages) - messages[++messages.len] = list("body" = M.body, "img" = M.img ? icon2base64(M.img) : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count) + messages[++messages.len] = list("title" = M.title, "body" = M.body, "img" = M.img ? icon2base64(M.img) : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count) if(8, 9) data["channel_name"] = viewing_channel.channel_name data["ref"] = "\ref[viewing_channel]" @@ -247,7 +252,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/list/messages = list() data["messages"] = messages for(var/datum/feed_message/M in viewing_channel.messages) - messages[++messages.len] = list("body" = M.body, "body_redacted" = (M.body == REDACTED ? 1 : 0) , "message_type" = M.message_type, "author" = M.author, "author_redacted" = (M.author == REDACTED ? 1 : 0), "ref" = "\ref[M]", "view_count" = M.view_count) + messages[++messages.len] = list("title" = M.title, "body" = M.body, "body_redacted" = (M.body == REDACTED ? 1 : 0) , "message_type" = M.message_type, "author" = M.author, "author_redacted" = (M.author == REDACTED ? 1 : 0), "ref" = "\ref[M]", "view_count" = M.view_count) if(10) var/wanted_already = 0 var/end_param = 1 @@ -283,9 +288,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co return 1 if(href_list["set_channel_name"]) - channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))) - while(findtext(channel_name," ") == 1) - channel_name = copytext(channel_name, 2, lentext(channel_name) + 1) + channel_name = trim(sanitize(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))) else if(href_list["set_channel_lock"]) c_locked = !c_locked @@ -333,10 +336,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co available_channels += F.channel_name channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels) + else if(href_list["set_message_title"]) + msg_title = trim(strip_html(input(usr, "Write a title for your feed story", "Network Channel Handler", ""))) + msg_title = dd_limittext(msg_title, 256) + else if(href_list["set_new_message"]) - msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", "")) - while(findtext(msg, " ") == 1) - msg = copytext(msg, 2, lentext(msg) + 1) + msg = trim(strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))) else if(href_list["set_attachment"]) AttachPhoto(usr) @@ -355,6 +360,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = scanned_user + newMsg.title = msg_title newMsg.body = msg if(photo) newMsg.img = photo.img @@ -363,7 +369,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == channel_name) FC.messages += newMsg //Adding message to the network's appropriate feed_channel - announcement = FC.announce_news() + announcement = FC.announce_news(msg_title) break temp = "Feed story successfully submitted to [channel_name]." temp_back_screen = NEWSCASTER_MAIN @@ -408,14 +414,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co screen = NEWSCASTER_W_ISSUE_H else if(href_list["set_wanted_name"]) - channel_name = strip_html(input(usr, "Provide the name of the wanted person", "Network Security Handler", "")) - while(findtext(channel_name, " ") == 1) - channel_name = copytext(channel_name, 2, lentext(channel_name) + 1) + channel_name = trim(strip_html(input(usr, "Provide the name of the wanted person", "Network Security Handler", ""))) else if(href_list["set_wanted_desc"]) - msg = strip_html(input(usr, "Provide the a description of the wanted person and any other details you deem important", "Network Security Handler", "")) - while(findtext(msg, " ") == 1) - msg = copytext(msg, 2, lentext(msg) + 1) + msg = trim(strip_html(input(usr, "Provide the a description of the wanted person and any other details you deem important", "Network Security Handler", ""))) else if(href_list["submit_wanted"]) var/input_param = text2num(href_list["submit_wanted"]) @@ -534,6 +536,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(screen == NEWSCASTER_MAIN) scanned_user = "Unknown" msg = "" + msg_title = "" c_locked = 0 channel_name = "" viewing_channel = null @@ -687,7 +690,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/i = 0 for(var/datum/feed_message/MESSAGE in C.messages) i++ - dat+="-[MESSAGE.body]
" + dat+="[MESSAGE.title]
" + dat+="[MESSAGE.body]
" if(MESSAGE.img) user << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="
" diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 9cf58846feb..43fda1c6e00 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -24,7 +24,7 @@ var/const/SAFETY_COOLDOWN = 100 component_parts += new /obj/item/weapon/circuitboard/recycler(null) component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) component_parts += new /obj/item/weapon/stock_parts/manipulator(null) - materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1, MAT_TRANQUILLITE=1)) + materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1, MAT_TRANQUILLITE=1, MAT_TITANIUM=1)) RefreshParts() update_icon() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 1cf769624e9..21f22866eb5 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -19,7 +19,8 @@ MAT_GOLD=0, MAT_PLASMA=0, MAT_SILVER=0, - MAT_URANIUM=0 + MAT_URANIUM=0, + MAT_TITANIUM=0 ) var/res_max_amount = 200000 var/datum/research/files @@ -435,6 +436,8 @@ type = /obj/item/stack/sheet/mineral/bananium if(MAT_TRANQUILLITE) type = /obj/item/stack/sheet/mineral/tranquillite + if(MAT_TITANIUM) + type = /obj/item/stack/sheet/mineral/titanium else return 0 var/result = 0 @@ -492,6 +495,8 @@ material = MAT_TRANQUILLITE if(/obj/item/stack/sheet/mineral/uranium) material = MAT_URANIUM + if(/obj/item/stack/sheet/mineral/titanium) + material = MAT_TITANIUM else return ..() diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index a0a4417de4e..830d12cfd12 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -40,6 +40,11 @@ icon = 'icons/misc/beach.dmi' icon_state = "coconuts" +/obj/effect/overlay/sparkles + name = "sparkles" + icon = 'icons/effects/effects.dmi' + icon_state = "shieldsparkles" + /obj/effect/overlay/adminoverlay name = "adminoverlay" icon = 'icons/effects/effects.dmi' diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 61f27730d77..8a82d3cd73a 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -284,3 +284,19 @@ obj/item/device/flashlight/lamp/bananalamp else to_chat(user, "\The [src] needs time to recharge!") return + +/obj/item/device/flashlight/spotlight //invisible lighting source + name = "disco light" + desc = "Groovy..." + icon_state = null + light_color = null + brightness_on = 0 + light_range = 0 + light_power = 10 + alpha = 0 + layer = 0 + on = TRUE + anchored = TRUE + var/range = null + unacidable = TRUE + burn_state = LAVA_PROOF \ No newline at end of file diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 75b2ad94d95..3c9be2c67de 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -1,4 +1,6 @@ /obj/item/flag + name = "flag" + desc = "It's a flag." icon = 'icons/obj/flag.dmi' icon_state = "ntflag" lefthand_file = 'icons/mob/inhands/flags_lefthand.dmi' @@ -6,13 +8,19 @@ w_class = WEIGHT_CLASS_BULKY burntime = 20 burn_state = FLAMMABLE + var/rolled = FALSE /obj/item/flag/attackby(obj/item/weapon/W, mob/user, params) ..() if(is_hot(W) && burn_state != ON_FIRE) - user.visible_message("[user] lights the [name] with [W].") + user.visible_message("[user] lights [src] with [W].", "You light [src] with [W].", "You hear a low whoosh.") fire_act() +/obj/item/flag/attack_self(mob/user) + rolled = !rolled + user.visible_message("[user] [rolled ? "rolls up" : "unfurls"] [src].", "You [rolled ? "roll up" : "unfurl"] [src].", "You hear fabric rustling.") + update_icon() + /obj/item/flag/fire_act(global_overlay = FALSE) ..() update_icon() @@ -23,16 +31,24 @@ /obj/item/flag/update_icon() overlays.Cut() + updateFlagIcon() + item_state = icon_state + if(rolled) + icon_state = "[icon_state]_rolled" if(burn_state == ON_FIRE) + item_state = "[item_state]_fire" + if(burn_state == ON_FIRE && rolled) + overlays += image('icons/obj/flag.dmi', src , "fire_rolled") + else if(burn_state == ON_FIRE && !rolled) overlays += image('icons/obj/flag.dmi', src , "fire") - item_state = "[icon_state]_fire" - else - item_state = initial(icon_state) if(ismob(loc)) var/mob/M = loc M.update_inv_r_hand() M.update_inv_l_hand() +/obj/item/flag/proc/updateFlagIcon() + icon_state = initial(icon_state) + /obj/item/flag/nt name = "Nanotrasen flag" desc = "A flag proudly boasting the logo of NT." @@ -187,11 +203,16 @@ desc = "A poor recreation of the official NT flag. It seems to shimmer a little." icon_state = "ntflag" origin_tech = "syndicate=4;magnets=4" - var/used = 0 + var/updated_icon_state = null + var/used = FALSE + +/obj/item/flag/chameleon/New() + updated_icon_state = icon_state + ..() /obj/item/flag/chameleon/attack_self(mob/user) if(used) - return + return ..() var/list/flag_types = typesof(/obj/item/flag) - list(src.type, /obj/item/flag) var/list/flag = list() @@ -208,12 +229,16 @@ var/obj/item/flag/chosen_flag = flag[input_flag] - if(chosen_flag) + if(chosen_flag && !used) name = chosen_flag.name icon_state = chosen_flag.icon_state + updated_icon_state = icon_state desc = chosen_flag.desc - used = 1 + used = TRUE /obj/item/flag/chameleon/burn() explosion(loc,1,2,4,4, flame_range = 4) qdel(src) + +/obj/item/flag/chameleon/updateFlagIcon() + icon_state = updated_icon_state diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index bc46eb54239..3757faffba9 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -103,9 +103,8 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ ) /obj/item/stack/sheet/mineral - force = 5.0 + force = 5 throwforce = 5 - w_class = WEIGHT_CLASS_NORMAL throw_speed = 3 /obj/item/stack/sheet/mineral/New() @@ -226,6 +225,56 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \ ..() recipes = tranquillite_recipes +/* + * Titanium + */ +/obj/item/stack/sheet/mineral/titanium + name = "titanium" + icon_state = "sheet-titanium" + singular_name = "titanium sheet" + force = 5 + throwforce = 5 + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 1 + throw_range = 3 + sheettype = "titanium" + materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + +var/global/list/datum/stack_recipe/titanium_recipes = list ( + new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), + ) + +/obj/item/stack/sheet/mineral/titanium/New(loc, amount=null) + recipes = titanium_recipes + ..() + +/obj/item/stack/sheet/mineral/titanium/fifty + amount = 50 + + +/* + * Plastitanium + */ +/obj/item/stack/sheet/mineral/plastitanium + name = "plastitanium" + icon_state = "sheet-plastitanium" + singular_name = "plastitanium sheet" + force = 5 + throwforce = 5 + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 1 + throw_range = 3 + sheettype = "plastitanium" + materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000) + +var/global/list/datum/stack_recipe/plastitanium_recipes = list ( + new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), + ) + +/obj/item/stack/sheet/mineral/plastitanium/New(loc, amount=null) + recipes = plastitanium_recipes + ..() + /obj/item/stack/sheet/mineral/enruranium name = "enriched uranium" icon_state = "sheet-enruranium" diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 8e830f27407..86590026f53 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -111,4 +111,22 @@ var/global/list/datum/stack_recipe/silverfancy_tile_recipes = list ( \ icon_state = "tile_abductor" origin_tech = "materials=6;abductor=1" turf_type = /turf/simulated/floor/mineral/abductor - mineralType = "abductor" \ No newline at end of file + mineralType = "abductor" + +/obj/item/stack/tile/mineral/titanium + name = "titanium tile" + singular_name = "titanium floor tile" + desc = "A tile made of titanium, used for shuttles." + icon_state = "tile_shuttle" + turf_type = /turf/simulated/floor/mineral/titanium + mineralType = "titanium" + materials = list(MAT_TITANIUM=500) + +/obj/item/stack/tile/mineral/plastitanium + name = "plas-titanium tile" + singular_name = "plas-titanium floor tile" + desc = "A tile made of plas-titanium, used for very evil shuttles." + icon_state = "tile_darkshuttle" + turf_type = /turf/simulated/floor/mineral/plastitanium + mineralType = "plastitanium" + materials = list(MAT_TITANIUM=250, MAT_PLASMA=250) \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index 13b0f0b8140..fb10c7cedc2 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -1,70 +1,6 @@ //improvised explosives// -//iedcasing assembly crafting// -/obj/item/weapon/reagent_containers/food/drinks/cans/attackby(var/obj/item/I, mob/user as mob) - if(istype(I, /obj/item/device/assembly/igniter)) - var/obj/item/device/assembly/igniter/G = I - var/obj/item/weapon/grenade/iedcasing/W = new /obj/item/weapon/grenade/iedcasing - user.unEquip(G) - user.unEquip(src) - user.put_in_hands(W) - to_chat(user, "You stuff the [I] in the [src], emptying the contents beforehand.") - W.underlays += image(src.icon, icon_state = src.icon_state) - qdel(I) - qdel(src) - - /obj/item/weapon/grenade/iedcasing - name = "improvised explosive assembly" - desc = "An igniter stuffed into an aluminum shell." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/grenade.dmi' - icon_state = "improvised_grenade" - item_state = "flashbang" - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - slot_flags = SLOT_BELT - var/assembled = 0 - active = 1 - det_time = 50 - display_timer = 0 - var/range = 3 - var/times = list() - - - -/obj/item/weapon/grenade/iedcasing/afterattack(atom/target, mob/user , flag) //Filling up the can - if(assembled == 0) - if( istype(target, /obj/structure/reagent_dispensers/fueltank)) - if(target.reagents.total_volume < 50) - to_chat(user, "There's not enough fuel left to work with.") - return - var/obj/structure/reagent_dispensers/fueltank/F = target - F.reagents.remove_reagent("fuel", 50, 1)//Deleting 50 fuel from the welding fuel tank, - assembled = 1 - to_chat(user, "You've filled the makeshift explosive with welding fuel.") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) - desc = "An improvised explosive assembly. Filled to the brim with 'Explosive flavor'" - overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - return - - -/obj/item/weapon/grenade/iedcasing/attackby(var/obj/item/I, mob/user as mob) //Wiring the can for ignition - if(istype(I, /obj/item/stack/cable_coil)) - if(assembled == 1) - var/obj/item/stack/cable_coil/C = I - C.use(1) - assembled = 2 - to_chat(user, "You wire the igniter to detonate the fuel.") - desc = "A weak, improvised explosive." - overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") - name = "improvised explosive" - active = 0 - det_time = rand(30,80) - - -/obj/item/weapon/grenade/iedcasing/filled name = "improvised firebomb" desc = "A weak, improvised incendiary device." w_class = WEIGHT_CLASS_SMALL @@ -77,53 +13,53 @@ slot_flags = SLOT_BELT active = 0 det_time = 50 - assembled = 2 + display_timer = 0 + var/list/times - - -/obj/item/weapon/grenade/iedcasing/filled/New(loc) +/obj/item/weapon/grenade/iedcasing/New() ..() - overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") - times = list("5" = 10, "-1" = 20, "[rand(30,80)]" = 50, "[rand(65,180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] + overlays += "improvised_grenade_filled" + overlays += "improvised_grenade_wired" + times = list("5" = 10, "-1" = 20, "[rand(30, 80)]" = 50, "[rand(65, 180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] det_time = text2num(pickweight(times)) if(det_time < 0) //checking for 'duds' - range = 1 det_time = rand(30,80) - else - range = pick(2,2,2,3,3,3,4) /obj/item/weapon/grenade/iedcasing/CheckParts(list/parts_list) ..() var/obj/item/weapon/reagent_containers/food/drinks/cans/can = locate() in contents if(can) - underlays += can + can.pixel_x = 0 //Reset the sprite's position to make it consistent with the rest of the IED + can.pixel_y = 0 + var/mutable_appearance/can_underlay = new(can) + can_underlay.layer = FLOAT_LAYER + can_underlay.plane = FLOAT_PLANE + underlays += can_underlay -/obj/item/weapon/grenade/iedcasing/attack_self(mob/user as mob) // +/obj/item/weapon/grenade/iedcasing/attack_self(mob/user) // if(!active) if(clown_check(user)) to_chat(user, "You light the [name]!") - active = 1 - overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + active = TRUE + overlays -= "improvised_grenade_filled" icon_state = initial(icon_state) + "_active" add_fingerprint(user) var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) - message_admins("[key_name_admin(usr)] has primed a [name] for detonation at [A.name] (JMP)") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z])") + message_admins("[ADMIN_LOOKUPFLW(user)] has primed a [name] for detonation at [ADMIN_COORDJMP(bombturf)].") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] [COORD(bombturf)].") if(iscarbon(user)) var/mob/living/carbon/C = user C.throw_mode_on() - spawn(det_time) - prime() + addtimer(src, "prime", det_time) /obj/item/weapon/grenade/iedcasing/prime() //Blowing that can up update_mob() - explosion(src.loc,-1,-1,-1, flame_range = range) // no explosive damage, only a large fireball. + explosion(loc, -1, -1, 2, flame_range = 4) // small explosion, plus a very large fireball. qdel(src) /obj/item/weapon/grenade/iedcasing/examine(mob/user) - ..(user) + ..() to_chat(user, "You can't tell when it will explode!") diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 1dce8088158..21d8828310f 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -52,23 +52,12 @@ if(sig) to_chat(user, "This beartrap already has a signaler hooked up to it!") return - IED = I - switch(IED.assembled) - if(0,1) //if it's not fueled/hooked up - to_chat(user, "You haven't prepared this IED yet!") - IED = null - return - if(2,3) - user.drop_item() - I.forceMove(src) - message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") - log_game("[key_name(user)] has rigged a beartrap with an IED.") - to_chat(user, "You sneak the [IED] underneath the pressure plate and connect the trigger wire.") - desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." - else - to_chat(user, "You shouldn't be reading this message! Contact a coder or someone, something broke!") - IED = null - return + user.drop_item() + I.forceMove(src) + message_admins("[key_name_admin(user)] has rigged a beartrap with an IED.") + log_game("[key_name(user)] has rigged a beartrap with an IED.") + to_chat(user, "You sneak [IED] underneath the pressure plate and connect the trigger wire.") + desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." if(istype(I, /obj/item/device/assembly/signaler)) if(IED) to_chat(user, "This beartrap already has an IED hooked up to it!") @@ -110,9 +99,6 @@ if(IED && isturf(src.loc)) IED.active = 1 - IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") - IED.icon_state = initial(icon_state) + "_active" - IED.assembled = 3 message_admins("[key_name_admin(usr)] has triggered an IED-rigged [name].") log_game("[key_name(usr)] has triggered an IED-rigged [name].") spawn(IED.det_time) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 22c4acbf098..31ba83fc444 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -58,7 +58,7 @@ icon_state = "drill_bolt" item_state = "drill" usesound = 'sound/items/drill_use.ogg' - materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25) + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get force = 8 //might or might not be too high, subject to change throwforce = 8 @@ -180,7 +180,7 @@ desc = "A simple hand drill with a screwdriver bit attached." icon_state = "drill_screw" item_state = "drill" - materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25) + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get force = 8 //might or might not be too high, subject to change throwforce = 8 @@ -276,7 +276,7 @@ icon_state = "jaws_cutter" item_state = "jawsoflife" origin_tech = "materials=2;engineering=2" - materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25) + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) usesound = 'sound/items/jaws_cut.ogg' toolspeed = 0.25 @@ -691,7 +691,7 @@ obj/item/weapon/weldingtool/experimental/process() desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head." icon_state = "jaws_pry" item_state = "jawsoflife" - materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_DIAMOND=25) + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) origin_tech = "materials=2;engineering=2" usesound = 'sound/items/jaws_pry.ogg' force = 15 diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 5b26b46eacd..b93ad13c98c 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -100,6 +100,14 @@ if(pickednum >= 40) new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max)) + //Titanium (rare ore) + if(pickednum >= 40) + new /obj/item/stack/sheet/mineral/titanium(src, rand(rare_min, rare_max)) + + //Plastitanium (rare ore) + if(pickednum >= 40) + new /obj/item/stack/sheet/mineral/plastitanium(src, rand(rare_min, rare_max)) + //Diamond (rare HONK) if(pickednum >= 45) new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max)) @@ -122,6 +130,8 @@ /obj/item/stack/sheet/mineral/uranium, /obj/item/stack/sheet/mineral/diamond, /obj/item/stack/sheet/mineral/bananium, + /obj/item/stack/sheet/mineral/titanium, + /obj/item/stack/sheet/mineral/plastitanium, /obj/item/stack/sheet/plasteel, /obj/item/stack/rods ) diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index d0aacb78d53..2475e9e1b4d 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -246,6 +246,15 @@ mineral = "sandstone" glass_type = /obj/machinery/door/airlock/sandstone/glass +/obj/structure/door_assembly/door_assembly_titanium + name = "titanium airlock assembly" + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + base_name = "shuttle airlock" + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + glass_type = /obj/machinery/door/airlock/titanium/glass + airlock_type = /obj/machinery/door/airlock/titanium + mineral = "titanium" + /obj/structure/door_assembly/door_assembly_wood name = "wooden airlock assembly" icon = 'icons/obj/doors/airlocks/station/wood.dmi' diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index aa661e57aa8..e318dd6f289 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -80,9 +80,9 @@ /obj/structure/falsewall/update_icon() if(density) + icon_state = initial(icon_state) smooth = SMOOTH_TRUE smooth_icon(src) - icon_state = "" else icon_state = "fwall_open" @@ -304,4 +304,22 @@ icon_state = "abductor" mineral = "abductor" walltype = "abductor" - canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/simulated/wall/mineral/abductor) \ No newline at end of file + canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/simulated/wall/mineral/abductor) + +/obj/structure/falsewall/titanium + desc = "A light-weight titanium wall used in shuttles." + icon = 'icons/turf/walls/shuttle_wall.dmi' + icon_state = "shuttle" + mineral = /obj/item/stack/sheet/mineral/titanium + walltype = /turf/simulated/wall/mineral/titanium + smooth = SMOOTH_MORE + canSmoothWith = list(/turf/simulated/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/full/shuttle, /obj/structure/shuttle/engine/heater) + +/obj/structure/falsewall/plastitanium + desc = "An evil wall of plasma and titanium." + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "shuttle" + mineral = /obj/item/stack/sheet/mineral/plastitanium + walltype = /turf/simulated/wall/mineral/plastitanium + smooth = SMOOTH_MORE + canSmoothWith = list(/turf/simulated/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/full/shuttle, /obj/structure/shuttle/engine/heater) \ No newline at end of file diff --git a/code/game/objects/structures/fullwindow.dm b/code/game/objects/structures/fullwindow.dm index f9e8adbf9aa..f2663063dea 100644 --- a/code/game/objects/structures/fullwindow.dm +++ b/code/game/objects/structures/fullwindow.dm @@ -94,6 +94,7 @@ basestate = "window" health = 160 reinf = 1 + explosion_block = 3 /obj/structure/window/full/shuttle/New() ..() diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm index e66d4383407..218599f9e9d 100644 --- a/code/game/turfs/simulated/floor/mineral.dm +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -6,6 +6,7 @@ * Bananium floor * Diamond floor * Uranium floor + * Shuttle floor (Titanium) */ /turf/simulated/floor/mineral @@ -76,6 +77,61 @@ floor_tile = /obj/item/stack/tile/mineral/silver/fancy icons = list("silverfancy","silverfancy_dam") +//TITANIUM (shuttle) + +/turf/simulated/floor/mineral/titanium/blue + icon_state = "shuttlefloor" + icons = list("shuttlefloor","shuttlefloor_dam") + +/turf/simulated/floor/mineral/titanium/blue/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + +/turf/simulated/floor/mineral/titanium/yellow + icon_state = "shuttlefloor2" + icons = list("shuttlefloor2","shuttlefloor2_dam") + +/turf/simulated/floor/mineral/titanium/yellow/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + +/turf/simulated/floor/mineral/titanium + name = "shuttle floor" + icon_state = "shuttlefloor3" + floor_tile = /obj/item/stack/tile/mineral/titanium + icons = list("shuttlefloor3","shuttlefloor3_dam") + +/turf/simulated/floor/mineral/titanium/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + +/turf/simulated/floor/mineral/titanium/purple + icon_state = "shuttlefloor5" + icons = list("shuttlefloor5","shuttlefloor5_dam") + +/turf/simulated/floor/mineral/titanium/purple/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + +//PLASTITANIUM (syndieshuttle) +/turf/simulated/floor/mineral/plastitanium + name = "shuttle floor" + icon_state = "shuttlefloor4" + floor_tile = /obj/item/stack/tile/mineral/plastitanium + icons = list("shuttlefloor4","shuttlefloor4_dam") + +/turf/simulated/floor/mineral/plastitanium/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + +/turf/simulated/floor/mineral/plastitanium/brig + name = "brig floor" + //BANANIUM /turf/simulated/floor/mineral/bananium name = "bananium floor" diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index d2db056e824..80ce5f842be 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -156,4 +156,111 @@ smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL sheet_type = /obj/item/stack/sheet/mineral/abductor explosion_block = 3 - canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor) \ No newline at end of file + canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor) + +/////////////////////Titanium walls///////////////////// + +/turf/simulated/wall/mineral/titanium //has to use this path due to how building walls works + name = "wall" + desc = "A light-weight titanium wall used in shuttles." + icon = 'icons/turf/walls/shuttle_wall.dmi' + icon_state = "map-shuttle" + explosion_block = 3 + sheet_type = /obj/item/stack/sheet/mineral/titanium + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + canSmoothWith = list(/turf/simulated/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/full/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) + +/turf/simulated/wall/mineral/titanium/nodiagonal + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + +/turf/simulated/wall/mineral/titanium/nosmooth + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + smooth = SMOOTH_FALSE + +/turf/simulated/wall/mineral/titanium/overspace + icon_state = "map-overspace" + fixed_underlay = list("space"=1) + +//sub-type to be used for interior shuttle walls +//won't get an underlay of the destination turf on shuttle move +/turf/simulated/wall/mineral/titanium/interior/copyTurf(turf/T) + if(T.type != type) + T.ChangeTurf(type) + if(underlays.len) + T.underlays = underlays + if(T.icon_state != icon_state) + T.icon_state = icon_state + if(T.icon != icon) + T.icon = icon + if(T.color != color) + T.color = color + if(T.dir != dir) + T.dir = dir + T.transform = transform + return T + +/turf/simulated/wall/mineral/titanium/copyTurf(turf/T) + . = ..() + T.transform = transform + +/turf/simulated/wall/mineral/titanium/survival + name = "pod wall" + desc = "An easily-compressable wall used for temporary shelter." + icon = 'icons/turf/walls/survival_pod_walls.dmi' + icon_state = "smooth" + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock, /obj/structure/window/full, /obj/structure/window/full/reinforced, /obj/structure/window/full/reinforced/tinted, /obj/structure/window/full/shuttle, /obj/structure/shuttle/engine) + +/turf/simulated/wall/mineral/titanium/survival/nodiagonal + smooth = SMOOTH_MORE + +/turf/simulated/wall/mineral/titanium/survival/pod + canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod) + +/////////////////////Plastitanium walls///////////////////// + +/turf/simulated/wall/mineral/plastitanium + name = "wall" + desc = "An evil wall of plasma and titanium." + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle" + explosion_block = 4 + sheet_type = /obj/item/stack/sheet/mineral/plastitanium + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + canSmoothWith = list(/turf/simulated/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + +/turf/simulated/wall/mineral/plastitanium/nodiagonal + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + +/turf/simulated/wall/mineral/plastitanium/nosmooth + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + smooth = SMOOTH_FALSE + +/turf/simulated/wall/mineral/plastitanium/overspace + icon_state = "map-overspace" + fixed_underlay = list("space"=1) + +//have to copypaste this code +/turf/simulated/wall/mineral/plastitanium/interior/copyTurf(turf/T) + if(T.type != type) + T.ChangeTurf(type) + if(underlays.len) + T.underlays = underlays + if(T.icon_state != icon_state) + T.icon_state = icon_state + if(T.icon != icon) + T.icon = icon + if(T.color != color) + T.color = color + if(T.dir != dir) + T.dir = dir + T.transform = transform + return T + +/turf/simulated/wall/mineral/plastitanium/copyTurf(turf/T) + . = ..() + T.transform = transform \ No newline at end of file diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 3fbcf39ed08..4e7093bf5cf 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -16,7 +16,7 @@ /datum/crafting_recipe/IED name = "IED" - result = /obj/item/weapon/grenade/iedcasing/filled + result = /obj/item/weapon/grenade/iedcasing reqs = list(/datum/reagent/fuel = 50, /obj/item/stack/cable_coil = 1, /obj/item/device/assembly/igniter = 1, diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 700803792e2..3d3ce0aa613 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -19,7 +19,7 @@ var/ore_pickup_rate = 15 var/sheet_per_ore = 1 var/point_upgrade = 1 - var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("uranium" = 30), ("diamond" = 50), ("bluespace crystal" = 50), ("bananium" = 60), ("tranquillite" = 60)) + var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("titanium" = 30), ("uranium" = 30), ("diamond" = 50), ("bluespace crystal" = 50), ("bananium" = 60), ("tranquillite" = 60)) var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold")) speed_process = 1 @@ -175,17 +175,28 @@ dat += "
" //just looks nicer dat += text("[capitalize(s.name)]: [s.amount] Release
") - if((/obj/item/stack/sheet/metal in stack_list) && (/obj/item/stack/sheet/mineral/plasma in stack_list)) - var/obj/item/stack/sheet/metalstack = stack_list[/obj/item/stack/sheet/metal] - var/obj/item/stack/sheet/plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] - if(min(metalstack.amount, plasmastack.amount)) - dat += text("Plasteel Alloy (Metal + Plasma): Smelt
") - if((/obj/item/stack/sheet/glass in stack_list) && (/obj/item/stack/sheet/mineral/plasma in stack_list)) - var/obj/item/stack/sheet/glassstack = stack_list[/obj/item/stack/sheet/glass] - var/obj/item/stack/sheet/plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] - if(min(glassstack.amount, plasmastack.amount)) - dat += "Plasma Glass (Glass + Plasma): Smelt
" + var/obj/item/stack/sheet/metalstack + if(/obj/item/stack/sheet/metal in stack_list) + metalstack = stack_list[/obj/item/stack/sheet/metal] + var/obj/item/stack/sheet/glass/glassstack + if(/obj/item/stack/sheet/glass in stack_list) + glassstack = stack_list[/obj/item/stack/sheet/glass] + + var/obj/item/stack/sheet/plasmastack + if((/obj/item/stack/sheet/mineral/plasma in stack_list)) + plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] + + var/obj/item/stack/sheet/mineral/titaniumstack + if((/obj/item/stack/sheet/mineral/titanium in stack_list)) + titaniumstack = stack_list[/obj/item/stack/sheet/mineral/titanium] + + if(metalstack && plasmastack && min(metalstack.amount, plasmastack.amount)) + dat += text("Plasteel Alloy (Metal + Plasma): Smelt
") + if(titaniumstack && plasmastack && min(titaniumstack.amount, plasmastack.amount)) + dat += text("Plastitanium Alloy (Titanium + Plasma): Smelt
") + if(glassstack && plasmastack && min(glassstack.amount, plasmastack.amount)) + dat += text("Plasma Glass (Glass + Plasma): Smelt
") dat += text("
Mineral Value List:
[get_ore_values()]
") var/datum/browser/popup = new(user, "console_stacking_machine", "Ore Redemption Machine", 400, 500) @@ -242,37 +253,24 @@ else to_chat(usr, "Required access not found.") - if(href_list["plasteel"]) + if(href_list["alloytype1"] && href_list["alloytype2"] && href_list["alloytypeout"]) + var/alloytype1 = text2path(href_list["alloytype1"]) + var/alloytype2 = text2path(href_list["alloytype2"]) + var/alloytypeout = text2path(href_list["alloytypeout"]) if(check_access(inserted_id) || allowed(usr)) - if(!(/obj/item/stack/sheet/metal in stack_list)) return - if(!(/obj/item/stack/sheet/mineral/plasma in stack_list)) return - var/obj/item/stack/sheet/metalstack = stack_list[/obj/item/stack/sheet/metal] - var/obj/item/stack/sheet/plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] - + if(!(alloytype1 in stack_list)) + return + if(!(alloytype2 in stack_list)) + return + var/obj/item/stack/sheet/stack1 = stack_list[alloytype1] + var/obj/item/stack/sheet/stack2 = stack_list[alloytype2] var/desired = input("How much?", "How much would you like to smelt?", 1) as num - var/obj/item/stack/sheet/plasteel/plasteelout = new - plasteelout.amount = round(min(desired,50,metalstack.amount,plasmastack.amount)) - if(plasteelout.amount >= 1) - metalstack.amount -= plasteelout.amount - plasmastack.amount -= plasteelout.amount - unload_mineral(plasteelout) - else - to_chat(usr, "Required access not found.") - - if(href_list["plasglass"]) - if(check_access(inserted_id) || allowed(usr)) - if(!(/obj/item/stack/sheet/glass in stack_list)) return - if(!(/obj/item/stack/sheet/mineral/plasma in stack_list)) return - var/obj/item/stack/sheet/glassstack = stack_list[/obj/item/stack/sheet/glass] - var/obj/item/stack/sheet/plasmastack = stack_list[/obj/item/stack/sheet/mineral/plasma] - - var/desired = input("How much?", "How much would you like to smelt?", 1) as num - var/obj/item/stack/sheet/plasmaglass/plasglassout = new - plasglassout.amount = round(min(desired, 50, glassstack.amount, plasmastack.amount)) - if(plasglassout.amount >= 1) - glassstack.amount -= plasglassout.amount - plasmastack.amount -= plasglassout.amount - unload_mineral(plasglassout) + var/obj/item/stack/sheet/alloyout = new alloytypeout + alloyout.amount = round(min(desired,50,stack1.amount,stack2.amount)) + if(alloyout.amount >= 1) + stack1.amount -= alloyout.amount + stack2.amount -= alloyout.amount + unload_mineral(alloyout) else to_chat(usr, "Required access not found.") updateUsrDialog() diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 212e8488ac8..4fe8edbe7f6 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -25,93 +25,102 @@ if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_mime || machine.ore_adamantine) if(machine.ore_iron) if(machine.selected_iron==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Iron: [machine.ore_iron]
") + dat += "Not smelting " + dat += "Iron: [machine.ore_iron]
" else machine.selected_iron = 0 //sand - glass if(machine.ore_glass) if(machine.selected_glass==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Sand: [machine.ore_glass]
") + dat += "Not smelting " + dat += "Sand: [machine.ore_glass]
" else machine.selected_glass = 0 //plasma if(machine.ore_plasma) if(machine.selected_plasma==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Plasma: [machine.ore_plasma]
") + dat += "Not smelting " + dat += "Plasma: [machine.ore_plasma]
" else machine.selected_plasma = 0 //uranium if(machine.ore_uranium) if(machine.selected_uranium==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Uranium: [machine.ore_uranium]
") + dat += "Not smelting " + dat += "Uranium: [machine.ore_uranium]
" else machine.selected_uranium = 0 //gold if(machine.ore_gold) if(machine.selected_gold==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Gold: [machine.ore_gold]
") + dat += "Not smelting " + dat += "Gold: [machine.ore_gold]
" else machine.selected_gold = 0 //silver if(machine.ore_silver) if(machine.selected_silver==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Silver: [machine.ore_silver]
") + dat += "Not smelting " + dat += "Silver: [machine.ore_silver]
" else machine.selected_silver = 0 //diamond if(machine.ore_diamond) if(machine.selected_diamond==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Diamond: [machine.ore_diamond]
") + dat += "Not smelting " + dat += "Diamond: [machine.ore_diamond]
" else machine.selected_diamond = 0 //bananium if(machine.ore_clown) if(machine.selected_clown==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Bananium: [machine.ore_clown]
") + dat += "Not smelting " + dat += "Bananium: [machine.ore_clown]
" else machine.selected_clown = 0 //tranquillite if(machine.ore_mime) if(machine.selected_mime==1) - dat += text("Smelting ") + dat += "Smelting " else - dat += text("Not smelting ") - dat += text("Tranquillite: [machine.ore_mime]
") + dat += "Not smelting " + dat += "Tranquillite: [machine.ore_mime]
" else machine.selected_mime = 0 + //titanium + if(machine.ore_titanium) + if (machine.selected_titanium==1) + dat += "Smelting " + else + dat += "Not smelting " + dat += "Titanium: [machine.ore_titanium]
" + else + machine.selected_titanium = 0 //On or off dat += text("Machine is currently ") @@ -175,6 +184,11 @@ machine.selected_mime = 1 else machine.selected_mime = 0 + if(href_list["sel_titanium"]) + if (href_list["sel_titanium"] == "yes") + machine.selected_titanium = 1 + else + machine.selected_titanium = 0 if(href_list["set_on"]) if(href_list["set_on"] == "on") machine.on = 1 @@ -203,6 +217,7 @@ var/ore_clown = 0 var/ore_mime = 0 var/ore_adamantine = 0 + var/ore_titanium = 0 var/selected_gold = 0 var/selected_silver = 0 var/selected_diamond = 0 @@ -212,92 +227,106 @@ var/selected_iron = 0 var/selected_clown = 0 var/selected_mime = 0 + var/selected_titanium = 0 var/on = 0 //0 = off, 1 =... oh you know! /obj/machinery/mineral/processing_unit/process() - var/i - for(i = 0; i < 10; i++) + for(var/i in 1 to 10) if(on) - if(selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0) + if(selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime) if(ore_glass > 0) - ore_glass--; + ore_glass-- generate_mineral(/obj/item/stack/sheet/glass) else on = 0 continue - if(selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0) + if(selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_mime) if(ore_glass > 0 && ore_iron > 0) - ore_glass--; - ore_iron--; + ore_glass-- + ore_iron-- generate_mineral(/obj/item/stack/sheet/rglass) else on = 0 continue - if(selected_glass == 0 && selected_gold == 1 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime) if(ore_gold > 0) - ore_gold--; + ore_gold-- generate_mineral(/obj/item/stack/sheet/mineral/gold) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && !selected_gold && selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime) if(ore_silver > 0) - ore_silver--; + ore_silver-- generate_mineral(/obj/item/stack/sheet/mineral/silver) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && !selected_gold && !selected_silver && selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime) if(ore_diamond > 0) - ore_diamond--; + ore_diamond-- generate_mineral(/obj/item/stack/sheet/mineral/diamond) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime) if(ore_plasma > 0) - ore_plasma--; + ore_plasma-- generate_mineral(/obj/item/stack/sheet/mineral/plasma) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && selected_uranium && !selected_iron && !selected_clown && !selected_mime) if(ore_uranium > 0) - ore_uranium--; + ore_uranium-- generate_mineral(/obj/item/stack/sheet/mineral/uranium) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_mime) if(ore_iron > 0) - ore_iron--; + ore_iron-- generate_mineral(/obj/item/stack/sheet/metal) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0) + if(!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_mime) if(ore_iron > 0 && ore_plasma > 0) - ore_iron--; - ore_plasma--; + ore_iron-- + ore_plasma-- generate_mineral(/obj/item/stack/sheet/plasteel) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 1 && selected_mime == 0) + if(!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && selected_clown && !selected_mime) if(ore_clown > 0) - ore_clown--; + ore_clown-- generate_mineral(/obj/item/stack/sheet/mineral/bananium) else on = 0 continue - if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 1) + if(!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_mime) if(ore_mime > 0) - ore_mime--; + ore_mime-- generate_mineral(/obj/item/stack/sheet/mineral/tranquillite) else on = 0 continue - + if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime && selected_titanium) + if (ore_titanium > 0) + ore_titanium-- + generate_mineral(/obj/item/stack/sheet/mineral/titanium) + else + on = 0 + continue + if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_mime && selected_titanium) + if (ore_titanium > 0) + ore_titanium-- + ore_plasma-- + generate_mineral(/obj/item/stack/sheet/mineral/plastitanium) + else + on = 0 + continue //if a non valid combination is selected @@ -333,6 +362,9 @@ if(selected_mime == 1) if(ore_mime <= 0) b = 0 + if(selected_titanium == 1) + if(ore_titanium <= 0) + b = 0 if(b) //if they are, deduct one from each, produce slag and shut the machine off if(selected_gold == 1) @@ -351,6 +383,8 @@ ore_clown-- if(selected_mime == 1) ore_mime-- + if(selected_titanium == 1) + ore_titanium-- generate_mineral(/obj/item/weapon/ore/slag) on = 0 else @@ -402,6 +436,10 @@ ore_mime++ O.loc = null continue + if(istype(O,/obj/item/weapon/ore/titanium)) + ore_titanium++ + O.loc = null + continue unload_mineral(O) /obj/machinery/mineral/processing_unit/proc/generate_mineral(var/P) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index bf671764197..7b7f4a4fd48 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -362,15 +362,6 @@ icon_regular_floor = "podfloor" floor_tile = /obj/item/stack/tile/pod -//Walls -/turf/simulated/wall/survival - name = "pod wall" - desc = "An easily-compressable wall used for temporary shelter." - icon = 'icons/turf/walls/survival_pod_walls.dmi' - icon_state = "smooth" - smooth = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod) - //Door /obj/machinery/door/airlock/survival_pod icon = 'icons/obj/doors/airlocks/survival/survival.dmi' diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index d57f509e13e..d2f8e2c8bc1 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -110,8 +110,7 @@ var/global/list/rockTurfEdgeCache = list( "Uranium" = 5, "Diamond" = 1, "Gold" = 10, "Silver" = 12, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 4, "Cave" = 2, "BScrystal" = 1, - /*, "Adamantine" =5*/) - //Currently, Adamantine won't spawn as it has no uses. -Durandan + "Titanium" = 11) var/mineralChance = 13 /turf/simulated/mineral/random/New() @@ -142,6 +141,8 @@ var/global/list/rockTurfEdgeCache = list( M = new/turf/simulated/mineral/clown(src) if("Tranquillite") M = new/turf/simulated/mineral/mime(src) + if("Titanium") + M = new/turf/simulated/mineral/titanium(src) if("BScrystal") M = new/turf/simulated/mineral/bscrystal(src) if(M) @@ -155,9 +156,9 @@ var/global/list/rockTurfEdgeCache = list( icon_state = "rock_highchance" mineralChance = 25 mineralSpawnChanceList = list( - "Uranium" = 35, "Diamond" = 30, - "Gold" = 45, "Silver" = 50, "Plasma" = 50, - "BScrystal" = 20) + "Uranium" = 35, "Diamond" = 30, "Gold" = 45, + "Silver" = 50, "Plasma" = 50, "BScrystal" = 20, + "Titanium" = 45) /turf/simulated/mineral/random/high_chance_clown @@ -177,7 +178,7 @@ var/global/list/rockTurfEdgeCache = list( mineralSpawnChanceList = list( "Uranium" = 2, "Diamond" = 1, "Gold" = 4, "Silver" = 6, "Plasma" = 15, "Iron" = 40, - "Gibtonite" = 2, "BScrystal" = 1) + "Gibtonite" = 2, "BScrystal" = 1, "Titanium" = 4) /turf/simulated/mineral/random/low_chance/New() icon_state = "rock" @@ -228,6 +229,14 @@ var/global/list/rockTurfEdgeCache = list( hidden = 1 scan_state = "rock_Silver" +/turf/simulated/mineral/titanium + name = "titanium deposit" + mineralType = /obj/item/weapon/ore/titanium + spreadChance = 5 + spread = 1 + hidden = 1 + scan_state = "rock_Titanium" + /turf/simulated/mineral/plasma name = "plasma deposit" icon_state = "rock_Plasma" diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index fbf14349a53..a9cdbffed7d 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -37,7 +37,8 @@ speak_emote = list("states") wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver, /obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron, - /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass) + /obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass, + /obj/item/weapon/ore/titanium) healable = 0 var/mode = MINEDRONE_COLLECT var/light_on = 0 diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index cf987c654bc..3158b1b524a 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -142,6 +142,13 @@ refined_type = /obj/item/stack/sheet/mineral/tranquillite materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT) +/obj/item/weapon/ore/titanium + name = "titanium ore" + icon_state = "Titanium ore" + points = 50 + materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + refined_type = /obj/item/stack/sheet/mineral/titanium + /obj/item/weapon/ore/slag name = "slag" desc = "Completely useless" diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 5cf24a394ee..5f21412f3b8 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -33,6 +33,7 @@ var/amt_iron = 0 var/amt_plasma = 0 var/amt_uranium = 0 + var/amt_titanium = 0 var/amt_clown = 0 var/amt_mime = 0 var/amt_bluespace = 0 @@ -56,6 +57,8 @@ amt_clown++ if(istype(C,/obj/item/weapon/ore/tranquillite)) amt_mime++ + if(istype(C, /obj/item/weapon/ore/titanium)) + amt_titanium++ if(istype(C,/obj/item/weapon/ore/bluespace_crystal)) amt_bluespace++ @@ -74,6 +77,8 @@ dat += text("Plasma ore: [amt_plasma]
") if(amt_uranium) dat += text("Uranium ore: [amt_uranium]
") + if(amt_titanium) + dat += text("Titanium ore: [amt_titanium]
") if(amt_clown) dat += text("Bananium ore: [amt_clown]
") if(amt_mime) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index b7834d873f1..d8c80c8b3fe 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -287,6 +287,7 @@ // Do species-specific reagent handling here // Return 1 if it should do normal processing too +// Return the parent value if processing does not explicitly stop // Return 0 if it shouldn't deplete and do its normal effect // Other return values will cause weird badness /datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index b895ed0fdd4..96a3571f113 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -744,6 +744,12 @@ if(speech_pref) H.mind.speech_span = "wingdings" +/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) + if(R.id == "sacid") + H.reagents.del_reagent(R.id) + return 0 + return ..() + /datum/species/diona name = "Diona" name_plural = "Dionaea" @@ -963,10 +969,10 @@ speech_chance = 20 male_scream_sound = 'sound/voice/DraskTalk2.ogg' female_scream_sound = 'sound/voice/DraskTalk2.ogg' - male_cough_sounds = null //whale cough when - female_cough_sounds = null - male_sneeze_sound = null - female_sneeze_sound = null + male_cough_sounds = 'sound/voice/DraskCough.ogg' + female_cough_sounds = 'sound/voice/DraskCough.ogg' + male_sneeze_sound = 'sound/voice/DraskSneeze.ogg' + female_sneeze_sound = 'sound/voice/DraskSneeze.ogg' burn_mod = 2 //exotic_blood = "cryoxadone" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 07c4d2f25cd..054c94d7a25 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -490,6 +490,10 @@ Difficulty: Hard icon_state = "hierophant_telegraph_teleport" duration = 9 +/obj/effect/temp_visual/hierophant/telegraph/edge + icon_state = "hierophant_telegraph_edge" + duration = 40 + /obj/effect/temp_visual/hierophant/blast icon = 'icons/effects/effects.dmi' icon_state = "hierophant_blast" diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 255be518671..d070baa3766 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -982,6 +982,14 @@ icon_state = "skrell_hair_f" gender = FEMALE +/datum/sprite_accessory/hair/skrell/skr_tentacleslong + name = "Long Skrell Tentacles" + icon_state = "skrell_hair_verylong" + +/datum/sprite_accessory/hair/skrell/skr_tentaclesshort + name = "Short Skrell Tentacles" + icon_state = "skrell_hair_veryshort" + /datum/sprite_accessory/hair/skrell/skr_gold_m name = "Gold plated Skrell Male Tentacles" icon_state = "skrell_hair_m" @@ -1008,6 +1016,117 @@ gender = FEMALE secondary_theme = "cloth" +/datum/sprite_accessory/hair/skrell/skr_gclothtentacle_m + name = "Ombre Dye, Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentacle_f + name = "Ombre Dye, Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentacleslong + name = "Ombre Dye, Long Skrell Tentacles" + icon_state = "skrell_hair_verylong" + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_gclothtentaclesshort + name = "Ombre Dye, Short Skrell Tentacles" + icon_state = "skrell_hair_veryshort" + secondary_theme = "gradient" + +/datum/sprite_accessory/hair/skrell/skr_diablacktentacle_m + name = "Black headress Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "blackdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diablacktentacle_f + name = "Black headress Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "blackdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diablacktentacleslong + name = "Black headress Long Skrell Tentacles" + icon_state = "skrell_hair_verylong" + secondary_theme = "blackdia" + no_sec_colour = 1 + + +/datum/sprite_accessory/hair/skrell/skr_diagoldtentacle_m + name = "Gold headress Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "golddia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diagoldtentacle_f + name = "Gold headress Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "golddia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diagoldtentacleslong + name = "Gold headress Long Skrell Tentacles" + icon_state = "skrell_hair_verylong" + secondary_theme = "golddia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diasilvertentacle_m + name = "Silver headress Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "silvdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diasilvertentacle_f + name = "Silver headress Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "silvdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_diasilvertentacleslong + name = "Silver headress Long Skrell Tentacles" + icon_state = "skrell_hair_verylong" + secondary_theme = "silvdia" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentacle_m + name = "Festive headress Skrell Male Tentacles" + icon_state = "skrell_hair_m" + gender = MALE + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentacle_f + name = "Festive headress Skrell Female Tentacles" + icon_state = "skrell_hair_f" + gender = FEMALE + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentacleslong + name = "Festive headress Long Skrell Tentacles" + icon_state = "skrell_hair_verylong" + secondary_theme = "fest" + no_sec_colour = 1 + +/datum/sprite_accessory/hair/skrell/skr_festivetentaclesshort + name = "Festive headress Short Skrell Tentacles" + icon_state = "skrell_hair_veryshort" + secondary_theme = "fest" + no_sec_colour = 1 + +//Tajaran styles + /datum/sprite_accessory/hair/tajara species_allowed = list("Tajaran") glasses_over = 1 @@ -1064,6 +1183,11 @@ icon_state = "hair_curly" glasses_over = null +/datum/sprite_accessory/hair/tajara/taj_hair_bedhead + name = "Tajara bedhead" + icon_state = "hair_tbedhead" + glasses_over = null + /datum/sprite_accessory/hair/tajara/taj_hair_retro name = "Tajaran Ladies' Retro" icon_state = "hair_ladies_retro" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 121f47a9e9e..34a447306db 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -239,6 +239,7 @@ \[list\] - \[/list\] : A list.
\[*\] : A dot used for lists.
\[hr\] : Adds a horizontal rule. + \[time\] : Inserts the current station time in HH:MM:SS.
"}, "window=paper_help") /obj/item/weapon/paper/Topic(href, href_list) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm new file mode 100644 index 00000000000..c51cd39e56e --- /dev/null +++ b/code/modules/paperwork/paperplane.dm @@ -0,0 +1,129 @@ +// Ported from TG +/obj/item/weapon/paperplane + name = "paper plane" + desc = "Paper, folded in the shape of a plane." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "paperplane" + throw_range = 7 + throw_speed = 1 + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + burn_state = FLAMMABLE + burntime = 5 + no_spin = TRUE + + var/obj/item/weapon/paper/internal_paper + +/obj/item/weapon/paperplane/New(loc, obj/item/weapon/paper/new_paper) + ..() + pixel_y = rand(-8, 8) + pixel_x = rand(-9, 9) + if(new_paper) + internal_paper = new_paper + flags = new_paper.flags + color = new_paper.color + new_paper.forceMove(src) + else + internal_paper = new /obj/item/weapon/paper(src) + update_icon() + +/obj/item/weapon/paperplane/Destroy() + QDEL_NULL(internal_paper) + return ..() + +/obj/item/weapon/paperplane/suicide_act(mob/living/user) + user.Stun(10) + user.visible_message("[user] jams [name] in \his nose. It looks like \he's trying to commit suicide!") + user.EyeBlurry(6) + var/obj/item/organ/internal/eyes/E = user.get_int_organ(/obj/item/organ/internal/eyes) + if(E) + E.take_damage(8, 1) + sleep(10) + return BRUTELOSS + +/obj/item/weapon/paperplane/update_icon() + overlays.Cut() + var/list/stamped = internal_paper.stamped + if(!stamped) + stamped = new + else if(stamped) + for(var/S in stamped) + var/obj/item/weapon/stamp = S + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi', "paperplane_[initial(stamp.icon_state)]") + overlays += stampoverlay + +/obj/item/weapon/paperplane/attack_self(mob/user) // Unfold the paper plane + to_chat(user, "You unfold [src].") + if(internal_paper) + internal_paper.forceMove(get_turf(src)) + user.put_in_hands(internal_paper) + internal_paper = null + qdel(src) + +/obj/item/weapon/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params) + ..() + + if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) + to_chat(user, "You should unfold [src] before changing it.") + return + + else if(istype(P, /obj/item/weapon/stamp)) //we don't randomize stamps on a paperplane + internal_paper.attackby(P, user) //spoofed attack to update internal paper. + update_icon() + + else if(is_hot(P)) + if(user.disabilities & CLUMSY && prob(10)) + user.visible_message("[user] accidentally ignites themselves!", \ + "You miss [src] and accidentally light yourself on fire!") + user.unEquip(P) + user.adjust_fire_stacks(1) + user.IgniteMob() + return + + if(!in_range(user, src)) //to prevent issues as a result of telepathically lighting a paper + return + user.unEquip(src) + user.visible_message("[user] lights [src] on fire with [P]!", "You lights [src] on fire!") + fire_act() + + add_fingerprint(user) + +/obj/item/weapon/paperplane/throw_impact(atom/hit_atom) + if(..()) + return + if(!ishuman(hit_atom)) + return + var/mob/living/carbon/human/H = hit_atom + if(prob(2)) + if(H.head && H.head.flags_cover & HEADCOVERSEYES) + return + if(H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) + return + if(H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES) + return + visible_message("[src] hits [H] in the eye!") + H.EyeBlurry(6) + H.Weaken(2) + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(E) + E.take_damage(8, 1) + H.emote("scream") + +/obj/item/weapon/paper/AltClick(mob/user, obj/item/I) + var/mob/living/carbon/human/H = user + I = H.is_in_hands(/obj/item/weapon/paper) + if(I) + ProcFoldPlane(H, I) + else + ..() + +/obj/item/weapon/paper/proc/ProcFoldPlane(mob/living/carbon/user, obj/item/I) + if(istype(user)) + if((!in_range(src, user)) || user.stat || user.restrained()) + return + to_chat(user, "You fold [src] into the shape of a plane!") + user.unEquip(src) + I = new /obj/item/weapon/paperplane(user, src) + user.put_in_hands(I) + else + to_chat(user, "You lack the dexterity to fold [src].") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 62313ddbccb..0914cdc8d32 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -467,8 +467,6 @@ obj/structure/cable/proc/cableColor(var/colorC) // Definitions //////////////////////////////// -#define MAXCOIL 30 - var/global/list/datum/stack_recipe/cable_coil_recipes = list( new /datum/stack_recipe/cable_restraints("cable restraints", /obj/item/weapon/restraints/handcuffs/cable, 15), ) diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm index a3e9b82b722..b9f5b108f05 100644 --- a/code/modules/research/designs/equipment_designs.dm +++ b/code/modules/research/designs/equipment_designs.dm @@ -186,7 +186,7 @@ id = "handdrill" req_tech = list("materials" = 4, "engineering" = 6) build_type = PROTOLATHE - materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_GOLD = 1000) + materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500) build_path = /obj/item/weapon/screwdriver/power category = list("Equipment") @@ -197,7 +197,7 @@ req_tech = list("materials" = 4, "engineering" = 6, "magnets" = 6) // added one more requirment since the Jaws of Life are a bit OP build_path = /obj/item/weapon/crowbar/power build_type = PROTOLATHE - materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_DIAMOND = 1000) + materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500) category = list("Equipment") /datum/design/alienwrench @@ -207,7 +207,7 @@ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) build_path = /obj/item/weapon/wrench/abductor build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000) category = list("Equipment") /datum/design/alienwirecutters @@ -217,7 +217,7 @@ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) build_path = /obj/item/weapon/wirecutters/abductor build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000) category = list("Equipment") /datum/design/alienscrewdriver @@ -227,7 +227,7 @@ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) build_path = /obj/item/weapon/screwdriver/abductor build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000) category = list("Equipment") /datum/design/aliencrowbar @@ -237,7 +237,7 @@ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) build_path = /obj/item/weapon/crowbar/abductor build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000) category = list("Equipment") /datum/design/alienwelder @@ -247,7 +247,7 @@ req_tech = list("engineering" = 5, "plasmatech" = 5, "abductor" = 4) build_path = /obj/item/weapon/weldingtool/abductor build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000) category = list("Equipment") /datum/design/alienmultitool @@ -257,5 +257,5 @@ req_tech = list("engineering" = 5, "programming" = 5, "abductor" = 4) build_path = /obj/item/device/multitool/abductor build_type = PROTOLATHE - materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000) + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_TITANIUM = 2000, MAT_DIAMOND = 2000) category = list("Equipment") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 6054fd1f859..697b3e3abaf 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -318,7 +318,7 @@ id = "gygax_armor" build_type = MECHFAB build_path = /obj/item/mecha_parts/part/gygax_armour - materials = list(MAT_METAL=25000,MAT_DIAMOND=10000) + materials = list(MAT_METAL=15000,MAT_DIAMOND=10000,MAT_TITANIUM=10000) construction_time = 600 category = list("Gygax") @@ -391,7 +391,7 @@ id = "durand_armor" build_type = MECHFAB build_path = /obj/item/mecha_parts/part/durand_armor - materials = list(MAT_METAL=50000,MAT_URANIUM=30000) + materials = list(MAT_METAL=30000,MAT_URANIUM=25000,MAT_TITANIUM=20000) construction_time = 600 category = list("Durand") @@ -592,7 +592,7 @@ id = "phazon_armor" build_type = MECHFAB build_path = /obj/item/mecha_parts/part/phazon_armor - materials = list(MAT_METAL=45000,MAT_PLASMA=30000) + materials = list(MAT_METAL=25000,MAT_PLASMA=20000,MAT_TITANIUM=20000) construction_time = 300 category = list("Phazon") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 2a791e8c61a..cb73a0afe8c 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -192,7 +192,7 @@ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) build_path = /obj/item/weapon/scalpel/alien build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500) + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical") /datum/design/alienhemostat @@ -202,7 +202,7 @@ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) build_path = /obj/item/weapon/hemostat/alien build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500) + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical") /datum/design/alienretractor @@ -212,7 +212,7 @@ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) build_path = /obj/item/weapon/retractor/alien build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500) + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical") /datum/design/aliensaw @@ -222,7 +222,7 @@ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) build_path = /obj/item/weapon/circular_saw/alien build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_GOLD = 1000, MAT_PLASMA = 1000) + materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500) category = list("Medical") /datum/design/aliendrill @@ -232,7 +232,7 @@ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) build_path = /obj/item/weapon/surgicaldrill/alien build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_GOLD = 1000, MAT_PLASMA = 1000) + materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500) category = list("Medical") /datum/design/aliencautery @@ -242,7 +242,7 @@ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) build_path = /obj/item/weapon/cautery/alien build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500) + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical") ///////////////////////////////////////// diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index f1b361a4b5b..88fac1905da 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -52,7 +52,7 @@ id = "bluespace_cell" req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE | MECHFAB - materials = list(MAT_METAL = 800, MAT_GOLD = 300, MAT_SILVER = 300, MAT_GLASS = 160, MAT_DIAMOND = 160) + materials = list(MAT_METAL = 800, MAT_GOLD = 120, MAT_SILVER = 150, MAT_GLASS = 160, MAT_DIAMOND = 160, MAT_TITANIUM = 300) construction_time=100 build_path = /obj/item/weapon/stock_parts/cell/bluespace category = list("Misc","Power") diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index eb79a54b219..9c68127d0e1 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -203,7 +203,7 @@ id = "femto_mani" req_tech = list("materials" = 7, "programming" = 5, "engineering" = 5, "bluespace" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 200, MAT_DIAMOND = 60) + materials = list(MAT_METAL = 200, MAT_DIAMOND = 30, MAT_TITANIUM = 30) build_path = /obj/item/weapon/stock_parts/manipulator/femto category = list("Stock Parts") lathe_time_factor = 0.2 diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 1384e193f8b..0c880fb8484 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -8,7 +8,7 @@ id = "nuclear_gun" req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5) build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 4000) + materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 3000, MAT_TITANIUM = 1000) build_path = /obj/item/weapon/gun/energy/gun/nuclear locked = 1 category = list("Weapons") @@ -116,7 +116,7 @@ id = "tele_shield" req_tech = list("combat" = 4, "materials" = 3, "engineering" = 4) build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_GLASS = 5000, MAT_SILVER = 300) + materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200) build_path = /obj/item/weapon/shield/riot/tele category = list("Weapons") @@ -242,7 +242,7 @@ id = "xray" req_tech = list("combat" = 7, "magnets" = 5, "biotech" = 5, "powerstorage" = 4) build_type = PROTOLATHE - materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 5000) + materials = list(MAT_GOLD = 5000,MAT_URANIUM = 8000, MAT_METAL = 5000, MAT_TITANIUM = 2000) build_path = /obj/item/weapon/gun/energy/xray locked = 1 category = list("Weapons") diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index ad90dcce9f6..46355f144da 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -42,7 +42,7 @@ Note: Must be placed west/left of and R&D console to function. component_parts += new /obj/item/weapon/stock_parts/manipulator(null) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker/large(null) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker/large(null) - materials = new(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1, MAT_TRANQUILLITE=1)) + materials = new(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1, MAT_TRANQUILLITE=1, MAT_TITANIUM=1)) RefreshParts() reagents.my_atom = src diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 790819bd49b..ee499b8eac3 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -98,6 +98,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, return_name = "Bananium" if("mime") return_name = "Tranquillite" + if("titanium") + return_name = "Titanium" return return_name else for(var/R in subtypesof(/datum/reagent)) @@ -808,6 +810,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, materials_list[++materials_list.len] = list("name" = "Diamond", "id" = MAT_DIAMOND, "amount" = linked_lathe.materials.amount(MAT_DIAMOND)) materials_list[++materials_list.len] = list("name" = "Bananium", "id" = MAT_BANANIUM, "amount" = linked_lathe.materials.amount(MAT_BANANIUM)) materials_list[++materials_list.len] = list("name" = "Tranquillite", "id" = MAT_TRANQUILLITE, "amount" = linked_lathe.materials.amount(MAT_TRANQUILLITE)) + materials_list[++materials_list.len] = list("name" = "Titanium", "id" = MAT_TITANIUM, "amount" = linked_lathe.materials.amount(MAT_TITANIUM)) if(submenu == 3) var/list/loaded_chemicals = list() data["loaded_chemicals"] = loaded_chemicals diff --git a/code/modules/spacepods/construction.dm b/code/modules/spacepods/construction.dm index a997a23f585..080973b1f25 100644 --- a/code/modules/spacepods/construction.dm +++ b/code/modules/spacepods/construction.dm @@ -140,7 +140,7 @@ state_next = list( "key" = /obj/item/stack/sheet/metal, "amount" = 5, - "vis_msg" = "{USER} frabricates a pressure bulkhead for the {HOLDER}.", + "vis_msg" = "{USER} fabricates a pressure bulkhead for the {HOLDER}.", "self_msg" = "You frabricate a pressure bulkhead for the {HOLDER}." ) ), diff --git a/html/changelog.html b/html/changelog.html index d87a1f07b51..49b4f508c49 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,56 @@ -->
+

21 February 2018

+

uraniummeltdown updated:

+
    +
  • Added titanium and plastitanium. Mine the asteroid for titanium, make plastitanium by smelting together titanium and plasma
  • +
  • You can build shuttle floors and walls with titanium and plastitanium. Can also make shuttle airlocks by applying titanium to a non-mineral airlock
  • +
  • Shuttle windows have explosion resistance now
  • +
  • A few RnD recipes require titanium now
  • +
+ +

20 February 2018

+

Alffd updated:

+
    +
  • Reduce all atmospheric stuns by 80%
  • +
  • Cap the maximum atmospheric stun time to 4 seconds
  • +
+

Anasari updated:

+
    +
  • Add paperplane. Alt-click or use a verb on a piece of paper in your hand to make them.
  • +
+

Birdtalon updated:

+
    +
  • adds [time] tag for paperwork
  • +
+

Citinited updated:

+
    +
  • You can now roll up flags.
  • +
+

Fox McCloud updated:

+
    +
  • Adds in a Dance Machine
  • +
  • IEDs now have a blast radius again
  • +
  • Slap crafting of IEDs is gone; use personal crafting instead
  • +
+

HugoLuman updated:

+
    +
  • coughing and sneezing sounds for the Drask
  • +
+

MarcellusPye updated:

+
    +
  • Grays can now drink sulphuric acid without being burnt
  • +
+

Shazbot updated:

+
    +
  • Fixes Patch's patch
  • +
+

Tayyyyyyy, bryanayalalugo updated:

+
    +
  • News reporters can now add titles to their stories!
  • +
+

05 February 2018

IK3I updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f87bf7f13ab..1e4d6e4c7c7 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6051,3 +6051,34 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. uraniummeltdown: - bugfix: Multitile airlock opening/closing animation is no longer glitchy and paper/photos don't float in the air when opening/closing them +2018-02-20: + Alffd: + - tweak: Reduce all atmospheric stuns by 80% + - tweak: Cap the maximum atmospheric stun time to 4 seconds + Anasari: + - rscadd: Add paperplane. Alt-click or use a verb on a piece of paper in your hand + to make them. + Birdtalon: + - rscadd: adds [time] tag for paperwork + Citinited: + - tweak: You can now roll up flags. + Fox McCloud: + - rscadd: Adds in a Dance Machine + - tweak: IEDs now have a blast radius again + - tweak: Slap crafting of IEDs is gone; use personal crafting instead + HugoLuman: + - rscadd: coughing and sneezing sounds for the Drask + MarcellusPye: + - bugfix: Grays can now drink sulphuric acid without being burnt + Shazbot: + - bugfix: Fixes Patch's patch + Tayyyyyyy, bryanayalalugo: + - rscadd: News reporters can now add titles to their stories! +2018-02-21: + uraniummeltdown: + - rscadd: Added titanium and plastitanium. Mine the asteroid for titanium, make + plastitanium by smelting together titanium and plasma + - rscadd: You can build shuttle floors and walls with titanium and plastitanium. + Can also make shuttle airlocks by applying titanium to a non-mineral airlock + - tweak: Shuttle windows have explosion resistance now + - tweak: A few RnD recipes require titanium now diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index a7a8a11b111..a5195cc0167 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 12130e15e93..a5f810730fc 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi index fdd6a52144c..4927b69dc97 100644 Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index d371622ed23..008e7ae9ad2 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 9e0eb73a992..720fafd8847 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/flag.dmi b/icons/obj/flag.dmi index 8b7b2d4a517..309b1d38d87 100644 Binary files a/icons/obj/flag.dmi and b/icons/obj/flag.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index abf090ef440..c21be1a7ffe 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 484417b9e83..bf788f62bc5 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index 75211829f2f..b21738f2fed 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 1fabc78bdd0..29196e625ae 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/robotics.dmi b/icons/obj/robotics.dmi index 2e896133851..08d8675ff06 100644 Binary files a/icons/obj/robotics.dmi and b/icons/obj/robotics.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 67cc9682cf8..4d5fe2d875d 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index a7adf552d91..634b24d3eb5 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi index fb5d8fd62aa..d36db34304b 100644 Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ diff --git a/icons/turf/walls/plastitanium_wall.dmi b/icons/turf/walls/plastitanium_wall.dmi new file mode 100644 index 00000000000..4f556752c24 Binary files /dev/null and b/icons/turf/walls/plastitanium_wall.dmi differ diff --git a/icons/turf/walls/shuttle_wall.dmi b/icons/turf/walls/shuttle_wall.dmi new file mode 100644 index 00000000000..71166f3d7b6 Binary files /dev/null and b/icons/turf/walls/shuttle_wall.dmi differ diff --git a/nano/templates/newscaster.tmpl b/nano/templates/newscaster.tmpl index c589bde4702..16c201407e3 100644 --- a/nano/templates/newscaster.tmpl +++ b/nano/templates/newscaster.tmpl @@ -96,6 +96,13 @@ Property of Nanotrasen
    {{:helper.link('Edit', 'pencil', {'set_channel_receiving' : 1})}}
+
+
Title:
+
+ {{:data.title}} + {{:helper.link('Edit', 'pencil', {'set_message_title' : 1})}} +
+
Message body:
@@ -132,7 +139,8 @@ Property of Nanotrasen
{{else}} {{for data.messages}}
- - {{:value.body}}
+ {{:value.title}}
+ {{:value.body}}
{{if value.img}}
{{/if}} @@ -198,7 +206,8 @@ Property of Nanotrasen
{{:helper.link(data.author_redacted ? 'Undo author censorship' : 'Censor channel author', null, {'censor_channel_author' : data.ref})}}

{{for data.messages}}
- - {{:value.body}}
+ {{:value.title}}
+ {{:value.body}}
{{if value.img}}
{{/if}} @@ -217,7 +226,7 @@ Property of Nanotrasen
{{else data.screen == 9}} {{:data.channel_name}} [created by: {{:data.author}}]
- Channel messages listed below. If you deem them dangerous to the station, you can
{{:helper.link('Bestow a D-Notice upon the channel', null, {'toggle_d_notice' : data.ref})}}


+ Channel messages listed below. If you deem them dangerous to the station, you can
{{:helper.link(data.censored ? 'Remove the D-Notice on the channel' : 'Bestow a D-Notice upon the channel', null, {'toggle_d_notice' : data.ref})}}


{{if data.censored}}
ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice. @@ -226,7 +235,8 @@ Property of Nanotrasen
{{else}} {{for data.messages}}
- - {{:value.body}}
+ {{:value.title}}
+ {{:value.body}}
{{if value.img}}
{{/if}} diff --git a/paradise.dme b/paradise.dme index ddc3734a626..647a4081b4d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -216,6 +216,7 @@ #include "code\datums\mind.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" +#include "code\datums\mutable_appearance.dm" #include "code\datums\periodic_news.dm" #include "code\datums\progressbar.dm" #include "code\datums\recipe.dm" @@ -535,6 +536,7 @@ #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\cryo.dm" #include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\deployable.dm" #include "code\game\machinery\door_control.dm" #include "code\game\machinery\doppler_array.dm" @@ -1884,6 +1886,7 @@ #include "code\modules\paperwork\paper.dm" #include "code\modules\paperwork\paper_bundle.dm" #include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" #include "code\modules\paperwork\pen.dm" #include "code\modules\paperwork\photocopier.dm" #include "code\modules\paperwork\photography.dm" diff --git a/sound/AI/harmalarm.ogg b/sound/AI/harmalarm.ogg new file mode 100644 index 00000000000..b9107f6e44d Binary files /dev/null and b/sound/AI/harmalarm.ogg differ diff --git a/sound/machines/engine_alert1.ogg b/sound/machines/engine_alert1.ogg new file mode 100644 index 00000000000..fadec78891f Binary files /dev/null and b/sound/machines/engine_alert1.ogg differ diff --git a/sound/misc/boogie2.ogg b/sound/misc/boogie2.ogg new file mode 100644 index 00000000000..e9cdb973a21 Binary files /dev/null and b/sound/misc/boogie2.ogg differ diff --git a/sound/misc/compiler-failure.ogg b/sound/misc/compiler-failure.ogg new file mode 100644 index 00000000000..682e333bcb4 Binary files /dev/null and b/sound/misc/compiler-failure.ogg differ diff --git a/sound/misc/disco.ogg b/sound/misc/disco.ogg new file mode 100644 index 00000000000..5e15c8ccc01 Binary files /dev/null and b/sound/misc/disco.ogg differ diff --git a/sound/misc/paradox.ogg b/sound/misc/paradox.ogg new file mode 100644 index 00000000000..c28403578d5 Binary files /dev/null and b/sound/misc/paradox.ogg differ diff --git a/sound/voice/DraskCough.ogg b/sound/voice/DraskCough.ogg new file mode 100644 index 00000000000..55c876769c7 Binary files /dev/null and b/sound/voice/DraskCough.ogg differ diff --git a/sound/voice/DraskSneeze.ogg b/sound/voice/DraskSneeze.ogg new file mode 100644 index 00000000000..1f257a4e0ef Binary files /dev/null and b/sound/voice/DraskSneeze.ogg differ