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