Files
Paradise/code/game/objects/items.dm
n3ophyt3@gmail.com 9e50fd8e96 MMI update the third and fourth. Barring some big huge bug that didn't turn up in my testing to make sure shit works, the MMI is ready for showtime.
If you're wondering why updates third and fourth happened together, in update the third I redid how brains work, and I was halfway to committing it when I realized "wait, if I upload this now, everything that uses the brain will cause fuckups".

Notable changes:
When your brain is cut out, instead of your client hanging around inside your now brainless and more or less useless body, it it shunted into the brain object, similar to an AI in an intellicard.
While not in an MMI, your brain is "dead", deathchat and all. When stuck into an MMI, you spring to 'life', allowing you to talk to whoever stuck your brain into the thing. It occurs to me while I'm typing this up that it would be very easy to abuse this communication between life and death by slapping brains in and out of MMIs. DO NOT DO THIS OR THE ADMINS WILL HATE YOU AND DO MEAN THINGS TO YOU.

Life in an MMI is pretty boring, so you should yell at people until they stick you into an AI core or robot frame to give you something to do. I know the MMI was originally thought up as a mecha interface, but I haven't gotten around to looking at the mecha code to figure out how to hook it in yet.

I suspect there's going to be howls of "WHY DO YOU HATE ROBOTICISTS" over this next part, but the MMI itself is an R&D-researched object, with a biotech level of 3. That said, the station starts with two of them in the operating room (to get the research level up if nothing else), and they are producible at the protolathe AND the mecha fabricator (since they will eventually get to plug into a mecha.)

Known issues: The MMI is SUPPOSED to pop out of a cyborg with the player attached when the cyborg goes pop, but it didn't in my initial testing, simply ghosting the borg as they already do. Will work on this as I have time, but what with having to go to work these days, I have somewhat less of that.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1311 316c924e-a436-60f5-8080-3fe189b3f50e
2011-03-30 02:42:54 +00:00

397 lines
11 KiB
Plaintext

/obj/item/weapon/bedsheet/ex_act(severity)
if (severity <= 2)
del(src)
return
return
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
user.drop_item()
src.layer = 5
add_fingerprint(user)
return
/obj/item/weapon/handcuffs/attack(mob/M as mob, mob/user as mob)
if ((usr.mutations & 16) && prob(50))
usr << "\red Uh ... how do those things work?!"
if (istype(M, /mob/living/carbon/human))
var/obj/equip_e/human/O = new /obj/equip_e/human( )
O.source = user
O.target = user
O.item = user.equipped()
O.s_loc = user.loc
O.t_loc = user.loc
O.place = "handcuff"
M.requests += O
spawn( 0 )
O.process()
return
return
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
usr << "\red You don't have the dexterity to do this!"
return
if (istype(M, /mob/living/carbon/human))
var/obj/equip_e/human/O = new /obj/equip_e/human( )
O.source = user
O.target = M
O.item = user.equipped()
O.s_loc = user.loc
O.t_loc = M.loc
O.place = "handcuff"
M.requests += O
spawn( 0 )
playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
O.process()
return
else
var/obj/equip_e/monkey/O = new /obj/equip_e/monkey( )
O.source = user
O.target = M
O.item = user.equipped()
O.s_loc = user.loc
O.t_loc = M.loc
O.place = "handcuff"
M.requests += O
spawn( 0 )
playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
O.process()
return
return
/obj/item/weapon/extinguisher/New()
var/datum/reagents/R = new/datum/reagents(50)
reagents = R
R.my_atom = src
R.add_reagent("water", 50)
/obj/item/weapon/extinguisher/examine()
set src in usr
usr << text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume)
..()
return
/obj/item/weapon/extinguisher/afterattack(atom/target, mob/user , flag)
//TODO; Add support for reagents in water.
if( istype(target, /obj/reagent_dispensers/watertank) && get_dist(src,target) <= 1)
var/obj/o = target
o.reagents.trans_to(src, 50)
user << "\blue Extinguisher refilled"
playsound(src.loc, 'refill.ogg', 50, 1, -6)
return
if (!safety)
if (src.reagents.total_volume < 1)
return
if (world.time < src.last_use + 20)
return
src.last_use = world.time
playsound(src.loc, 'extinguish.ogg', 75, 1, -3)
var/direction = get_dir(src,target)
var/turf/T = get_turf(target)
var/turf/T1 = get_step(T,turn(direction, 90))
var/turf/T2 = get_step(T,turn(direction, -90))
var/list/the_targets = list(T,T1,T2)
for(var/a=0, a<5, a++)
spawn(0)
var/obj/effects/water/W = new /obj/effects/water( get_turf(src) )
var/turf/my_target = pick(the_targets)
var/datum/reagents/R = new/datum/reagents(5)
if(!W) return
W.reagents = R
R.my_atom = W
if(!W || !src) return
src.reagents.trans_to(W,1)
for(var/b=0, b<5, b++)
step_towards(W,my_target)
if(!W) return
W.reagents.reaction(get_turf(W))
for(var/atom/atm in get_turf(W))
if(!W) return
W.reagents.reaction(atm)
if(W.loc == my_target) break
sleep(2)
if(istype(usr.loc, /turf/space))
user.inertia_dir = get_dir(target, user)
step(user, user.inertia_dir)
else
return ..()
return
/obj/item/weapon/extinguisher/attack_self(mob/user as mob)
if (safety)
src.icon_state = "fire_extinguisher1"
src.desc = "The safety is off."
user << "The safety is off."
safety = 0
else
src.icon_state = "fire_extinguisher0"
src.desc = "The safety is on."
user << "The safety is on."
safety = 1
return
/obj/item/weapon/pen/sleepypen
origin_tech = "syndicate=1"
/obj/item/weapon/pen/sleepypen/attack_paw(mob/user as mob)
return src.attack_hand(user)
return
/obj/item/weapon/pen/sleepypen/New()
var/datum/reagents/R = new/datum/reagents(30) //Used to be 300
reagents = R
R.my_atom = src
R.add_reagent("chloralhydrate", 30) //Used to be 100 sleep toxin
// R.add_reagent("impedrezene", 100)
// R.add_reagent("cryptobiolin", 100)
..()
return
/obj/item/weapon/pen/sleepypen/attack(mob/M as mob, mob/user as mob)
if (!( istype(M, /mob) ))
return
if (reagents.total_volume)
//for(var/mob/O in viewers(M, null))
// O.show_message(text("\red [] has been stabbed with [] by [].", M, src, user), 1)
user << "\red You stab [M] with the pen."
M << "\red You feel a tiny prick!"
if(M.reagents) reagents.trans_to(M, 50) //used to be 150
return
/obj/item/device/flashlight/pen/paralysis/New()
var/datum/reagents/R = new/datum/reagents(15)
reagents = R
R.my_atom = src
R.add_reagent("zombiepowder", 15)
..()
return
/obj/item/device/flashlight/pen/paralysis/attack(mob/M as mob, mob/user as mob)
if (!( istype(M, /mob) ))
return
if (reagents.total_volume)
user << "\red You stab [M] with the penlight."
M << "\red You feel a tiny prick!"
if(M.reagents) reagents.trans_to(M, 15)
..()
return
/obj/item/weapon/Bump(mob/M as mob)
spawn( 0 )
..()
return
/obj/manifest/New()
src.invisibility = 101
return
/obj/manifest/proc/manifest()
var/dat = "<B>Crew Manifest</B>:<BR>"
for(var/mob/living/carbon/human/M in world)
dat += text(" <B>[]</B> - []<BR>", M.name, M.get_assignment())
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
P.info = dat
P.name = "paper- 'Crew Manifest'"
//SN src = null
del(src)
return
/obj/screen/close/DblClick()
if (src.master)
src.master:close(usr)
return
/mob/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/shielded = 0
for(var/obj/item/device/shield/S in src)
if (S.active)
shielded = 1
else
if (locate(/obj/item/weapon/grab, src))
var/mob/safe = null
if (istype(src.l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = src.l_hand
if ((G.state == 3 && get_dir(src, user) == src.dir))
safe = G.affecting
if (istype(src.r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = src.r_hand
if ((G.state == 3 && get_dir(src, user) == src.dir))
safe = G.affecting
if (safe)
return safe.attackby(W, user)
if ((!( shielded ) || !( W.flags ) & 32))
spawn( 0 )
if (W)
W.attack(src, user)
return
return
/obj/item/weapon/teleportation_scroll/attack_self(mob/user as mob)
user.machine = src
var/dat = "<B>Teleportation Scroll:</B><BR>"
dat += "Number of uses: [src.uses]<BR>"
dat += "<HR>"
dat += "<B>Four uses use them wisely:</B><BR>"
dat += "<A href='byond://?src=\ref[src];spell_teleport=1'>Teleport</A><BR>"
dat += "Kind regards,<br>Wizards Federation<br><br>P.S. Don't forget to bring your gear, you'll need it to cast most spells.<HR>"
user << browse(dat, "window=scroll")
onclose(user, "scroll")
return
/obj/item/weapon/teleportation_scroll/Topic(href, href_list)
..()
if (usr.stat || usr.restrained())
return
var/mob/living/carbon/human/H = usr
if (!( istype(H, /mob/living/carbon/human)))
return 1
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.machine = src
if (href_list["spell_teleport"])
if (src.uses >= 1)
src.uses -= 1
usr.teleportscroll()
if (istype(src.loc, /mob))
attack_self(src.loc)
else
for(var/mob/M in viewers(1, src))
if (M.client)
src.attack_self(M)
return
/obj/item/brain/examine() // -- TLE
set src in oview(12)
if (!( usr ))
return
usr << "This is \icon[src] \an [src.name]."
if(src.owner)
//if the brain has an owner corpse
if(src.owner.client)
//if the player hasn't ghosted
usr << "You can feel the small spark of life still in this one."
else
//if the player HAS ghosted
for(var/mob/dead/observer/O in world)
if(O.corpse == src.owner && O.client)
//find their ghost
usr << "You can feel the small spark of life still in this one."
else
usr << "This one seems particularly lifeless. Perhaps it will regain some of its luster later. Perhaps not."
/obj/item/brain/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
src.add_fingerprint(user)
if(!(user.zone_sel.selecting == ("head")) || !istype(M, /mob/living/carbon/human))
return ..()
if(!(locate(/obj/machinery/optable, M.loc) && M.resting))
return ..()
var/mob/living/carbon/human/H = M
if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
// you can't stab someone in the eyes wearing a mask!
user << "\blue You're going to need to remove that mask/helmet/glasses first."
return
//since these people will be dead M != usr
if(M:brain_op_stage == 4.0)
for(var/mob/O in viewers(M, null))
if(O == (user || M))
continue
if(M == user)
O.show_message(text("\red [user] inserts [src] into his head!"), 1)
else
O.show_message(text("\red [M] has [src] inserted into his head by [user]."), 1)
if(M != user)
M << "\red [user] inserts [src] into your head!"
user << "\red You insert [src] into [M]'s head!"
else
user << "\red You insert [src] into your head!"
if(M.client)
M.client.mob = new/mob/dead/observer(M)
//a mob can't have two clients so get rid of one
//this might actually be outdated since barring badminnery, a debrain'd body will have any client sucked out to the brain's internal mob. Leaving it anyway to be safe. --NEO
src.brainmob.mind.transfer_to(M)
src.brainmob = null
// if(src.owner)
//if the brain has an owner corpse
// if(src.owner.client)
//if the player hasn't ghosted
// src.owner.client.mob = M
//then put them in M
// else
//if the player HAS ghosted
// for(var/mob/dead/observer/O in world)
// if(O.corpse == src.owner && O.client)
//find their ghost
// O.client.mob = M
//put their mob in M
// del(O)
//delete thier ghost
M:brain_op_stage = 3.0
del(src)
else
..()
return
/obj/item/weapon/stamp/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/item/weapon/stamp/New()
..()
return
/obj/item/weapon/dice/attack_self(mob/user as mob) // Roll the dice -- TLE
var/temp_sides
if(src.sides < 1)
temp_sides = 2
else
temp_sides = src.sides
var/result = rand(1,temp_sides)
var/comment = ""
if(temp_sides == 20 && result == 20)
comment = "Nat 20!"
else if(temp_sides == 20 && result == 1)
comment = "Ouch, bad luck."
user << text("\red You throw a [src]. It lands on a [result]. [comment]")
for(var/mob/O in viewers(user, null))
if(O == (user))
continue
else
O.show_message(text("\red [user] has thrown a [src]. It lands on [result]. [comment]"), 1)