"
+ 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 6c1ebccca14..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
@@ -481,9 +491,11 @@
//Terribly sorry for the code doubling, but things go derpy otherwise.
/obj/machinery/door/airlock/multi_tile
name = "large airlock"
+ dir = EAST
width = 2
icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi'
overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
+ note_overlay_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi'
assemblytype = "obj/structure/door_assembly/multi_tile"
/obj/machinery/door/airlock/multi_tile/narsie_act()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index ee18a81385b..842b08b577c 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -26,7 +26,6 @@
var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened.
//Multi-tile doors
- dir = EAST
var/width = 1
/obj/machinery/door/New()
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index 059c6268005..270d3a064e4 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -3,6 +3,7 @@
desc = "Heavy duty metal shutters that opens mechanically."
icon = 'icons/obj/doors/rapid_pdoor.dmi'
icon_state = "shutter1"
+ dir = EAST
/obj/machinery/door/poddoor/shutters/New()
..()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 32c03d22dcd..b9910e00997 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -6,6 +6,7 @@
visible = 0.0
flags = ON_BORDER
opacity = 0
+ dir = EAST
var/obj/item/weapon/airlock_electronics/electronics = null
var/base_state = "left"
var/health = 150.0 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file
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/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index d2b6bf9ccd1..ccfe2a47c22 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -370,6 +370,7 @@ var/global/list/datum/stack_recipe/plastic_recipes = list ( \
new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic spork", /obj/item/weapon/kitchen/utensil/pspork, 1, on_floor = 1), \
new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \
new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
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/toys.dm b/code/game/objects/items/toys.dm
index 2c23c6ae2b0..4979b94eb92 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -209,6 +209,7 @@
force_wielded = 0
origin_tech = null
attack_verb = list("attacked", "struck", "hit")
+ brightness_on = 0
/obj/item/weapon/twohanded/dualsaber/toy/hit_reaction()
return 0
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/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 0b7850bba1f..24bcb7a8c2c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -29,7 +29,7 @@
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(!(H.get_organ("l_hand") || H.get_organ("r_hand")))
+ if(!H.has_left_hand() || !H.has_right_hand())
to_chat(user, "
How do you suggest handcuffing someone with no hands?")
return
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 4bf40a3ae15..c2067935ee6 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -82,6 +82,18 @@
icon_state = "pspoon"
attack_verb = list("attacked", "poked")
+/obj/item/weapon/kitchen/utensil/spork
+ name = "spork"
+ desc = "It's a spork. Marvel at its innovative design."
+ icon_state = "spork"
+ attack_verb = list("attacked", "sporked")
+
+/obj/item/weapon/kitchen/utensil/pspork
+ name = "plastic spork"
+ desc = "It's a plastic spork. It's the fork side of the spoon!"
+ icon_state = "pspork"
+ attack_verb = list("attacked", "sporked")
+
/*
* Knives
*/
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
index 21845a47515..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)
@@ -127,7 +113,7 @@
H.apply_damage(trap_damage, BRUTE,"chest")
else
H.apply_damage(trap_damage, BRUTE,(pick("l_leg", "r_leg")))
- if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs.
+ if(!H.legcuffed && H.get_num_legs() >= 2) //beartrap can't cuff you leg if there's already a beartrap or legcuffs.
H.legcuffed = src
forceMove(H)
H.update_inv_legcuffed()
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 1c4ff92708a..16b8d302c7f 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -9,7 +9,10 @@
hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave
usesound = 'sound/weapons/blade1.ogg'
toolspeed = 1
-
+ light_power = 2
+ var/brightness_on = 2
+ var/colormap = list(red=LIGHT_COLOR_RED, blue=LIGHT_COLOR_LIGHTBLUE, green=LIGHT_COLOR_GREEN, purple=LIGHT_COLOR_PURPLE, rainbow=LIGHT_COLOR_WHITE)
+
/obj/item/weapon/melee/energy/suicide_act(mob/user)
user.visible_message(pick("
[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.", \
"
[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."))
@@ -29,8 +32,10 @@
attack_verb = attack_verb_on
if(!item_color)
icon_state = icon_state_on
+ set_light(brightness_on)
else
icon_state = "sword[item_color]"
+ set_light(brightness_on, l_color=colormap[item_color])
w_class = w_class_on
playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
to_chat(user, "
[src] is now active.")
@@ -44,6 +49,7 @@
icon_state = initial(icon_state)
w_class = initial(w_class)
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
+ set_light(0)
to_chat(user, "
[src] can now be concealed.")
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -71,6 +77,7 @@
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
attack_verb_on = list()
sharp = 1
+ light_color = LIGHT_COLOR_WHITE
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
user.visible_message("
[user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide.")
@@ -92,7 +99,6 @@
block_chance = 50
sharp = 1
var/hacked = 0
- var/blade_color
/obj/item/weapon/melee/energy/sword/New()
if(item_color == null)
@@ -129,6 +135,7 @@
hitcost = 75 //Costs more than a standard cyborg esword
item_color = null
w_class = WEIGHT_CLASS_NORMAL
+ light_color = LIGHT_COLOR_WHITE
/obj/item/weapon/melee/energy/sword/cyborg/saw/New()
..()
@@ -192,6 +199,7 @@
desc = "Arrrr matey."
icon_state = "cutlass0"
icon_state_on = "cutlass1"
+ light_color = LIGHT_COLOR_RED
/obj/item/weapon/melee/energy/sword/pirate/New()
return
@@ -224,4 +232,4 @@
name = "hardlight blade"
desc = "An extremely sharp blade made out of hard light. Packs quite a punch."
icon_state = "lightblade"
- item_state = "lightblade"
\ No newline at end of file
+ item_state = "lightblade"
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/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 5d1755dc9d3..96628da9a26 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -208,15 +208,21 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 75
sharp = 1
+ light_power = 2
+ var/brightness_on = 2
+ var/colormap = list(red=LIGHT_COLOR_RED, blue=LIGHT_COLOR_LIGHTBLUE, green=LIGHT_COLOR_GREEN, purple=LIGHT_COLOR_PURPLE, rainbow=LIGHT_COLOR_WHITE)
/obj/item/weapon/twohanded/dualsaber/New()
- blade_color = pick("red", "blue", "green", "purple")
+ if(!blade_color)
+ blade_color = pick("red", "blue", "green", "purple")
/obj/item/weapon/twohanded/dualsaber/update_icon()
if(wielded)
icon_state = "dualsaber[blade_color][wielded]"
+ set_light(brightness_on, l_color=colormap[blade_color])
else
icon_state = "dualsaber0"
+ set_light(0)
/obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
if(HULK in user.mutations)
@@ -239,16 +245,16 @@
return ..()
return 0
-/obj/item/weapon/twohanded/dualsaber/green/New()
+/obj/item/weapon/twohanded/dualsaber/green
blade_color = "green"
-/obj/item/weapon/twohanded/dualsaber/red/New()
+/obj/item/weapon/twohanded/dualsaber/red
blade_color = "red"
-/obj/item/weapon/twohanded/dualsaber/purple/New()
+/obj/item/weapon/twohanded/dualsaber/purple
blade_color = "purple"
-/obj/item/weapon/twohanded/dualsaber/blue/New()
+/obj/item/weapon/twohanded/dualsaber/blue
blade_color = "blue"
/obj/item/weapon/twohanded/dualsaber/unwield()
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/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 8e148d75eb5..9c8624df444 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -39,9 +39,7 @@
if(ishuman(buckled_mob))
var/mob/living/carbon/human/driver = user
- var/obj/item/organ/external/l_hand = driver.get_organ("l_hand")
- var/obj/item/organ/external/r_hand = driver.get_organ("r_hand")
- if(!l_hand && !r_hand)
+ if(!driver.has_left_hand() && !driver.has_right_hand())
return 0 // No hands to drive your chair? Tough luck!
for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm"))
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/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 0b5b2171f86..f80a58f7fba 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -43,6 +43,9 @@
/obj/item/weapon/reagent_containers/food/drinks/MouseDrop(atom/over_object) //CHUG! CHUG! CHUG!
var/mob/living/carbon/chugger = over_object
+ if (!(flags & OPENCONTAINER))
+ to_chat(chugger, "
You need to open [src] first!")
+ return
if(istype(chugger) && loc == chugger && src == chugger.get_active_hand() && reagents.total_volume)
chugger.visible_message("
[chugger] raises the [src] to their mouth and starts [pick("chugging","gulping")] it down like [pick("a savage","a mad beast","it's going out of style","there's no tomorrow")]!", "
You start chugging \the [src].", "
You hear what sounds like gulping.")
while(do_mob(chugger, chugger, 40)) //Between the default time for do_mob and the time it takes for a vampire to suck blood.
diff --git a/code/modules/holiday/holiday.dm b/code/modules/holiday/holiday.dm
index 85162a75c2d..414df7f7589 100644
--- a/code/modules/holiday/holiday.dm
+++ b/code/modules/holiday/holiday.dm
@@ -349,10 +349,8 @@
holiday_master.holidays = list()
holiday_master.holidays[H.name] = H
- station_name = null
- station_name()
//update our hub status
world.update_status()
message_admins("
ADMIN: Event: [key_name_admin(src)] force-set Holiday to \"[H]\"")
- log_admin("[key_name(src)] force-set Holiday to \"[H]\"")
\ No newline at end of file
+ log_admin("[key_name(src)] force-set Holiday to \"[H]\"")
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/human.dm b/code/modules/mob/living/carbon/human/human.dm
index dad8fae62f7..27aa1d6b4da 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1800,7 +1800,10 @@
..()
/mob/living/carbon/human/canBeHandcuffed()
- return 1
+ if(get_num_arms() >= 2)
+ return TRUE
+ else
+ return FALSE
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
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/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 9d9f0ed0c11..461b5193b69 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -108,18 +108,6 @@
health = Clamp(health, 0, maxHealth)
med_hud_set_status()
-/mob/living/simple_animal/handle_hud_icons_health()
- ..()
- if(healths && maxHealth > 0)
- switch(health / maxHealth * 30)
- if(30 to INFINITY) healths.icon_state = "health0"
- if(26 to 29) healths.icon_state = "health1"
- if(21 to 25) healths.icon_state = "health2"
- if(16 to 20) healths.icon_state = "health3"
- if(11 to 15) healths.icon_state = "health4"
- if(6 to 10) healths.icon_state = "health5"
- if(1 to 5) healths.icon_state = "health6"
- if(0) healths.icon_state = "health7"
/mob/living/simple_animal/proc/process_ai()
handle_automated_movement()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index b33413d115c..ec416a14a74 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -17,26 +17,29 @@
//The byond version of these verbs wait for the next tick before acting.
// instant verbs however can run mid tick or even during the time between ticks.
+#define DO_MOVE(this_dir) var/final_dir = turn(this_dir, -dir2angle(dir)); Move(get_step(mob, final_dir), final_dir);
+
/client/verb/moveup()
set name = ".moveup"
set instant = 1
- Move(get_step(mob, NORTH), NORTH)
+ DO_MOVE(NORTH)
/client/verb/movedown()
set name = ".movedown"
set instant = 1
- Move(get_step(mob, SOUTH), SOUTH)
+ DO_MOVE(SOUTH)
/client/verb/moveright()
set name = ".moveright"
set instant = 1
- Move(get_step(mob, EAST), EAST)
+ DO_MOVE(EAST)
/client/verb/moveleft()
set name = ".moveleft"
set instant = 1
- Move(get_step(mob, WEST), WEST)
+ DO_MOVE(WEST)
+#undef DO_MOVE
/client/Northeast()
swap_hand()
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.