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