mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-25 17:41:56 +00:00
Moved into their own folder and got split into three files. Damage zones have been regrouped slightly to make it easier to deal with them. Currently the organ groups are head, l/r leg, l/r arm, and head. Attacking: Armor is properly checked. Currently aiming for the chest gives a higher chance to stun whereas the head will stun for longer. Stungloves/Disarm now show up in the attack log. Stungloves ignore intent. Silicon: AI units can now move between cams that are not on the ss13 network. Cyborg's alert screen should not longer pop up every time they get an alert if they have opened it once during the round. Robot vision now uses the standard amount of energy. Gamemodes: Added Deuryn's unrev message. Runes can only be examined if you are close to them. Moved the Loyalty implants to the HoS' locker at the request of HerpA. Nuke agents now come with explosive implants that will activate upon death. Projectiles: Once again went though the gun code and cleaned things up, it is much better now. Bullet_act fixed up and most mobs now use the one in living, just overload it if they need to do something diff. Freeze /caplaser/xbow no longer have an infinite loop. Shotguns have to be pumped manually. Went though the latest runtime log. Power cells now use return on their give/use procs Assemblies have been reworked and are nearly finished, just need to finish up the special assembly code, redo the signalers, and add one or two new assembly items. Laying down will now only take 3 ticks to get up, from 5. You can no longer punch people on the spawn screen. This is a big one and was cleared by two heads, TK will only allow you to pick up items. If you have an item in your hand it will act normal. This revision got much larger than originally intended my tests show everything is working fine, but you never know. Ill likely do more mob teaks in the next few days. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2333 316c924e-a436-60f5-8080-3fe189b3f50e
405 lines
11 KiB
Plaintext
405 lines
11 KiB
Plaintext
|
|
/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)
|
|
if(src.desc)
|
|
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()
|
|
if(Metroid)
|
|
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))
|
|
M:attacked_by(src, user, def_zone)
|
|
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
|
|
|
|
|