#define BOOKCASE_UNANCHORED 0
#define BOOKCASE_ANCHORED 1
#define BOOKCASE_FINISHED 2
/obj/structure/bookcase
name = "bookcase"
icon = 'icons/obj/service/library.dmi'
icon_state = "bookempty"
desc = "A great place for storing knowledge."
anchored = FALSE
density = TRUE
opacity = FALSE
resistance_flags = FLAMMABLE
max_integrity = 200
armor_type = /datum/armor/structure_bookcase
var/state = BOOKCASE_UNANCHORED
/// When enabled, books_to_load number of random books will be generated for this bookcase
var/load_random_books = FALSE
/// The category of books to pick from when populating random books.
var/random_category = null
/// How many random books to generate.
var/books_to_load = 0
/datum/armor/structure_bookcase
fire = 50
/obj/structure/bookcase/Initialize(mapload)
. = ..()
if(!mapload || QDELETED(src))
return
// Only mapload from here on
set_anchored(TRUE)
state = BOOKCASE_FINISHED
for(var/obj/item/I in loc)
if(!isbook(I))
continue
I.forceMove(src)
update_appearance()
if(SSlibrary.initialized)
INVOKE_ASYNC(src, PROC_REF(load_shelf))
else
SSlibrary.shelves_to_load += src
///proc for doing things after a bookcase is randomly populated
/obj/structure/bookcase/proc/after_random_load()
return
///Loads the shelf, both by allowing it to generate random items, and by adding its contents to a list used by library machines
/obj/structure/bookcase/proc/load_shelf()
//Loads a random selection of books in from the db, adds a copy of their info to a global list
//To send to library consoles as a starting inventory
if(load_random_books)
create_random_books(books_to_load, src, FALSE, random_category)
after_random_load()
update_appearance() //Make sure you look proper
var/area/our_area = get_area(src)
var/area_type = our_area.type //Save me from the dark
if(!SSlibrary.books_by_area[area_type])
SSlibrary.books_by_area[area_type] = list()
//Time to populate that list
var/list/books_in_area = SSlibrary.books_by_area[area_type]
for(var/obj/item/book/book in contents)
var/datum/book_info/info = book.book_data
books_in_area += info.return_copy()
/obj/structure/bookcase/examine(mob/user)
. = ..()
if(!anchored)
. += span_notice("The bolts on the bottom are unsecured.")
else
. += span_notice("It's secured in place with bolts.")
switch(state)
if(BOOKCASE_UNANCHORED)
. += span_notice("There's a small crack visible on the back panel.")
if(BOOKCASE_ANCHORED)
. += span_notice("There's space inside for a wooden shelf.")
if(BOOKCASE_FINISHED)
. += span_notice("There's a small crack visible on the shelf.")
/obj/structure/bookcase/set_anchored(anchorvalue)
. = ..()
if(isnull(.))
return
state = anchorvalue
if(!anchorvalue) //in case we were vareditted or uprooted by a hostile mob, ensure we drop all our books instead of having them disappear till we're rebuild.
var/atom/Tsec = drop_location()
for(var/obj/I in contents)
if(!isbook(I))
continue
I.forceMove(Tsec)
update_appearance()
/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, params)
if(state == BOOKCASE_UNANCHORED)
if(attacking_item.tool_behaviour == TOOL_WRENCH)
if(attacking_item.use_tool(src, user, 20, volume=50))
balloon_alert(user, "wrenched in place")
set_anchored(TRUE)
return
if(attacking_item.tool_behaviour == TOOL_CROWBAR)
if(attacking_item.use_tool(src, user, 20, volume=50))
balloon_alert(user, "pried apart")
deconstruct(TRUE)
return
return ..()
if(state == BOOKCASE_ANCHORED)
if(istype(attacking_item, /obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/sheet/mineral/wood/W = attacking_item
if(W.get_amount() < 2)
balloon_alert(user, "not enough wood")
return
W.use(2)
balloon_alert(user, "shelf added")
state = BOOKCASE_FINISHED
update_appearance()
return
if(attacking_item.tool_behaviour == TOOL_WRENCH)
attacking_item.play_tool_sound(src, 100)
balloon_alert(user, "unwrenched the frame")
set_anchored(FALSE)
return
return ..()
if(isbook(attacking_item))
if(!user.transferItemToLoc(attacking_item, src))
return ..()
update_appearance()
return
if(atom_storage)
var/found_anything = FALSE
for(var/obj/item/T in attacking_item.contents)
if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook))
atom_storage.attempt_remove(T, src)
found_anything = TRUE
if (found_anything)
balloon_alert(user, "emptied into [src]")
update_appearance()
return
if(IS_WRITING_UTENSIL(attacking_item))
if(!user.can_perform_action(src) || !user.can_write(attacking_item))
return ..()
var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN)
if(!user.can_perform_action(src) || !user.can_write(attacking_item))
return ..()
if(!newname)
return
name = "bookcase ([sanitize(newname)])"
return
if(attacking_item.tool_behaviour == TOOL_CROWBAR)
if(length(contents))
balloon_alert(user, "remove the books first")
return
attacking_item.play_tool_sound(src, 100)
balloon_alert(user, "pried the shelf out")
new /obj/item/stack/sheet/mineral/wood(drop_location(), 2)
state = BOOKCASE_ANCHORED
update_appearance()
return
return ..()
/obj/structure/bookcase/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(.)
return
if(!istype(user))
return
if(!length(contents))
return
var/obj/item/book/choice = tgui_input_list(user, "Book to remove from the shelf", "Remove Book", sort_names(contents.Copy()))
if(isnull(choice))
return
if(!(user.mobility_flags & MOBILITY_USE) || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !in_range(loc, user))
return
if(ishuman(user))
if(!user.get_active_held_item())
user.put_in_hands(choice)
else
choice.forceMove(drop_location())
update_appearance()
/obj/structure/bookcase/atom_deconstruct(disassembled = TRUE)
var/atom/Tsec = drop_location()
new /obj/item/stack/sheet/mineral/wood(Tsec, 4)
for(var/obj/item/I in contents)
if(!isbook(I)) //Wake me up inside
continue
I.forceMove(Tsec)
/obj/structure/bookcase/update_icon_state()
if(state == BOOKCASE_UNANCHORED || state == BOOKCASE_ANCHORED)
icon_state = "bookempty"
return ..()
var/amount = length(contents)
icon_state = "book-[clamp(amount, 0, 5)]"
return ..()
/obj/structure/bookcase/manuals/engineering
name = "engineering manuals bookcase"
/obj/structure/bookcase/manuals/engineering/Initialize(mapload)
. = ..()
new /obj/item/book/manual/wiki/engineering_construction(src)
new /obj/item/book/manual/wiki/engineering_hacking(src)
new /obj/item/book/manual/wiki/engineering_guide(src)
new /obj/item/book/manual/wiki/robotics_cyborgs(src)
update_appearance()
/obj/structure/bookcase/manuals/research_and_development
name = "\improper R&D manuals bookcase"
/obj/structure/bookcase/manuals/research_and_development/Initialize(mapload)
. = ..()
new /obj/item/book/manual/wiki/research_and_development(src)
update_appearance()
#undef BOOKCASE_UNANCHORED
#undef BOOKCASE_ANCHORED
#undef BOOKCASE_FINISHED