diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index ed54bc42225..a229bd12590 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -459,13 +459,13 @@
max_storage_space += I.get_storage_cost()
//Useful for spilling the contents of containers all over the floor
-/obj/item/weapon/storage/proc/spill()
- if (istype(loc, /turf))//If its not on the floor this might cause issues
- var/turf/T = get_turf(src)
- for (var/obj/O in contents)
- contents.Remove(O)
- O.forceMove(T)
- O.tumble(2)
+/obj/item/weapon/storage/proc/spill(var/dist = 2, var/turf/T = null)
+ if (!T || !istype(T, /turf))//If its not on the floor this might cause issues
+ T = get_turf(src)
+
+ for (var/obj/O in contents)
+ remove_from_storage(O, T)
+ O.tumble(2)
//Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area).
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 8f589f98835..543286bdde5 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -14,6 +14,11 @@
max_storage_space = 14 //can hold 7 w_class-2 items or up to 3 w_class-3 items (with 1 w_class-2 item as change).
origin_tech = "combat=1"
attack_verb = list("robusted")
+ var/stunhit = 0
+
+/obj/item/weapon/storage/toolbox/initialize()
+ spawn(3)
+ update_force()
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
@@ -80,3 +85,24 @@
new /obj/item/stack/cable_coil(src,30,color)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
+
+
+/obj/item/weapon/storage/toolbox/proc/update_force()
+ force = initial(force)
+ for (var/obj/item/I in contents)
+ force += I.w_class*1.5
+
+/obj/item/weapon/storage/toolbox/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
+ if (..(W, prevent_warning))
+ update_force()
+
+
+/obj/item/weapon/storage/toolbox/attack(mob/living/M as mob, mob/user as mob)
+ update_force()
+ ..(M, user)
+ if (contents.len)
+ spill(3, get_turf(M))
+ playsound(M, 'sound/items/trayhit2.ogg', 100, 1) //sound playin' again
+ update_force()
+ user.visible_message(span("danger", "[user] smashes the [src] into [M], causing it to break open and strew its contents across the area"))
+
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index ecbf194a7f1..145ea420386 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -334,16 +334,15 @@
else
remainder = cost
- H.adjustOxyLoss(remainder*0.4)
- H.adjustHalLoss(remainder*0.3)
+ H.adjustOxyLoss(remainder*0.3)
+ H.adjustHalLoss(remainder*0.25)
H.updatehealth()
H.update_oxy_overlay()
if (H.oxyloss >= exhaust_threshold)
- H.Weaken(10)
H.m_intent = "walk"
H.hud_used.move_intent.update_move_icon(H)
- H << span("danger", "You're too exhausted to run anymore! You collapse in a heap on the floor.")
+ H << span("danger", "You're too exhausted to run anymore!")
return 0
H.hud_used.move_intent.update_move_icon(H)
return 1
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index a7cd36f21ee..24890b5c24a 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -16,7 +16,7 @@
stamina = 130 // Humans can sprint for longer than any other species
stamina_recovery = 5
sprint_speed_factor = 0.8
- sprint_cost_factor = 0.8
+ sprint_cost_factor = 0.7
/datum/species/unathi
name = "Unathi"
@@ -35,7 +35,7 @@
stamina = 120 // Unathi have the shortest but fastest sprint of all
sprint_speed_factor = 3
stamina_recovery = 5
- sprint_cost_factor = 2
+ sprint_cost_factor = 1.8
rarity_value = 3
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
@@ -102,7 +102,7 @@
stamina = 90 // Tajarans evolved to maintain a steady pace in the snow, sprinting wastes energy
stamina_recovery = 4
sprint_speed_factor = 0.55
- sprint_cost_factor = 1.1
+ sprint_cost_factor = 1
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
@@ -153,7 +153,7 @@
of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
the secrets of their empire to their allies."
-
+
rarity_value = 3
flags = CAN_JOIN | IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_SLIP | HAS_SKIN_COLOR
@@ -166,7 +166,7 @@
ethanol_resistance = 0.5//gets drunk faster
stamina = 90
- sprint_speed_factor = 1.2 //Evolved for rapid escapes from predators
+ sprint_speed_factor = 1.1 //Evolved for rapid escapes from predators
/datum/species/diona
@@ -338,13 +338,13 @@
has_organ = list() //TODO: Positronic brain.
stamina = -1 // Machines use power and generate heat, stamina is not a thing
- sprint_speed_factor = 0.8 // About as capable of speed as a human
+ sprint_speed_factor = 0.85 // About as capable of speed as a human
/datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
if (H.stat == CONSCIOUS)
- H.bodytemperature += cost*1.5
- H.nutrition -= cost
+ H.bodytemperature += cost*1.35
+ H.nutrition -= cost*0.9
if (H.nutrition > 0)
return 1
else
@@ -408,7 +408,7 @@
stamina = 100 // Long period of sprinting, but relatively low speed gain
sprint_speed_factor = 0.5
- sprint_cost_factor = 0.3
+ sprint_cost_factor = 0.27
stamina_recovery = 1//slow recovery
diff --git a/code/modules/mob/living/devour.dm b/code/modules/mob/living/devour.dm
index 43ff8e1ac83..4e7452abf5f 100644
--- a/code/modules/mob/living/devour.dm
+++ b/code/modules/mob/living/devour.dm
@@ -27,6 +27,8 @@
//This is set true if there are any mobs in this mob's contents. they will be slowly digested.
//just used as a boolean to minimise extra processing
+/mob/living/var/mob/living/devouring = null
+//If we are currently devouring a mob, a reference to it goes here.
/mob/living/proc/attempt_devour(var/mob/living/victim, var/eat_types, var/mouth_size = null)
@@ -44,6 +46,16 @@
src << "\red You can't eat yourself!"
return 0
+ if (devouring == victim)
+ src << span("danger","You're already eating that!.")
+ return
+
+ if (ishuman(src))
+ var/mob/living/carbon/human/H = src
+ var/obj/item/blocked = H.check_mouth_coverage()
+ if(blocked)
+ user << "\The [blocked] is in the way!"
+ return
//This check is exploit prevention.
//Nymphs have seperate mechanics for gaining biomass from other diona
@@ -106,6 +118,7 @@
//This function will start consuming the victim by taking bites out of them.
//Victim or attacker moving will interrupt it
//A bite will be taken every 4 seconds
+ devouring = victim
var/bite_delay = 4
var/bite_size = mouth_size * 0.5
var/num_bites_needed = (victim.mob_size*victim.mob_size)/bite_size//total bites needed to eat it from full health
@@ -141,7 +154,7 @@
var/i = 0
for (i=0;i < num_bites_needed;i++)
- if(do_mob(src, victim, bite_delay*10))
+ if(do_mob(src, victim, bite_delay*10) && devouring == victim)
face_atom(victim)
victim.adjustCloneLoss(victim_maxhealth*PEPB)
victim.adjustHalLoss(victim_maxhealth*PEPB*5)//Being eaten hurts!
@@ -153,14 +166,17 @@
src.visible_message("[src] finishes devouring [victim]","You finish devouring [victim]")
handle_devour_mess(src, victim, vessel, 1)
qdel(victim)
+ devouring = null
break
else
+ devouring = null
if (victimloc != victim.loc)
src << "[victim] moved away, you need to keep it still. Try grabbing, stunning or killing it first."
else if (ourloc != src.loc)
src << "You moved! Devouring cancelled"
else
src << "Devouring Cancelled"//reason unknown, maybe the eater got stunned?
+ //This can also happen if you start devouring something else
break
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 9a5eac6e374..222be7ba558 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -1219,4 +1219,13 @@ var/list/wierd_mobs_inclusive = list( /mob/living/simple_animal/construct,
else
return "its"//Something went wrong
+
+/mob/proc/isHoldingShield()
+ var/obj/item/test = l_hand
+ if (istype(test, /obj/item) && test.IsShield())
+ return 1
+ test = r_hand
+ if (istype(test, /obj/item) && test.IsShield())
+ return 1
+ return 0
#undef SAFE_PERP
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 28cd0e5fa9e..33bfd8b8751 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -312,8 +312,11 @@
//source is an object caused electrocuting (airlock, grille, etc)
//No animations will be performed by this proc.
/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0)
- if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb
- if (!M) return 0
+
+ if (!M)
+ return 0
+ if(istype(M.loc,/obj/mecha))
+ return 0 //feckin mechs are dumb
var/mob/living/carbon/human/H = null
if (ishuman(M))
H = M //20/1/16 Insulation (vaurca)
diff --git a/html/changelogs/Nanako-Toolbox.yml b/html/changelogs/Nanako-Toolbox.yml
new file mode 100644
index 00000000000..755e63616fc
--- /dev/null
+++ b/html/changelogs/Nanako-Toolbox.yml
@@ -0,0 +1,8 @@
+author: Nanako
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+changes:
+ - rscadd: "Toolboxes that are full of stuff now hit much harder, but spill their contents."
+ - bugfix: "Fixed unathi being able to eat while wearing face-covering helmets, and being able to rapidly spam devour."
\ No newline at end of file