Files
Paradise/code/game/objects/items/item.dm
vageyenaman@gmail.com ca6a513377 Bugfixes galore:
- Retrovirus is now curable. However, unlike most viruses, when it infects a host it generates a random cure. This cure can be either Ryetalyn or rest. For good measure, a doctor should prescribe Ryetalyn AND send them to the recovery room for rest.
     - Fixed a crash in the seeds crate that would result in the crate only having berry seeds. A small typo.
     - Fixed some grammar.
     - Cloning people should now transfer their UI preferences onto the clones.
     - Portable Artificial Intelligences should now properly be able to use the messaging software. They generated some odd runtimes caused by normal PDAs not recognizing pAIs in the PDAs list.
     - Hopefully, I made equipping and dropping items a bit more responsive.
     - As a result of the fix above, the item duplication bug (two people pick an item up at the same time) should theoretically not happen anymore. When I mean theoretically, I mean I have no way of testing this for sure.
     - Cleaned up some of Deuryn's code in a previous revision.

Miscellaneous:
     - The Cold can now be cured if you're just laying down, although actually sleeping will greatly increase your odds of curing it.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2016 316c924e-a436-60f5-8080-3fe189b3f50e
2011-08-16 04:56:32 +00:00

545 lines
16 KiB
Plaintext

/obj/item/proc/process()
processing_items.Remove(src)
return null
/obj/item/proc/attack_self()
return
/obj/item/proc/talk_into(mob/M as mob, text)
return
/obj/item/proc/moved(mob/user as mob, old_loc as turf)
return
/obj/item/proc/dropped(mob/user as mob)
..()
// So you can't drop the Offhand
if(istype(src, /obj/item/weapon/offhand))
user.drop_item(src)
var/obj/item/O_r = user.r_hand
var/obj/item/O_l = user.l_hand
if(O_r.twohanded)
if(O_r.wielded)
user.drop_item(O_r)
if(O_l.twohanded)
if(O_l.wielded)
user.drop_item(O_l)
del(src)
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
return
// called after an item is placed in an equipment slot
// user is mob that equipped it
// slot is text of slot type e.g. "head"
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(var/mob/user, var/slot)
return
//
// ***TODO: implement unequipped()
//
/obj/item/proc/afterattack()
return
/obj/item/weapon/dummy/ex_act()
return
/obj/item/weapon/dummy/blob_act()
return
/obj/item/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(5))
del(src)
return
else
return
/obj/item/blob_act()
return
/obj/item/verb/move_to_top()
set name = "Move To Top"
set category = "Object"
set src in oview(1)
if(!istype(src.loc, /turf) || usr.stat || usr.restrained() )
return
var/turf/T = src.loc
src.loc = null
src.loc = T
/obj/item/examine()
set src in view()
var/t
switch(src.w_class)
if(1.0)
t = "tiny"
if(2.0)
t = "small"
if(3.0)
t = "normal-sized"
if(4.0)
t = "bulky"
if(5.0)
t = "huge"
else
if ((usr.mutations & CLOWN) && prob(50)) t = "funny-looking"
usr << text("This is a []\icon[][]. It is a [] item.", !src.blood_DNA ? "" : "bloody ",src, src.name, t)
usr << src.desc
return
/obj/item/attack_hand(mob/user as mob)
if (!user) return
if (istype(src.loc, /obj/item/weapon/storage))
for(var/mob/M in range(1, src.loc))
if (M.s_active == src.loc)
if (M.client)
M.client.screen -= src
src.throwing = 0
if (src.loc == user)
//canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N
if(istype(src, /obj/item/clothing) && !src:canremove)
return
else
user.u_equip(src)
else
if(istype(src.loc, /mob/living))
return
src.pickup(user)
user.lastDblClick = world.time + 2
user.next_move = world.time + 2
if (user.hand)
user.l_hand = src
else
user.r_hand = src
src.loc = user
src.layer = 20
add_fingerprint(user)
user.update_clothing()
return
/obj/item/attack_paw(mob/user as mob)
if(isalien(user)) // -- TLE
if(!user:has_fine_manipulation) // -- defaults to 0, only changes due to badminnery -- Urist
user << "Your claws aren't capable of such fine manipulation."
return
if (istype(src.loc, /obj/item/weapon/storage))
for(var/mob/M in range(1, src.loc))
if (M.s_active == src.loc)
if (M.client)
M.client.screen -= src
src.throwing = 0
if (src.loc == user)
//canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N
if(istype(src, /obj/item/clothing) && !src:canremove)
return
else
user.u_equip(src)
else
if(istype(src.loc, /mob/living))
return
src.pickup(user)
user.lastDblClick = world.time + 2
user.next_move = world.time + 2
if (user.hand)
user.l_hand = src
else
user.r_hand = src
src.loc = user
src.layer = 20
user.update_clothing()
return
/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/packageWrap))
var/obj/item/weapon/packageWrap/O = W
if (O.amount > 1)
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(src.loc))
P.wrapped = src
src.loc = P
O.amount -= 1
/obj/item/attack_self(mob/user as mob)
..()
if(twohanded)
if(wielded) //Trying to unwield it
wielded = 0
force = force_unwielded
src.name = "[initial(name)] (Unwielded)"
src.update_icon() //If needed by the particular item
user << "\blue You are now carrying the [initial(name)] with one hand."
if(istype(user.get_inactive_hand(),/obj/item/weapon/offhand))
del user.get_inactive_hand()
return
else //Trying to wield it
if(user.get_inactive_hand())
user << "\red You need your other hand to be empty"
return
wielded = 1
force = force_wielded
src.name = "[initial(name)] (Wielded)"
src.update_icon() //If needed by the particular item
user << "\blue You grab the [initial(name)] with both hands, It is ready for use."
var/obj/item/weapon/offhand/O = new /obj/item/weapon/offhand(user) ////Let's reserve his other hand~
O.name = text("[initial(src.name)] - Offhand")
O.desc = "Your second grip on the [initial(src.name)]"
if(user.hand)
user.r_hand = O ///Place dat offhand in the opposite hand
else
user.l_hand = O
O.layer = 20
return
/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
if (!istype(M)) // not sure if this is the right thing...
return
var/messagesource = M
if (istype(M,/mob/living/carbon/brain))
messagesource = M:container
if (src.hitsound)
playsound(src.loc, hitsound, 50, 1, -1)
/////////////////////////
user.lastattacked = M
M.lastattacker = user
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
//spawn(1800) // this wont work right
// M.lastattacker = null
/////////////////////////
var/power = src.force
if(!istype(M, /mob/living/carbon/human))
if(istype(M, /mob/living/carbon/metroid))
var/mob/living/carbon/metroid/Metroid = M
if(prob(25))
user << "\red [src] passes right through [M]!"
return
if(power > 0)
Metroid.attacked += 10
if(power >= 3)
if(istype(Metroid, /mob/living/carbon/metroid/adult))
if(prob(5 + round(power/2)))
if(Metroid.Victim)
if(prob(80) && !Metroid.client)
Metroid.Discipline++
Metroid.Victim = null
Metroid.anchored = 0
if(prob(80) && !Metroid.client)
Metroid.Discipline++
spawn()
Metroid.SStun = 1
sleep(rand(5,20))
Metroid.SStun = 0
spawn(0)
Metroid.canmove = 0
step_away(Metroid, user)
if(prob(25 + power*2))
sleep(2)
step_away(Metroid, user)
Metroid.canmove = 1
else
if(prob(10 + power*2))
if(Metroid.Victim)
if(prob(80) && !Metroid.client)
Metroid.Discipline++
if(Metroid.Discipline == 1)
Metroid.attacked = 0
spawn()
Metroid.SStun = 1
sleep(rand(5,20))
Metroid.SStun = 0
Metroid.Victim = null
Metroid.anchored = 0
spawn(0)
step_away(Metroid, user)
Metroid.canmove = 0
if(prob(25 + power*4))
sleep(2)
step_away(Metroid, user)
Metroid.canmove = 1
for(var/mob/O in viewers(messagesource, null))
O.show_message(text("\red <B>[] has been attacked with [][] </B>", M, src, (user ? text(" by [].", user) : ".")), 1)
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if (ishuman(user) || isrobot(user) || ismonkey(user) || isalien(user))
if (!( def_zone ))
var/mob/user2 = user
var/t = user2:zone_sel.selecting
if ((t in list( "eyes", "mouth" )))
t = "head"
def_zone = ran_zone(t)
var/datum/organ/external/affecting
if (H.organs[text("[]", def_zone)])
affecting = H.organs[text("[]", def_zone)]
var/hit_area = parse_zone(def_zone)
var/list/armor = H.getarmor(affecting, "melee")
//Grabbing the set of clothing that offers the best protective value against melee attacks to that area. --NEO
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] has been attacked in the [] with [][] </B>", M, hit_area, src, (user ? text(" by [].", user) : ".")), 1)
if (istype(affecting, /datum/organ/external))
var/b_dam = (src.damtype == "brute" ? src.force : 0)
var/f_dam = (src.damtype == "fire" ? src.force : 0)
if (M.mutations & COLD_RESISTANCE)
f_dam = 0
if (def_zone == "head")
if (b_dam && prob(armor["armor"] - src.force))
if (prob(20))
affecting.take_damage(power, 0)
else
H.show_message("\red Your [armor["clothes"]] has protected you from a hit to the head.")
return
if ((b_dam && prob(src.force + affecting.brute_dam + affecting.burn_dam)))
var/time = rand(10, 120)
if (prob(90))
if (H.paralysis < time)
H.paralysis = time
else
if (H.weakened < time)
H.weakened = time
if(H.stat != 2) H.stat = 1
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] has been knocked unconscious!</B>", H), 1, "\red You hear someone fall.", 2)
if (prob(50))
if (/*ticker.mode.name == "revolution" && */ M != user)
ticker.mode.remove_revolutionary(H.mind)
if (b_dam && prob(25 + (b_dam * 2)))
src.add_blood(H)
if (prob(33))
var/turf/location = H.loc
if (istype(location, /turf/simulated))
location.add_blood(H)
if (H.wear_mask)
H.wear_mask.add_blood(H)
if (H.head)
H.head.add_blood(H)
if (H.glasses && prob(33))
H.glasses.add_blood(H)
if (istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
if (user2.gloves)
user2.gloves.add_blood(H)
else
user2.add_blood(H)
if (prob(15))
if (user2.wear_suit)
user2.wear_suit.add_blood(H)
else if (user2.w_uniform)
user2.w_uniform.add_blood(H)
affecting.take_damage(b_dam, f_dam)
else if (def_zone == "chest" || def_zone == "groin")
if (b_dam && prob(armor["armor"] - src.force))
H.show_message("\red Your [armor["clothes"]] has protected you from a hit to the [affecting.name].")
return
if (b_dam && ((istype(H.r_hand, /obj/item/weapon/shield/riot))) && prob(90 - src.force))
H.show_message("\red You have been protected from a hit to the [affecting.name].")
return
if (b_dam && ((istype(H.l_hand, /obj/item/weapon/shield/riot))) && prob(90 - src.force))
H.show_message("\red You have been protected from a hit to the [affecting.name].")
return
if ((b_dam && prob(src.force + affecting.brute_dam + affecting.burn_dam)))
if (prob(50))
if (H.weakened < 5)
H.weakened = 5
for(var/mob/O in viewers(H, null))
O.show_message(text("\red <B>[] has been knocked down!</B>", H), 1, "\red You hear someone fall.", 2)
else
if (H.stunned < 2)
H.stunned = 2
for(var/mob/O in viewers(H, null))
O.show_message(text("\red <B>[] has been stunned!</B>", H), 1)
if(H.stat != 2) H.stat = 1
if (b_dam && prob(25 + (b_dam * 2)))
src.add_blood(H)
if (prob(33))
var/turf/location = H.loc
if (istype(location, /turf/simulated))
location.add_blood(H)
if (H.wear_suit)
H.wear_suit.add_blood(H)
if (H.w_uniform)
H.w_uniform.add_blood(H)
if (istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
if (user2.gloves)
user2.gloves.add_blood(H)
else
user2.add_blood(H)
if (prob(15))
if (user2.wear_suit)
user2.wear_suit.add_blood(H)
else if (user2.w_uniform)
user2.w_uniform.add_blood(H)
affecting.take_damage(b_dam, f_dam)
else
if (b_dam && prob(armor["armor"] - src.force))
H.show_message("\red Your [armor["clothes"]] has protected you from a hit to the [affecting.name].")
return
if (b_dam && prob(25 + (b_dam * 2)))
src.add_blood(H)
if (prob(33))
var/turf/location = H.loc
if (istype(location, /turf/simulated))
location.add_blood(H)
if (H.wear_suit)
H.wear_suit.add_blood(H)
if (H.w_uniform)
H.w_uniform.add_blood(H)
if (istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
if (user2.gloves)
user2.gloves.add_blood(H)
else
user2.add_blood(H)
if (prob(15))
if (user2.wear_suit)
user2.wear_suit.add_blood(H)
else if (user2.w_uniform)
user2.w_uniform.add_blood(H)
affecting.take_damage(b_dam, f_dam)
H.UpdateDamageIcon() ///Only reference I can find on the attack() proc actually changing mob icon -Agouri
else
switch(src.damtype)
if("brute")
if(istype(src, /mob/living/carbon/metroid))
M.bruteloss += power
else
M.take_organ_damage(power)
if (prob(33)) // Added blood for whacking non-humans too
var/turf/location = M.loc
if (istype(location, /turf/simulated))
location.add_blood_floor(M)
if("fire")
if (!(M.mutations & COLD_RESISTANCE))
M.take_organ_damage(0, power)
M << "Aargh it burns!"
M.updatehealth()
src.add_fingerprint(user)
return 1
/obj/item/proc/eyestab(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
var/mob/living/carbon/human/H = M
if(istype(H) && ( \
(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 << "\red You're going to need to remove that mask/helmet/glasses first."
return
var/mob/living/carbon/monkey/Mo = M
if(istype(Mo) && ( \
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
))
// you can't stab someone in the eyes wearing a mask!
user << "\red You're going to need to remove that mask/helmet/glasses first."
return
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes!
user << "\red You cannot locate any eyes on this creature!"
return
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
src.add_fingerprint(user)
//if((user.mutations & CLOWN) && prob(50))
// M = user
/*
M << "\red You stab yourself in the eye."
M.sdisabilities |= 1
M.weakened += 4
M.bruteloss += 10
*/
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1)
M << "\red [user] stabs you in the eye with [src]!"
user << "\red You stab [M] in the eye with [src]!"
else
user.visible_message( \
"\red [user] has stabbed themself with [src]!", \
"\red You stab yourself in the eyes with [src]!" \
)
if(istype(M, /mob/living/carbon/human))
var/datum/organ/external/affecting = M:organs["head"]
affecting.take_damage(7)
else
M.take_organ_damage(7)
M.eye_blurry += rand(3,4)
M.eye_stat += rand(2,4)
if (M.eye_stat >= 10)
M.eye_blurry += 15+(0.1*M.eye_blurry)
M.disabilities |= 1
if(M.stat != 2)
M << "\red Your eyes start to bleed profusely!"
if(prob(50))
if(M.stat != 2)
M << "\red You drop what you're holding and clutch at your eyes!"
M.drop_item()
M.eye_blurry += 10
M.paralysis += 1
M.weakened += 4
if (prob(M.eye_stat - 10 + 1))
if(M.stat != 2)
M << "\red You go blind!"
M.sdisabilities |= 1
return