/* Library Items * * Contains: * Bookcase * Book * Barcode Scanner */ /* * Bookcase */ /obj/structure/bookcase name = "bookcase" icon = 'icons/obj/library.dmi' icon_state = "bookempty" anchored = 0 density = 1 opacity = 0 var/state = 0 /obj/structure/bookcase/initialize() state = 2 icon_state = "book-0" anchored = 1 for(var/obj/item/I in loc) if(istype(I, /obj/item/weapon/book)) I.loc = src update_icon() /obj/structure/bookcase/attackby(obj/item/I, mob/user) switch(state) if(0) if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) if(do_after(user, 20)) user << "You wrench the frame into place." anchored = 1 state = 1 if(istype(I, /obj/item/weapon/crowbar)) playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 20)) user << "You pry the frame apart." new /obj/item/stack/sheet/mineral/wood(loc, 4) qdel(src) if(1) if(istype(I, /obj/item/stack/sheet/mineral/wood)) var/obj/item/stack/sheet/mineral/wood/W = I if(W.get_amount() >= 2) W.use(2) user << "You add a shelf." state = 2 icon_state = "book-0" if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) user << "You unwrench the frame." anchored = 0 state = 0 if(2) if(istype(I, /obj/item/weapon/book) || istype(I, /obj/item/weapon/spellbook)) user.drop_item() I.loc = src update_icon() else if(istype(I, /obj/item/weapon/storage/bag/books)) var/obj/item/weapon/storage/bag/books/B = I for(var/obj/item/T in B.contents) if(istype(T, /obj/item/weapon/book) || istype(T, /obj/item/weapon/spellbook)) B.remove_from_storage(T, src) user << "You empty \the [I] into \the [src]." update_icon() else if(istype(I, /obj/item/weapon/pen)) var/newname = stripped_input(usr, "What would you like to title this bookshelf?") if(!newname) return else name = ("bookcase ([sanitize(newname)])") else if(istype(I, /obj/item/weapon/crowbar)) if(contents.len) user << "You need to remove the books first." else playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) user << "You pry the shelf out." new /obj/item/stack/sheet/mineral/wood(loc, 2) state = 1 icon_state = "bookempty" else ..() /obj/structure/bookcase/attack_hand(mob/user) if(contents.len) var/obj/item/weapon/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) return if(ishuman(user)) if(!user.get_active_hand()) user.put_in_hands(choice) else choice.loc = get_turf(src) update_icon() /obj/structure/bookcase/ex_act(severity, target) ..() if(!gc_destroyed) for(var/obj/item/weapon/book/b in contents) b.loc = (get_turf(src)) if(prob(50)) qdel(src) /obj/structure/bookcase/update_icon() if(contents.len < 5) icon_state = "book-[contents.len]" else icon_state = "book-5" /obj/structure/bookcase/manuals/medical name = "medical manuals bookcase" /obj/structure/bookcase/manuals/medical/New() ..() new /obj/item/weapon/book/manual/medical_cloning(src) update_icon() /obj/structure/bookcase/manuals/engineering name = "engineering manuals bookcase" /obj/structure/bookcase/manuals/engineering/New() ..() new /obj/item/weapon/book/manual/wiki/engineering_construction(src) new /obj/item/weapon/book/manual/engineering_particle_accelerator(src) new /obj/item/weapon/book/manual/wiki/engineering_hacking(src) new /obj/item/weapon/book/manual/wiki/engineering_guide(src) new /obj/item/weapon/book/manual/engineering_singularity_safety(src) new /obj/item/weapon/book/manual/robotics_cyborgs(src) update_icon() /obj/structure/bookcase/manuals/research_and_development name = "\improper R&D manuals bookcase" /obj/structure/bookcase/manuals/research_and_development/New() ..() new /obj/item/weapon/book/manual/research_and_development(src) update_icon() /* * Book */ /obj/item/weapon/book name = "book" icon = 'icons/obj/library.dmi' icon_state ="book" throw_speed = 1 throw_range = 5 w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") var/dat //Actual page content var/due_date = 0 //Game time in 1/10th seconds var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned var/unique = 0 //0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified var/title //The real name of the book. var/window_size = null // Specific window size for the book, i.e: "1920x1080", Size x Width /obj/item/weapon/book/attack_self(mob/user) if(is_blind(user)) return if(ismonkey(user)) user << "You skim through the book but can't comprehend any of it." return if(dat) user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]") user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") onclose(user, "book") else user << "This book is completely blank!" /obj/item/weapon/book/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/pen)) if(is_blind(user)) return if(unique) user << "These pages don't seem to take the ink well. Looks like you can't modify it." return var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") switch(choice) if("Title") var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:")) if(!newtitle) usr << "The title is invalid." return else name = newtitle title = newtitle if("Contents") var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192) if(!content) usr << "The content is invalid." return else dat += content if("Author") var/newauthor = stripped_input(usr, "Write the author's name:") if(!newauthor) usr << "The name is invalid." return else author = newauthor else return else if(istype(I, /obj/item/weapon/barcodescanner)) var/obj/item/weapon/barcodescanner/scanner = I if(!scanner.computer) user << "[I]'s screen flashes: 'No associated computer found!'" else switch(scanner.mode) if(0) scanner.book = src user << "[I]'s screen flashes: 'Book stored in buffer.'" if(1) scanner.book = src scanner.computer.buffer_book = name user << "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'" if(2) scanner.book = src for(var/datum/borrowbook/b in scanner.computer.checkouts) if(b.bookname == name) scanner.computer.checkouts.Remove(b) user << "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'" return user << "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'" if(3) scanner.book = src for(var/obj/item/weapon/book in scanner.computer.inventory) if(book == src) user << "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'" return scanner.computer.inventory.Add(src) user << "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'" else if(istype(I, /obj/item/weapon/kitchenknife) || istype(I, /obj/item/weapon/wirecutters)) user << "You begin to carve out [title]." if(do_after(user, 30)) user << "You carve out the pages from [title]! You didn't want to read it anyway." var/obj/item/weapon/storage/book/B = new B.name = src.name B.title = src.title B.icon_state = src.icon_state if(user.l_hand == src || user.r_hand == src) qdel(src) user.put_in_hands(B) return else B.loc = src.loc qdel(src) return return else ..() /* * Barcode Scanner */ /obj/item/weapon/barcodescanner name = "barcode scanner" icon = 'icons/obj/library.dmi' icon_state ="scanner" throw_speed = 3 throw_range = 5 w_class = 1.0 var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this var/obj/item/weapon/book/book //Currently scanned book var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory /obj/item/weapon/barcodescanner/attack_self(mob/user) mode += 1 if(mode > 3) mode = 0 user << "[src] Status Display:" var/modedesc switch(mode) if(0) modedesc = "Scan book to local buffer." if(1) modedesc = "Scan book to local buffer and set associated computer buffer to match." if(2) modedesc = "Scan book to local buffer, attempt to check in scanned book." if(3) modedesc = "Scan book to local buffer, attempt to add book to general inventory." else modedesc = "ERROR" user << " - Mode [mode] : [modedesc]" if(computer) user << "Computer has been associated with this unit." else user << "No associated computer found. Only local scans will function properly." user << "\n"