mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-05 23:21:53 +00:00
- Adds the ability to construct Syndicate Medbots, which were previously in the code but unable to be constructed. These bots will only heal Syndicate Nukeops, and can only be made from the medikit box that Nukeops can purchase. - Fixed recharging in energy crossbows and laser tag guns, they were recharging 10x slower than they were meant to.
488 lines
15 KiB
Plaintext
488 lines
15 KiB
Plaintext
/* Kitchen tools
|
|
* Contains:
|
|
* Utensils
|
|
* Spoons
|
|
* Forks
|
|
* Knives
|
|
* Kitchen knives
|
|
* Butcher's cleaver
|
|
* Rolling Pins
|
|
* Trays
|
|
*/
|
|
|
|
/obj/item/weapon/kitchen
|
|
icon = 'icons/obj/kitchen.dmi'
|
|
|
|
/*
|
|
* Utensils
|
|
*/
|
|
/obj/item/weapon/kitchen/utensil
|
|
force = 5.0
|
|
w_class = 1.0
|
|
throwforce = 5.0
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
origin_tech = "materials=1"
|
|
attack_verb = list("attacked", "stabbed", "poked")
|
|
sharp = 0
|
|
|
|
var/loaded //Descriptive string for currently loaded food object.
|
|
|
|
/obj/item/weapon/kitchen/utensil/New()
|
|
if (prob(60))
|
|
src.pixel_y = rand(0, 4)
|
|
|
|
create_reagents(5)
|
|
return
|
|
|
|
/obj/item/weapon/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return ..()
|
|
|
|
if(user.a_intent != "help")
|
|
if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
|
|
if((M_CLUMSY in user.mutations) && prob(50))
|
|
M = user
|
|
return eyestab(M,user)
|
|
else
|
|
return ..()
|
|
|
|
if (reagents.total_volume > 0)
|
|
reagents.trans_to_ingest(M, reagents.total_volume)
|
|
if(M == user)
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\blue [] eats some [] from \the [].", user, loaded, src), 1)
|
|
M.reagents.add_reagent("nutriment", 1)
|
|
else
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\blue [] feeds [] some [] from \the []", user, M, loaded, src), 1)
|
|
M.reagents.add_reagent("nutriment", 1)
|
|
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
|
|
overlays.Cut()
|
|
return
|
|
|
|
/obj/item/weapon/kitchen/utensil/fork
|
|
name = "fork"
|
|
desc = "It's a fork. Sure is pointy."
|
|
icon_state = "fork"
|
|
|
|
/obj/item/weapon/kitchen/utensil/pfork
|
|
name = "plastic fork"
|
|
desc = "Yay, no washing up to do."
|
|
icon_state = "pfork"
|
|
|
|
/obj/item/weapon/kitchen/utensil/spoon
|
|
name = "spoon"
|
|
desc = "It's a spoon. You can see your own upside-down face in it."
|
|
icon_state = "spoon"
|
|
attack_verb = list("attacked", "poked")
|
|
|
|
/obj/item/weapon/kitchen/utensil/pspoon
|
|
name = "plastic spoon"
|
|
desc = "It's a plastic spoon. How dull."
|
|
icon_state = "pspoon"
|
|
attack_verb = list("attacked", "poked")
|
|
|
|
/*
|
|
* Knives
|
|
*/
|
|
/obj/item/weapon/kitchen/utensil/knife
|
|
name = "knife"
|
|
desc = "Can cut through any food."
|
|
icon_state = "knife"
|
|
force = 10.0
|
|
throwforce = 10.0
|
|
sharp = 1
|
|
edge = 1
|
|
|
|
suicide_act(mob/user)
|
|
viewers(user) << pick("<span class='suicide'>[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.</span>", \
|
|
"<span class='suicide'>[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.</span>", \
|
|
"<span class='suicide'>[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.</span>")
|
|
return (BRUTELOSS)
|
|
|
|
/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
|
|
if ((M_CLUMSY in user.mutations) && prob(50))
|
|
user << "\red You accidentally cut yourself with the [src]."
|
|
user.take_organ_damage(20)
|
|
return
|
|
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
|
return ..()
|
|
|
|
/obj/item/weapon/kitchen/utensil/pknife
|
|
name = "plastic knife"
|
|
desc = "The bluntest of blades."
|
|
icon_state = "pknife"
|
|
force = 10.0
|
|
throwforce = 10.0
|
|
|
|
/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
|
|
if ((M_CLUMSY in user.mutations) && prob(50))
|
|
user << "\red You somehow managed to cut yourself with the [src]."
|
|
user.take_organ_damage(20)
|
|
return
|
|
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
|
return ..()
|
|
|
|
/*
|
|
* Kitchen knives
|
|
*/
|
|
/obj/item/weapon/kitchenknife
|
|
name = "kitchen knife"
|
|
icon = 'icons/obj/kitchen.dmi'
|
|
icon_state = "knife"
|
|
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
sharp = 1
|
|
edge = 1
|
|
force = 10.0
|
|
w_class = 3.0
|
|
throwforce = 6.0
|
|
throw_speed = 3
|
|
throw_range = 6
|
|
m_amt = 12000
|
|
origin_tech = "materials=1"
|
|
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
|
|
|
suicide_act(mob/user)
|
|
viewers(user) << pick("<span class='suicide'>[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.</span>", \
|
|
"<span class='suicide'>[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.</span>", \
|
|
"<span class='suicide'>[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.</span>")
|
|
return (BRUTELOSS)
|
|
|
|
/obj/item/weapon/kitchenknife/combat
|
|
name = "combat knife"
|
|
force = 15.0
|
|
throwforce = 10.0
|
|
origin_tech = "materials=2;combat=2"
|
|
desc = "A razor sharp knife, built from advanced alloys, designed for quick, melee killing. Also not half bad as a kitchen knife."
|
|
slot_flags = SLOT_BELT
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "combatknife"
|
|
|
|
|
|
/obj/item/weapon/kitchenknife/ritual
|
|
name = "ritual knife"
|
|
desc = "The unearthly energies that once powered this blade are now dormant."
|
|
icon = 'icons/obj/wizard.dmi'
|
|
icon_state = "render"
|
|
|
|
/*
|
|
* Bucher's cleaver
|
|
*/
|
|
/obj/item/weapon/butch
|
|
name = "butcher's Cleaver"
|
|
icon = 'icons/obj/kitchen.dmi'
|
|
icon_state = "butch"
|
|
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
force = 15.0
|
|
w_class = 2.0
|
|
throwforce = 8.0
|
|
throw_speed = 3
|
|
throw_range = 6
|
|
m_amt = 12000
|
|
origin_tech = "materials=1"
|
|
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
|
sharp = 1
|
|
edge = 1
|
|
|
|
/obj/item/weapon/butch/meatcleaver
|
|
name = "Meat Cleaver"
|
|
icon_state = "mcleaver"
|
|
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
|
|
force = 25.0
|
|
throwforce = 15.0
|
|
no_embed = 1
|
|
|
|
/obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
|
return ..()
|
|
|
|
/*
|
|
* Rolling Pins
|
|
*/
|
|
|
|
/obj/item/weapon/kitchen/rollingpin
|
|
name = "rolling pin"
|
|
desc = "Used to knock out the Bartender."
|
|
icon_state = "rolling_pin"
|
|
force = 8.0
|
|
throwforce = 10.0
|
|
throw_speed = 2
|
|
throw_range = 7
|
|
w_class = 3.0
|
|
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
|
|
|
|
/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
|
|
if ((M_CLUMSY in user.mutations) && prob(50))
|
|
user << "\red The [src] slips out of your hand and hits your head."
|
|
user.take_organ_damage(10)
|
|
user.Paralyse(2)
|
|
return
|
|
|
|
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
|
|
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
|
|
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
|
|
|
if(!iscarbon(user))
|
|
M.LAssailant = null
|
|
else
|
|
M.LAssailant = user
|
|
|
|
var/t = user:zone_sel.selecting
|
|
if (t == "head")
|
|
if(ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
if (H.stat < 2 && H.health < 50 && prob(90))
|
|
// ******* Check
|
|
if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
|
|
H << "\red The helmet protects you from being hit hard in the head!"
|
|
return
|
|
var/time = rand(2, 6)
|
|
if (prob(75))
|
|
H.Paralyse(time)
|
|
else
|
|
H.Stun(time)
|
|
if(H.stat != 2) H.stat = 1
|
|
user.visible_message("\red <B>[H] has been knocked unconscious!</B>", "\red <B>You knock [H] unconscious!</B>")
|
|
return
|
|
else
|
|
H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!")
|
|
H.eye_blurry += 3
|
|
return ..()
|
|
|
|
/*
|
|
* Trays - Agouri
|
|
*/
|
|
/obj/item/weapon/tray
|
|
name = "tray"
|
|
icon = 'icons/obj/food.dmi'
|
|
icon_state = "tray"
|
|
desc = "A metal tray to lay food on."
|
|
throwforce = 12.0
|
|
throwforce = 10.0
|
|
throw_speed = 1
|
|
throw_range = 5
|
|
w_class = 3.0
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
m_amt = 3000
|
|
/* // NOPE
|
|
var/food_total= 0
|
|
var/burger_amt = 0
|
|
var/cheese_amt = 0
|
|
var/fries_amt = 0
|
|
var/classyalcdrink_amt = 0
|
|
var/alcdrink_amt = 0
|
|
var/bottle_amt = 0
|
|
var/soda_amt = 0
|
|
var/carton_amt = 0
|
|
var/pie_amt = 0
|
|
var/meatbreadslice_amt = 0
|
|
var/salad_amt = 0
|
|
var/miscfood_amt = 0
|
|
*/
|
|
var/list/carrying = list() // List of things on the tray. - Doohl
|
|
var/max_carry = 10 // w_class = 1 -- takes up 1
|
|
// w_class = 2 -- takes up 3
|
|
// w_class = 3 -- takes up 5
|
|
|
|
/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
|
|
// Drop all the things. All of them.
|
|
overlays.Cut()
|
|
for(var/obj/item/I in carrying)
|
|
I.loc = M.loc
|
|
carrying.Remove(I)
|
|
if(isturf(I.loc))
|
|
spawn()
|
|
for(var/i = 1, i <= rand(1,2), i++)
|
|
if(I)
|
|
step(I, pick(NORTH,SOUTH,EAST,WEST))
|
|
sleep(rand(2,4))
|
|
|
|
|
|
if((M_CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
|
|
M << "\red You accidentally slam yourself with the [src]!"
|
|
M.Weaken(1)
|
|
user.take_organ_damage(2)
|
|
if(prob(50))
|
|
playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
|
|
return
|
|
else
|
|
playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
|
|
return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
|
|
|
|
var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
|
|
|
|
|
|
if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
|
|
if(prob(33))
|
|
src.add_blood(H)
|
|
var/turf/location = H.loc
|
|
if (istype(location, /turf/simulated))
|
|
location.add_blood(H) ///Plik plik, the sound of blood
|
|
|
|
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
|
|
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
|
|
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
|
|
|
if(!iscarbon(user))
|
|
M.LAssailant = null
|
|
else
|
|
M.LAssailant = user
|
|
|
|
if(prob(15))
|
|
M.Weaken(3)
|
|
M.take_organ_damage(3)
|
|
else
|
|
M.take_organ_damage(5)
|
|
if(prob(50))
|
|
playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red <B>[] slams [] with the tray!</B>", user, M), 1)
|
|
return
|
|
else
|
|
playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red <B>[] slams [] with the tray!</B>", user, M), 1)
|
|
return
|
|
|
|
|
|
|
|
|
|
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)))
|
|
M << "\red You get slammed in the face with the tray, against your mask!"
|
|
if(prob(33))
|
|
src.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)
|
|
var/turf/location = H.loc
|
|
if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor and item :v
|
|
location.add_blood(H)
|
|
|
|
if(prob(50))
|
|
playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red <B>[] slams [] with the tray!</B>", user, M), 1)
|
|
else
|
|
playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red <B>[] slams [] with the tray!</B>", user, M), 1)
|
|
if(prob(10))
|
|
M.Stun(rand(1,3))
|
|
M.take_organ_damage(3)
|
|
return
|
|
else
|
|
M.take_organ_damage(5)
|
|
return
|
|
|
|
else //No eye or head protection, tough luck!
|
|
M << "\red You get slammed in the face with the tray!"
|
|
if(prob(33))
|
|
src.add_blood(M)
|
|
var/turf/location = H.loc
|
|
if (istype(location, /turf/simulated))
|
|
location.add_blood(H)
|
|
|
|
if(prob(50))
|
|
playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red <B>[] slams [] in the face with the tray!</B>", user, M), 1)
|
|
else
|
|
playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red <B>[] slams [] in the face with the tray!</B>", user, M), 1)
|
|
if(prob(30))
|
|
M.Stun(rand(2,4))
|
|
M.take_organ_damage(4)
|
|
return
|
|
else
|
|
M.take_organ_damage(8)
|
|
if(prob(30))
|
|
M.Weaken(2)
|
|
return
|
|
return
|
|
|
|
/obj/item/weapon/tray/var/cooldown = 0 //shield bash cooldown. based on world.time
|
|
|
|
/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
if(istype(W, /obj/item/weapon/kitchen/rollingpin))
|
|
if(cooldown < world.time - 25)
|
|
user.visible_message("<span class='warning'>[user] bashes [src] with [W]!</span>")
|
|
playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
|
|
cooldown = world.time
|
|
else
|
|
..()
|
|
|
|
/*
|
|
===============~~~~~================================~~~~~====================
|
|
= =
|
|
= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ =
|
|
= =
|
|
===============~~~~~================================~~~~~====================
|
|
*/
|
|
/obj/item/weapon/tray/proc/calc_carry()
|
|
// calculate the weight of the items on the tray
|
|
var/val = 0 // value to return
|
|
|
|
for(var/obj/item/I in carrying)
|
|
if(I.w_class == 1.0)
|
|
val ++
|
|
else if(I.w_class == 2.0)
|
|
val += 3
|
|
else
|
|
val += 5
|
|
|
|
return val
|
|
|
|
/obj/item/weapon/tray/pickup(mob/user)
|
|
|
|
if(!isturf(loc))
|
|
return
|
|
|
|
for(var/obj/item/I in loc)
|
|
if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
|
|
var/add = 0
|
|
if(I.w_class == 1.0)
|
|
add = 1
|
|
else if(I.w_class == 2.0)
|
|
add = 3
|
|
else
|
|
add = 5
|
|
if(calc_carry() + add >= max_carry)
|
|
break
|
|
|
|
I.loc = src
|
|
carrying.Add(I)
|
|
overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
|
|
|
|
/obj/item/weapon/tray/dropped(mob/user)
|
|
|
|
var/mob/living/M
|
|
for(M in src.loc) //to handle hand switching
|
|
return
|
|
|
|
var/foundtable = 0
|
|
for(var/obj/structure/table/T in loc)
|
|
foundtable = 1
|
|
break
|
|
|
|
overlays.Cut()
|
|
|
|
for(var/obj/item/I in carrying)
|
|
I.loc = loc
|
|
carrying.Remove(I)
|
|
if(!foundtable && isturf(loc))
|
|
// if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
|
|
spawn()
|
|
for(var/i = 1, i <= rand(1,2), i++)
|
|
if(I)
|
|
step(I, pick(NORTH,SOUTH,EAST,WEST))
|
|
sleep(rand(2,4))
|