/* CONTAINS: SAFES FLOOR SAFES */ //SAFES /obj/structure/safe name = "safe" desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\"" icon = 'icons/obj/structures.dmi' icon_state = "safe" anchored = TRUE density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/open = FALSE //is the safe open? var/tumbler_1_pos //the tumbler position- from 0 to 72 var/tumbler_1_open //the tumbler position to open at- 0 to 72 var/tumbler_2_pos var/tumbler_2_open var/dial = 0 //where is the dial pointing? var/space = 0 //the combined w_class of everything in the safe var/maxspace = 24 //the maximum combined w_class of stuff in the safe /obj/structure/safe/New() ..() tumbler_1_pos = rand(0, 71) tumbler_1_open = rand(0, 71) tumbler_2_pos = rand(0, 71) tumbler_2_open = rand(0, 71) /obj/structure/safe/Initialize(mapload) . = ..() if(!mapload) return for(var/obj/item/I in loc) if(space >= maxspace) return if(I.w_class + space <= maxspace) space += I.w_class I.loc = src /obj/structure/safe/proc/check_unlocked(mob/user, canhear) if(user && canhear) if(tumbler_1_pos == tumbler_1_open) to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].") if(tumbler_2_pos == tumbler_2_open) to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].") if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open) if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!") return 1 return 0 /obj/structure/safe/proc/decrement(num) num -= 1 if(num < 0) num = 71 return num /obj/structure/safe/proc/increment(num) num += 1 if(num > 71) num = 0 return num /obj/structure/safe/update_icon() if(open) icon_state = "[initial(icon_state)]-open" else icon_state = initial(icon_state) /obj/structure/safe/attack_hand(mob/user) user.set_machine(src) var/dat = "
" dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" if(open) dat += "" for(var/i = contents.len, i>=1, i--) var/obj/item/P = contents[i] dat += "" dat += "
[P.name]
" user << browse("[name][dat]", "window=safe;size=350x300") /obj/structure/safe/Topic(href, href_list) if(!ishuman(usr)) return var/mob/living/carbon/human/user = usr var/canhear = 0 if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope)) canhear = 1 if(href_list["open"]) if(check_unlocked()) to_chat(user, "You [open ? "close" : "open"] [src].") open = !open update_icon() updateUsrDialog() return else to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!") return if(href_list["decrement"]) dial = decrement(dial) if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) tumbler_1_pos = decrement(tumbler_1_pos) if(canhear) to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35) tumbler_2_pos = decrement(tumbler_2_pos) if(canhear) to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") check_unlocked(user, canhear) updateUsrDialog() return if(href_list["increment"]) dial = increment(dial) if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71) tumbler_1_pos = increment(tumbler_1_pos) if(canhear) to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].") if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35) tumbler_2_pos = increment(tumbler_2_pos) if(canhear) to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].") check_unlocked(user, canhear) updateUsrDialog() return if(href_list["retrieve"]) user << browse("", "window=safe") // Close the menu var/obj/item/P = locate(href_list["retrieve"]) in src if(open) if(P && in_range(src, user)) user.put_in_hands(P) space -= P.w_class updateUsrDialog() /obj/structure/safe/attackby(obj/item/I, mob/user, params) if(open) . = 1 //no afterattack if(I.w_class + space <= maxspace) space += I.w_class if(!user.drop_item()) to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!") return I.forceMove(src) to_chat(user, "You put [I] in [src].") updateUsrDialog() return else to_chat(user, "[I] won't fit in [src].") return else if(istype(I, /obj/item/clothing/neck/stethoscope)) to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!") else return ..() /obj/structure/safe/handle_atom_del(atom/A) updateUsrDialog() /obj/structure/safe/blob_act(obj/structure/blob/B) return /obj/structure/safe/ex_act(severity, target) return //FLOOR SAFES /obj/structure/safe/floor name = "floor safe" icon_state = "floorsafe" density = FALSE level = 1 //underfloor layer = LOW_OBJ_LAYER /obj/structure/safe/floor/Initialize(mapload) . = ..() if(mapload) var/turf/T = loc hide(T.intact) /obj/structure/safe/floor/hide(var/intact) invisibility = intact ? INVISIBILITY_MAXIMUM : 0