diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 5d72495520..e0bca0c65a 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -114,8 +114,10 @@ name = "plastic knife" desc = "The bluntest of blades." icon_state = "pknife" - force = 10.0 - throwforce = 10.0 + force = 1 + throwforce = 1 + sharp = 0 + edge = 1 //for cutting pizzas /obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob) if ((CLUMSY in user.mutations) && prob(50)) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index afa97b983b..83f42ed021 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -1,52 +1,156 @@ /obj/item/weapon/melee/energy var/active = 0 + var/active_force + var/active_throwforce + var/active_w_class + sharp = 0 + edge = 0 flags = FPRINT | TABLEPASS | NOBLOODY - suicide_act(mob/user) +/obj/item/weapon/melee/energy/proc/activate(mob/living/user) + active = 1 + force = active_force + throwforce = active_throwforce + sharp = 1 + edge = 1 + w_class = active_w_class + playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + +/obj/item/weapon/melee/energy/proc/deactivate(mob/living/user) + active = 0 + force = initial(force) + throwforce = initial(throwforce) + sharp = initial(sharp) + edge = initial(edge) + w_class = initial(w_class) + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + +/obj/item/weapon/melee/energy/attack_self(mob/living/user as mob) + if (active) + if ((CLUMSY in user.mutations) && prob(50)) + user.visible_message("\red [user] accidentally cuts \himself with \the [src].", "\red You accidentally cut yourself with \the [src].") + user.take_organ_damage(5,5) + deactivate(user) + else + activate(user) + + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + + add_fingerprint(user) + return + +/obj/item/weapon/melee/energy/suicide_act(mob/user) + if (active) viewers(user) << pick("\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.", \ "\red [user] is falling on the [src.name]! It looks like \he's trying to commit suicide.") return (BRUTELOSS|FIRELOSS) +/* + * Energy Axe + */ /obj/item/weapon/melee/energy/axe name = "energy axe" desc = "An energised battle axe." icon_state = "axe0" - force = 40.0 - throwforce = 25.0 + //active_force = 150 //holy... + active_force = 60 + active_throwforce = 35 + active_w_class = 5 + //force = 40 + //throwforce = 25 + force = 20 + throwforce = 10 throw_speed = 1 throw_range = 5 - w_class = 3.0 + w_class = 3 flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS | NOBLOODY - origin_tech = "combat=3" + origin_tech = "magnets=3;combat=4" attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") sharp = 1 edge = 1 - suicide_act(mob/user) - viewers(user) << "\red [user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide." - return (BRUTELOSS|FIRELOSS) +/obj/item/weapon/melee/energy/axe/activate(mob/living/user) + ..() + icon_state = "axe1" + user << "\blue \The [src] is now energised." +/obj/item/weapon/melee/energy/axe/deactivate(mob/living/user) + ..() + icon_state = initial(icon_state) + user << "\blue \The [src] is de-energised. It's just a regular axe now." + +/obj/item/weapon/melee/energy/axe/suicide_act(mob/user) + viewers(user) << "\red [user] swings the [src.name] towards /his head! It looks like \he's trying to commit suicide." + return (BRUTELOSS|FIRELOSS) + +/* + * Energy Sword + */ /obj/item/weapon/melee/energy/sword color name = "energy sword" desc = "May the force be within you." icon_state = "sword0" - force = 3.0 - throwforce = 5.0 + active_force = 30 + active_throwforce = 20 + active_w_class = 4 + force = 3 + throwforce = 5 throw_speed = 1 throw_range = 5 - w_class = 2.0 + w_class = 2 flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY origin_tech = "magnets=3;syndicate=4" + +/obj/item/weapon/melee/energy/sword/New() + item_color = pick("red","blue","green","purple") + +/obj/item/weapon/melee/energy/sword/green/New() + item_color = "green" + +/obj/item/weapon/melee/energy/sword/red/New() + item_color = "red" + +/obj/item/weapon/melee/energy/sword/blue/New() + item_color = "blue" + +/obj/item/weapon/melee/energy/sword/purple/New() + item_color = "purple" + +/obj/item/weapon/melee/energy/sword/activate(mob/living/user) + ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - sharp = 1 - edge = 1 + icon_state = "sword[item_color]" + user << "\blue \The [src] is now energised." + +/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) + ..() + attack_verb = list() + icon_state = initial(icon_state) + user << "\blue It can now be concealed." + +/obj/item/weapon/melee/energy/sword/IsShield() + if(active) + return 1 + return 0 /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." icon_state = "cutlass0" +/obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user) + ..() + icon_state = "cutlass1" + +/* + *Energy Blade + */ + +//Can't be activated or deactivated, so no reason to be a subtype of energy /obj/item/weapon/melee/energy/blade name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." @@ -60,4 +164,15 @@ w_class = 4.0//So you can't hide it in your pocket or some such. flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - var/datum/effect/effect/system/spark_spread/spark_system \ No newline at end of file + var/datum/effect/effect/system/spark_spread/spark_system + +/obj/item/weapon/melee/energy/blade/New() + spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/item/weapon/melee/energy/blade/dropped() + del(src) + +/obj/item/weapon/melee/energy/blade/proc/throw() + del(src) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index e10ea5bece..2814c6fe4d 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -30,6 +30,10 @@ else ..() +/* + * Energy Shield + */ + /obj/item/weapon/shield/energy name = "energy combat shield" desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." @@ -45,6 +49,39 @@ attack_verb = list("shoved", "bashed") var/active = 0 +/obj/item/weapon/shield/energy/IsShield() + if(active) + return 1 + else + return 0 + +/obj/item/weapon/shield/energy/attack_self(mob/living/user as mob) + if ((CLUMSY in user.mutations) && prob(50)) + user << "\red You beat yourself in the head with [src]." + user.take_organ_damage(5) + active = !active + if (active) + force = 10 + icon_state = "eshield[active]" + w_class = 4 + playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + user << "\blue [src] is now active." + + else + force = 3 + icon_state = "eshield[active]" + w_class = 1 + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + user << "\blue [src] can now be concealed." + + if(istype(user,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + H.update_inv_l_hand() + H.update_inv_r_hand() + + add_fingerprint(user) + return + /obj/item/weapon/cloaking_device name = "cloaking device" desc = "Use this to become invisible to the human eyesocket." diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 739ad8f694..3a0f29a3da 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -3,9 +3,6 @@ * Banhammer * Sword * Classic Baton - * Energy Blade - * Energy Axe - * Energy Shield */ /* @@ -15,50 +12,6 @@ M << " You have been banned FOR NO REISIN by [user]" user << " You have BANNED [M]" -/* - * Sword - */ -/obj/item/weapon/melee/energy/sword/IsShield() - if(active) - return 1 - return 0 - -/obj/item/weapon/melee/energy/sword/New() - item_color = pick("red","blue","green","purple") - -/obj/item/weapon/melee/energy/sword/attack_self(mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You accidentally cut yourself with [src]." - user.take_organ_damage(5,5) - active = !active - if (active) - force = 30 - if(istype(src,/obj/item/weapon/melee/energy/sword/pirate)) - icon_state = "cutlass1" - else - icon_state = "sword[item_color]" - w_class = 4 - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - user << "\blue [src] is now active." - - else - force = 3 - if(istype(src,/obj/item/weapon/melee/energy/sword/pirate)) - icon_state = "cutlass0" - else - icon_state = "sword0" - w_class = 2 - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - user << "\blue [src] can now be concealed." - - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - - add_fingerprint(user) - return - /* * Classic Baton */ @@ -182,86 +135,3 @@ else return ..() - -/* - *Energy Blade - */ -//Most of the other special functions are handled in their own files. - -/obj/item/weapon/melee/energy/sword/green - New() - item_color = "green" - -/obj/item/weapon/melee/energy/sword/red - New() - item_color = "red" - -/obj/item/weapon/melee/energy/blade/New() - spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, src) - spark_system.attach(src) - return - -/obj/item/weapon/melee/energy/blade/dropped() - del(src) - return - -/obj/item/weapon/melee/energy/blade/proc/throw() - del(src) - return - -/* - * Energy Axe - */ - -/obj/item/weapon/melee/energy/axe/attack_self(mob/user as mob) - src.active = !( src.active ) - if (src.active) - user << "\blue The axe is now energised." - src.force = 150 - src.icon_state = "axe1" - src.w_class = 5 - else - user << "\blue The axe can now be concealed." - src.force = 40 - src.icon_state = "axe0" - src.w_class = 5 - src.add_fingerprint(user) - return - - -/* - * Energy Shield - */ -/obj/item/weapon/shield/energy/IsShield() - if(active) - return 1 - else - return 0 - -/obj/item/weapon/shield/energy/attack_self(mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red You beat yourself in the head with [src]." - user.take_organ_damage(5) - active = !active - if (active) - force = 10 - icon_state = "eshield[active]" - w_class = 4 - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - user << "\blue [src] is now active." - - else - force = 3 - icon_state = "eshield[active]" - w_class = 1 - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - user << "\blue [src] can now be concealed." - - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - - add_fingerprint(user) - return diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 8626f365a3..6bb08bb451 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -18,14 +18,13 @@ */ /obj/item/weapon/twohanded var/wielded = 0 - var/force_unwielded = 0 var/force_wielded = 0 var/wieldsound = null var/unwieldsound = null /obj/item/weapon/twohanded/proc/unwield() wielded = 0 - force = force_unwielded + force = initial(force) name = "[initial(name)]" update_icon() @@ -108,12 +107,11 @@ icon_state = "fireaxe0" name = "fire axe" desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" - force = 5 + force = 10 sharp = 1 edge = 1 w_class = 4.0 slot_flags = SLOT_BACK - force_unwielded = 10 force_wielded = 40 attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") @@ -149,7 +147,6 @@ throw_speed = 1 throw_range = 5 w_class = 2.0 - force_unwielded = 3 force_wielded = 30 wieldsound = 'sound/weapons/saberon.ogg' unwieldsound = 'sound/weapons/saberoff.ogg' @@ -189,11 +186,10 @@ force = 14 w_class = 4.0 slot_flags = SLOT_BACK - force_unwielded = 14 force_wielded = 22 // Was 13, Buffed - RR throwforce = 20 throw_speed = 3 - edge = 1 + edge = 0 sharp = 1 flags = NOSHIELD hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f695621d97..19d3a2e32d 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -159,6 +159,8 @@ matter = list("metal" = 50) origin_tech = "materials=1;engineering=1" attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") + sharp = 0 + edge = 1 /obj/item/weapon/shovel/spade name = "spade" diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index 2916c4170a..0d8e614468 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -71,7 +71,7 @@ name = lowertext("[fullname] sandwich") if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" - w_class = n_ceil(Clamp((ingredients.len/2),1,3)) + w_class = n_ceil(Clamp((ingredients.len/2),2,4)) /obj/item/weapon/reagent_containers/food/snacks/csandwich/Del() for(var/obj/item/O in ingredients) @@ -98,4 +98,4 @@ if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. H << "\red You lacerate your mouth on a [shard.name] in the sandwich!" H.adjustBruteLoss(5) //TODO: Target head if human. - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index d4a9d9d09b..63944b8157 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -10,6 +10,7 @@ var/slice_path var/slices_num center_of_mass = list("x"=15, "y"=15) + w_class = 2 //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M) @@ -125,11 +126,10 @@ /obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/storage)) ..() // -> item/attackby() - if(istype(W,/obj/item/weapon/storage)) - ..() // -> item/attackby() - + return + + // Eating with forks if(istype(W,/obj/item/weapon/kitchen/utensil)) - var/obj/item/weapon/kitchen/utensil/U = W if(!U.reagents) @@ -156,65 +156,46 @@ if (reagents.total_volume <= 0) del(src) return + + if (is_sliceable()) + //these are used to allow hiding edge items in food that is not on a table/tray + var/can_slice_here = isturf(src.loc) && ((locate(/obj/structure/table) in src.loc) || (locate(/obj/machinery/optable) in src.loc) || (locate(/obj/item/weapon/tray) in src.loc)) + var/hide_item = !has_edge(W) || !can_slice_here + + if (hide_item) + if (W.w_class >= src.w_class || W.is_robot_module()) + return + + user << "\red You slip [W] inside [src]." + user.u_equip(W) + if ((user.client && user.s_active != src)) + user.client.screen -= W + W.dropped(user) + add_fingerprint(user) + contents += W + return + + if (has_edge(W)) + if (!can_slice_here) + user << "\red You cannot slice [src] here! You need a table or at least a tray to do it." + return + + var/slices_lost = 0 + if (W.w_class > 3) + user.visible_message("\blue [user] crudely slices \the [src] with [W]!", "\blue You crudely slice \the [src] with your [W]!") + slices_lost = rand(1,min(1,round(slices_num/2))) + else + user.visible_message("\blue [user] slices \the [src]!", "\blue You slice \the [src]!") + + var/reagents_per_slice = reagents.total_volume/slices_num + for(var/i=1 to (slices_num-slices_lost)) + var/obj/slice = new slice_path (src.loc) + reagents.trans_to(slice,reagents_per_slice) + del(src) + return - if((slices_num <= 0 || !slices_num) || !slice_path) - return 0 - - var/inaccurate = 0 - if( \ - istype(W, /obj/item/weapon/kitchenknife) || \ - istype(W, /obj/item/weapon/butch) || \ - istype(W, /obj/item/weapon/scalpel) || \ - istype(W, /obj/item/weapon/kitchen/utensil/knife) \ - ) - else if( \ - istype(W, /obj/item/weapon/circular_saw) || \ - istype(W, /obj/item/weapon/melee/energy/sword) && W:active || \ - istype(W, /obj/item/weapon/melee/energy/blade) || \ - istype(W, /obj/item/weapon/shovel) || \ - istype(W, /obj/item/weapon/hatchet) \ - ) - inaccurate = 1 - else if(W.w_class <= 2 && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable)) - if(!iscarbon(user)) - return 1 - user << "\red You slip [W] inside [src]." - user.u_equip(W) - if ((user.client && user.s_active != src)) - user.client.screen -= W - W.dropped(user) - add_fingerprint(user) - contents += W - return - else - return 1 - if ( \ - !isturf(src.loc) || \ - !(locate(/obj/structure/table) in src.loc) && \ - !(locate(/obj/machinery/optable) in src.loc) && \ - !(locate(/obj/item/weapon/tray) in src.loc) \ - ) - user << "\red You cannot slice [src] here! You need a table or at least a tray to do it." - return 1 - var/slices_lost = 0 - if (!inaccurate) - user.visible_message( \ - "\blue [user] slices \the [src]!", \ - "\blue You slice \the [src]!" \ - ) - else - user.visible_message( \ - "\blue [user] crudely slices \the [src] with [W]!", \ - "\blue You crudely slice \the [src] with your [W]!" \ - ) - slices_lost = rand(1,min(1,round(slices_num/2))) - var/reagents_per_slice = reagents.total_volume/slices_num - for(var/i=1 to (slices_num-slices_lost)) - var/obj/slice = new slice_path (src.loc) - reagents.trans_to(slice,reagents_per_slice) - del(src) - - return +/obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable() + return (slices_num <= 0 || !slices_num || !slice_path) /obj/item/weapon/reagent_containers/food/snacks/Del() if(contents) @@ -241,7 +222,6 @@ //N.emote("nibbles away at the [src]") N.health = min(N.health + 1, N.maxHealth) - //////////////////////////////////////////////////////////////////////////////// /// FOOD END //////////////////////////////////////////////////////////////////////////////// @@ -2153,6 +2133,9 @@ // sliceable is just an organization type path, it doesn't have any additional code or variables tied to it. +/obj/item/weapon/reagent_containers/food/snacks/sliceable + w_class = 3 //Whole pizzas and cakes shouldn't fit in a pocket, you can slice them if you want to do that. + /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread name = "meatbread loaf" desc = "The culinary base of every self-respecting eloquen/tg/entleman."