mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-26 10:12:17 +00:00
- 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
545 lines
16 KiB
Plaintext
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
|
|
|
|
|