diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 0bff454fea7..d1558f77020 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -1969,7 +1969,7 @@
"aLS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aLT" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/item/weapon/pen/multi/gold,/turf/simulated/floor/carpet,/area/magistrateoffice)
"aLU" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutral"},/area/crew_quarters/fitness)
-"aLV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Mr. Chang's"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/snow,/area/crew_quarters/mrchangs)
+"aLV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/public/glass{name = "Mr. Chang's"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aLW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/sleep)
"aLX" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 5},/area/crew_quarters/fitness)
"aLY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet/arcade,/area/crew_quarters/fitness{name = "\improper Arcade"})
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 4fa7dad536d..98f541c4425 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -914,6 +914,7 @@
"rD" = (/obj/structure/table/wood{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
"rE" = (/turf/unsimulated/wall,/area/start)
"rF" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "specopsoffice"; name = "Privacy Shutters"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
+"rG" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/obj/machinery/door/poddoor{id_tag = "specopsoffice"; name = "Super Privacy Shutters"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"rH" = (/obj/effect/landmark/start,/turf/unsimulated/floor,/area/start)
"rK" = (/turf/unsimulated/wall/splashscreen,/area/start)
"sq" = (/turf/unsimulated/wall,/area/centcom/control)
@@ -1034,7 +1035,6 @@
"uR" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uS" = (/obj/machinery/camera{c_tag = "CentComm Special Ops. Ready Room East"; dir = 8; network = list("ERT","CentComm")},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"uT" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/centcom/specops)
-"uU" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "114"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"uW" = (/obj/structure/urinal,/turf/unsimulated/wall,/area/centcom/specops)
"uX" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"va" = (/obj/structure/table/reinforced,/obj/effect/landmark{name = "Commando_Manual"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -1634,7 +1634,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGoNoJoWoPoGfmjHfFkdkdkdkdfFlZmdujujujujujujujujuqururururururussXfeujflsqtQtRtZsuutuuuvuwuxuyuzsutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpgpfpfpfphoGfmoKkdkdkdkdkdkdoLmdujujujujujujujujsXuAuBuBuBuBuBuCsXsXoMsXsquEtRtSsuuFtRuGuHtRtRtRsuuEtRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpipfpkpopfptfdoUoToToToToToToVfdujujujuIuIujujujuJuKuKuKuKuKuKuKuLuKuKuKuMtRtRtRuNtRtRtRtRtRtRtRuNtRtRtZoltRolomogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXrFuUrFsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmoGpjpfpfrloGfmfmfmfmfmfmfmfmfmfmujujuOuPuQuRujuSsXsXrFrGrFsXsXoXsXoZoYpbsquetRucsutRtRtRtRtRtRtRsuuetRtZsqsqsqohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpnrnrmrprooGfmaNsXrxujujujujujryujuXrzooonvavbujvcvdvdvdvdvesXuKsXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNohogogogogogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmpDoEoEoEoErkfmaNsXrAujsXuWuWsXsXujujvauRvmuRujujvnvdvovpvqvdsXuKsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNohogogogopogogogohaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNfmfmfmfmfmfmfmfmaNsXrBujsXvkvkpqprujujujvyvyujujujvzvdrCvBvCbesXuKsqpstRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNoqodododododododoraNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 5312cba6e14..1b85e76c772 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -120,6 +120,7 @@
#define TINT_IMPAIR 2 //Threshold of tint level to apply weld mask overlay
#define TINT_BLIND 3 //Threshold of tint level to obscure vision fully
+#define EYE_SHINE_THRESHOLD 6 //dark_view threshold past which a humanoid's eyes will 'shine' in the dark.
#define isliving(A) (istype((A), /mob/living))
#define iscarbon(A) (istype((A), /mob/living/carbon))
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index ac17d0591c5..96109186359 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -897,3 +897,12 @@ proc/rand_hex_color()
for(var/i=0;i<6;i++)
color = color+pick(colors)
return "#[color]"
+
+//Imagine removing pixels from the main icon that are covered by pixels from the mask icon.
+proc/get_icon_difference(var/icon/main, var/icon/mask)
+ if(istype(main) && istype(mask))
+ mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible.
+ mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white.
+ mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white pixels.
+ main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent).
+ return main
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index f106d579e94..8be1eaa478b 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1337,7 +1337,7 @@ Standard way to write links -Sayu
if(covered_locations & HEAD)
return 0
if("eyes")
- if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES)
+ if(face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES || eyesmouth_covered & HEADCOVERSEYES)
return 0
if("mouth")
if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH)
diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm
index 4195052fdda..2a8408dfe4a 100644
--- a/code/datums/spells/mind_transfer.dm
+++ b/code/datums/spells/mind_transfer.dm
@@ -20,15 +20,8 @@ Make sure spells that are removed from spell_list are actually removed and delet
Also, you never added distance checking after target is selected. I've went ahead and did that.
*/
/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets, mob/user = usr, distanceoverride)
- if(!targets.len)
- to_chat(user, "No mind found.")
- return
- if(targets.len > 1)
- to_chat(user, "Too many minds! You're not a hive damnit!")//Whaa...aat?
- return
-
- var/mob/living/target = targets[1]
+ var/mob/living/target = targets[range]
if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
to_chat(user, "They are too far away!")
@@ -50,6 +43,10 @@ Also, you never added distance checking after target is selected. I've went ahea
to_chat(user, "Their mind is resisting your spell.")
return
+ if(istype(target, /mob/living/silicon))
+ to_chat(user, "You feel this enslaved being is just as dead as its cold, hard exoskeleton.")
+ return
+
var/mob/living/victim = target//The target of the spell whos body will be transferred to.
var/mob/caster = user//The wizard/whomever doing the body transferring.
diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm
index aaea991d5cf..d448419b72d 100644
--- a/code/game/dna/genes/disabilities.dm
+++ b/code/game/dna/genes/disabilities.dm
@@ -128,10 +128,12 @@
/datum/dna/gene/disability/colourblindness/activate(var/mob/M, var/connected, var/flags)
..()
M.update_client_colour() //Handle the activation of the colourblindness on the mob.
+ M.update_icons() //Apply eyeshine as needed.
/datum/dna/gene/disability/colourblindness/deactivate(var/mob/M, var/connected, var/flags)
..()
M.update_client_colour() //Handle the deactivation of the colourblindness on the mob.
+ M.update_icons() //Remove eyeshine as needed.
/datum/dna/gene/disability/deaf
name="Deafness"
diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm
index 656be0d4cb9..e9d69c2b904 100644
--- a/code/game/dna/genes/powers.dm
+++ b/code/game/dna/genes/powers.dm
@@ -164,10 +164,12 @@
/datum/dna/gene/basic/xray/activate(mob/living/M, connected, flags)
..()
M.update_sight()
+ M.update_icons() //Apply eyeshine as needed.
/datum/dna/gene/basic/xray/deactivate(mob/living/M, connected, flags)
..()
M.update_sight()
+ M.update_icons() //Remove eyeshine as needed.
/datum/dna/gene/basic/tk
name="Telekenesis"
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 917cd73c83d..4af01736028 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -97,6 +97,9 @@
var/obj/item/weapon/coin/coin
var/datum/wires/vending/wires = null
+ var/item_slot = FALSE
+ var/obj/item/inserted_item = null
+
/obj/machinery/vending/New()
..()
wires = new(src)
@@ -119,6 +122,10 @@
return
+/obj/machinery/vending/Destroy()
+ eject_item()
+ return ..()
+
/**
* Build src.produdct_records from the products lists
*
@@ -281,9 +288,54 @@
return;
else
to_chat(user, "You should probably unscrew the service panel first.")
+ else if(item_slot_check(user, I))
+ insert_item(user, I)
+ return
else
..()
+//Override this proc to do per-machine checks on the inserted item, but remember to call the parent to handle these generic checks before your logic!
+/obj/machinery/vending/proc/item_slot_check(mob/user, obj/item/I)
+ if(!item_slot)
+ return FALSE
+ if(alert(user, "Do you want to attempt to insert [I]?", "","Yes", "No") == "No")
+ return FALSE
+ if(inserted_item)
+ to_chat(user, "There is something already inserted!")
+ return FALSE
+ return TRUE
+
+/* Example override for item_slot_check proc:
+/obj/machinery/vending/example/item_slot_check(mob/user, obj/item/I)
+ if(!..())
+ return FALSE
+ if(!istype(I, /obj/item/toy))
+ to_chat(user, "[I] isn't compatible with this machine's slot.")
+ return FALSE
+ return TRUE
+*/
+
+/obj/machinery/vending/proc/insert_item(mob/user, obj/item/I)
+ if(!item_slot || inserted_item)
+ return
+ if(!user.canUnEquip(I))
+ to_chat(user, "[I] is stuck to your hand, you can't seem to put it down!")
+ return
+
+ user.unEquip(I)
+ inserted_item = I
+ I.forceMove(src)
+
+ to_chat(user, "You insert [I] into [src].")
+ nanomanager.update_uis(src)
+
+/obj/machinery/vending/proc/eject_item()
+ if(!item_slot || !inserted_item)
+ return
+ inserted_item.forceMove(get_turf(src))
+ inserted_item = null
+ nanomanager.update_uis(src)
+
/obj/machinery/vending/emag_act(user as mob)
emagged = 1
to_chat(user, "You short out the product lock on [src]")
@@ -439,12 +491,21 @@
data["products"] = listed_products
- if(src.coin)
- data["coin"] = src.coin.name
+ if(coin)
+ data["coin"] = coin.name
- if(src.panel_open)
+ if(item_slot)
+ data["item_slot"] = 1
+ if(inserted_item)
+ data["inserted_item"] = inserted_item
+ else
+ data["inserted_item"] = null
+ else
+ data["item_slot"] = 0
+
+ if(panel_open)
data["panel"] = 1
- data["speaker"] = src.shut_up ? 0 : 1
+ data["speaker"] = shut_up ? 0 : 1
else
data["panel"] = 0
return data
@@ -463,6 +524,9 @@
to_chat(usr, "You remove [coin] from [src].")
categories &= ~CAT_COIN
+ if(href_list["remove_item"])
+ eject_item()
+
if(href_list["pay"])
if(currently_vending && vendor_account && !vendor_account.suspended)
var/paid = 0
@@ -562,14 +626,32 @@
use_power(vend_power_usage) //actuators and stuff
if(icon_vend) //Show the vending animation if needed
flick(icon_vend,src)
- spawn(src.vend_delay)
- new R.product_path(get_turf(src))
+ spawn(vend_delay)
+ do_vend(R)
status_message = ""
status_error = 0
vend_ready = 1
currently_vending = null
nanomanager.update_uis(src)
+//override this proc to add handling for what to do with the vended product when you have a inserted item and remember to include a parent call for this generic handling
+/obj/machinery/vending/proc/do_vend(datum/data/vending_product/R)
+ if(!item_slot || !inserted_item)
+ new R.product_path(get_turf(src))
+ return TRUE
+ return FALSE
+
+/* Example override for do_vend proc:
+/obj/machinery/vending/example/do_vend(datum/data/vending_product/R)
+ if(..())
+ return
+ var/obj/item/vended = new R.product_path()
+ if(inserted_item.force == initial(inserted_item.force)
+ inserted_item.force += vended.force
+ inserted_item.damtype = vended.damtype
+ qdel(vended)
+*/
+
/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user)
if(panel_open)
to_chat(user, "You stock the [src] with \a [R.product_name]")
@@ -701,6 +783,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bag/goonbag = 3,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,
/obj/item/weapon/reagent_containers/food/drinks/cans/beer = 6,
@@ -737,18 +820,22 @@
component_parts += new /obj/item/weapon/vending_refill/boozeomat(0)
component_parts += new /obj/item/weapon/vending_refill/boozeomat(0)
+
/obj/machinery/vending/coffee
name = "\improper Hot Drinks machine"
desc = "A vending machine which dispenses hot drinks."
product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
icon_state = "coffee"
icon_vend = "coffee-vend"
+ item_slot = TRUE
vend_delay = 34
products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25,
- /obj/item/weapon/reagent_containers/food/drinks/chocolate = 10, /obj/item/weapon/reagent_containers/food/drinks/chicken_soup = 10,/obj/item/weapon/reagent_containers/food/drinks/weightloss = 10)
+ /obj/item/weapon/reagent_containers/food/drinks/chocolate = 10, /obj/item/weapon/reagent_containers/food/drinks/chicken_soup = 10,/obj/item/weapon/reagent_containers/food/drinks/weightloss = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/mug = 15)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10)
+ premium = list(/obj/item/weapon/reagent_containers/food/drinks/mug/novelty = 5)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/tea = 25, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25, /obj/item/weapon/reagent_containers/food/drinks/chocolate = 25,
- /obj/item/weapon/reagent_containers/food/drinks/chicken_soup = 30,/obj/item/weapon/reagent_containers/food/drinks/weightloss = 50)
+ /obj/item/weapon/reagent_containers/food/drinks/chicken_soup = 30,/obj/item/weapon/reagent_containers/food/drinks/weightloss = 50, /obj/item/weapon/reagent_containers/food/drinks/mug = 50)
refill_canister = /obj/item/weapon/vending_refill/coffee
/obj/machinery/vending/coffee/New()
@@ -761,6 +848,33 @@
component_parts += new /obj/item/weapon/vending_refill/coffee(0)
component_parts += new /obj/item/weapon/vending_refill/coffee(0)
+/obj/machinery/vending/coffee/item_slot_check(mob/user, obj/item/I)
+ if(!..())
+ return FALSE
+ if(!(istype(I, /obj/item/weapon/reagent_containers/glass) || istype(I, /obj/item/weapon/reagent_containers/food/drinks)))
+ to_chat(user, "[I] is not compatible with this machine.")
+ return FALSE
+ if(!I.is_open_container())
+ to_chat(user, "
+