diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index bfbd0a4ccb6..f5b3650c5bb 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -129,3 +129,11 @@
turf_type = /turf/simulated/floor/silent
mineralType = "tranquillite"
materials = list(MAT_TRANQUILLITE=500)
+
+//Pod floor
+/obj/item/stack/tile/pod
+ name = "pod floor tile"
+ singular_name = "pod floor tile"
+ desc = "A grooved floor tile."
+ icon_state = "tile_pod"
+ turf_type = /turf/simulated/floor/pod
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index 0b090581595..dcd32582046 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -1,16 +1,49 @@
-/obj/item/weapon/dice
- name = "d6"
+/obj/item/weapon/storage/pill_bottle/dice
+ name = "bag of dice"
+ desc = "Contains all the luck you'll ever need."
+ icon = 'icons/obj/dice.dmi'
+ icon_state = "dicebag"
+
+/obj/item/weapon/storage/pill_bottle/dice/New()
+ ..()
+ var/special_die = pick("1","2","fudge","00","100")
+ if(special_die == "1")
+ new /obj/item/weapon/dice/d1(src)
+ if(special_die == "2")
+ new /obj/item/weapon/dice/d2(src)
+ new /obj/item/weapon/dice/d4(src)
+ new /obj/item/weapon/dice/d6(src)
+ if(special_die == "fudge")
+ new /obj/item/weapon/dice/fudge(src)
+ new /obj/item/weapon/dice/d8(src)
+ new /obj/item/weapon/dice/d10(src)
+ if(special_die == "00")
+ new /obj/item/weapon/dice/d00(src)
+ new /obj/item/weapon/dice/d12(src)
+ new /obj/item/weapon/dice/d20(src)
+ if(special_die == "100")
+ new /obj/item/weapon/dice/d100(src)
+
+/obj/item/weapon/dice //depreciated d6, use /obj/item/weapon/dice/d6 if you actually want a d6
+ name = "die"
desc = "A die with six sides. Basic and servicable."
icon = 'icons/obj/dice.dmi'
icon_state = "d6"
w_class = 1
var/sides = 6
var/result = null
+ var/list/special_faces = list() //entries should match up to sides var if used
/obj/item/weapon/dice/New()
result = rand(1, sides)
update_icon()
+/obj/item/weapon/dice/d1
+ name = "d1"
+ desc = "A die with one side. Deterministic!"
+ icon_state = "d1"
+ sides = 1
+
/obj/item/weapon/dice/d2
name = "d2"
desc = "A die with two sides. Coins are undignified!"
@@ -23,6 +56,16 @@
icon_state = "d4"
sides = 4
+/obj/item/weapon/dice/d6
+ name = "d6"
+
+/obj/item/weapon/dice/fudge
+ name = "fudge die"
+ desc = "A die with six sides but only three results. Is this a plus or a minus? Your mind is drawing a blank..."
+ sides = 3 //shhh
+ icon_state = "fudge"
+ special_faces = list("minus","blank","plus")
+
/obj/item/weapon/dice/d8
name = "d8"
desc = "A die with eight sides. It feels... lucky."
@@ -53,6 +96,15 @@
icon_state = "d20"
sides = 20
+/obj/item/weapon/dice/d100
+ name = "d100"
+ desc = "A die with one hundred sides! Probably not fairly weighted..."
+ icon_state = "d100"
+ sides = 100
+
+/obj/item/weapon/dice/d100/update_icon()
+ return
+
/obj/item/weapon/dice/d20/e20
var/triggered = 0
@@ -64,8 +116,9 @@
return
diceroll(user)
-/obj/item/weapon/dice/proc/diceroll(mob/user as mob)
+/obj/item/weapon/dice/proc/diceroll(mob/user)
result = rand(1, sides)
+ var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be
var/comment = ""
if(sides == 20 && result == 20)
comment = "Nat 20!"
@@ -74,20 +127,20 @@
update_icon()
if(initial(icon_state) == "d00")
result = (result - 1)*10
+ if(special_faces.len == sides)
+ result = special_faces[result]
if(user != null) //Dice was rolled in someone's hand
- user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \
+ user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \
"You throw [src]. It lands on [result]. [comment]", \
- "You hear [src] landing on [result]. [comment]")
+ "You hear [src] rolling, it sounds like a [fake_result].")
else if(src.throwing == 0) //Dice was thrown and is coming to rest
visible_message("[src] rolls to a stop, landing on [result]. [comment]")
-/*
+
/obj/item/weapon/dice/d4/Crossed(var/mob/living/carbon/human/H)
if(istype(H) && !H.shoes)
to_chat(H, "You step on the D4!")
H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg")))
H.Weaken(3)
-*///ew.
-
/obj/item/weapon/dice/d20/e20/diceroll(mob/user as mob, thrown)
if(triggered)
@@ -112,6 +165,7 @@
/obj/item/weapon/dice/update_icon()
overlays.Cut()
overlays += "[src.icon_state][src.result]"
+
/obj/item/weapon/storage/box/dice
name = "Box of dice"
desc = "ANOTHER ONE!? FUCK!"
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 03ba6bed54b..67d44c53b2d 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -276,16 +276,6 @@
new /obj/item/weapon/reagent_containers/food/pill/charcoal( src )
new /obj/item/weapon/reagent_containers/food/pill/charcoal( src )
-/obj/item/weapon/storage/pill_bottle/dice
- name = "pack of dice"
- desc = "It's a small container with dice inside."
-
- New()
- ..()
- new /obj/item/weapon/dice( src )
- new /obj/item/weapon/dice/d20( src )
-
-
/obj/item/weapon/storage/pill_bottle/painkillers
name = "Pill Bottle (Salicylic Acid)"
desc = "Contains various pills for minor pain relief."
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index e774ef23924..c79f2aa4046 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -263,6 +263,268 @@
icon_state = "mobcap[colorindex]"
update_icon()
+/*****************************Survival Pod********************************/
+
+
+/area/survivalpod
+ name = "\improper Emergency Shelter"
+ icon_state = "away"
+ requires_power = 0
+ has_gravity = 1
+
+/obj/item/weapon/survivalcapsule
+ name = "bluespace shelter capsule"
+ desc = "An emergency shelter stored within a pocket of bluespace."
+ icon_state = "capsule"
+ icon = 'icons/obj/mining.dmi'
+ w_class = 1
+ var/used = FALSE
+
+/obj/item/weapon/survivalcapsule/attack_self()
+ if(used == FALSE)
+ loc.visible_message("[src] begins to shake. Stand back!")
+ used = TRUE
+ sleep(50)
+ var/turf/T = get_turf(src)
+ var/clear = TRUE
+ for(var/turf/turf in range(2, T))
+ if(turf.density && !istype(turf, /turf/simulated/mineral))
+ clear = FALSE
+ break
+ for(var/obj/obj in turf)
+ if(obj.density && obj.anchored)
+ clear = FALSE
+ break
+ if(!clear)
+ loc.visible_message("[src] doesn't have room to deploy! You need to clear a 5x5 area!")
+ used = FALSE
+ return
+ playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
+ if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level
+ message_admins("[key_name_admin(usr)] (?) (FLW) activated a bluespace capsule away from the mining level! (JMP)")
+ log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
+ load()
+ new /obj/effect/effect/smoke(loc)
+ qdel(src)
+
+/obj/item/weapon/survivalcapsule/proc/load()
+ var/list/blacklist = list(/area/shuttle) //Shuttles move based on area, and we'd like not to break them
+ var/turf/start_turf = get_turf(loc)
+ var/turf/cur_turf
+ var/x_size = 5
+ var/y_size = 5
+ var/list/walltypes = list(/turf/simulated/wall/survival)
+ var/floor_type = /turf/simulated/floor/pod
+ var/room
+
+ //Center the room/spawn it
+ start_turf = locate(start_turf.x -2, start_turf.y - 2, start_turf.z)
+
+ room = spawn_room(start_turf, x_size, y_size, walltypes, floor_type, "Emergency Shelter")
+
+ start_turf = get_turf(loc)
+
+ //Fill it
+
+ //The door
+ cur_turf = locate(start_turf.x, start_turf.y-2, start_turf.z)
+ new /obj/machinery/door/airlock/survival_pod(cur_turf)
+
+
+ //Bed middle right
+ cur_turf = locate(start_turf.x+1, start_turf.y, start_turf.z)
+ new /obj/structure/stool/bed/pod(cur_turf)
+ new /obj/item/weapon/bedsheet/brown(cur_turf)
+
+ //Chair bottom right
+ cur_turf = locate(start_turf.x+1, start_turf.y-1, start_turf.z)
+ new /obj/structure/tubes(cur_turf)
+ var/obj/structure/stool/bed/chair/comfy/black/C = new (cur_turf)
+ C.dir = 8
+
+ //GPS computer top right
+ cur_turf = locate(start_turf.x+1, start_turf.y+1, start_turf.z)
+ new /obj/item/device/gps/computer(cur_turf)
+
+ //Donk Pocket Storage Top/middle
+ cur_turf = locate(start_turf.x, start_turf.y+1, start_turf.z)
+ new /obj/machinery/smartfridge/survival_pod(cur_turf)
+
+ //Table in Bottom Left
+ cur_turf = locate(start_turf.x-1, start_turf.y-1, start_turf.z)
+ new /obj/structure/table/survival_pod(cur_turf)
+
+ //Sleeper Middle Left
+ cur_turf = locate(start_turf.x-1, start_turf.y, start_turf.z)
+ new /obj/machinery/sleeper/survival_pod(cur_turf)
+
+ //Fans Top Left
+ cur_turf = locate(start_turf.x-1, start_turf.y+1, start_turf.z)
+ new /obj/structure/fans(cur_turf)
+
+ //Signs
+ cur_turf = locate(start_turf.x-2, start_turf.y, start_turf.z)
+ var/obj/structure/sign/mining/survival/S1 = new(cur_turf)
+ S1.dir = EAST
+
+ cur_turf = locate(start_turf.x+2, start_turf.y, start_turf.z)
+ var/obj/structure/sign/mining/survival/S2 = new(cur_turf)
+ S2.dir = WEST
+
+ cur_turf = locate(start_turf.x, start_turf.y+2, start_turf.z)
+ var/obj/structure/sign/mining/survival/S3 = new(cur_turf)
+ S3.dir = NORTH
+
+ cur_turf = locate(start_turf.x-1, start_turf.y-2, start_turf.z)
+ var/obj/structure/sign/mining/survival/S4 = new(cur_turf)
+ S4.dir = SOUTH
+
+ cur_turf = locate(start_turf.x+1, start_turf.y-2, start_turf.z)
+ new /obj/structure/sign/mining(cur_turf)
+
+ var/area/survivalpod/L = new /area/survivalpod
+
+ var/turf/threshhold = locate(start_turf.x, start_turf.y-2, start_turf.z)
+ threshhold.ChangeTurf(/turf/simulated/floor/pod)
+ var/turf/simulated/floor/pod/doorturf = threshhold
+ air_master.remove_from_active(doorturf)
+ doorturf.oxygen = 21
+ doorturf.temperature = 293.15
+ doorturf.nitrogen = 82
+ doorturf.carbon_dioxide = 0
+ doorturf.toxins = 0
+ doorturf.air.oxygen = 21
+ doorturf.air.carbon_dioxide = 0
+ doorturf.air.nitrogen = 82
+ doorturf.air.toxins = 0
+ doorturf.air.temperature = 293.15
+ air_master.add_to_active(doorturf)
+ var/area/ZZ = get_area(threshhold)
+ if(!is_type_in_list(ZZ, blacklist))
+ L.contents += threshhold
+ threshhold.overlays.Cut()
+
+ new /obj/structure/fans/tiny(threshhold) //a tiny fan, to keep the air in.
+
+ var/list/turfs = room["floors"]
+ for(var/turf/simulated/floor/A in turfs)
+ air_master.remove_from_active(A)
+ A.oxygen = 21
+ A.temperature = 293.15
+ A.nitrogen = 82
+ A.carbon_dioxide = 0
+ A.toxins = 0
+ A.air.oxygen = 21
+ A.air.carbon_dioxide = 0
+ A.air.nitrogen = 82
+ A.air.toxins = 0
+ A.air.temperature = 293.15
+ air_master.add_to_active(A)
+ A.overlays.Cut()
+ var/area/Z = get_area(A)
+ if(!is_type_in_list(Z, blacklist))
+ L.contents += A
+
+//Pod turfs and objects
+
+
+//Floors
+/turf/simulated/floor/pod
+ name = "pod floor"
+ icon_state = "podfloor"
+ 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"
+ walltype = "shuttle"
+ smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support
+ canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod)
+
+//Door
+/obj/machinery/door/airlock/survival_pod
+ name = "Airlock"
+ icon = 'icons/obj/doors/survival.dmi'
+ assembly_type = /obj/structure/door_assembly/door_assembly_pod
+ opacity = 0
+ glass = 1
+
+/obj/structure/door_assembly/door_assembly_pod
+ base_icon_state = "survival_pod"
+ glass_type = "/survival_pod"
+
+//Table
+/obj/structure/table/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "table"
+ smooth = SMOOTH_FALSE
+
+//Sleeper
+/obj/machinery/sleeper/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "sleeper-open"
+ density = 0
+
+//Computer
+/obj/item/device/gps/computer
+ name = "pod computer"
+ icon_state = "pod_computer"
+ icon = 'icons/obj/lavaland/pod_computer.dmi'
+ anchored = 1
+ density = 1
+ pixel_y = -32
+
+/obj/item/device/gps/computer/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ user.visible_message("[user] disassembles the gps.", \
+ "You start to disassemble the gps...", "You hear clanking and banging noises.")
+ if(do_after(user, 20, target = src))
+ new /obj/item/device/gps(loc)
+ qdel(src)
+ return ..()
+
+/obj/item/device/gps/computer/attack_hand(mob/user)
+ attack_self(user)
+
+//Bed
+/obj/structure/stool/bed/pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "bed"
+
+//Survival Storage Unit
+/obj/machinery/smartfridge/survival_pod
+ name = "survival pod storage"
+ desc = "A heated storage unit."
+ icon_state = "donkvendor"
+ icon = 'icons/obj/lavaland/donkvendor.dmi'
+ icon_on = "donkvendor"
+ icon_off = "donkvendor"
+ light_range = 8
+ max_n_of_items = 10
+ pixel_y = -4
+
+/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
+ if(istype(O, /obj/item))
+ return 1
+ return 0
+
+/obj/machinery/smartfridge/survival_pod/New()
+ ..()
+ for(var/i in 1 to 5)
+ var/obj/item/weapon/reagent_containers/food/snacks/warmdonkpocket/W = new(src)
+ load(W)
+ if(prob(50))
+ var/obj/item/weapon/storage/pill_bottle/dice/D = new(src)
+ load(D)
+ else
+ var/obj/item/device/guitar/G = new(src)
+ load(G)
+
//Fans
/obj/structure/fans
icon = 'icons/obj/lavaland/survival_pod.dmi'
@@ -307,4 +569,26 @@
return ..()
/obj/structure/fans/CanAtmosPass(turf/T)
- return !arbitraryatmosblockingvar
\ No newline at end of file
+ return !arbitraryatmosblockingvar
+
+//Signs
+/obj/structure/sign/mining
+ name = "nanotrasen mining corps sign"
+ desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "ntpod"
+
+/obj/structure/sign/mining/survival
+ name = "shelter sign"
+ desc = "A high visibility sign designating a safe shelter."
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "survival"
+
+//Fluff
+/obj/structure/tubes
+ icon_state = "tubes"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ name = "tubes"
+ anchored = 1
+ layer = MOB_LAYER - 0.2
+ density = 0
\ No newline at end of file
diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi
index d1a2dde4550..9ec030df05e 100644
Binary files a/icons/obj/dice.dmi and b/icons/obj/dice.dmi differ
diff --git a/icons/obj/doors/door_assembly.dmi b/icons/obj/doors/door_assembly.dmi
index 2c927cb8047..232a54da317 100644
Binary files a/icons/obj/doors/door_assembly.dmi and b/icons/obj/doors/door_assembly.dmi differ
diff --git a/icons/obj/doors/survival.dmi b/icons/obj/doors/survival.dmi
new file mode 100644
index 00000000000..fcc10adaa17
Binary files /dev/null and b/icons/obj/doors/survival.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 863c25a7aee..d0c6f7591ac 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/lavaland/donkvendor.dmi b/icons/obj/lavaland/donkvendor.dmi
new file mode 100644
index 00000000000..0b78a5168e4
Binary files /dev/null and b/icons/obj/lavaland/donkvendor.dmi differ
diff --git a/icons/obj/lavaland/pod_computer.dmi b/icons/obj/lavaland/pod_computer.dmi
new file mode 100644
index 00000000000..8417cfb8802
Binary files /dev/null and b/icons/obj/lavaland/pod_computer.dmi differ
diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi
index 62aad7854d2..3895ac4d10e 100644
Binary files a/icons/obj/lavaland/survival_pod.dmi and b/icons/obj/lavaland/survival_pod.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index c39dbef36a8..ef7ea2ddac7 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 98e01f18cfa..cacec24168c 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/icons/turf/walls/survival_pod_walls.dmi b/icons/turf/walls/survival_pod_walls.dmi
new file mode 100644
index 00000000000..12dc44e9ea2
Binary files /dev/null and b/icons/turf/walls/survival_pod_walls.dmi differ