diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 4ec106d56fa..30e301b9833 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -166,3 +166,12 @@ #define RESPAWN_ANIMAL 3000 #define RESPAWN_MINISYNTH 6000 + +//Flags for the eat_types variable, a bitfield of what can or can't be eaten +//Note that any given mob can be more than one type +#define TYPE_ORGANIC 1//Almost any creature under /mob/living/carbon and most simple animals +#define TYPE_SYNTHETIC 2//Everything under /mob/living/silicon, plus IPCs, viscerators +#define TYPE_HUMANOID 4//Humans, skrell, unathi, tajara, vaurca, diona, IPC, vox +#define TYPE_WIERD 8//Slimes, constructs, demons, and other creatures of a magical or bluespace nature. + + diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index b801121e62e..f93fb39ce59 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -200,14 +200,12 @@ /obj/structure/window/attack_generic(var/mob/user, var/damage) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if(!damage) - return if(damage >= 10) visible_message("[user] smashes into [src]!") take_damage(damage) else visible_message("\The [user] bonks \the [src] harmlessly.") - playsound(src.loc, 'sound/effects/Glasshit.ogg', 7, 1, -1) + playsound(src.loc, 'sound/effects/Glasshit.ogg', 10, 1, -2) user.do_attack_animation(src) return 1 diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a78a1b29271..e64f1a6f2e1 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -2,8 +2,8 @@ name = "mousetrap" desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" - origin_tech = list(TECH_COMBAT = 1) - matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10) + origin_tech = list(TECH_COMBAT = 1) + matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10) var/armed = 0 @@ -20,29 +20,32 @@ if(holder) holder.update_icon() -/obj/item/device/assembly/mousetrap/proc/triggered(mob/target as mob, var/type = "feet") - if(!armed) +/obj/item/device/assembly/mousetrap/proc/triggered(var/mob/living/target, var/type = "feet") + if(!armed || !istype(target)) return - var/obj/item/organ/external/affecting = null - if(ishuman(target)) - var/mob/living/carbon/human/H = target - switch(type) - if("feet") - if(!H.shoes) - affecting = H.get_organ(pick("l_leg", "r_leg")) - H.Weaken(3) - if("l_hand", "r_hand") - if(!H.gloves) - affecting = H.get_organ(type) - H.Stun(3) - if(affecting) - if(affecting.take_damage(rand(7,12), 0)) - H.UpdateDamageIcon() - H.updatehealth() - else if(ismouse(target)) + + var/types = target.find_type() + if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target visible_message("\red SPLAT!") M.splat() + else + var/zone = "chest" + if(ishuman(target) && target.mob_size) + var/mob/living/carbon/human/H = target + switch(type) + if("feet") + zone = pick("l_foot", "r_foot") + if(!H.shoes) + H.apply_effect(400/(target.mob_size*(target.mob_size*0.25)), AGONY)//Halloss instead of instant knockdown + //Mainly for the benefit of giant monsters like vaurca breeders + if("l_hand", "r_hand") + zone = type + if(!H.gloves) + H.apply_effect(250/(target.mob_size*(target.mob_size*0.25)), AGONY) + if (!(types & TYPE_SYNTHETIC)) + target.apply_damage(rand(6,14), BRUTE, def_zone = zone, used_weapon = src) + playsound(target.loc, 'sound/effects/snap.ogg', 50, 1) layer = MOB_LAYER - 0.2 armed = 0 @@ -83,14 +86,14 @@ /obj/item/device/assembly/mousetrap/Crossed(AM as mob|obj) if(armed) - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.m_intent == "run") - triggered(H) - H.visible_message("[H] accidentally steps on [src].", \ - "You accidentally step on [src]") if(ismouse(AM)) triggered(AM) + else if(istype(AM, /mob/living)) + var/mob/living/L = AM + triggered(L) + L.visible_message("[L] accidentally steps on [src].", \ + "You accidentally step on [src]") + ..() diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 3387383a83a..5276e0ebcdd 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -21,7 +21,7 @@ var/list/ghost_traps /datum/ghosttrap var/object = "positronic brain" - var/minutes_since_death = 0 // If non-zero the ghost must have been dead for this many minutes to be allowed to spawn + var/respawn_check = 0//Which respawning test we check against var/list/ban_checks = list("AI","Cyborg") var/pref_check = BE_SYNTH var/ghost_trap_message = "They are occupying a positronic brain now." @@ -37,7 +37,7 @@ var/list/ghost_traps // Check for bans, proper atom types, etc. /datum/ghosttrap/proc/assess_candidate(var/mob/dead/observer/candidate, var/mob/target) - if(!candidate.MayRespawn(1, minutes_since_death)) + if(!candidate.MayRespawn(1, respawn_check)) return 0 if(islist(ban_checks)) for(var/bantype in ban_checks) @@ -174,7 +174,7 @@ var/list/ghost_traps list_as_special_role = FALSE /datum/ghosttrap/drone/New() - minutes_since_death = DRONE_SPAWN_DELAY + respawn_check = MINISYNTH ..() datum/ghosttrap/drone/assess_candidate(var/mob/dead/observer/candidate, var/mob/target) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d89b82584fa..15765004498 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -465,12 +465,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(config.disable_player_mice) src << "Spawning as a mouse is currently disabled." return - + if(ticker.current_state < GAME_STATE_PLAYING) src << "You can not spawn as a mouse before round start!" return - - if(!MayRespawn(1, ANIMAL_SPAWN_DELAY)) + + if(!MayRespawn(1, ANIMAL)) return var/turf/T = get_turf(src) @@ -815,7 +815,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (ghostimage) client.images -= ghostimage //remove ourself -mob/dead/observer/MayRespawn(var/feedback = 0, var/respawn_time = 0) +mob/dead/observer/MayRespawn(var/feedback = 0, var/respawn_type = null) if(!client) return 0 if(config.antag_hud_restricted && has_enabled_antagHUD == 1) @@ -823,10 +823,21 @@ mob/dead/observer/MayRespawn(var/feedback = 0, var/respawn_time = 0) src << "antagHUD restrictions prevent you from respawning." return 0 - var/timedifference = world.time - timeofdeath - if(respawn_time && timeofdeath && timedifference < respawn_time MINUTES) - var/timedifference_text = time2text(respawn_time MINUTES - timedifference,"mm:ss") - src << "You must have been dead for [respawn_time] minute\s to respawn. You have [timedifference_text] left." + if (respawn_type) + var/timedifference = world.time- get_death_time(respawn_type) + var/respawn_time = 0 + if (respawn_type == CREW) + respawn_time = config.respawn_delay *600 + else if (respawn_type == ANIMAL) + respawn_time = RESPAWN_ANIMAL + else if (respawn_type == MINISYNTH) + respawn_time = RESPAWN_MINISYNTH + + if (respawn_time && timedifference >= respawn_time) + return 1 + else if (feedback) + var/timedifference_text = time2text(respawn_time - timedifference,"mm:ss") + src << "You must have been dead for [respawn_time/600] minute\s to respawn. You have [timedifference_text] left." return 0 return 1 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cf80d65f456..fd565da3e1b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -752,7 +752,7 @@ default behaviour is: if(jobban_isbanned(possessor, "Animal")) possessor << "You are banned from animal roles." return 0 - if(!possessor.MayRespawn(1,ANIMAL_SPAWN_DELAY)) + if(!possessor.MayRespawn(1,ANIMAL)) return 0 return 1 diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 35b71c4afce..860606f2a36 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -70,7 +70,7 @@ var/list/mob_hat_cache = list() if(jobban_isbanned(possessor,"Cyborg")) usr << "You are banned from playing synthetics and cannot spawn as a drone." return 0 - if(!possessor.MayRespawn(1,DRONE_SPAWN_DELAY)) + if(!possessor.MayRespawn(1,MINISYNTH)) return 0 return 1 diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index ba3aea2556c..c074b5efdc4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -105,7 +105,7 @@ user << "You are banned from playing synthetics and cannot spawn as a drone." return - if(!user.MayRespawn(1, DRONE_SPAWN_DELAY)) + if(!user.MayRespawn(1, MINISYNTH)) return if(!fabricator) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 39a38c0f841..1f4436e46af 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -55,9 +55,11 @@ if(..()) if(client) + walk_to(src,0) + //Player-animals don't do random speech normally, so this is here //Player-controlled mice will still squeak, but less often than NPC mice - if (stat == CONSCIOUS && prob(speak_chance*0.1)) + if (stat == CONSCIOUS && prob(speak_chance*0.05)) squeak_soft(0) if(is_ventcrawling == 0) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f4ddb23fdd4..177ac46fccf 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -439,7 +439,7 @@ if (ticker.mode.deny_respawn) //BS12 EDIT usr << "Respawn is disabled for this roundtype." return - else if(!MayRespawn(1, config.respawn_delay)) + else if(!MayRespawn(1, CREW)) return usr << "You can respawn now, enjoy your new life!" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 13c3ddd163b..4d3fe9ba319 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -949,13 +949,6 @@ proc/is_blind(A) //See Devour.dm for more info in how these are used -//Flags for the eat_types variable, a bitfield of what can or can't be eaten -//Note that any given mob can be more than one type -#define TYPE_ORGANIC 1//Almost any creature under /mob/living/carbon and most simple animals -#define TYPE_SYNTHETIC 2//Everything under /mob/living/silicon, plus IPCs, viscerators -#define TYPE_HUMANOID 4//Humans, skrell, unathi, tajara, vaurca, diona, IPC, vox -#define TYPE_WIERD 8//Slimes, constructs, demons, and other creatures of a magical or bluespace nature. - //Blacklists of mobs that can be excluded from eating by flags in the bitfield diff --git a/html/changelogs/Nanako-MiceSpawn.yml b/html/changelogs/Nanako-MiceSpawn.yml new file mode 100644 index 00000000000..227fc25f8f6 --- /dev/null +++ b/html/changelogs/Nanako-MiceSpawn.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Nanako + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Mousetraps will now trigger when walked on. Also nerfed the instastun for shoeless mobs stepping on them." + - bugfix: "Fixed several mouse related bugs." + - bugfix: "Fixed the individual respawn times not working. Respawning should now work as before" \ No newline at end of file