diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index c0dc87b1c0d..cf9d38a6b4b 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -517,19 +517,13 @@
hud_used.item_action_list = list()
for(var/obj/item/I in src)
- if(istype(I,/obj/item/clothing/under))
- var/obj/item/clothing/under/U = I
- if(U.hastie)
- I = U.hastie
if(I.icon_action_button)
var/obj/screen/item_action/A = new(hud_used)
-
+
//A.icon = 'icons/mob/screen1_action.dmi'
//A.icon_state = I.icon_action_button
-
A.icon = ui_style2icon(client.prefs.UI_style)
A.icon_state = "template"
-
var/image/img = image(I.icon, A, I.icon_state)
img.pixel_x = 0
img.pixel_y = 0
@@ -540,9 +534,7 @@
else
A.name = "Use [I.name]"
A.owner = I
-
hud_used.item_action_list += A
-
switch(num)
if(1)
A.screen_loc = ui_action_slot1
@@ -566,4 +558,4 @@
A.screen_loc = ui_action_slot10
break //5 slots available, so no more can be added.
num++
- src.client.screen += src.hud_used.item_action_list
+ src.client.screen += src.hud_used.item_action_list
\ No newline at end of file
diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm
index c19cb43be7b..8ad7042e959 100644
--- a/code/datums/spells/mind_transfer.dm
+++ b/code/datums/spells/mind_transfer.dm
@@ -10,7 +10,6 @@
range = 1
cooldown_min = 200 //100 deciseconds reduction per rank
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
- var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer
@@ -18,8 +17,6 @@
var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell
var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell
- icon_power_button = "spell_mind"
-
/*
Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do.
Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering.
@@ -40,12 +37,8 @@ Also, you never added distance checking after target is selected. I've went ahea
user << "They are too far away!"
return
- if(!(target.type in compatible_mobs))
- user << "Their mind isn't compatible with yours."
- return
-
if(target.stat == DEAD)
- user << "You didn't study necromancy back at the Space Wizard Federation academy."
+ user << "You don't particularly want to be dead."
return
if(!target.key || !target.mind)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 2cf5b94c1df..f79374021d3 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -685,7 +685,7 @@ var/list/datum/dna/hivemind_bank = list()
/mob/proc/changeling_hivedownload()
set category = "Changeling"
set name = "Hive Absorb (20)"
- set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
+ set desc = "Allows you to absorb DNA that is being channelled in the airwaves."
var/datum/changeling/changeling = changeling_power(20,1)
if(!changeling) return
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 0d361ca233c..efb7538cdb0 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -406,6 +406,7 @@
spellname = "mindswap"
icon_state ="bookmindswap"
desc = "This book's cover is pristine, though its pages look ragged and torn."
+ var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps
/obj/item/weapon/spellbook/oneuse/mindswap/onlearned()
spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge")
@@ -415,8 +416,45 @@
/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user as mob)
..()
- user <<"You suddenly don't feel like yourself!"
- wabbajack(user)
+ if(stored_swap in dead_mob_list)
+ stored_swap = null
+ if(!stored_swap)
+ stored_swap = user
+ user <<"For a moment you feel like you don't even know who you are anymore."
+ return
+ if(stored_swap == user)
+ user <<"You stare at the book some more, but there doesn't seem to be anything else to learn..."
+ return
+
+ if(user.mind.special_verbs.len)
+ for(var/V in user.mind.special_verbs)
+ user.verbs -= V
+
+ if(stored_swap.mind.special_verbs.len)
+ for(var/V in stored_swap.mind.special_verbs)
+ stored_swap.verbs -= V
+
+ var/mob/dead/observer/ghost = stored_swap.ghostize(0)
+ ghost.spell_list = stored_swap.spell_list
+
+ user.mind.transfer_to(stored_swap)
+ stored_swap.spell_list = user.spell_list
+
+ if(stored_swap.mind.special_verbs.len)
+ for(var/V in user.mind.special_verbs)
+ user.verbs += V
+
+ ghost.mind.transfer_to(user)
+ user.key = ghost.key
+ user.spell_list = ghost.spell_list
+
+ if(user.mind.special_verbs.len)
+ for(var/V in user.mind.special_verbs)
+ user.verbs += V
+
+ stored_swap <<"You're suddenly somewhere else... and someone else?!"
+ user <<"Suddenly you're staring at [src] again... where are you, who are you?!"
+ stored_swap = null
/obj/item/weapon/spellbook/oneuse/forcewall
spell = /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/forcewall
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 94e3e75a1ea..f834719c9e0 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -10,6 +10,7 @@
var/processing = 0
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/points = 0
+ var/in_beaker = 1
var/menustat = "menu"
var/efficiency = 0
var/productivity = 0
@@ -137,11 +138,12 @@
menustat = "menu"
if(beaker)
dat += "
Biomass: [points] units.
"
- dat += "ActivateDetach Container"
+ dat += "ActivateDetach Container
"
+ dat += "Put fertilizer in: [in_beaker ? "Beaker" : "Bottle"]"
dat += "Food:
"
dat += ""
dat += "10 milk:
Make ([20/efficiency])
"
- /*dat += "10 cream:
Make ([30/efficiency])
"*/
+ dat += "10 cream:
Make ([30/efficiency])
"
dat += "Monkey cube:
Make ([250/efficiency])"
dat += "
"
dat += "Nutrients:
"
@@ -153,14 +155,14 @@
dat += "Leather:
"
dat += ""
dat += "Wallet:
Make ([100/efficiency])
"
- /*dat += "Book bag:
Make ([200/efficiency])
"
+ dat += "Book bag:
Make ([200/efficiency])
"
dat += "Plant bag:
Make ([200/efficiency])
"
- dat += "Mining satchel:
Make ([200/efficiency])
"*/
+ dat += "Mining satchel:
Make ([200/efficiency])
"
dat += "Botanical gloves:
Make ([250/efficiency])
"
dat += "Utility belt:
Make ([300/efficiency])
"
dat += "Leather Satchel:
Make ([400/efficiency])
"
dat += "Cash Bag:
Make ([400/efficiency])
"
- /*dat += "Leather Jacket:
Make ([500/efficiency])
"*/
+ dat += "Leather Jacket:
Make ([500/efficiency])
"
//dat += "
Other:
"
//dat += "Monkey:
Make ([400/efficiency])
"
dat += "
"
@@ -225,26 +227,38 @@
if(check_container_volume(10)) return 0
else if (check_cost(20/efficiency)) return 0
else beaker.reagents.add_reagent("milk",10)
- /*if("cream")
+ if("cream")
if(check_container_volume(10)) return 0
else if (check_cost(30/efficiency)) return 0
- else beaker.reagents.add_reagent("cream",10)*/
+ else beaker.reagents.add_reagent("cream",10)
if("meat")
if (check_cost(250/efficiency)) return 0
else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc)
if("ez")
if (check_cost(10/efficiency)) return 0
- else new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
+ if(in_beaker)
+ if(check_container_volume(10)) return 0
+ else beaker.reagents.add_reagent("eznutrient",10)
+ else
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
if("l4z")
if (check_cost(20/efficiency)) return 0
- else new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
+ if(in_beaker)
+ if(check_container_volume(10)) return 0
+ else beaker.reagents.add_reagent("left4zed",10)
+ else
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
if("rh")
if (check_cost(25/efficiency)) return 0
- else new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
+ if(in_beaker)
+ if(check_container_volume(10)) return 0
+ else beaker.reagents.add_reagent("robustharvest",10)
+ else
+ new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
if("wallet")
if (check_cost(100/efficiency)) return 0
else new/obj/item/weapon/storage/wallet(src.loc)
- /*if("bkbag")
+ if("bkbag")
if (check_cost(200/efficiency)) return 0
else new/obj/item/weapon/storage/bag/books(src.loc)
if("ptbag")
@@ -252,7 +266,7 @@
else new/obj/item/weapon/storage/bag/plants(src.loc)
if("mnbag")
if (check_cost(200/efficiency)) return 0
- else new/obj/item/weapon/storage/bag/ore(src.loc)*/
+ else new/obj/item/weapon/storage/bag/ore(src.loc)
if("gloves")
if (check_cost(250/efficiency)) return 0
else new/obj/item/clothing/gloves/botanic_leather(src.loc)
@@ -265,9 +279,9 @@
if("cashbag")
if (check_cost(400/efficiency)) return 0
else new/obj/item/weapon/storage/bag/cash(src.loc)
- /*if("jacket")
+ if("jacket")
if (check_cost(500/efficiency)) return 0
- else new/obj/item/clothing/suit/jacket/leather(src.loc)*/
+ else new/obj/item/clothing/suit/jacket/leather(src.loc)
//if("monkey")
// if (check_cost(500)) return 0
// else new/mob/living/carbon/monkey(src.loc)
@@ -309,4 +323,8 @@
else if(href_list["menu"])
menustat = "menu"
+ updateUsrDialog()
+
+ else if(href_list["inbeaker"])
+ in_beaker = !in_beaker
updateUsrDialog()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 90b0b268a22..3fa71922efd 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -9,6 +9,7 @@
* Mining Satchel
* Plant Bag
* Sheet Snatcher
+ * Book Bag
*
* -Sayu
*/
@@ -307,3 +308,19 @@
w_class = 1
can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash")
+
+// -----------------------------
+// Book bag
+// -----------------------------
+
+/obj/item/weapon/storage/bag/books
+ name = "book bag"
+ desc = "A bag for books."
+ icon = 'icons/obj/library.dmi'
+ icon_state = "bookbag"
+ display_contents_with_number = 0 //This would look really stupid otherwise
+ storage_slots = 7
+ max_combined_w_class = 21
+ max_w_class = 3
+ w_class = 4 //Bigger than a book because physics
+ can_hold = list(/obj/item/weapon/book, /obj/item/weapon/spellbook) //No bibles, consistent with bookcase
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index cdf0cbc0156..5294334d070 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -68,6 +68,8 @@
new /obj/item/clothing/under/color/black(src)
new /obj/item/clothing/under/color/black(src)
new /obj/item/clothing/under/color/black(src)
+ if(prob(25))
+ new /obj/item/clothing/suit/jacket/leather(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index fbfb77cdc9d..0b9570bbb5c 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -414,6 +414,11 @@
item_state = "bomber"
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|ARMS
+
+/obj/item/clothing/suit/jacket/leather
+ name = "leather jacket"
+ desc = "Pompadour not included."
+ icon_state = "leatherjacket"
/obj/item/clothing/suit/officercoat
name = "Clown Officer's Coat"
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index f3dc453accc..99890d48df0 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 6a505eb8523..77dde9413fc 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 606deaeefea..1c405908b43 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 859e9d188b4..c7cf93a4e56 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -2616,7 +2616,7 @@
"aYp" = (/obj/machinery/seed_extractor,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
"aYq" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
"aYr" = (/obj/machinery/vending/hydroseeds,/obj/machinery/camera{c_tag = "Hydroponics North"; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
-"aYs" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
+"aYs" = (/obj/machinery/biogenerator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
"aYt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/requests_console{department = "Hydroponics"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
"aYu" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/hydroponics)
"aYv" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/obj/machinery/atmospherics/pipe/simple{_color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor/wood,/area/library)
@@ -3571,7 +3571,7 @@
"bqI" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{dir = 2; id = "mechbay"; name = "Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/chargebay)
"bqJ" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bqK" = (/obj/structure/table,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics Requests Console"; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
-"bqL" = (/obj/machinery/r_n_d/circuit_imprinter,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
+"bqL" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bqM" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "rdlab2"; name = "Research and Development Lab Shutters"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bqN" = (/obj/machinery/door_control{id = "rdlab2"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = -24; req_access_txt = "47"},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bqO" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east)