"
+ else
+ alert(usr, "You do not have the required rank to do this!")
+ if("species")
+ if (istype(active1, /datum/data/record))
+ var/t1 = copytext(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message),1,MAX_MESSAGE_LEN)
+ if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ return
+ active1.fields["species"] = t1
+
+//TEMPORARY MENU FUNCTIONS
+ else//To properly clear as per clear screen.
+ temp=null
+ switch(href_list["choice"])
+ if ("Change Rank")
+ if (active1)
+ active1.fields["rank"] = href_list["rank"]
+ if(href_list["rank"] in get_all_jobs())
+ active1.fields["real_rank"] = href_list["real_rank"]
+
+ if ("Delete Record (ALL) Execute")
+ if (active1)
+ for(var/datum/data/record/R in data_core.medical)
+ if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
+ del(R)
+ else
+ del(active1)
+ else
+ temp = "This function does not appear to be working at the moment. Our apologies."
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+
+/obj/machinery/computer/skills/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+
+ for(var/datum/data/record/R in data_core.security)
+ if(prob(10/severity))
+ switch(rand(1,6))
+ if(1)
+ R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
+ if(2)
+ R.fields["sex"] = pick("Male", "Female")
+ if(3)
+ R.fields["age"] = rand(5, 85)
+ if(4)
+ R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
+ if(5)
+ R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(6)
+ R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
+ continue
+
+ else if(prob(1))
+ del(R)
+ continue
+
+ ..(severity)
\ No newline at end of file
diff --git a/code/game/machinery/computer/vox_shuttle.dm b/code/game/machinery/computer/vox_shuttle.dm
new file mode 100644
index 00000000000..fa9d05d7b90
--- /dev/null
+++ b/code/game/machinery/computer/vox_shuttle.dm
@@ -0,0 +1,106 @@
+#define VOX_SHUTTLE_MOVE_TIME 260
+#define VOX_SHUTTLE_COOLDOWN 460
+
+//Copied from Syndicate shuttle.
+var/global/vox_shuttle_location
+
+/obj/machinery/computer/vox_station
+ name = "vox skipjack terminal"
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "syndishuttle"
+ req_access = list(access_syndicate)
+ var/area/curr_location
+ var/moving = 0
+ var/lastMove = 0
+ var/warning //Warning about the end of the round.
+
+/obj/machinery/computer/vox_station/New()
+ curr_location= locate(/area/shuttle/vox/station)
+
+
+/obj/machinery/computer/vox_station/proc/vox_move_to(area/destination as area)
+ if(moving) return
+ if(lastMove + VOX_SHUTTLE_COOLDOWN > world.time) return
+ var/area/dest_location = locate(destination)
+ if(curr_location == dest_location) return
+
+ moving = 1
+ lastMove = world.time
+
+ if(curr_location.z != dest_location.z)
+ var/area/transit_location = locate(/area/vox_station/transit)
+ curr_location.move_contents_to(transit_location)
+ curr_location = transit_location
+ sleep(VOX_SHUTTLE_MOVE_TIME)
+
+ curr_location.move_contents_to(dest_location)
+ curr_location = dest_location
+ moving = 0
+
+ return 1
+
+
+/obj/machinery/computer/vox_station/attackby(obj/item/I as obj, mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/vox_station/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/vox_station/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/vox_station/attack_hand(mob/user as mob)
+ if(!allowed(user))
+ user << "\red Access Denied"
+ return
+
+ user.set_machine(src)
+
+ var/dat = {"Location: [curr_location]
+ Ready to move[max(lastMove + VOX_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + VOX_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
+ Return to dark space
+ Fore port solar |
+ Aft port solar |
+ Fore starboard solar
+ Aft starboard solar |
+ Mining Asteroid
+ Close"}
+
+ user << browse(dat, "window=computer;size=575x450")
+ onclose(user, "computer")
+ return
+
+
+/obj/machinery/computer/vox_station/Topic(href, href_list)
+ if(!isliving(usr)) return
+ var/mob/living/user = usr
+
+ if(in_range(src, user) || istype(user, /mob/living/silicon))
+ user.set_machine(src)
+
+ vox_shuttle_location = "station"
+ if(href_list["start"])
+ if(ticker && (istype(ticker.mode,/datum/game_mode/heist)))
+ if(!warning)
+ user << "\red Returning to dark space will end your raid and report your success or failure. If you are sure, press the button again."
+ warning = 1
+ return
+ vox_move_to(/area/shuttle/vox/station)
+ vox_shuttle_location = "start"
+ else if(href_list["solars_fore_starboard"])
+ vox_move_to(/area/vox_station/northeast_solars)
+ else if(href_list["solars_fore_port"])
+ vox_move_to(/area/vox_station/northwest_solars)
+ else if(href_list["solars_aft_starboard"])
+ vox_move_to(/area/vox_station/southeast_solars)
+ else if(href_list["solars_aft_port"])
+ vox_move_to(/area/vox_station/southwest_solars)
+ else if(href_list["mining"])
+ vox_move_to(/area/vox_station/mining)
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+
+/obj/machinery/computer/vox_station/bullet_act(var/obj/item/projectile/Proj)
+ visible_message("[Proj] ricochets off [src]!")
\ No newline at end of file
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 4d634d45895..a5eb560e3c1 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -17,222 +17,287 @@
anchored = 1.0 // can't pick it up
density = 0 // can walk through it.
var/id = null // id of door it controls.
- var/releasetime = 0 // when world.time reaches it - release the prisoneer
+ var/releasetime = 0 // when world.timeofday reaches it - release the prisoner
var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing
var/picture_state // icon_state of alert picture, if not displaying text/numbers
var/list/obj/machinery/targets = list()
+ var/timetoset = 0 // Used to set releasetime upon starting the timer
- New()
- ..()
+/obj/machinery/door_timer/New()
+ ..()
- pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
- pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
+ pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
+ pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
- spawn(20)
- for(var/obj/machinery/door/window/brigdoor/M in world)
- if (M.id == src.id)
- targets += M
+ spawn(20)
+ for(var/obj/machinery/door/window/brigdoor/M in world)
+ if (M.id == src.id)
+ targets += M
- for(var/obj/machinery/flasher/F in world)
- if(F.id == src.id)
- targets += F
+ for(var/obj/machinery/flasher/F in world)
+ if(F.id == src.id)
+ targets += F
- for(var/obj/structure/closet/secure_closet/brig/C in world)
- if(C.id == src.id)
- targets += C
+ for(var/obj/structure/closet/secure_closet/brig/C in world)
+ if(C.id == src.id)
+ targets += C
- if(targets.len==0)
- stat |= BROKEN
- update_icon()
- return
+ if(targets.len==0)
+ stat |= BROKEN
+ update_icon()
return
+ return
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
// update the door_timer window and the icon
- process()
- if(stat & (NOPOWER|BROKEN)) return
- if(src.timing)
- if(world.time > src.releasetime)
- src.timer_end() // open doors, reset timer, clear status screen
- src.timing = 0
- src.updateUsrDialog()
- src.update_icon()
- else
- timer_end()
- return
+/obj/machinery/door_timer/process()
+
+ if(stat & (NOPOWER|BROKEN)) return
+ if(src.timing)
+
+ // poorly done midnight rollover
+ // (no seriously there's gotta be a better way to do this)
+ var/timeleft = timeleft()
+ if(timeleft > 1e5)
+ src.releasetime = 0
-// has the door power sitatuation changed, if so update icon.
- power_change()
- ..()
- update_icon()
- return
+ if(world.timeofday > src.releasetime)
+ src.timer_end() // open doors, reset timer, clear status screen
+ src.timing = 0
+
+ src.updateUsrDialog()
+ src.update_icon()
+
+ else
+ timer_end()
+
+ return
+
+
+// has the door power situation changed, if so update icon.
+/obj/machinery/door_timer/power_change()
+ ..()
+ update_icon()
+ return
// open/closedoor checks if door_timer has power, if so it checks if the
// linked door is open/closed (by density) then opens it/closes it.
- proc/timer_start()
- if(stat & (NOPOWER|BROKEN)) return 0
- for(var/obj/machinery/door/window/brigdoor/door in targets)
- if(door.density) continue
- spawn(0)
- door.close()
+// Closes and locks doors, power check
+/obj/machinery/door_timer/proc/timer_start()
+ if(stat & (NOPOWER|BROKEN)) return 0
- for(var/obj/structure/closet/secure_closet/brig/C in targets)
- if(C.broken) continue
- if(C.opened && !C.close()) continue
- C.locked = 1
- C.icon_state = C.icon_locked
- return 1
+ // Set releasetime
+ releasetime = world.timeofday + timetoset
+
+ for(var/obj/machinery/door/window/brigdoor/door in targets)
+ if(door.density) continue
+ spawn(0)
+ door.close()
+
+ for(var/obj/structure/closet/secure_closet/brig/C in targets)
+ if(C.broken) continue
+ if(C.opened && !C.close()) continue
+ C.locked = 1
+ C.icon_state = C.icon_locked
+ return 1
- proc/timer_end()
- if(stat & (NOPOWER|BROKEN)) return 0
+// Opens and unlocks doors, power check
+/obj/machinery/door_timer/proc/timer_end()
+ if(stat & (NOPOWER|BROKEN)) return 0
- for(var/obj/machinery/door/window/brigdoor/door in targets)
- if(!door.density) continue
- spawn(0)
- door.open()
+ // Reset releasetime
+ releasetime = 0
- for(var/obj/structure/closet/secure_closet/brig/C in targets)
- if(C.broken) continue
- if(C.opened) continue
- C.locked = 0
- C.icon_state = C.icon_closed
+ for(var/obj/machinery/door/window/brigdoor/door in targets)
+ if(!door.density) continue
+ spawn(0)
+ door.open()
- return 1
+ for(var/obj/structure/closet/secure_closet/brig/C in targets)
+ if(C.broken) continue
+ if(C.opened) continue
+ C.locked = 0
+ C.icon_state = C.icon_closed
+
+ return 1
- proc/timeleft()
- . = (releasetime-world.time)/10
- if(. < 0)
- . = 0
+// Check for releasetime timeleft
+/obj/machinery/door_timer/proc/timeleft()
+ . = (releasetime - world.timeofday)/10
+ if(. < 0)
+ . = 0
+// Set timetoset
+/obj/machinery/door_timer/proc/timeset(var/seconds)
+ timetoset = seconds * 10
- proc/timeset(var/seconds)
- releasetime=world.time+seconds*10
- return
+ if(timetoset <= 0)
+ timetoset = 0
+ return
//Allows AIs to use door_timer, see human attack_hand function below
- attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/door_timer/attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
//Allows humans to use door_timer
//Opens dialog window when someone clicks on door timer
// Allows altering timer and the timing boolean.
// Flasher activation limited to 150 seconds
- attack_hand(var/mob/user as mob)
- if(..())
- return
- var/second = round(timeleft() % 60)
- var/minute = round((timeleft() - second) / 60)
- user.set_machine(src)
- var/dat = ""
- dat += "Timer System:"
- dat += "Door [src.id] controls "
- if (src.timing)
- dat += "Stop Timer and open door "
- else
- dat += "Activate Timer and close door "
-
- dat += "Time Left: [(minute ? text("[minute]:") : null)][second] "
- dat += "--++ "
-
- for(var/obj/machinery/flasher/F in targets)
- if(F.last_flash && (F.last_flash + 150) > world.time)
- dat += " Flash Charging"
- else
- dat += " Activate Flash"
-
- dat += "
Close"
- dat += ""
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
+/obj/machinery/door_timer/attack_hand(var/mob/user as mob)
+ if(..())
return
+ // Used for the 'time left' display
+ var/second = round(timeleft() % 60)
+ var/minute = round((timeleft() - second) / 60)
+
+ // Used for 'set timer'
+ var/setsecond = round((timetoset / 10) % 60)
+ var/setminute = round(((timetoset / 10) - setsecond) / 60)
+
+ user.set_machine(src)
+
+ // dat
+ var/dat = ""
+
+ dat += "Timer System:"
+ dat += " Door [src.id] controls "
+
+ // Start/Stop timer
+ if (src.timing)
+ dat += "Stop Timer and open door "
+ else
+ dat += "Activate Timer and close door "
+
+ // Time Left display (uses releasetime)
+ dat += "Time Left: [(minute ? text("[minute]:") : null)][second] "
+ dat += " "
+
+ // Set Timer display (uses timetoset)
+ if(src.timing)
+ dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] Set "
+ else
+ dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] "
+
+ // Controls
+ dat += "--++ "
+
+ // Mounted flash controls
+ for(var/obj/machinery/flasher/F in targets)
+ if(F.last_flash && (F.last_flash + 150) > world.time)
+ dat += " Flash Charging"
+ else
+ dat += " Activate Flash"
+
+ dat += "
Close"
+ dat += ""
+
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+ return
+
//Function for using door_timer dialog input, checks if user has permission
// href_list to
// "timing" turns on timer
// "tp" value to modify timer
// "fc" activates flasher
+// "change" resets the timer to the timetoset amount while the timer is counting down
// Also updates dialog window and timer icon
- Topic(href, href_list)
- if(..())
- return
- if(!src.allowed(usr))
- return
+/obj/machinery/door_timer/Topic(href, href_list)
+ if(..())
+ return
+ if(!src.allowed(usr))
+ return
+
+ usr.set_machine(src)
+
+ if(href_list["timing"])
+ src.timing = text2num(href_list["timing"])
- usr.set_machine(src)
- if(href_list["timing"])
- src.timing = text2num(href_list["timing"])
- else
- if(href_list["tp"]) //adjust timer, close door if not already closed
- var/tp = text2num(href_list["tp"])
- var/timeleft = timeleft()
- timeleft += tp
- timeleft = min(max(round(timeleft), 0), 3600)
- timeset(timeleft)
- //src.timing = 1
- //src.closedoor()
- if(href_list["fc"])
- for(var/obj/machinery/flasher/F in targets)
- F.flash()
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- src.update_icon()
if(src.timing)
src.timer_start()
else
src.timer_end()
- return
+
+ else
+ if(href_list["tp"]) //adjust timer, close door if not already closed
+ var/tp = text2num(href_list["tp"])
+ var/addtime = (timetoset / 10)
+ addtime += tp
+ addtime = min(max(round(addtime), 0), 3600)
+
+ timeset(addtime)
+
+ if(href_list["fc"])
+ for(var/obj/machinery/flasher/F in targets)
+ F.flash()
+
+ if(href_list["change"])
+ src.timer_start()
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ src.update_icon()
+
+ /* if(src.timing)
+ src.timer_start()
+
+ else
+ src.timer_end() */
+
+ return
//icon update function
// if NOPOWER, display blank
// if BROKEN, display blue screen of death icon AI uses
// if timing=true, run update display function
- update_icon()
- if(stat & (NOPOWER))
- icon_state = "frame"
- return
- if(stat & (BROKEN))
- set_picture("ai_bsod")
- return
- if(src.timing)
- var/disp1 = uppertext(id)
- var/timeleft = timeleft()
- var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
- spawn( 5 )
- update_display(disp1, disp2)
- else
- update_display("SET","TIME")
+/obj/machinery/door_timer/update_icon()
+ if(stat & (NOPOWER))
+ icon_state = "frame"
return
+ if(stat & (BROKEN))
+ set_picture("ai_bsod")
+ return
+ if(src.timing)
+ var/disp1 = uppertext(id)
+ var/timeleft = timeleft()
+ var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
+ spawn( 5 )
+ update_display(disp1, disp2)
+ else
+ update_display("SET","TIME")
+ return
// Adds an icon in case the screen is broken/off, stolen from status_display.dm
- proc/set_picture(var/state)
- picture_state = state
- overlays.Cut()
- overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
+/obj/machinery/door_timer/proc/set_picture(var/state)
+ picture_state = state
+ overlays.Cut()
+ overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
// Stolen from status_display
- proc/update_display(var/line1, var/line2)
- if(line2 == null) // single line display
- overlays.Cut()
- overlays += texticon(line1, 23, -13)
- else // dual line display
- overlays.Cut()
- overlays += texticon(line1, 23, -9)
- overlays += texticon(line2, 23, -17)
+/obj/machinery/door_timer/proc/update_display(var/line1, var/line2)
+ if(line2 == null) // single line display
+ overlays.Cut()
+ overlays += texticon(line1, 23, -13)
+ else // dual line display
+ overlays.Cut()
+ overlays += texticon(line1, 23, -9)
+ overlays += texticon(line2, 23, -17)
// return an icon of a time text string (tn)
// valid characters are 0-9 and :
// px, py are pixel offsets
@@ -240,19 +305,19 @@
//Actual string input to icon display for loop, with 5 pixel x offsets for each letter.
//Stolen from status_display
- proc/texticon(var/tn, var/px = 0, var/py = 0)
- var/image/I = image('icons/obj/status_display.dmi', "blank")
- var/len = lentext(tn)
+/obj/machinery/door_timer/proc/texticon(var/tn, var/px = 0, var/py = 0)
+ var/image/I = image('icons/obj/status_display.dmi', "blank")
+ var/len = lentext(tn)
- for(var/d = 1 to len)
- var/char = copytext(tn, len-d+1, len-d+2)
- if(char == " ")
- continue
- var/image/ID = image('icons/obj/status_display.dmi', icon_state=char)
- ID.pixel_x = -(d-1)*5 + px
- ID.pixel_y = py
- I.overlays += ID
- return I
+ for(var/d = 1 to len)
+ var/char = copytext(tn, len-d+1, len-d+2)
+ if(char == " ")
+ continue
+ var/image/ID = image('icons/obj/status_display.dmi', icon_state=char)
+ ID.pixel_x = -(d-1)*5 + px
+ ID.pixel_y = py
+ I.overlays += ID
+ return I
/obj/machinery/door_timer/cell_1
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 5d187b337c7..a0f8c371e41 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -915,115 +915,13 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
parent.update_tray()
-/obj/item/seeds/replicapod/harvest(mob/user = usr) //now that one is fun -- Urist
- var/obj/machinery/hydroponics/parent = loc
- var/make_podman = 0
- var/mob/ghost
- if(ckey && config.revival_pod_plants)
- ghost = find_dead_player("[ckey]")
- if(ismob(ghost))
- if(istype(ghost,/mob/dead/observer))
- var/mob/dead/observer/O = ghost
- if(istype(mind,/datum/mind))
- if(O.can_reenter_corpse)
- make_podman = 1
- else
- make_podman = 1
-
- if(make_podman) //all conditions met!
- var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
- if(realName)
- podman.real_name = realName
- else
- podman.real_name = "Pod Person [rand(0,999)]"
- var/oldactive = mind.active
- mind.active = 1
- mind.transfer_to(podman)
- mind.active = oldactive
- // -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
- switch(ticker.mode.name)
- if ("revolution")
- if (podman.mind in ticker.mode:revolutionaries)
- ticker.mode:add_revolutionary(podman.mind)
- ticker.mode:update_all_rev_icons() //So the icon actually appears
- if (podman.mind in ticker.mode:head_revolutionaries)
- ticker.mode:update_all_rev_icons()
- if ("nuclear emergency")
- if (podman.mind in ticker.mode:syndicates)
- ticker.mode:update_all_synd_icons()
- if ("cult")
- if (podman.mind in ticker.mode:cult)
- ticker.mode:add_cultist(podman.mind)
- ticker.mode:update_all_cult_icons() //So the icon actually appears
-
- // -- End mode specific stuff
-
- podman.gender = ghost.gender
- if(podman.gender in list(NEUTER, PLURAL)) //Sanity check, which should never actually happen.
- podman.gender = pick(MALE,FEMALE)
-
- if(!podman.dna)
- podman.dna = new /datum/dna()
- podman.dna.real_name = podman.real_name
- if(ui)
- podman.dna.uni_identity = ui
- updateappearance(podman, ui)
- if(se)
- podman.dna.struc_enzymes = se
- if(!prob(potency)) //if it fails, plantman!
- if(podman)
-// podman.dna.mutantrace = "plant"
- podman.mutations.Add(PLANT)
- podman.update_mutantrace()
-
- else //else, one packet of seeds. maybe two
- var/seed_count = 1
- if(prob(yield * parent.yieldmod * 20))
- seed_count++
- for(var/i=0,iYour blood has been placed into a replica pod seed. Return to your body if you want to be returned to life as a pod person! (Verbs -> Ghost -> Re-enter corpse)"
+ break
+ else
+ user << "Nothing happens."
+ return
+
+ if (!istype(source))
+ return
+
+ if(source.ckey)
+ realName = source.real_name
+ ckey = source.ckey
+
+ W:reagents.clear_reagents()
+ return
+
+ return ..()
+
+/obj/item/seeds/replicapod/harvest(mob/user = usr)
+
+ var/obj/machinery/hydroponics/parent = loc
+ var/mob/ghost
+ var/list/candidates = list()
+
+ user.visible_message("\blue You carefully begin to open the pod...","[user] carefully begins to open the pod...")
+
+ //If a sample is injected (and revival is allowed) the plant will be controlled by the original donor.
+ if(source && source.mind && source.ckey && config.revival_pod_plants)
+ ghost = source
+ else // If no sample was injected or revival is not allowed, we grab an interested observer.
+ for(var/mob/dead/observer/O in player_list)
+ if(O.client)
+ var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No")
+ if(response == "Yes")
+ candidates += O
+
+ if(!do_after(user, 100))
+ return
+
+ if(!src || !user)
+ return
+
+ if(candidates.len)
+ ghost = pick(candidates)
+
+ //If we don't have a ghost or the ghost is now unplayed, we just give the harvester some seeds.
+ if(!ghost || !(ghost.ckey))
+ user << "The pod has formed badly, and all you can do is salvage some of the seeds."
+ var/seed_count = 1
+
+ if(prob(yield * parent.yieldmod * 20))
+ seed_count++
+
+ for(var/i=0,iYou awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark."
+ if(source && ckey && podman.ckey == ckey)
+ podman << "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake."
+ podman << "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders."
+ podman << "Too much darkness will send you into shock and starve you, but light will help you heal."
+
+ if(!realName)
+ var/newname = input(podman,"Enter a name, or leave blank for the default name.", "Name change","") as text
+ if (newname != "")
+ podman.real_name = newname
+ parent.update_tray()
\ No newline at end of file
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 4ab483076b7..7302ed81b6c 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -341,12 +341,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Engineering"
if(1359)
freq_text = "Security"
-// if(1349)
-// freq_text = "Mining"
if(1347)
freq_text = "Supply"
if(1441)
- freq_text = "Death Squad"
+ freq_text = "Special Ops"
if(1443)
freq_text = "Response Team"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -365,10 +363,35 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra]" // Tweaked for security headsets -- TLE
var/part_c = ""
- if (display_freq==SYND_FREQ)
+ // syndies!
+ if (display_freq == SYND_FREQ)
part_a = ""
- else if (display_freq==COMM_FREQ)
+
+ // centcomm channels (deathsquid and ert)
+ else if (display_freq in CENT_FREQS)
+ part_a = ""
+
+ // command channel
+ else if (display_freq == COMM_FREQ)
part_a = ""
+
+ // department radio formatting (poorly optimized, ugh)
+ else if (display_freq == SEC_FREQ)
+ part_a = ""
+
+ else if (display_freq == ENG_FREQ)
+ part_a = ""
+
+ else if (display_freq == SCI_FREQ)
+ part_a = ""
+
+ else if (display_freq == MED_FREQ)
+ part_a = ""
+
+ else if (display_freq == SUP_FREQ) // cargo
+ part_a = ""
+
+ // If all else fails and it's a dept_freq, color me purple!
else if (display_freq in DEPT_FREQS)
part_a = ""
@@ -406,8 +429,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(1213)
blackbox.msg_syndicate += blackbox_msg
-// if(1349)
-// blackbox.msg_mining += blackbox_msg
if(1347)
blackbox.msg_cargo += blackbox_msg
else
@@ -629,8 +650,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Engineering"
if(1359)
freq_text = "Security"
-// if(1349)
-// freq_text = "Mining"
if(1347)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -685,8 +704,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(1213)
blackbox.msg_syndicate += blackbox_msg
-// if(1349)
-// blackbox.msg_mining += blackbox_msg
if(1347)
blackbox.msg_cargo += blackbox_msg
else
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index 2b708ded291..914bd8c9016 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -142,12 +142,7 @@
id = "Supply Server"
freq_listening = list(1347)
autolinkers = list("supply")
-/*
-/obj/machinery/telecomms/server/presets/mining
- id = "Mining Server"
- freq_listening = list(1349)
- autolinkers = list("mining")
-*/
+
/obj/machinery/telecomms/server/presets/common
id = "Common Server"
freq_listening = list()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 80703f4916e..9439757282a 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1,860 +1,861 @@
-/datum/data/vending_product
- var/product_name = "generic"
- var/product_path = null
- var/amount = 0
- var/price = 0
- var/display_color = "blue"
-
-
-
-/obj/machinery/vending
- name = "Vendomat"
- desc = "A generic vending machine."
- icon = 'icons/obj/vending.dmi'
- icon_state = "generic"
- layer = 2.9
- anchored = 1
- density = 1
- var/active = 1 //No sales pitches if off!
- var/vend_ready = 1 //Are we ready to vend?? Is it time??
- var/vend_delay = 10 //How long does it take to vend?
- var/datum/data/vending_product/currently_vending = null // A /datum/data/vending_product instance of what we're paying for right now.
-
- // To be filled out at compile time
- var/list/products = list() // For each, use the following pattern:
- var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2)
- var/list/premium = list() // No specified amount = only one in stock
- var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price.
-
- var/product_slogans = "" //String of slogans separated by semicolons, optional
- var/product_ads = "" //String of small ad messages in the vending screen - random chance
- var/list/product_records = list()
- var/list/hidden_records = list()
- var/list/coin_records = list()
- var/list/slogan_list = list()
- var/list/small_ads = list() // small ad messages in the vending screen - random chance of popping up whenever you open it
- var/vend_reply //Thank you for shopping!
- var/last_reply = 0
- var/last_slogan = 0 //When did we last pitch?
- var/slogan_delay = 6000 //How long until we can pitch again?
- var/icon_vend //Icon_state when vending!
- var/icon_deny //Icon_state when vending!
- //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine.
- var/seconds_electrified = 0 //Shock customers like an airlock.
- var/shoot_inventory = 0 //Fire items at customers! We're broken!
- var/shut_up = 1 //Stop spouting those godawful pitches!
- var/extended_inventory = 0 //can we access the hidden inventory?
- var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar.
- var/wires = 15
- var/obj/item/weapon/coin/coin
- var/const/WIRE_EXTEND = 1
- var/const/WIRE_SCANID = 2
- var/const/WIRE_SHOCK = 3
- var/const/WIRE_SHOOTINV = 4
-
- var/obj/machinery/account_database/linked_db
- var/datum/money_account/linked_account
-
-/obj/machinery/vending/New()
- ..()
- spawn(4)
- src.slogan_list = text2list(src.product_slogans, ";")
-
- // So not all machines speak at the exact same time.
- // The first time this machine says something will be at slogantime + this random value,
- // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated.
- src.last_slogan = world.time + rand(0, slogan_delay)
-
- src.build_inventory(products)
- //Add hidden inventory
- src.build_inventory(contraband, 1)
- src.build_inventory(premium, 0, 1)
- power_change()
-
- reconnect_database()
- linked_account = vendor_account
-
- return
-
- return
-
-/obj/machinery/vending/proc/reconnect_database()
- for(var/obj/machinery/account_database/DB in world)
- if(DB.z == src.z)
- linked_db = DB
- break
-
-/obj/machinery/vending/ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(50))
- del(src)
- return
- if(3.0)
- if (prob(25))
- spawn(0)
- src.malfunction()
- return
- return
- else
- return
-
-/obj/machinery/vending/blob_act()
- if (prob(50))
- spawn(0)
- src.malfunction()
- del(src)
- return
-
- return
-
-/obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0)
- for(var/typepath in productlist)
- var/amount = productlist[typepath]
- var/price = prices[typepath]
- if(isnull(amount)) amount = 1
-
- var/atom/temp = new typepath(null)
- var/datum/data/vending_product/R = new /datum/data/vending_product()
- R.product_name = temp.name
- R.product_path = typepath
- R.amount = amount
- R.price = price
- R.display_color = pick("red","blue","green")
-
- if(hidden)
- hidden_records += R
- else if(req_coin)
- coin_records += R
- else
- product_records += R
-// world << "Added: [R.product_name]] - [R.amount] - [R.product_path]"
- return
-
-/obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/card/emag))
- src.emagged = 1
- user << "You short out the product lock on [src]"
- return
- else if(istype(W, /obj/item/weapon/screwdriver))
- src.panel_open = !src.panel_open
- user << "You [src.panel_open ? "open" : "close"] the maintenance panel."
- src.overlays.Cut()
- if(src.panel_open)
- src.overlays += image(src.icon, "[initial(icon_state)]-panel")
- src.updateUsrDialog()
- return
- else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters))
- if(src.panel_open)
- attack_hand(user)
- return
- else if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
- user.drop_item()
- W.loc = src
- coin = W
- user << "\blue You insert the [W] into the [src]"
- return
- else if(istype(W, /obj/item/weapon/card) && currently_vending)
- //attempt to connect to a new db, and if that doesn't work then fail
- if(!linked_db)
- reconnect_database()
- if(linked_db)
- if(linked_account)
- var/obj/item/weapon/card/I = W
- scan_card(I)
- else
- usr << "\icon[src]Unable to connect to linked account."
- else
- usr << "\icon[src]Unable to connect to accounts database."
- else
- ..()
-
-/obj/machinery/vending/proc/scan_card(var/obj/item/weapon/card/I)
- if(!currently_vending) return
- if (istype(I, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/C = I
- visible_message("[usr] swipes a card through [src].")
- if(linked_account)
- var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
- var/datum/money_account/D = linked_db.attempt_account_access(C.associated_account_number, attempt_pin, 2)
- if(D)
- var/transaction_amount = currently_vending.price
- if(transaction_amount <= D.money)
-
- //transfer the money
- D.money -= transaction_amount
- linked_account.money += transaction_amount
-
- //create entries in the two account transaction logs
- var/datum/transaction/T = new()
- T.target_name = "[linked_account.owner_name] (via [src.name])"
- T.purpose = "Purchase of [currently_vending.product_name]"
- if(transaction_amount > 0)
- T.amount = "([transaction_amount])"
- else
- T.amount = "[transaction_amount]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = worldtime2text()
- D.transaction_log.Add(T)
- //
- T = new()
- T.target_name = D.owner_name
- T.purpose = "Purchase of [currently_vending.product_name]"
- T.amount = "[transaction_amount]"
- T.source_terminal = src.name
- T.date = current_date_string
- T.time = worldtime2text()
- linked_account.transaction_log.Add(T)
-
- // Vend the item
- src.vend(src.currently_vending, usr)
- currently_vending = null
- else
- usr << "\icon[src]You don't have that much money!"
- else
- usr << "\icon[src]Unable to access account. Check security settings and try again."
- else
- usr << "\icon[src]EFTPOS is not connected to an account."
-
-/obj/machinery/vending/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/vending/attack_ai(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/vending/attack_hand(mob/user as mob)
- if(stat & (BROKEN|NOPOWER))
- return
- user.set_machine(src)
-
- if(src.seconds_electrified != 0)
- if(src.shock(user, 100))
- return
-
- var/vendorname = (src.name) //import the machine's name
-
- if(src.currently_vending)
- var/dat = "
[vendorname]
" //display the name, and added a horizontal rule
- dat += "You have selected [currently_vending.product_name]. Please swipe your ID to pay for the article. "
- dat += "Cancel"
- user << browse(dat, "window=vending")
- onclose(user, "")
- return
-
- var/dat = "
[vendorname]
" //display the name, and added a horizontal rule
- dat += "Select an item:
" //the rest is just general spacing and bolding
-
- if (premium.len > 0)
- dat += "Coin slot: [coin ? coin : "No coin inserted"] (Remove)
"
-
- if (src.product_records.len == 0)
- dat += "No product loaded!"
- else
- var/list/display_records = src.product_records
- if(src.extended_inventory)
- display_records = src.product_records + src.hidden_records
- if(src.coin)
- display_records = src.product_records + src.coin_records
- if(src.coin && src.extended_inventory)
- display_records = src.product_records + src.hidden_records + src.coin_records
-
- for (var/datum/data/vending_product/R in display_records)
- dat += "[R.product_name]:"
- dat += " [R.amount] "
- if(R.price)
- dat += " (Price: [R.price])"
- if (R.amount > 0)
- dat += " (Vend)"
- else
- dat += " SOLD OUT"
- dat += " "
-
- dat += ""
-
- if(panel_open)
- var/list/vendwires = list(
- "Violet" = 1,
- "Orange" = 2,
- "Goldenrod" = 3,
- "Green" = 4,
- )
- dat += " Access Panel "
- for(var/wiredesc in vendwires)
- var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]]
- dat += "[wiredesc] wire: "
- if(!is_uncut)
- dat += "Mend"
- else
- dat += "Cut "
- dat += "Pulse "
- dat += " "
-
- dat += " "
- dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"]. "
- dat += "The red light is [src.shoot_inventory ? "off" : "blinking"]. "
- dat += "The green light is [src.extended_inventory ? "on" : "off"]. "
- dat += "The [(src.wires & WIRE_SCANID) ? "purple" : "yellow"] light is on. "
-
- if (product_slogans != "")
- dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle"
-
- user << browse(dat, "window=vending")
- onclose(user, "")
- return
-
-/obj/machinery/vending/Topic(href, href_list)
- if(stat & (BROKEN|NOPOWER))
- return
- if(usr.stat || usr.restrained())
- return
-
- if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon))
- if(!coin)
- usr << "There is no coin in this machine."
- return
-
- coin.loc = src.loc
- if(!usr.get_active_hand())
- usr.put_in_hands(coin)
- usr << "\blue You remove the [coin] from the [src]"
- coin = null
-
-
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
- usr.set_machine(src)
- if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending))
-
- if(istype(usr,/mob/living/silicon))
- if(istype(usr,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = usr
- if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) ))
- usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!"
- return
- else
- usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!"
- return
-
- if ((!src.allowed(usr)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH
- usr << "\red Access denied." //Unless emagged of course
- flick(src.icon_deny,src)
- return
-
- var/datum/data/vending_product/R = locate(href_list["vend"])
- if (!R || !istype(R) || !R.product_path || R.amount <= 0)
- return
-
- if(R.price == null)
- src.vend(R, usr)
- else
- src.currently_vending = R
- src.updateUsrDialog()
-
- return
-
- else if (href_list["cancel_buying"])
- src.currently_vending = null
- src.updateUsrDialog()
- return
-
- else if ((href_list["cutwire"]) && (src.panel_open))
- var/twire = text2num(href_list["cutwire"])
- if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
- usr << "You need wirecutters!"
- return
- if (src.isWireColorCut(twire))
- src.mend(twire)
- else
- src.cut(twire)
-
- else if ((href_list["pulsewire"]) && (src.panel_open))
- var/twire = text2num(href_list["pulsewire"])
- if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
- usr << "You need a multitool!"
- return
- if (src.isWireColorCut(twire))
- usr << "You can't pulse a cut wire."
- return
- else
- src.pulse(twire)
-
- else if ((href_list["togglevoice"]) && (src.panel_open))
- src.shut_up = !src.shut_up
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- else
- usr << browse(null, "window=vending")
- return
- return
-
-/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user)
- if ((!src.allowed(user)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH
- user << "\red Access denied." //Unless emagged of course
- flick(src.icon_deny,src)
- return
- src.vend_ready = 0 //One thing at a time!!
-
- if (R in coin_records)
- if(!coin)
- user << "\blue You need to insert a coin to get this item."
- return
- if(coin.string_attached)
- if(prob(50))
- user << "\blue You successfully pull the coin out before the [src] could swallow it."
- else
- user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all."
- del(coin)
- else
- del(coin)
-
- R.amount--
-
- if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply)
- spawn(0)
- src.speak(src.vend_reply)
- src.last_reply = world.time
-
- use_power(5)
- if (src.icon_vend) //Show the vending animation if needed
- flick(src.icon_vend,src)
- spawn(src.vend_delay)
- new R.product_path(get_turf(src))
- src.vend_ready = 1
- return
-
- src.updateUsrDialog()
-
-/obj/machinery/vending/process()
- if(stat & (BROKEN|NOPOWER))
- return
-
- if(!src.active)
- return
-
- if(src.seconds_electrified > 0)
- src.seconds_electrified--
-
- //Pitch to the people! Really sell it!
- if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5))
- var/slogan = pick(src.slogan_list)
- src.speak(slogan)
- src.last_slogan = world.time
-
- if(src.shoot_inventory && prob(2))
- src.throw_item()
-
- return
-
-/obj/machinery/vending/proc/speak(var/message)
- if(stat & NOPOWER)
- return
-
- if (!message)
- return
-
- for(var/mob/O in hearers(src, null))
- O.show_message("[src] beeps, \"[message]\"",2)
- return
-
-/obj/machinery/vending/power_change()
- if(stat & BROKEN)
- icon_state = "[initial(icon_state)]-broken"
- else
- if( powered() )
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- src.icon_state = "[initial(icon_state)]-off"
- stat |= NOPOWER
-
-//Oh no we're malfunctioning! Dump out some product and break.
-/obj/machinery/vending/proc/malfunction()
- for(var/datum/data/vending_product/R in src.product_records)
- if (R.amount <= 0) //Try to use a record that actually has something to dump.
- continue
- var/dump_path = R.product_path
- if (!dump_path)
- continue
-
- while(R.amount>0)
- new dump_path(src.loc)
- R.amount--
- break
-
- stat |= BROKEN
- src.icon_state = "[initial(icon_state)]-broken"
- return
-
-//Somebody cut an important wire and now we're following a new definition of "pitch."
-/obj/machinery/vending/proc/throw_item()
- var/obj/throw_item = null
- var/mob/living/target = locate() in view(7,src)
- if(!target)
- return 0
-
- for(var/datum/data/vending_product/R in src.product_records)
- if (R.amount <= 0) //Try to use a record that actually has something to dump.
- continue
- var/dump_path = R.product_path
- if (!dump_path)
- continue
-
- R.amount--
- throw_item = new dump_path(src.loc)
- break
- if (!throw_item)
- return 0
- spawn(0)
- throw_item.throw_at(target, 16, 3)
- src.visible_message("\red [src] launches [throw_item.name] at [target.name]!")
- return 1
-
-/obj/machinery/vending/proc/isWireColorCut(var/wireColor)
- var/wireFlag = APCWireColorToFlag[wireColor]
- return ((src.wires & wireFlag) == 0)
-
-/obj/machinery/vending/proc/isWireCut(var/wireIndex)
- var/wireFlag = APCIndexToFlag[wireIndex]
- return ((src.wires & wireFlag) == 0)
-
-/obj/machinery/vending/proc/cut(var/wireColor)
- var/wireFlag = APCWireColorToFlag[wireColor]
- var/wireIndex = APCWireColorToIndex[wireColor]
- src.wires &= ~wireFlag
- switch(wireIndex)
- if(WIRE_EXTEND)
- src.extended_inventory = 0
- if(WIRE_SHOCK)
- src.seconds_electrified = -1
- if (WIRE_SHOOTINV)
- if(!src.shoot_inventory)
- src.shoot_inventory = 1
-
-
-/obj/machinery/vending/proc/mend(var/wireColor)
- var/wireFlag = APCWireColorToFlag[wireColor]
- var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function
- src.wires |= wireFlag
- switch(wireIndex)
-// if(WIRE_SCANID)
- if(WIRE_SHOCK)
- src.seconds_electrified = 0
- if (WIRE_SHOOTINV)
- src.shoot_inventory = 0
-
-/obj/machinery/vending/proc/pulse(var/wireColor)
- var/wireIndex = APCWireColorToIndex[wireColor]
- switch(wireIndex)
- if(WIRE_EXTEND)
- src.extended_inventory = !src.extended_inventory
-// if (WIRE_SCANID)
- if (WIRE_SHOCK)
- src.seconds_electrified = 30
- if (WIRE_SHOOTINV)
- src.shoot_inventory = !src.shoot_inventory
-
-
-/obj/machinery/vending/proc/shock(mob/user, prb)
- if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
- return 0
- if(!prob(prb))
- return 0
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- if (electrocute_mob(user, get_area(src), src, 0.7))
- return 1
- else
- return 0
-
-/*
- * Vending machine types
- */
-
-/*
-
-/obj/machinery/vending/[vendors name here] // --vending machine template :)
- name = ""
- desc = ""
- icon = ''
- icon_state = ""
- vend_delay = 15
- products = list()
- contraband = list()
- premium = list()
-
-*/
-
-/*
-/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink
- name = "Tank Vendor"
- desc = "A vendor with a wide variety of masks and gas tanks."
- icon = 'icons/obj/objects.dmi'
- icon_state = "dispenser"
- product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
- product_amounts = "10;10;10;5;25"
- vend_delay = 0
-*/
-
-/obj/machinery/vending/boozeomat
- name = "Booze-O-Mat"
- desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
- icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles
- icon_deny = "boozeomat-deny"
- products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
- /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/bottle/cognac = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/beer = 6,
- /obj/item/weapon/reagent_containers/food/drinks/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/tonic = 8,
- /obj/item/weapon/reagent_containers/food/drinks/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/sodawater = 15,
- /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9)
- contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10)
- vend_delay = 15
- product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
- product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
- req_access_txt = "25"
-
-/obj/machinery/vending/assist
- products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
- /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
- contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
- product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
-
-/obj/machinery/vending/coffee
- name = "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"
- 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)
- contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10)
- 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/machinery/vending/snack
- name = "Getmore Chocolate Corp"
- desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars"
- product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
- product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
- icon_state = "snack"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6,
- /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6,
- /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6)
- contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6)
- prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25,
- /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 20,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 30,
- /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25)
-
-
-
-/obj/machinery/vending/cola
- name = "Robust Softdrinks"
- desc = "A softdrink vendor provided by Robust Industries, LLC."
- icon_state = "Cola_Machine"
- product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
- product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
- products = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 10,
- /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/starkist = 10,
- /obj/item/weapon/reagent_containers/food/drinks/space_up = 10)
- contraband = list(/obj/item/weapon/reagent_containers/food/drinks/thirteenloko = 5)
- prices = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 20,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 20,
- /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 20,/obj/item/weapon/reagent_containers/food/drinks/starkist = 20,
- /obj/item/weapon/reagent_containers/food/drinks/space_up = 20)
-
-//This one's from bay12
-/obj/machinery/vending/cart
- name = "PTech"
- desc = "Cartridges for PDAs"
- product_slogans = "Carts to go!"
- icon_state = "cart"
- icon_deny = "cart-deny"
- products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10,
- /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10,
- /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10)
-
-
-/obj/machinery/vending/cigarette
- name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
- desc = "If you want to get cancer, might as well do it in style"
- product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
- product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
- vend_delay = 34
- icon_state = "cigs"
- products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4)
- contraband = list(/obj/item/weapon/lighter/zippo = 4)
- premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2)
- prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60)
-
-
-/obj/machinery/vending/medical
- name = "NanoMed Plus"
- desc = "Medical drug dispenser."
- icon_state = "med"
- icon_deny = "med-deny"
- product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
- req_access_txt = "5"
- products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4,
- /obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
- /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
- /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2)
- contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
-
-
-//This one's from bay12
-/obj/machinery/vending/plasmaresearch
- name = "Toximate 3000"
- desc = "All the fine parts you need in one vending machine!"
- products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
- /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
- /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
-
-/obj/machinery/vending/wallmed1
- name = "NanoMed"
- desc = "Wall-mounted Medical Equipment dispenser."
- product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
- icon_state = "wallmed"
- icon_deny = "wallmed-deny"
- req_access_txt = "5"
- density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
- products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/syringe/inaprovaline = 4,/obj/item/device/healthanalyzer = 1)
- contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1)
-
-/obj/machinery/vending/wallmed2
- name = "NanoMed"
- desc = "Wall-mounted Medical Equipment dispenser."
- icon_state = "wallmed"
- icon_deny = "wallmed-deny"
- req_access_txt = "5"
- density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
- products = list(/obj/item/weapon/reagent_containers/syringe/inaprovaline = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3,
- /obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3)
- contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3)
-
-/obj/machinery/vending/security
- name = "SecTech"
- desc = "A security equipment vendor"
- product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
- icon_state = "sec"
- icon_deny = "sec-deny"
- req_access_txt = "1"
- products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
- /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6)
- contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2)
-
-/obj/machinery/vending/hydronutrients
- name = "NutriMax"
- desc = "A plant nutrients vendor"
- product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
- product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
- icon_state = "nutri"
- icon_deny = "nutri-deny"
- products = list(/obj/item/beezeez = 45,/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20,
- /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
- contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
-
-/obj/machinery/vending/hydroseeds
- name = "MegaSeed Servitor"
- desc = "When you need seeds fast!"
- product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
- product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
- icon_state = "seeds"
- products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3,
- /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3,
- /obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
- /obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3,
- /obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,
- /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)
- contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2,
- /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2)
- premium = list(/obj/item/toy/waterflower = 1)
-
-
-/obj/machinery/vending/magivend
- name = "MagiVend"
- desc = "A magic vending machine."
- icon_state = "MagiVend"
- product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
- vend_delay = 15
- vend_reply = "Have an enchanted evening!"
- product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
- products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
- contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
-
-/obj/machinery/vending/dinnerware
- name = "Dinnerware"
- desc = "A kitchen and restaurant equipment vendor"
- product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
- icon_state = "dinnerware"
- products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
- contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
-
-/obj/machinery/vending/sovietsoda
- name = "BODA"
- desc = "Old sweet water vending machine"
- icon_state = "sovietsoda"
- product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
- products = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30)
- contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20)
-
-/obj/machinery/vending/tool
- name = "YouTool"
- desc = "Tools for tools."
- icon_state = "tool"
- icon_deny = "tool-deny"
- //req_access_txt = "12" //Maintenance access
- products = list(/obj/item/weapon/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
- /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5)
- contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2)
- premium = list(/obj/item/clothing/gloves/yellow = 1)
-
-/obj/machinery/vending/engivend
- name = "Engi-Vend"
- desc = "Spare tool vending. What? Did you expect some witty description?"
- icon_state = "engivend"
- icon_deny = "engivend-deny"
- req_access_txt = "11" //Engineering Equipment access
- products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10)
- contraband = list(/obj/item/weapon/cell/potato = 3)
- premium = list(/obj/item/weapon/storage/belt/utility = 3)
-
-//This one's from bay12
-/obj/machinery/vending/engineering
- name = "Robco Tool Maker"
- desc = "Everything you need for do-it-yourself station repair."
- icon_state = "engi"
- icon_deny = "engi-deny"
- req_access_txt = "11"
- products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
- /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12,
- /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
- /obj/item/weapon/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
- /obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
- /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
- // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
- // Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it.
- // The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu
-
-//This one's from bay12
-/obj/machinery/vending/robotics
- name = "Robotech Deluxe"
- desc = "All the tools you need to create your own robot army."
- icon_state = "robotics"
- icon_deny = "robotics-deny"
- req_access_txt = "29"
- products = list(/obj/item/clothing/suit/storage/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/weapon/cable_coil = 4,/obj/item/device/flash = 4,
- /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
- /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
- /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
- //everything after the power cell had no amounts, I improvised. -Sayu
-
+/datum/data/vending_product
+ var/product_name = "generic"
+ var/product_path = null
+ var/amount = 0
+ var/price = 0
+ var/display_color = "blue"
+
+
+
+/obj/machinery/vending
+ name = "Vendomat"
+ desc = "A generic vending machine."
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "generic"
+ layer = 2.9
+ anchored = 1
+ density = 1
+ var/active = 1 //No sales pitches if off!
+ var/vend_ready = 1 //Are we ready to vend?? Is it time??
+ var/vend_delay = 10 //How long does it take to vend?
+ var/datum/data/vending_product/currently_vending = null // A /datum/data/vending_product instance of what we're paying for right now.
+
+ // To be filled out at compile time
+ var/list/products = list() // For each, use the following pattern:
+ var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2)
+ var/list/premium = list() // No specified amount = only one in stock
+ var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price.
+
+ var/product_slogans = "" //String of slogans separated by semicolons, optional
+ var/product_ads = "" //String of small ad messages in the vending screen - random chance
+ var/list/product_records = list()
+ var/list/hidden_records = list()
+ var/list/coin_records = list()
+ var/list/slogan_list = list()
+ var/list/small_ads = list() // small ad messages in the vending screen - random chance of popping up whenever you open it
+ var/vend_reply //Thank you for shopping!
+ var/last_reply = 0
+ var/last_slogan = 0 //When did we last pitch?
+ var/slogan_delay = 6000 //How long until we can pitch again?
+ var/icon_vend //Icon_state when vending!
+ var/icon_deny //Icon_state when vending!
+ //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine.
+ var/seconds_electrified = 0 //Shock customers like an airlock.
+ var/shoot_inventory = 0 //Fire items at customers! We're broken!
+ var/shut_up = 1 //Stop spouting those godawful pitches!
+ var/extended_inventory = 0 //can we access the hidden inventory?
+ var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar.
+ var/wires = 15
+ var/obj/item/weapon/coin/coin
+ var/const/WIRE_EXTEND = 1
+ var/const/WIRE_SCANID = 2
+ var/const/WIRE_SHOCK = 3
+ var/const/WIRE_SHOOTINV = 4
+
+ var/obj/machinery/account_database/linked_db
+ var/datum/money_account/linked_account
+
+/obj/machinery/vending/New()
+ ..()
+ spawn(4)
+ src.slogan_list = text2list(src.product_slogans, ";")
+
+ // So not all machines speak at the exact same time.
+ // The first time this machine says something will be at slogantime + this random value,
+ // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated.
+ src.last_slogan = world.time + rand(0, slogan_delay)
+
+ src.build_inventory(products)
+ //Add hidden inventory
+ src.build_inventory(contraband, 1)
+ src.build_inventory(premium, 0, 1)
+ power_change()
+
+ reconnect_database()
+ linked_account = vendor_account
+
+ return
+
+ return
+
+/obj/machinery/vending/proc/reconnect_database()
+ for(var/obj/machinery/account_database/DB in world)
+ if(DB.z == src.z)
+ linked_db = DB
+ break
+
+/obj/machinery/vending/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if (prob(50))
+ del(src)
+ return
+ if(3.0)
+ if (prob(25))
+ spawn(0)
+ src.malfunction()
+ return
+ return
+ else
+ return
+
+/obj/machinery/vending/blob_act()
+ if (prob(50))
+ spawn(0)
+ src.malfunction()
+ del(src)
+ return
+
+ return
+
+/obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0)
+ for(var/typepath in productlist)
+ var/amount = productlist[typepath]
+ var/price = prices[typepath]
+ if(isnull(amount)) amount = 1
+
+ var/atom/temp = new typepath(null)
+ var/datum/data/vending_product/R = new /datum/data/vending_product()
+ R.product_name = temp.name
+ R.product_path = typepath
+ R.amount = amount
+ R.price = price
+ R.display_color = pick("red","blue","green")
+
+ if(hidden)
+ hidden_records += R
+ else if(req_coin)
+ coin_records += R
+ else
+ product_records += R
+// world << "Added: [R.product_name]] - [R.amount] - [R.product_path]"
+ return
+
+/obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/card/emag))
+ src.emagged = 1
+ user << "You short out the product lock on [src]"
+ return
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ src.panel_open = !src.panel_open
+ user << "You [src.panel_open ? "open" : "close"] the maintenance panel."
+ src.overlays.Cut()
+ if(src.panel_open)
+ src.overlays += image(src.icon, "[initial(icon_state)]-panel")
+ src.updateUsrDialog()
+ return
+ else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters))
+ if(src.panel_open)
+ attack_hand(user)
+ return
+ else if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
+ user.drop_item()
+ W.loc = src
+ coin = W
+ user << "\blue You insert the [W] into the [src]"
+ return
+ else if(istype(W, /obj/item/weapon/card) && currently_vending)
+ //attempt to connect to a new db, and if that doesn't work then fail
+ if(!linked_db)
+ reconnect_database()
+ if(linked_db)
+ if(linked_account)
+ var/obj/item/weapon/card/I = W
+ scan_card(I)
+ else
+ usr << "\icon[src]Unable to connect to linked account."
+ else
+ usr << "\icon[src]Unable to connect to accounts database."
+ else
+ ..()
+
+/obj/machinery/vending/proc/scan_card(var/obj/item/weapon/card/I)
+ if(!currently_vending) return
+ if (istype(I, /obj/item/weapon/card/id))
+ var/obj/item/weapon/card/id/C = I
+ visible_message("[usr] swipes a card through [src].")
+ if(linked_account)
+ var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
+ var/datum/money_account/D = linked_db.attempt_account_access(C.associated_account_number, attempt_pin, 2)
+ if(D)
+ var/transaction_amount = currently_vending.price
+ if(transaction_amount <= D.money)
+
+ //transfer the money
+ D.money -= transaction_amount
+ linked_account.money += transaction_amount
+
+ //create entries in the two account transaction logs
+ var/datum/transaction/T = new()
+ T.target_name = "[linked_account.owner_name] (via [src.name])"
+ T.purpose = "Purchase of [currently_vending.product_name]"
+ if(transaction_amount > 0)
+ T.amount = "([transaction_amount])"
+ else
+ T.amount = "[transaction_amount]"
+ T.source_terminal = src.name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ D.transaction_log.Add(T)
+ //
+ T = new()
+ T.target_name = D.owner_name
+ T.purpose = "Purchase of [currently_vending.product_name]"
+ T.amount = "[transaction_amount]"
+ T.source_terminal = src.name
+ T.date = current_date_string
+ T.time = worldtime2text()
+ linked_account.transaction_log.Add(T)
+
+ // Vend the item
+ src.vend(src.currently_vending, usr)
+ currently_vending = null
+ else
+ usr << "\icon[src]You don't have that much money!"
+ else
+ usr << "\icon[src]Unable to access account. Check security settings and try again."
+ else
+ usr << "\icon[src]EFTPOS is not connected to an account."
+
+/obj/machinery/vending/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/vending/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/vending/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ user.set_machine(src)
+
+ if(src.seconds_electrified != 0)
+ if(src.shock(user, 100))
+ return
+
+ var/vendorname = (src.name) //import the machine's name
+
+ if(src.currently_vending)
+ var/dat = "
[vendorname]
" //display the name, and added a horizontal rule
+ dat += "You have selected [currently_vending.product_name]. Please swipe your ID to pay for the article. "
+ dat += "Cancel"
+ user << browse(dat, "window=vending")
+ onclose(user, "")
+ return
+
+ var/dat = "
[vendorname]
" //display the name, and added a horizontal rule
+ dat += "Select an item:
" //the rest is just general spacing and bolding
+
+ if (premium.len > 0)
+ dat += "Coin slot: [coin ? coin : "No coin inserted"] (Remove)
"
+
+ if (src.product_records.len == 0)
+ dat += "No product loaded!"
+ else
+ var/list/display_records = src.product_records
+ if(src.extended_inventory)
+ display_records = src.product_records + src.hidden_records
+ if(src.coin)
+ display_records = src.product_records + src.coin_records
+ if(src.coin && src.extended_inventory)
+ display_records = src.product_records + src.hidden_records + src.coin_records
+
+ for (var/datum/data/vending_product/R in display_records)
+ dat += "[R.product_name]:"
+ dat += " [R.amount] "
+ if(R.price)
+ dat += " (Price: [R.price])"
+ if (R.amount > 0)
+ dat += " (Vend)"
+ else
+ dat += " SOLD OUT"
+ dat += " "
+
+ dat += ""
+
+ if(panel_open)
+ var/list/vendwires = list(
+ "Violet" = 1,
+ "Orange" = 2,
+ "Goldenrod" = 3,
+ "Green" = 4,
+ )
+ dat += " Access Panel "
+ for(var/wiredesc in vendwires)
+ var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]]
+ dat += "[wiredesc] wire: "
+ if(!is_uncut)
+ dat += "Mend"
+ else
+ dat += "Cut "
+ dat += "Pulse "
+ dat += " "
+
+ dat += " "
+ dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"]. "
+ dat += "The red light is [src.shoot_inventory ? "off" : "blinking"]. "
+ dat += "The green light is [src.extended_inventory ? "on" : "off"]. "
+ dat += "The [(src.wires & WIRE_SCANID) ? "purple" : "yellow"] light is on. "
+
+ if (product_slogans != "")
+ dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle"
+
+ user << browse(dat, "window=vending")
+ onclose(user, "")
+ return
+
+/obj/machinery/vending/Topic(href, href_list)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(usr.stat || usr.restrained())
+ return
+
+ if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon))
+ if(!coin)
+ usr << "There is no coin in this machine."
+ return
+
+ coin.loc = src.loc
+ if(!usr.get_active_hand())
+ usr.put_in_hands(coin)
+ usr << "\blue You remove the [coin] from the [src]"
+ coin = null
+
+
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
+ usr.set_machine(src)
+ if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending))
+
+ if(istype(usr,/mob/living/silicon))
+ if(istype(usr,/mob/living/silicon/robot))
+ var/mob/living/silicon/robot/R = usr
+ if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) ))
+ usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!"
+ return
+ else
+ usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!"
+ return
+
+ if ((!src.allowed(usr)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH
+ usr << "\red Access denied." //Unless emagged of course
+ flick(src.icon_deny,src)
+ return
+
+ var/datum/data/vending_product/R = locate(href_list["vend"])
+ if (!R || !istype(R) || !R.product_path || R.amount <= 0)
+ return
+
+ if(R.price == null)
+ src.vend(R, usr)
+ else
+ src.currently_vending = R
+ src.updateUsrDialog()
+
+ return
+
+ else if (href_list["cancel_buying"])
+ src.currently_vending = null
+ src.updateUsrDialog()
+ return
+
+ else if ((href_list["cutwire"]) && (src.panel_open))
+ var/twire = text2num(href_list["cutwire"])
+ if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
+ usr << "You need wirecutters!"
+ return
+ if (src.isWireColorCut(twire))
+ src.mend(twire)
+ else
+ src.cut(twire)
+
+ else if ((href_list["pulsewire"]) && (src.panel_open))
+ var/twire = text2num(href_list["pulsewire"])
+ if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
+ usr << "You need a multitool!"
+ return
+ if (src.isWireColorCut(twire))
+ usr << "You can't pulse a cut wire."
+ return
+ else
+ src.pulse(twire)
+
+ else if ((href_list["togglevoice"]) && (src.panel_open))
+ src.shut_up = !src.shut_up
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ else
+ usr << browse(null, "window=vending")
+ return
+ return
+
+/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user)
+ if ((!src.allowed(user)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH
+ user << "\red Access denied." //Unless emagged of course
+ flick(src.icon_deny,src)
+ return
+ src.vend_ready = 0 //One thing at a time!!
+
+ if (R in coin_records)
+ if(!coin)
+ user << "\blue You need to insert a coin to get this item."
+ return
+ if(coin.string_attached)
+ if(prob(50))
+ user << "\blue You successfully pull the coin out before the [src] could swallow it."
+ else
+ user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all."
+ del(coin)
+ else
+ del(coin)
+
+ R.amount--
+
+ if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply)
+ spawn(0)
+ src.speak(src.vend_reply)
+ src.last_reply = world.time
+
+ use_power(5)
+ if (src.icon_vend) //Show the vending animation if needed
+ flick(src.icon_vend,src)
+ spawn(src.vend_delay)
+ new R.product_path(get_turf(src))
+ src.vend_ready = 1
+ return
+
+ src.updateUsrDialog()
+
+/obj/machinery/vending/process()
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ if(!src.active)
+ return
+
+ if(src.seconds_electrified > 0)
+ src.seconds_electrified--
+
+ //Pitch to the people! Really sell it!
+ if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5))
+ var/slogan = pick(src.slogan_list)
+ src.speak(slogan)
+ src.last_slogan = world.time
+
+ if(src.shoot_inventory && prob(2))
+ src.throw_item()
+
+ return
+
+/obj/machinery/vending/proc/speak(var/message)
+ if(stat & NOPOWER)
+ return
+
+ if (!message)
+ return
+
+ for(var/mob/O in hearers(src, null))
+ O.show_message("[src] beeps, \"[message]\"",2)
+ return
+
+/obj/machinery/vending/power_change()
+ if(stat & BROKEN)
+ icon_state = "[initial(icon_state)]-broken"
+ else
+ if( powered() )
+ icon_state = initial(icon_state)
+ stat &= ~NOPOWER
+ else
+ spawn(rand(0, 15))
+ src.icon_state = "[initial(icon_state)]-off"
+ stat |= NOPOWER
+
+//Oh no we're malfunctioning! Dump out some product and break.
+/obj/machinery/vending/proc/malfunction()
+ for(var/datum/data/vending_product/R in src.product_records)
+ if (R.amount <= 0) //Try to use a record that actually has something to dump.
+ continue
+ var/dump_path = R.product_path
+ if (!dump_path)
+ continue
+
+ while(R.amount>0)
+ new dump_path(src.loc)
+ R.amount--
+ break
+
+ stat |= BROKEN
+ src.icon_state = "[initial(icon_state)]-broken"
+ return
+
+//Somebody cut an important wire and now we're following a new definition of "pitch."
+/obj/machinery/vending/proc/throw_item()
+ var/obj/throw_item = null
+ var/mob/living/target = locate() in view(7,src)
+ if(!target)
+ return 0
+
+ for(var/datum/data/vending_product/R in src.product_records)
+ if (R.amount <= 0) //Try to use a record that actually has something to dump.
+ continue
+ var/dump_path = R.product_path
+ if (!dump_path)
+ continue
+
+ R.amount--
+ throw_item = new dump_path(src.loc)
+ break
+ if (!throw_item)
+ return 0
+ spawn(0)
+ throw_item.throw_at(target, 16, 3)
+ src.visible_message("\red [src] launches [throw_item.name] at [target.name]!")
+ return 1
+
+/obj/machinery/vending/proc/isWireColorCut(var/wireColor)
+ var/wireFlag = APCWireColorToFlag[wireColor]
+ return ((src.wires & wireFlag) == 0)
+
+/obj/machinery/vending/proc/isWireCut(var/wireIndex)
+ var/wireFlag = APCIndexToFlag[wireIndex]
+ return ((src.wires & wireFlag) == 0)
+
+/obj/machinery/vending/proc/cut(var/wireColor)
+ var/wireFlag = APCWireColorToFlag[wireColor]
+ var/wireIndex = APCWireColorToIndex[wireColor]
+ src.wires &= ~wireFlag
+ switch(wireIndex)
+ if(WIRE_EXTEND)
+ src.extended_inventory = 0
+ if(WIRE_SHOCK)
+ src.seconds_electrified = -1
+ if (WIRE_SHOOTINV)
+ if(!src.shoot_inventory)
+ src.shoot_inventory = 1
+
+
+/obj/machinery/vending/proc/mend(var/wireColor)
+ var/wireFlag = APCWireColorToFlag[wireColor]
+ var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function
+ src.wires |= wireFlag
+ switch(wireIndex)
+// if(WIRE_SCANID)
+ if(WIRE_SHOCK)
+ src.seconds_electrified = 0
+ if (WIRE_SHOOTINV)
+ src.shoot_inventory = 0
+
+/obj/machinery/vending/proc/pulse(var/wireColor)
+ var/wireIndex = APCWireColorToIndex[wireColor]
+ switch(wireIndex)
+ if(WIRE_EXTEND)
+ src.extended_inventory = !src.extended_inventory
+// if (WIRE_SCANID)
+ if (WIRE_SHOCK)
+ src.seconds_electrified = 30
+ if (WIRE_SHOOTINV)
+ src.shoot_inventory = !src.shoot_inventory
+
+
+/obj/machinery/vending/proc/shock(mob/user, prb)
+ if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
+ return 0
+ if(!prob(prb))
+ return 0
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ if (electrocute_mob(user, get_area(src), src, 0.7))
+ return 1
+ else
+ return 0
+
+/*
+ * Vending machine types
+ */
+
+/*
+
+/obj/machinery/vending/[vendors name here] // --vending machine template :)
+ name = ""
+ desc = ""
+ icon = ''
+ icon_state = ""
+ vend_delay = 15
+ products = list()
+ contraband = list()
+ premium = list()
+
+*/
+
+/*
+/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink
+ name = "Tank Vendor"
+ desc = "A vendor with a wide variety of masks and gas tanks."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "dispenser"
+ product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
+ product_amounts = "10;10;10;5;25"
+ vend_delay = 0
+*/
+
+/obj/machinery/vending/boozeomat
+ name = "Booze-O-Mat"
+ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
+ icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles
+ icon_deny = "boozeomat-deny"
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
+ /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/bottle/cognac = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/beer = 6,
+ /obj/item/weapon/reagent_containers/food/drinks/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/tonic = 8,
+ /obj/item/weapon/reagent_containers/food/drinks/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/sodawater = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9)
+ contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10)
+ vend_delay = 15
+ product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
+ product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
+ req_access_txt = "25"
+
+/obj/machinery/vending/assist
+ products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
+ /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
+ contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
+ product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
+
+/obj/machinery/vending/coffee
+ name = "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"
+ 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)
+ contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10)
+ 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/machinery/vending/snack
+ name = "Getmore Chocolate Corp"
+ desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars"
+ product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
+ product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
+ icon_state = "snack"
+ products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6,
+ /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6)
+ contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6)
+ prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25,
+ /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 20,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25)
+
+
+
+/obj/machinery/vending/cola
+ name = "Robust Softdrinks"
+ desc = "A softdrink vendor provided by Robust Industries, LLC."
+ icon_state = "Cola_Machine"
+ product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
+ product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/starkist = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/space_up = 10)
+ contraband = list(/obj/item/weapon/reagent_containers/food/drinks/thirteenloko = 5)
+ prices = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 20,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 20,
+ /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 20,/obj/item/weapon/reagent_containers/food/drinks/starkist = 20,
+ /obj/item/weapon/reagent_containers/food/drinks/space_up = 20)
+
+//This one's from bay12
+/obj/machinery/vending/cart
+ name = "PTech"
+ desc = "Cartridges for PDAs"
+ product_slogans = "Carts to go!"
+ icon_state = "cart"
+ icon_deny = "cart-deny"
+ products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10,
+ /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10,
+ /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10)
+
+
+/obj/machinery/vending/cigarette
+ name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
+ desc = "If you want to get cancer, might as well do it in style"
+ product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
+ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
+ vend_delay = 34
+ icon_state = "cigs"
+ products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4)
+ contraband = list(/obj/item/weapon/lighter/zippo = 4)
+ premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2)
+ prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60)
+
+
+/obj/machinery/vending/medical
+ name = "NanoMed Plus"
+ desc = "Medical drug dispenser."
+ icon_state = "med"
+ icon_deny = "med-deny"
+ product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
+ req_access_txt = "5"
+ products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4,
+ /obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
+ /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
+ /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
+ /obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2)
+ contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
+
+
+//This one's from bay12
+/obj/machinery/vending/plasmaresearch
+ name = "Toximate 3000"
+ desc = "All the fine parts you need in one vending machine!"
+ products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
+ /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
+ /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
+
+/obj/machinery/vending/wallmed1
+ name = "NanoMed"
+ desc = "Wall-mounted Medical Equipment dispenser."
+ product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
+ icon_state = "wallmed"
+ icon_deny = "wallmed-deny"
+ req_access_txt = "5"
+ density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
+ products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1)
+ contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1)
+
+/obj/machinery/vending/wallmed2
+ name = "NanoMed"
+ desc = "Wall-mounted Medical Equipment dispenser."
+ icon_state = "wallmed"
+ icon_deny = "wallmed-deny"
+ req_access_txt = "5"
+ density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
+ products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3,
+ /obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3)
+ contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3)
+
+/obj/machinery/vending/security
+ name = "SecTech"
+ desc = "A security equipment vendor"
+ product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
+ icon_state = "sec"
+ icon_deny = "sec-deny"
+ req_access_txt = "1"
+ products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6)
+ contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2)
+
+/obj/machinery/vending/hydronutrients
+ name = "NutriMax"
+ desc = "A plant nutrients vendor"
+ product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
+ product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
+ icon_state = "nutri"
+ icon_deny = "nutri-deny"
+ products = list(/obj/item/beezeez = 45,/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20,
+ /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
+ contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
+
+/obj/machinery/vending/hydroseeds
+ name = "MegaSeed Servitor"
+ desc = "When you need seeds fast!"
+ product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
+ product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
+ icon_state = "seeds"
+ products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3,
+ /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3,
+ /obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
+ /obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3,
+ /obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,
+ /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)
+ contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2,
+ /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2)
+ premium = list(/obj/item/toy/waterflower = 1)
+
+
+/obj/machinery/vending/magivend
+ name = "MagiVend"
+ desc = "A magic vending machine."
+ icon_state = "MagiVend"
+ product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
+ vend_delay = 15
+ vend_reply = "Have an enchanted evening!"
+ product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
+ products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
+ contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
+
+/obj/machinery/vending/dinnerware
+ name = "Dinnerware"
+ desc = "A kitchen and restaurant equipment vendor"
+ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
+ icon_state = "dinnerware"
+ products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
+ contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
+
+/obj/machinery/vending/sovietsoda
+ name = "BODA"
+ desc = "Old sweet water vending machine"
+ icon_state = "sovietsoda"
+ product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30)
+ contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20)
+
+/obj/machinery/vending/tool
+ name = "YouTool"
+ desc = "Tools for tools."
+ icon_state = "tool"
+ icon_deny = "tool-deny"
+ //req_access_txt = "12" //Maintenance access
+ products = list(/obj/item/weapon/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
+ /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5)
+ contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2)
+ premium = list(/obj/item/clothing/gloves/yellow = 1)
+
+/obj/machinery/vending/engivend
+ name = "Engi-Vend"
+ desc = "Spare tool vending. What? Did you expect some witty description?"
+ icon_state = "engivend"
+ icon_deny = "engivend-deny"
+ req_access_txt = "11" //Engineering Equipment access
+ products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10)
+ contraband = list(/obj/item/weapon/cell/potato = 3)
+ premium = list(/obj/item/weapon/storage/belt/utility = 3)
+
+//This one's from bay12
+/obj/machinery/vending/engineering
+ name = "Robco Tool Maker"
+ desc = "Everything you need for do-it-yourself station repair."
+ icon_state = "engi"
+ icon_deny = "engi-deny"
+ req_access_txt = "11"
+ products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
+ /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12,
+ /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
+ /obj/item/weapon/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
+ /obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
+ /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
+ // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
+ // Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it.
+ // The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu
+
+//This one's from bay12
+/obj/machinery/vending/robotics
+ name = "Robotech Deluxe"
+ desc = "All the tools you need to create your own robot army."
+ icon_state = "robotics"
+ icon_deny = "robotics-deny"
+ req_access_txt = "29"
+ products = list(/obj/item/clothing/suit/storage/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/weapon/cable_coil = 4,/obj/item/device/flash = 4,
+ /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
+ /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
+ /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
+ //everything after the power cell had no amounts, I improvised. -Sayu
+
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index c55684eb197..281c23f0fd0 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -131,8 +131,7 @@
else
if(isliving(src.loc))
return
- user.lastDblClick = world.time + 2
- user.next_move = world.time + 2
+ user.delay_click(2)
src.pickup(user)
add_fingerprint(user)
user.put_in_active_hand(src)
@@ -166,8 +165,7 @@
if(istype(src.loc, /mob/living))
return
src.pickup(user)
- user.lastDblClick = world.time + 2
- user.next_move = world.time + 2
+ user.delay_click(2)
user.put_in_active_hand(src)
return
@@ -229,6 +227,8 @@
log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" )
msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG
+ user.delay_click(10)
+
//spawn(1800) // this wont work right
// M.lastattacker = null
/////////////////////////
diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm
new file mode 100644
index 00000000000..da297fbb55b
--- /dev/null
+++ b/code/game/objects/items/devices/pipe_painter.dm
@@ -0,0 +1,22 @@
+/obj/item/device/pipe_painter
+ name = "pipe painter"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "labeler1"
+ item_state = "flight"
+ var/list/modes = list("grey","red","blue","cyan","green","yellow","purple")
+ var/mode = "grey"
+
+/obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob)
+ if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated))
+ return
+ var/obj/machinery/atmospherics/pipe/P = A
+ P.color = mode
+ user.visible_message("[user] paints \the [P] [mode].","You paint \the [P] [mode].")
+ P.update_icon()
+
+/obj/item/device/pipe_painter/attack_self(mob/user as mob)
+ mode = input("Which colour do you want to use?","Pipe painter") in modes
+
+/obj/item/device/pipe_painter/examine()
+ ..()
+ usr << "It is in [mode] mode."
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 165f6748ec5..d2d5417d6c3 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -121,7 +121,8 @@
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "cargo_cypherkey"
channels = list("Supply" = 1)
+
/obj/item/device/encryptionkey/ert
name = "NanoTrasen ERT Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,)
+ channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0081954da84..422a27897c0 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -499,8 +499,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
freq_text = "Engineering"
if(1359)
freq_text = "Security"
-// if(1349)
-// freq_text = "Mining"
if(1347)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 9fccf2e0604..5011f5346ee 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -33,6 +33,7 @@
R.base_icon = "robot"
del(R.module)
R.module = null
+ R.camera.network.Remove(list("Medical","MINE"))
R.updatename("Default")
R.status_flags |= CANPUSH
R.updateicon()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index ca538c254e2..4721bcc8fe6 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -11,15 +11,6 @@
var/heal_burn = 0
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
- if (M.stat == 2)
- var/t_him = "it"
- if (M.gender == MALE)
- t_him = "him"
- else if (M.gender == FEMALE)
- t_him = "her"
- user << "\red \The [M] is dead, you cannot help [t_him]!"
- return 1
-
if (!istype(M))
user << "\red \The [src] cannot be applied to [M]!"
return 1
@@ -47,42 +38,16 @@
user << "\red This isn't useful at all on a robotic limb.."
return 1
- if(src.heal_brute)
- if(!affecting.bandage())
- user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
- return 1
- else
- for (var/datum/wound/W in affecting.wounds)
- if (W.internal)
- continue
- if (W.current_stage <= W.max_bleeding_stage)
- user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
- "\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
- //H.add_side_effect("Itch")
- else if (istype(W,/datum/wound/bruise))
- user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
- "\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
- else
- user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
- "\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
-
- else if(src.heal_burn)
- if(!affecting.salve())
- user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
- return 1
- else
- user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
- "\blue You salve wounds on [M]'s [affecting.display_name]." )
-
H.UpdateDamageIcon()
+
else
+
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message( \
"\blue [M] has been applied with [src] by [user].", \
"\blue You apply \the [src] to [M]." \
)
-
- use(1)
+ use(1)
M.updatehealth()
/obj/item/stack/medical/bruise_pack
@@ -90,18 +55,60 @@
singular_name = "gauze length"
desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "brutepack"
- heal_brute = 60
origin_tech = "biotech=1"
+/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.bandage())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
+ return 1
+ else
+ for (var/datum/wound/W in affecting.wounds)
+ if (W.internal)
+ continue
+ if (W.current_stage <= W.max_bleeding_stage)
+ user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
+ //H.add_side_effect("Itch")
+ else if (istype(W,/datum/wound/bruise))
+ user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
+ else
+ user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
+ use(1)
+
/obj/item/stack/medical/ointment
name = "ointment"
desc = "Used to treat those nasty burns."
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
- heal_burn = 40
+ heal_burn = 1
origin_tech = "biotech=1"
+/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.salve())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
+ return 1
+ else
+ user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
+ "\blue You salve wounds on [M]'s [affecting.display_name]." )
+ use(1)
+
/obj/item/stack/medical/bruise_pack/tajaran
name = "\improper S'rendarr's Hand leaf"
singular_name = "S'rendarr's Hand leaf"
@@ -126,6 +133,34 @@
heal_brute = 12
origin_tech = "biotech=1"
+/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.bandage())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been treated."
+ return 1
+ else
+ for (var/datum/wound/W in affecting.wounds)
+ if (W.internal)
+ continue
+ if (W.current_stage <= W.max_bleeding_stage)
+ user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \
+ "\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." )
+ //H.add_side_effect("Itch")
+ else if (istype(W,/datum/wound/bruise))
+ user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." )
+ else
+ user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." )
+ affecting.heal_damage(heal_brute,0)
+ use(1)
+
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
singular_name = "advanced burn kit"
@@ -134,8 +169,26 @@
heal_burn = 12
origin_tech = "biotech=1"
+
+/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.salve())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
+ return 1
+ else
+ user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
+ "\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." )
+ affecting.heal_damage(0,heal_burn)
+ use(1)
+
/obj/item/stack/medical/splint
- name = "medical splint"
+ name = "medical splints"
singular_name = "medical splint"
icon_state = "splint"
amount = 5
@@ -143,3 +196,38 @@
/obj/item/stack/medical/splint/single
amount = 1
+
+
+/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+ var/limb = affecting.display_name
+ if(!((affecting.name == "l_arm") || (affecting.name == "r_arm") || (affecting.name == "l_leg") || (affecting.name == "r_leg")))
+ user << "\red You can't apply a splint there!"
+ return
+ if(affecting.status & ORGAN_SPLINTED)
+ user << "\red [M]'s [limb] is already splinted!"
+ return
+ if (M != user)
+ user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
+ else
+ if((!user.hand && affecting.name == "r_arm") || (user.hand && affecting.name == "l_arm"))
+ user << "\red You can't apply a splint to the arm you're using!"
+ return
+ user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.")
+ if(do_after(user, 50))
+ if (M != user)
+ user.visible_message("\red [user] finishes applying \the [src] to [M]'s [limb].", "\red You finish applying \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
+ else
+ if(prob(25))
+ user.visible_message("\red [user] successfully applies \the [src] to their [limb].", "\red You successfully apply \the [src] to your [limb].", "\red You hear something being wrapped.")
+ else
+ user.visible_message("\red [user] fumbles \the [src].", "\red You fumble \the [src].", "\red You hear something being wrapped.")
+ return
+ affecting.status |= ORGAN_SPLINTED
+ use(1)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 77cf343de21..6a26f70e1f5 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,7 +14,6 @@
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
- var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -67,11 +66,6 @@
usr << "\red \The [src] is empty."
return
- if (world.time < src.last_use + 20)
- return
-
- src.last_use = world.time
-
playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3)
var/direction = get_dir(src,target)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 494e5c6552a..38d07024feb 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -461,3 +461,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
islegal()
return 0
+
+/obj/item/weapon/implant/cortical
+ name = "cortical stack"
+ desc = "A fist-sized mass of biocircuits and chips."
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index f4b2a147620..cc2c284adce 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -12,7 +12,7 @@
icon_state ="bookEngineering"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Station Repairs and Construction"
- dat = {"
+ /*dat = {"
@@ -23,7 +23,7 @@
- "}
+ "}*/
/obj/item/weapon/book/manual/engineering_particle_accelerator
name = "Particle Accelerator User's Guide"
@@ -32,7 +32,7 @@
title = "Particle Accelerator User's Guide"
//big pile of shit below.
- dat = {"
+ /*dat = {"