diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index b7a92ee48f..ddb54d6957 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -344,4 +344,3 @@ /datum/config_entry/number/max_ambitions // Maximum number of ambitions a mind can store. config_entry_value = 5 //ambition end - diff --git a/code/controllers/subsystem/jukeboxes.dm b/code/controllers/subsystem/jukeboxes.dm index 1e457703c2..8b9e424244 100644 --- a/code/controllers/subsystem/jukeboxes.dm +++ b/code/controllers/subsystem/jukeboxes.dm @@ -66,7 +66,7 @@ SUBSYSTEM_DEF(jukeboxes) //Updates jukebox by transferring to different object or modifying falloff. -/datum/controller/subsystem/jukeboxes/proc/updatejukebox(IDtoupdate, obj/jukebox, jukefalloff) +/datum/controller/subsystem/jukeboxes/proc/updatejukebox(IDtoupdate, obj/jukebox, jukefalloff) if(islist(activejukeboxes[IDtoupdate])) if(istype(jukebox)) activejukeboxes[IDtoupdate][JUKE_BOX] = jukebox @@ -95,6 +95,12 @@ SUBSYSTEM_DEF(jukeboxes) /datum/controller/subsystem/jukeboxes/Initialize() var/list/tracks = flist("config/jukebox_music/sounds/") + //SPLURT EDIT + var/max_tracks = CONFIG_GET(number/max_jukebox_songs) + if(max_tracks >= 0) + while(tracks.len > max_tracks) + LAZYREMOVE(tracks, pick(tracks)) + //SPLURT EDIT END for(var/S in tracks) var/datum/track/T = new() T.song_path = file("config/jukebox_music/sounds/[S]") diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 79b3010b85..629032a04e 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -32,8 +32,6 @@ SUBSYSTEM_DEF(vote) var/list/stored_modetier_results = list() // The aggregated tier list of the modes available in secret. - var/transfer_votes_done = 0 - /datum/controller/subsystem/vote/fire() //called by master_controller if(mode) if(end_time < world.time) @@ -250,18 +248,8 @@ SUBSYSTEM_DEF(vote) if(vote_system == SCORE_VOTING) calculate_scores(vote_title_text) if(vote_system == HIGHEST_MEDIAN_VOTING) - calculate_highest_median(vote_title_text) - var/list/winners = list() - if(mode == "transfer") - var/amount_required = CONFIG_GET(number/min_continue_votes) + transfer_votes_done - transfer_votes_done += 1 - text += "\nExtending requires at least [amount_required] votes to win." - if(choices[VOTE_CONTINUE] < amount_required || choices[VOTE_TRANSFER] >= choices[VOTE_CONTINUE]) - winners = list(VOTE_TRANSFER) - else - winners = list(VOTE_CONTINUE) - else - winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result() + calculate_highest_median(vote_title_text) // nothing uses this at the moment + var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) if(was_roundtype_vote) @@ -317,7 +305,7 @@ SUBSYSTEM_DEF(vote) if(vote_system == SCHULZE_VOTING) admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" else if(vote_system == HIGHEST_MEDIAN_VOTING) - admintext += "\nIt should be noted that this is not a raw tally of votes but rather the median score plus a tiebreaker!" + admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] admintext += "\n[choices[i]]: [votes ? votes : "0"]" //This is raw data, but the raw data is null by default. If ya don't compensate for it, then it'll look weird! diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 19480f6672..8936951b10 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -114,3 +114,60 @@ /datum/station_trait/announcement_medbot/New() . = ..() SSstation.announcer = /datum/centcom_announcer/medbot + +GLOBAL_LIST_INIT(randomizing_station_name_messages, world.file2list("strings/randomizing_station_name_messages.txt")) + +/datum/station_trait/randomizing_station_name + name = "Randomizing station name" + show_in_report = TRUE + report_message = "Due to legal reasons or other, we might not be able to settle on a station name." + trait_processes = TRUE + COOLDOWN_DECLARE(randomizing_cooldown) + var/trigger_every = 5 MINUTES + blacklist = list(/datum/station_trait/randomizing_station_name/fast, /datum/station_trait/randomizing_station_name/slow) + +/datum/station_trait/randomizing_station_name/on_round_start() + . = ..() + COOLDOWN_START(src, randomizing_cooldown, trigger_every) + +/datum/station_trait/randomizing_station_name/process(delta_time) + if(!COOLDOWN_FINISHED(src, randomizing_cooldown)) + return + + COOLDOWN_START(src, randomizing_cooldown, trigger_every) + + var/new_name = new_station_name() + + var/centcom_announcement = pick(GLOB.randomizing_station_name_messages) + + // Replace with CURRENT station name + centcom_announcement = replacetext(centcom_announcement, "%CURRENT_STATION_NAME%", station_name()) + + // Replace with NEW station name + centcom_announcement = replacetext(centcom_announcement, "%NEW_STATION_NAME%", new_name) + + // Take a CREWMEMBER's name for the goofs + if(findtext(centcom_announcement, "%RANDOM_CREWMEMBER%")) + var/crewmember = locate(/mob/living/carbon/human) in GLOB.alive_mob_list + if(!crewmember) + crewmember = random_unique_name() + centcom_announcement = replacetext(centcom_announcement, "%RANDOM_CREWMEMBER%", crewmember) + + // Replace with a completely RANDOM name + if(findtext(centcom_announcement, "%RANDOM_NAME%")) + var/name = random_unique_name() + centcom_announcement = replacetext(centcom_announcement, "%RANDOM_NAME%", name) + + set_station_name(new_name) + + print_command_report(centcom_announcement) + +/datum/station_trait/randomizing_station_name/fast + name = "Randomizing station name - Fast" + trigger_every = 3 MINUTES + blacklist = list(/datum/station_trait/randomizing_station_name, /datum/station_trait/randomizing_station_name/slow) + +/datum/station_trait/randomizing_station_name/slow + name = "Randomizing station name - Slow" + trigger_every = 10 MINUTES + blacklist = list(/datum/station_trait/randomizing_station_name/fast, /datum/station_trait/randomizing_station_name) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 93bddb2f70..351d8622c9 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -3,7 +3,8 @@ desc = "Stabby stabby" var/sting_icon = null -/datum/action/changeling/sting/Trigger(mob/user) +/datum/action/changeling/sting/Trigger() + var/mob/user = owner if(!user || !user.mind) return var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) @@ -74,7 +75,8 @@ loudness = 1 var/datum/changelingprofile/selected_dna = null -/datum/action/changeling/sting/transformation/Trigger(mob/user) +/datum/action/changeling/sting/transformation/Trigger() + var/mob/user = owner var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling.chosen_sting) unset_sting(user) diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index 4e65cb3200..983ceee290 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -76,16 +76,17 @@ ..() /obj/item/organ/genital/breasts/size_to_state() + var/rounded = round(size) var/str_size - switch(size) + switch(rounded) if(0) //flatchested str_size = "flat" if(1 to 8) //modest - str_size = GLOB.breast_values[size] + str_size = GLOB.breast_values[rounded] if(9 to 15) //massive - str_size = GLOB.breast_values[size] + str_size = GLOB.breast_values[rounded] if(16 to 17) //ridiculous - str_size = GLOB.breast_values[size] + str_size = GLOB.breast_values[rounded] if(18 to 24) //AWOOOOGAAAAAAA str_size = "massive" if(25 to 29) //AWOOOOOOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA diff --git a/code/modules/arousal/organs/butt.dm b/code/modules/arousal/organs/butt.dm index bcad9af8fb..9496cf1389 100644 --- a/code/modules/arousal/organs/butt.dm +++ b/code/modules/arousal/organs/butt.dm @@ -16,7 +16,7 @@ var/prev_size //former size value, to allow update_size() to early return should be there no significant changes. layer_index = BUTT_LAYER_INDEX -/obj/item/organ/genital/butt/modify_size(modifier, min = -INFINITY, max = INFINITY) +/obj/item/organ/genital/butt/modify_size(modifier, min = -INFINITY, max = BUTT_SIZE_MAX) var/new_value = clamp(size_cached + modifier, max(min, min_size ? min_size : -INFINITY), min(max_size ? max_size : INFINITY, max)) if(new_value == size_cached) return diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 4c74405389..46a3acdb9e 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -594,3 +594,10 @@ // blended_color = "#2eeb9a" // pre_asset.Blend(blended_color, ICON_MULTIPLY) // return pre_asset + +/datum/asset/spritesheet/jobs + name = "jobs" + +/datum/asset/spritesheet/jobs/register() + InsertAll("", 'icons/UI_Icons/tgui/jobs.dmi') + ..() diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 24f56a8dbb..7463c354e2 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -321,7 +321,8 @@ Key procs /datum/language/modular_sand/solcommon = list(LANGUAGE_ATOM), /datum/language/modular_sand/technorussian = list(LANGUAGE_ATOM), /datum/language/modular_sand/dunmeri = list(LANGUAGE_ATOM), - /datum/language/modular_sand/sergal = list(LANGUAGE_ATOM)) + /datum/language/modular_sand/sergal = list(LANGUAGE_ATOM), + /datum/language/signlanguage = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/machine = list(LANGUAGE_ATOM), /datum/language/draconic = list(LANGUAGE_ATOM), diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index b799c5e592..ea70227864 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -90,6 +90,14 @@ antagonists += list(serialized) break + var/assignment = "no_id" + + var/obj/item/card/id/card = M.get_idcard() + if(card) + assignment = "[ckey(card.get_job_name())]" + + serialized["assignment"] = assignment + if (!was_antagonist) alive += list(serialized) else @@ -107,4 +115,4 @@ /datum/orbit_menu/ui_assets() . = ..() || list() . += get_asset_datum(/datum/asset/simple/orbit) - + . += get_asset_datum(/datum/asset/spritesheet/jobs) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index fcb0ffcefa..841f08339f 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -15,6 +15,7 @@ * Returns TRUE if damage applied */ /mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE) + SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness) var/hit_percent = (100-blocked)/100 if(!damage || (hit_percent <= 0)) return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 0402220a5d..64566abb9d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -79,7 +79,7 @@ target = null return return ..() -/* + /mob/living/simple_animal/hostile/megafauna/death(gibbed, list/force_grant) if(health > 0) return @@ -96,7 +96,6 @@ grant_achievement(achievement_type, score_achievement_type, crusher_kill, force_grant) SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]") return ..() -*/ /mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot() loot = crusher_loot diff --git a/config/splurt/general.txt b/config/splurt/general.txt index 53c680f96b..773d015386 100644 --- a/config/splurt/general.txt +++ b/config/splurt/general.txt @@ -26,3 +26,8 @@ PROTOLOCK_ALL_ACCESS # Character color limits # Uncomment to disallow players from making characters with colors that are too dark CHARACTER_COLOR_LIMITS + +# Jukebox song limit +# Max amount of songs that can be added to the jukebox each round. +# -1 or comment to unlimit +#MAX_JUKEBOX_SONGS -1 diff --git a/html/changelogs/archive/2023-07.yml b/html/changelogs/archive/2023-07.yml index c567d1780b..95a7244fbb 100644 --- a/html/changelogs/archive/2023-07.yml +++ b/html/changelogs/archive/2023-07.yml @@ -79,8 +79,23 @@ JMoldy: - rscadd: disgust vomiting makes characters less disgusted. 2023-07-29: - miguelop1: - - bugfix: Finally the golden zippo has a turn on sprite. Yay. + Dexxiol: + - rscadd: Added a new plushie + - imageadd: Kinetic Destroyer resprite SandPoot: - tweak: Carrying small people in your active hand allows you to use their access for airlocks/etc. + Vhariik: + - tweak: penguin hiero var + miguelop1: + - bugfix: Finally the golden zippo has a turn on sprite. Yay. +2023-07-30: + Dexxiol: + - imageadd: 2nd frame for uncharged kinetic destroyer +2023-07-31: + BongaTheProto: + - rscadd: Now players can suggest songs to be automatically added to the jukebox + (after being reviewed) + - tweak: The amount of songs for jukeboxes can now be limited to avoid lag and issues + Dexxiol: + - imageadd: Fixed security hardsuit sprite diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml new file mode 100644 index 0000000000..720b1aa8e6 --- /dev/null +++ b/html/changelogs/archive/2023-08.yml @@ -0,0 +1,30 @@ +2023-08-02: + Yawet330: + - bugfix: sydnicate -> Syndicate +2023-08-04: + SandPoot: + - rscdel: There is no longer a minimum vote amount for extending rounds. +2023-08-05: + SandPoot: + - refactor: Glory killing has been componentized with (hopefully) better code. + - bugfix: Some megafauna will no longer die to lava/storms. + - tweak: Redundant code has been removed. + - code_imp: Turns out we had some extra tumor bosses that weren't on the pool, they + now have been added. + - bugfix: Watchers were meant to be glory killable, they are now. + miguelop1: + - bugfix: Ghost can't Speen anymore, fixed a small part of code that wasn't finished + (return FALSE). If it breaks blame Kepler xD +2023-08-07: + BongaTheProto: + - bugfix: Bellies and butts won't suddenly disappear when expanding +2023-08-09: + Anonymous: + - tweak: Cyborgs/Robots will now understand the Sign Language, but not speak it. + - bugfix: Sign Language now has it own icon instead of using EAL's. + NopemanMcHalt: + - rscadd: Xenoarchaeolgist alt title for scientists. +2023-08-10: + NopemanMcHalt: + - spellcheck: Xenoarchaeolgist -> Xenoarchaeologist. Someone was drunk while adding + it. diff --git a/icons/UI_Icons/tgui/jobs.dmi b/icons/UI_Icons/tgui/jobs.dmi new file mode 100644 index 0000000000..207f11afed Binary files /dev/null and b/icons/UI_Icons/tgui/jobs.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index 77d8328482..f68398a564 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/modular_sand/code/datums/components/glory_kill.dm b/modular_sand/code/datums/components/glory_kill.dm new file mode 100644 index 0000000000..94267c23c0 --- /dev/null +++ b/modular_sand/code/datums/components/glory_kill.dm @@ -0,0 +1,120 @@ +#define GLORY_KILL_COLOR "#00FFFF" + +/datum/component/glory_kill + /// Is this ready to be glory killed + var/ready = FALSE + /// WHAT THE FUCK ARE THE MESSAGES SAID BY THIS FUCK WHEN HE'S GLORY KILLED WITH AN EMPTY HAND? + var/list/messages_unarmed + /// SAME AS ABOVE BUT CRUSHER + var/list/messages_crusher + /// SAME AS ABOVE THE ABOVE BUT PKA + var/list/messages_pka + /// SAME AS ABOVE BUT WITH A HONKING KNIFE ON THE FUCKING THING + var/list/messages_pka_bayonet + /// Health to give to our executioner + var/health_given = 200 + /// With how much health our sate shall be sealed + var/threshold = 100 + /// Multiply crusher drop chance by (only for asteroid mobs) + var/crusher_drop_mod = 1 + +/datum/component/glory_kill/Initialize(messages_unarmed, messages_pka, messages_pka_bayonet, messages_crusher, health_given, threshold, crusher_drop_mod) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + if(messages_unarmed) + src.messages_unarmed = messages_unarmed + if(messages_pka) + src.messages_pka = messages_pka + if(messages_pka_bayonet) + src.messages_pka_bayonet = messages_pka_bayonet + if(messages_crusher) + src.messages_crusher = messages_crusher + if(health_given) + src.health_given = health_given + if(threshold) + src.threshold = threshold + if(crusher_drop_mod) + src.crusher_drop_mod = crusher_drop_mod + + return ..() + +/datum/component/glory_kill/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/glory_kill) + RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, .proc/health_modified) + RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/on_death) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examined) + +/datum/component/glory_kill/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_MOB_APPLY_DAMAGE, COMSIG_MOB_DEATH, COMSIG_MOB_EXAMINATE)) + . = ..() + +/datum/component/glory_kill/proc/health_modified(mob/living/owner, damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness) + if(((owner.health - damage) <= threshold) && !ready && (owner.stat != DEAD)) + glory(owner) + else if(ready) + unglory(owner) + +/datum/component/glory_kill/proc/glory(mob/living/owner) + ready = TRUE + owner.add_atom_colour(GLORY_KILL_COLOR, TEMPORARY_COLOUR_PRIORITY) + +/datum/component/glory_kill/proc/unglory(mob/living/owner) + ready = FALSE + owner.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLORY_KILL_COLOR) + +/datum/component/glory_kill/proc/glory_kill(mob/living/owner, mob/living/slayer) + if(!ready) + return + if(!slayer.canUseTopic(owner, TRUE)) + return + /// Let's give our slayer a chance (totally not abusable by spamming alt-click) + if(istype(owner, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/hostile = owner + if(hostile.ranged) + if(hostile.ranged_cooldown >= world.time) + hostile.ranged_cooldown += 10 + else + hostile.ranged_cooldown = 10 + world.time + if(do_mob(slayer, owner, 1 SECONDS) && (owner.stat != DEAD)) + var/message + if(!slayer.get_active_held_item() || (!istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher) && !istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator))) + message = pick(messages_unarmed) + else if(istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher)) + message = pick(messages_crusher) + else if(istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator)) + message = pick(messages_pka) + var/obj/item/gun/energy/kinetic_accelerator/KA = slayer.get_active_held_item() + if(KA && KA.bayonet) + message = pick(messages_pka | messages_pka_bayonet) + if(message) + owner.visible_message(span_danger("[slayer] [message]")) + else + owner.visible_message(span_danger("[slayer] does something generally considered brutal to [owner]... Whatever that may be!")) + if(istype(owner, /mob/living/simple_animal/hostile/asteroid)) + var/mob/living/simple_animal/hostile/asteroid/asteroid = owner + playsound(asteroid.loc, asteroid.death_sound, 150, TRUE, -1) + asteroid.crusher_drop_mod *= crusher_drop_mod + if(istype(owner, /mob/living/simple_animal)) + var/mob/living/simple_animal/simple = owner + simple.adjustHealth(simple.maxHealth, TRUE, TRUE) + if(owner.mob_biotypes & MOB_ORGANIC) + new /obj/effect/gibspawner/generic(owner.loc) + else if(owner.mob_biotypes & MOB_ROBOTIC) + new /obj/effect/gibspawner/robot(owner.loc) + slayer.heal_overall_damage(health_given, health_given) + else + to_chat(slayer, span_danger("You fail to glory kill [owner]!")) + +/datum/component/glory_kill/proc/examined(mob/living/owner, mob/living/user, list/examine_list) + if(ready) + examine_list += "[owner] is staggered and can be glory killed!" + +/datum/component/glory_kill/proc/on_death(mob/living/owner, gibbed) + if(gibbed) + qdel(src) + return + unglory(owner) + +#undef GLORY_KILL_COLOR diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm index a10bd2aae1..363ed73990 100644 --- a/modular_sand/code/datums/interactions/lewd_definitions.dm +++ b/modular_sand/code/datums/interactions/lewd_definitions.dm @@ -842,11 +842,13 @@ if(amount) add_lust(amount) - if(get_lust() >= get_lust_tolerance()) + var/lust = get_lust() + var/lust_tolerance = get_lust_tolerance() + if(lust >= lust_tolerance) if(prob(10)) to_chat(src, "You struggle to not orgasm!") return FALSE - if(lust >= get_lust_tolerance()*3) + if(lust >= (lust_tolerance * 3)) cum(partner, orifice) return TRUE else diff --git a/modular_sand/code/game/objects/items/plushes.dm b/modular_sand/code/game/objects/items/plushes.dm index fb50c80ce9..da9f13ec4f 100644 --- a/modular_sand/code/game/objects/items/plushes.dm +++ b/modular_sand/code/game/objects/items/plushes.dm @@ -1,4 +1,5 @@ // Honestly, Saliith was just sad when he made this. Leave this file in the game to let people hug him. +// i agree and support - one of the spriters /obj/item/toy/plush/lizardplushie/saliith name = "Saliith plushie" @@ -239,3 +240,12 @@ /obj/item/pinpointer/plushie_saliith/scan_for_target() set_target(GLOB.saliith_plushie, src) + +// cube guy thing. beware, very silly + +/obj/item/toy/plush/cube + name = "Cubical plushie" + desc = "That's one weird looking plushie." + icon = 'modular_sand/icons/obj/plushes.dmi' + icon_state = "cube" + squeak_override = list('sound/effects/footstep/rustystep1.ogg' = 1) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index e6fcf3980c..75082a1794 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -1,11 +1,15 @@ /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer, /obj/item/borg/upgrade/modkit/lifesteal/miner, /obj/item/crusher_trophy/miner_eye) loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer, /obj/item/borg/upgrade/modkit/lifesteal/miner) - glorymessageshand = list("grabs the blood-drunk's arm, flips their cleaving saw with the other hand, and forcefully makes them chop off their own head with it!", "grabs blood-drunk by their PKA, aims it at their head and then shoots, splattering his brains out!", "rips out both of the blood-drunk's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!") - glorymessagescrusher = list("chops off the blood-drunk's cleaving saw arm in one swift move, then grabs the saw and swings it against their head, chopping their skull vertically in half!", "bashes the miner to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the blood-drunk diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the moaning fiend!") - glorymessagespka = list("grabs the blood-drunk by the neck and flips them, shooting through their guts with a PKA blast!", "shoots at the blood-drunk's shoulder, exploding their arm! To finish the fiend off, they grab their PKA and bonk the blood-drunk's head inside their torso!", "doesn't bother with being fancy, and simply shoots at the blood-drunk's head with their PKA, exploding it in one violent blast!") - glorymessagespkabayonet = list("rams into the blood-drunk's stomach with their PKA's bayonet, knocking them and themselves down! To finish the fiend off, they simply stab into their torso like a madman with their bayonet!", "kicks the blood-drunk's knee hard, breaking it! While the fiend is stunned and barely standing, their chop their head off with the PKA's bayonet!") - glorythreshold = 50 + +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the blood-drunk's arm, flips their cleaving saw with the other hand, and forcefully makes them chop off their own head with it!", "grabs blood-drunk by their PKA, aims it at their head and then shoots, splattering his brains out!", "rips out both of the blood-drunk's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!"), \ + messages_crusher = list("chops off the blood-drunk's cleaving saw arm in one swift move, then grabs the saw and swings it against their head, chopping their skull vertically in half!", "bashes the miner to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the blood-drunk diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the moaning fiend!"), \ + messages_pka = list("grabs the blood-drunk by the neck and flips them, shooting through their guts with a PKA blast!", "shoots at the blood-drunk's shoulder, exploding their arm! To finish the fiend off, they grab their PKA and bonk the blood-drunk's head inside their torso!", "doesn't bother with being fancy, and simply shoots at the blood-drunk's head with their PKA, exploding it in one violent blast!"), \ + messages_pka_bayonet = list("rams into the blood-drunk's stomach with their PKA's bayonet, knocking them and themselves down! To finish the fiend off, they simply stab into their torso like a madman with their bayonet!", "kicks the blood-drunk's knee hard, breaking it! While the fiend is stunned and barely standing, their chop their head off with the PKA's bayonet!"), \ + threshold = 50) /obj/item/projectile/kinetic/miner color = "#FF0000" diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 77a910184b..b4a8993f4e 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -11,13 +11,16 @@ Removes slaughterlings (because they are bullshit), instead replacing them with /mob/living/simple_animal/hostile/megafauna/bubblegum death_sound = 'modular_sand/sound/misc/gorenest.ogg' //fuck it var/movesound = 'sound/effects/meteorimpact.ogg' - glorymessageshand = list("grabs bubblegum by the leg, and pulls them down! While downed, they climb on their torso and punch through it, smashing their demonic heart!", "goes around bubblegum and climbs them by their back, once on top of their head they punch right through the demon's skull, ripping out brain matter and killing it as it limply falls on the ground!") - glorymessagescrusher = list("jumps and chops off both of bubblegum's legs in one swift move with their crusher! To finish off the now wheelchair-bound demon, they chop at the torso vertically, getting the crusher stuck in the process but killing the demonic fiend!", "goes around bubblegum and climbs them by their back, once on the top they chop their head off with the crusher!") - glorymessagespka = list("shoots the weakened demon in the chest, opening a hole and exposing their inner core! With another blast, the demon's heart explodes, and they fall dead and limp on the ground!", "shoots the weakened demon's head, stunning them and revealing their brain! Another PKA blast finishes off what little brainmatter they had!") - glorymessagespkabayonet = list("shoots the weakened demon in the chest, opening a hole and exposing their inner core! They run onto the now exposed heart and stab it repeatedly with their bayonet, killing the demon off!") footstep_type = FOOTSTEP_MOB_HEAVY var/dont_move = TRUE //impedes bubbles from moving while using the blood jaunt +/mob/living/simple_animal/hostile/megafauna/bubblegum/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs bubblegum by the leg, and pulls them down! While downed, they climb on their torso and punch through it, smashing their demonic heart!", "goes around bubblegum and climbs them by their back, once on top of their head they punch right through the demon's skull, ripping out brain matter and killing it as it limply falls on the ground!"), \ + messages_crusher = list("jumps and chops off both of bubblegum's legs in one swift move with their crusher! To finish off the now wheelchair-bound demon, they chop at the torso vertically, getting the crusher stuck in the process but killing the demonic fiend!", "goes around bubblegum and climbs them by their back, once on the top they chop their head off with the crusher!"), \ + messages_pka = list("shoots the weakened demon in the chest, opening a hole and exposing their inner core! With another blast, the demon's heart explodes, and they fall dead and limp on the ground!", "shoots the weakened demon's head, stunning them and revealing their brain! Another PKA blast finishes off what little brainmatter they had!"), \ + messages_pka_bayonet = list("shoots the weakened demon in the chest, opening a hole and exposing their inner core! They run onto the now exposed heart and stab it repeatedly with their bayonet, killing the demon off!")) /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() . = ..() diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 090e2cf2e7..4bef2411bd 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -1,14 +1,7 @@ -/mob/living/simple_animal/hostile/megafauna/colossus - glorymessageshand = list("grabs the colossus by the leg, and pulls them down! While downed, they climb on his neck and violently rip off their vocal cords!", "goes around the colossus and climbs them by their back, once on top of their shoulder they grab it's arm and aim the blaster at the creature's head, which finishes itself off with a penetrating death bolt that blasts off their head!") - glorymessagescrusher = list("throws their crusher at the colossus' head, which surprisingly works! Humiliated, the angelic creature dies with a big fucking axe stuck on their skull!", "chops off one of the colossus' legs with the crusher, as it falls down they grab the leg and use it as a makeshift club on the creature's head, which explodes in differently-sized giblets on impact!") - glorymessagespka = list("somehow parries a death bolt with a PKA blast, which goes right back to it's owner's torso, opening a hole on them and killing them!") - glorymessagespkabayonet = list("goes around the colossus and climbs on their back, ramming their bayonet on it's spine and falling down holding it, pretty much gruesomely opening the colossus' back!") - -/mob/living/simple_animal/hostile/megafauna/colossus/enrage(mob/living/L) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.mind) - if(istype(H.mind.martial_art, /datum/martial_art/the_sleeping_carp) || istype(H.mind.martial_art, /datum/martial_art/the_rising_bass)) - . = TRUE - if(is_species(H, /datum/species/golem/sand)) - . = TRUE +/mob/living/simple_animal/hostile/megafauna/colossus/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the colossus by the leg, and pulls them down! While downed, they climb on his neck and violently rip off their vocal cords!", "goes around the colossus and climbs them by their back, once on top of their shoulder they grab it's arm and aim the blaster at the creature's head, which finishes itself off with a penetrating death bolt that blasts off their head!"), \ + messages_crusher = list("throws their crusher at the colossus' head, which surprisingly works! Humiliated, the angelic creature dies with a big fucking axe stuck on their skull!", "chops off one of the colossus' legs with the crusher, as it falls down they grab the leg and use it as a makeshift club on the creature's head, which explodes in differently-sized giblets on impact!"), \ + messages_pka = list("somehow parries a death bolt with a PKA blast, which goes right back to it's owner's torso, opening a hole on them and killing them!"), \ + messages_pka_bayonet = list("goes around the colossus and climbs on their back, ramming their bayonet on it's spine and falling down holding it, pretty much gruesomely opening the colossus' back!")) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 1b23f6abe4..6ba256c69d 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -1,4 +1,8 @@ /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner deathsound = "bodyfall" - glorymessageshand = list("grabs the demonic miner's arm, flips their cleaving saw with the other hand, and forcefully makes them chop off their own head with it!", "grabs demonic miner by their PKA, aims it at their head and then shoots, splattering his brains out!", "rips out both of the demonic miner's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!") - glorymessagescrusher = list("chops off the demonic miner's cleaving saw arm in one swift move, then grabs the saw and swings it against their head, chopping their skull vertically in half!", "bashes the miner to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the demonic miner diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the moaning fiend!") + +/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the demonic miner's arm, flips their cleaving saw with the other hand, and forcefully makes them chop off their own head with it!", "grabs demonic miner by their PKA, aims it at their head and then shoots, splattering his brains out!", "rips out both of the demonic miner's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!"), \ + messages_crusher = list("chops off the demonic miner's cleaving saw arm in one swift move, then grabs the saw and swings it against their head, chopping their skull vertically in half!", "bashes the miner to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the demonic miner diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the moaning fiend!")) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 99ece0229c..f58e444a83 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -1,8 +1,10 @@ -/mob/living/simple_animal/hostile/megafauna/dragon - glorymessageshand = list("climbs atop the drake's head as it dangles weakly near the ground, ripping its left horn off and jumping down before swinging it at the drake's face full force, cracking its maw!", "goes around the dragon and rips off their tail, using it's spiked end to beat the dragon's bloodied face until it cracks open and it dies!") - glorymessagescrusher = list("chops off the dragon's head by the neck, and it falls down with a strong thud!", "rams into the dragon's skull with the hilt of their crusher repeatedly and cracking holes into their skull each time, turning it's brain into mush!") - glorymessagespka = list("shoots at the dragon's wings with their PKA, exploding them into bizarre giblets! They then finish the poor creature off with a point-blank blast to the head, exploding it!") - glorymessagespkabayonet = list("goes around the drake and chops off their tail's spike with their bayonet, then climbs onto their head and makes them eat it!") +/mob/living/simple_animal/hostile/megafauna/dragon/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("climbs atop the drake's head as it dangles weakly near the ground, ripping its left horn off and jumping down before swinging it at the drake's face full force, cracking its maw!", "goes around the dragon and rips off their tail, using it's spiked end to beat the dragon's bloodied face until it cracks open and it dies!"), \ + messages_crusher = list("chops off the dragon's head by the neck, and it falls down with a strong thud!", "rams into the dragon's skull with the hilt of their crusher repeatedly and cracking holes into their skull each time, turning it's brain into mush!"), \ + messages_pka = list("shoots at the dragon's wings with their PKA, exploding them into bizarre giblets! They then finish the poor creature off with a point-blank blast to the head, exploding it!"), \ + messages_pka_bayonet = list("goes around the drake and chops off their tail's spike with their bayonet, then climbs onto their head and makes them eat it!")) /mob/living/simple_animal/hostile/megafauna/dragon/lesser/akatosh name = "Holy Dragon" diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm index db5c805d2a..752072b66c 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm @@ -37,7 +37,6 @@ They deal 35 brute (armor is considered). health = 1500 maxHealth = 1500 movement_type = GROUND - weather_immunities = list("lava","ash") var/phase = 1 var/list/introduced = list() //Basically all the mobs which the gladiator has already introduced himself to. var/speen = FALSE @@ -51,11 +50,15 @@ They deal 35 brute (armor is considered). var/move_to_charge = 1.5 loot = list(/obj/structure/closet/crate/necropolis/gladiator) crusher_loot = list(/obj/structure/closet/crate/necropolis/gladiator/crusher) - glorymessageshand = list("grabs the gladiator's arm, flips their zweihander with the other hand, and forcefully makes them chop off their own head with it!", "grabs the gladiator by their zweihander, and mark detonate them into a shower of gibs!", "rips out both of the gladiator's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!") - glorymessagescrusher = list("chops off gladiator's zweihandder arm in one swift move, then grabs the zweihander and swings it against their head, chopping their skull vertically in half!", "bashes the gladiator to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the gladiator diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the screaming fiend!") - glorymessagespka = list("grabs the gladiator by the neck and flips them, shooting through their guts with a PKA blast!", "shoots at the gladiator's shoulder, exploding their arm! To finish the fiend off, they grab their PKA and bonk the gladiator's head inside their torso!", "doesn't bother with being fancy, and simply shoots at the gladiator's head with their PKA, exploding it in one violent blast!") - glorymessagespkabayonet = list("rams into the gladiator's stomach with their PKA's bayonet, knocking them and themselves down! To finish the fiend off, they simply stab into their torso like a madman with their bayonet!", "kicks the gladiator's knee hard, breaking it! While the fiend is stunned and barely standing, their chop their head off with the PKA's bayonet!") - glorythreshold = 50 + +/mob/living/simple_animal/hostile/megafauna/gladiator/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the gladiator's arm, flips their zweihander with the other hand, and forcefully makes them chop off their own head with it!", "grabs the gladiator by their zweihander, and mark detonate them into a shower of gibs!", "rips out both of the gladiator's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!"), \ + messages_crusher = list("chops off gladiator's zweihandder arm in one swift move, then grabs the zweihander and swings it against their head, chopping their skull vertically in half!", "bashes the gladiator to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the gladiator diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the screaming fiend!"), \ + messages_pka = list("grabs the gladiator by the neck and flips them, shooting through their guts with a PKA blast!", "shoots at the gladiator's shoulder, exploding their arm! To finish the fiend off, they grab their PKA and bonk the gladiator's head inside their torso!", "doesn't bother with being fancy, and simply shoots at the gladiator's head with their PKA, exploding it in one violent blast!"), \ + messages_pka_bayonet = list("rams into the gladiator's stomach with their PKA's bayonet, knocking them and themselves down! To finish the fiend off, they simply stab into their torso like a madman with their bayonet!", "kicks the gladiator's knee hard, breaking it! While the fiend is stunned and barely standing, their chop their head off with the PKA's bayonet!"), \ + threshold = 50) /obj/item/gps/internal/gladiator icon_state = null @@ -97,27 +100,29 @@ They deal 35 brute (armor is considered). return if(ishuman(target)) var/mob/living/carbon/human/H = target - var/datum/species/Hspecies = H.dna.species - if(Hspecies.id == "ashlizard") + + var/message + var/language = /datum/language/common + + if(is_species(target, /datum/species/lizard/ashwalker)) var/list/messages = list("I am sorry, tribesssmate. I cannot let you through.",\ "Pleassse leave, walker.",\ "The necropolisss must be protected even from it'ss servants. Pleassse retreat.") - say(message = pick(messages), language = /datum/language/draconic) - introduced |= H - else if(Hspecies.id == "lizard") + message = pick(messages) + language = /datum/language/draconic + else if(islizard(target)) var/list/messages = list("Thisss isss not the time nor place to be. Leave.",\ "Go back where you came from. I am sssafeguarding thisss sssacred place.",\ "You ssshould not be here. Turn.",\ "I can sssee an outlander from a mile away. You're not one of us."\ ) - say(message = pick(messages), language = /datum/language/draconic) - introduced |= H - else if(Hspecies.id == "dunmer") + message = pick(messages) + language = /datum/language/draconic + else if(findtext(H.dna.custom_species, "dunmer")) // If some dummy actually decides to, let em have it. var/list/messages = list("I will finisssh what little of your race remainsss, starting with you!",\ "Lavaland belongsss to the lizzzards!",\ "Thisss sacred land wasn't your property before, it won't be now!") - say(message = pick(messages)) - introduced |= H + message = pick(messages) GiveTarget(H) Retaliate() else @@ -125,8 +130,10 @@ They deal 35 brute (armor is considered). "You will not run your dirty handsss through what little sssacred land we have left. Out.",\ "My urge to end your life isss immeasssurable, but I am willing to ssspare you. Leave.",\ "You're not invited. Get out.") - say(message = pick(messages)) - introduced |= H + message = pick(messages) + + introduced |= H + say(message, language = language) else say("You are not welcome into the necropolisss.") diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 2327e24daf..5b8d34c864 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -1,7 +1,11 @@ /mob/living/simple_animal/hostile/megafauna/hierophant loot = list(/obj/item/hierophant_club, /obj/item/borg/upgrade/modkit/wall) crusher_loot = list(/obj/item/hierophant_club, /obj/item/borg/upgrade/modkit/wall) - glorymessageshand = list("grabs the floating club by the hilt, and violently smashes it onto the ground, killing it!", "jumps onto the hierophant and rips off their beacon with one hand as it crackles and explodes!") - glorymessagescrusher = list("violently chops the floating club with seemingly no effect, until it falls onto the ground limply!") - glorymessagespka = list("shoots at the floating club in the middle of it's 'face', which seemingly overloads it until it explodes!") - glorymessagespkabayonet = list("jumps on the hierophant and stabs it's beacon, the bizarre creature seemingly screaming until it crackles and explodes!") + +/mob/living/simple_animal/hostile/megafauna/hierophant/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the floating club by the hilt, and violently smashes it onto the ground, killing it!", "jumps onto the hierophant and rips off their beacon with one hand as it crackles and explodes!"), \ + messages_crusher = list("violently chops the floating club with seemingly no effect, until it falls onto the ground limply!"), \ + messages_pka = list("shoots at the floating club in the middle of it's 'face', which seemingly overloads it until it explodes!"), \ + messages_pka_bayonet = list("jumps on the hierophant and stabs it's beacon, the bizarre creature seemingly screaming until it crackles and explodes!")) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm index 4b78bb7dbf..653851b05d 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm @@ -58,14 +58,18 @@ Difficulty: Insanely Hard atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 var/stun_chance = 5 //chance per attack to Weaken target - glorymessageshand = list("grabs the goat by it's horns, then repeatedly knees it in the face until it's skull cracks open and it fucking dies!", "rips off one of the goat's horns bare-handed, then stabs through their skull with it, killing it!") - glorymessagescrusher = list("slashes both of the goat's horns with their crusher, then chops it's face in half with it!") - glorymessagespka = list("shoots at goat's maw, the goat seemingly gulping down the blast and exploding!", "kicks the goat into the air, then shoots it in the gut with their PKA's blast, showering everything in... goat guts!") - glorymessagespkabayonet = list("repeatedly stabs through the goat's eye and skull with their PKAA's bayonet, until it finally gives up and lets go of their life!") - gloryhealth = 50 - glorythreshold = 50 crusher_loot = list(/obj/item/crusher_trophy/king_goat) +/mob/living/simple_animal/hostile/megafauna/king/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the goat by it's horns, then repeatedly knees it in the face until it's skull cracks open and it fucking dies!", "rips off one of the goat's horns bare-handed, then stabs through their skull with it, killing it!"), \ + messages_crusher = list("slashes both of the goat's horns with their crusher, then chops it's face in half with it!"), \ + messages_pka = list("shoots at goat's maw, the goat seemingly gulping down the blast and exploding!", "kicks the goat into the air, then shoots it in the gut with their PKA's blast, showering everything in... goat guts!"), \ + messages_pka_bayonet = list("repeatedly stabs through the goat's eye and skull with their PKAA's bayonet, until it finally gives up and lets go of their life!"), \ + health_given = 50, \ + threshold = 50) + /mob/living/simple_animal/hostile/megafauna/king/ex_act(severity, target, origin) switch (severity) if (1) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index ed66903f0f..2047f15345 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -1,10 +1,14 @@ /mob/living/simple_animal/hostile/megafauna/legion loot = list(/obj/item/stack/sheet/bone = 3) - glorymessageshand = list("punches into the Legion's maw and rips off a floating skull, which they then proceed to use to bash the Legion until it dies!", "punches through both of the Legion's eyeholes with both hands, ripping out a bunch of tiny skulls and killing it!") - glorymessagescrusher = list("slashes the Legion's maw, which falls on the ground as it dies!") - glorymessagespka = list("parries a floating legion skulls with a pka shoot, which goes flying violently into the Legion, bursting through them and killing them in the process!") - glorymessagespkabayonet = list("repeatedly stabs through the Legion's eyesocket, pulling out a bunch of dead skulls in the process and killing it!") - glorythreshold = 50 + +/mob/living/simple_animal/hostile/megafauna/legion/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("punches into the Legion's maw and rips off a floating skull, which they then proceed to use to bash the Legion until it dies!", "punches through both of the Legion's eyeholes with both hands, ripping out a bunch of tiny skulls and killing it!"), \ + messages_crusher = list("slashes the Legion's maw, which falls on the ground as it dies!"), \ + messages_pka = list("parries a floating legion skulls with a pka shoot, which goes flying violently into the Legion, bursting through them and killing them in the process!"), \ + messages_pka_bayonet = list("repeatedly stabs through the Legion's eyesocket, pulling out a bunch of dead skulls in the process and killing it!"), \ + threshold = 50) /mob/living/simple_animal/hostile/megafauna/legion/death() if(health > 0) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index b7476832fe..03d15f9c7f 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -1,21 +1,8 @@ /mob/living/simple_animal/hostile/megafauna - var/glorykill = FALSE //CAN THIS MOTHERFUCKER BE SNAPPED IN HALF FOR HEALTH? - var/list/glorymessageshand = list() //WHAT THE FUCK ARE THE MESSAGES SAID BY THIS FUCK WHEN HE'S GLORY KILLED WITH AN EMPTY HAND? - var/list/glorymessagescrusher = list() //SAME AS ABOVE BUT CRUSHER - var/list/glorymessagespka = list() //SAME AS ABOVE THE ABOVE BUT PKA - var/list/glorymessagespkabayonet = list() //SAME AS ABOVE BUT WITH A HONKING KNIFE ON THE FUCKING THING - var/gloryhealth = 200 - var/glorythreshold = 100 var/retaliated = FALSE var/retaliatedcooldowntime = 6000 var/retaliatedcooldown -/mob/living/simple_animal/hostile/megafauna/SetRecoveryTime(buffer_time, ranged_buffer_time) - recovery_time = world.time + buffer_time - ranged_cooldown = world.time + buffer_time - if(ranged_buffer_time) - ranged_cooldown = world.time + ranged_buffer_time - /mob/living/simple_animal/hostile/megafauna var/list/enemies = list() @@ -32,17 +19,15 @@ return A /mob/living/simple_animal/hostile/megafauna/ListTargets() - if(!enemies.len) + if(!length(enemies)) return list() var/list/see = ..() see &= enemies // Remove all entries that aren't in enemies return see /mob/living/simple_animal/hostile/megafauna/proc/Retaliate() - var/list/around = view(src, vision_range) + var/list/around = oview(src, vision_range) for(var/atom/movable/A in around) - if(A == src) - continue if(isliving(A)) var/mob/living/M = A if((faction_check_mob(M) && attack_same) || (!faction_check_mob(M)) || (!ismegafauna(M))) @@ -77,77 +62,6 @@ /mob/living/simple_animal/hostile/megafauna/Life() ..() - if(health <= glorythreshold && !glorykill && stat != DEAD) - glorykill = TRUE - glory() if(retaliated) if(retaliatedcooldown < world.time) retaliated = FALSE - -/mob/living/simple_animal/hostile/megafauna/proc/glory() - desc += "
[src] is staggered and can be glory killed!" - animate(src, color = "#00FFFF", time = 5) - -/mob/living/simple_animal/hostile/megafauna/death(gibbed, list/force_grant) - if(health > 0) - return - else - animate(src, color = initial(color), time = 3) - desc = initial(desc) - var/datum/status_effect/crusher_damage/crusher_dmg = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) - var/crusher_kill = FALSE - if(crusher_dmg && crusher_loot && crusher_dmg.total_damage >= maxHealth * 0.6) - spawn_crusher_loot() - crusher_kill = TRUE - if(true_spawn && !(flags_1 & ADMIN_SPAWNED_1)) - var/tab = "megafauna_kills" - if(crusher_kill) - tab = "megafauna_kills_crusher" - if(!elimination) //used so the achievment only occurs for the last legion to die. - grant_achievement(achievement_type, score_achievement_type, crusher_kill, force_grant) - SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]") - return ..() - -/mob/living/simple_animal/hostile/megafauna/AltClick(mob/living/carbon/slayer) - if(!slayer.canUseTopic(src, TRUE)) - return - if(glorykill) - if(ranged) - if(ranged_cooldown >= world.time) - ranged_cooldown += 10 - else - ranged_cooldown = 10 + world.time - if(do_mob(slayer, src, 10) && (stat != DEAD)) - var/message - if(!slayer.get_active_held_item() || (!istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher) && !istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator))) - message = pick(glorymessageshand) - else if(istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher)) - message = pick(glorymessagescrusher) - else if(istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator)) - message = pick(glorymessagespka) - var/obj/item/gun/energy/kinetic_accelerator/KA = get_active_held_item() - if(KA && KA.bayonet) - message = pick(glorymessagespka | glorymessagespkabayonet) - if(message) - visible_message(span_danger("[slayer] [message]")) - else - visible_message(span_danger("[slayer] does something generally considered brutal to [src]... Whatever that may be!")) - adjustHealth(maxHealth, TRUE, TRUE) - if(mob_biotypes & MOB_ORGANIC) - new /obj/effect/gibspawner/generic(src.loc) - else if(mob_biotypes & MOB_ROBOTIC) - new /obj/effect/gibspawner/robot(src.loc) - slayer.heal_overall_damage(gloryhealth,gloryhealth) - else - to_chat(slayer, span_danger("You fail to glory kill [src]!")) - -/mob/living/simple_animal/hostile/megafauna/devour(mob/living/L) - if(!L) - return - visible_message( - span_danger("[src] devours [L]!"), - span_userdanger("You feast on [L], restoring your health!")) - if(!is_station_level(z) || client) //NPC monsters won't heal while on station - adjustBruteLoss(-L.maxHealth/2) - L.gib() - ..() diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm index fb49b7fa98..c392c9e0dd 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm @@ -32,7 +32,6 @@ var/special = FALSE wander = FALSE faction = list("mining", "boss") - weather_immunities = list("lava","ash") blood_volume = 0 var/min_sparks = 1 var/max_sparks = 4 diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm index 56c05a748c..cdc3543df9 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm @@ -85,12 +85,16 @@ Difficulty: Medium var/stageThree = FALSE var/currentPower = 0 //Every few seconds this variable gets higher, when it gets high //enough it will use a special attack then reset the variable to 0w - glorymessageshand = list("climbs atop the wolf's head as it dangles weakly near the ground, ripping its left eye off and jumping down before punching through it's cranium!", "goes around the wolf and rips off their tail, using it as whip on the fiend") - glorymessagescrusher = list("chops off the wolf's head by it's neck!") - glorymessagespka = list("shoots at the wolf's eyes with their PKA, exploding them into giblets!") - glorymessagespkabayonet = list("slides down below Sif, using their bayonet to rip it's stomach open!") var/list/hit_things = list() +/mob/living/simple_animal/hostile/megafauna/sif/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("climbs atop the wolf's head as it dangles weakly near the ground, ripping its left eye off and jumping down before punching through it's cranium!", "goes around the wolf and rips off their tail, using it as whip on the fiend"), \ + messages_crusher = list("chops off the wolf's head by it's neck!"), \ + messages_pka = list("shoots at the wolf's eyes with their PKA, exploding them into giblets!"), \ + messages_pka_bayonet = list("slides down below Sif, using their bayonet to rip it's stomach open!")) + /obj/item/gps/internal/sif icon_state = null gpstag = "Infinity Signal" diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index c146a83928..fc66f7103f 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -1,5 +1,10 @@ -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher - glorymessageshand = list("rips out both of the watcher's wings and shoves them aside, then kicks the downed body until it turns into mush!", "violently rips off one of the watcher's spikes, then stabs them repeatedly with it!") - glorymessagespka = list("bashes the shit out of the watcher with their PKA, gushing blood everywhere!", "shoots both of the watcher's wings off, then sticks their PKA on their face and shoots, showering everything in gore!") - glorymessagespkabayonet = list("stabs the watcher's eye repeatedly, turning it into a bloody mess!", "slices one wing after another off the watcher, in swift moves!") - glorymessagescrusher = list("repeatedly chops the watcher with their crusher, turning it into bloody mush!", "mark detonates the watcher in close proximity, showering viscera everywhere!", "flips their Crusher around, ramming the handle up the Watcher's eye, impaling it, before smashing it against the ground brutally!") +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("rips out both of the watcher's wings and shoves them aside, then kicks the downed body until it turns into mush!", "violently rips off one of the watcher's spikes, then stabs them repeatedly with it!"), \ + messages_pka = list("bashes the shit out of the watcher with their PKA, gushing blood everywhere!", "shoots both of the watcher's wings off, then sticks their PKA on their face and shoots, showering everything in gore!"), \ + messages_pka_bayonet = list("stabs the watcher's eye repeatedly, turning it into a bloody mess!", "slices one wing after another off the watcher, in swift moves!"), \ + messages_crusher = list("repeatedly chops the watcher with their crusher, turning it into bloody mush!", "mark detonates the watcher in close proximity, showering viscera everywhere!", "flips their Crusher around, ramming the handle up the Watcher's eye, impaling it, before smashing it against the ground brutally!"), \ + health_given = 7.5, \ + threshold = (maxHealth/10 * 1.5), \ + crusher_drop_mod = 2) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm index 63ad4d8cf0..8372abd7a2 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm @@ -42,10 +42,16 @@ /datum/action/innate/elite_attack/bloody_trap, /datum/action/innate/elite_attack/meat_shield, /datum/action/innate/elite_attack/knockdown) - glorymessageshand = list("tries punching Candy's head, but they parry it and grab their hand! However, another hard punch comes through with the other arm, this time killing the demon swiftly and exploding their skull!", "grabs Candy by their neck, then pressures into until it explodes and it's head comes flying off!") - glorymessagescrusher = list("slashes Candy in half vertically with their crusher, each of the parts falling off onto the ground limply!") - glorymessagespka = list("shoots at Candy's head, breaking their skull open and revealing their brain! Then, they bash the brain into mush with their PKA's stock!", "kicks Candy into the ground, and repeatedly slams their PKA against their skull until they finally die!") - glorymessagespkabayonet = list("stabs through Candy's maw and lifts them into the air, shooting their PKA and exploding their head as the limp body falls off!") + +/mob/living/simple_animal/hostile/asteroid/elite/candy/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("tries punching Candy's head, but they parry it and grab their hand! However, another hard punch comes through with the other arm, this time killing the demon swiftly and exploding their skull!", "grabs Candy by their neck, then pressures into until it explodes and it's head comes flying off!"), \ + messages_crusher = list("slashes Candy in half vertically with their crusher, each of the parts falling off onto the ground limply!"), \ + messages_pka = list("shoots at Candy's head, breaking their skull open and revealing their brain! Then, they bash the brain into mush with their PKA's stock!", "kicks Candy into the ground, and repeatedly slams their PKA against their skull until they finally die!"), \ + messages_pka_bayonet = list("stabs through Candy's maw and lifts them into the air, shooting their PKA and exploding their head as the limp body falls off!"), \ + health_given = 50, \ + threshold = (maxHealth/10 * 0.625)) /datum/action/innate/elite_attack/bloodcharge name = "Blood Charge" diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm index a59927c59e..d479633027 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm @@ -42,10 +42,16 @@ /datum/action/innate/elite_attack/lavaaround, /datum/action/innate/elite_attack/firespew, /datum/action/innate/elite_attack/firemoat) - glorymessageshand = list("rips off the little dragon's horns, then shoves them into their mouth!", "grabs the drakeling's head and rips it off violently from their neck with their bare hands!") - glorymessagescrusher = list("slashes the drakeling's head in half with their crusher, dividing it in two!") - glorymessagespka = list("hits the drakeling's maw repeatedly with the stock of their PKA until it breaks off, then shoots it in the head for good measure!", "grabs the drakeling's neck, and shoots it's head off with their PKA!") - glorymessagespkabayonet = list("kicks the drakeling onto the ground belly up, then slices their tummy open with the bayonet as it screams in agony!") + +/mob/living/simple_animal/hostile/asteroid/elite/drakeling/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("rips off the little dragon's horns, then shoves them into their mouth!", "grabs the drakeling's head and rips it off violently from their neck with their bare hands!"), \ + messages_crusher = list("slashes the drakeling's head in half with their crusher, dividing it in two!"), \ + messages_pka = list("hits the drakeling's maw repeatedly with the stock of their PKA until it breaks off, then shoots it in the head for good measure!", "grabs the drakeling's neck, and shoots it's head off with their PKA!"), \ + messages_pka_bayonet = list("kicks the drakeling onto the ground belly up, then slices their tummy open with the bayonet as it screams in agony!"), \ + health_given = 50, \ + threshold = (maxHealth/10 * 0.625)) /datum/action/innate/elite_attack/lavamoat name = "Lava Moat" diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index f47f7d8a9d..bf1f4c8a27 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -13,14 +13,12 @@ /mob/living/simple_animal/hostile/asteroid/elite can_talk = TRUE speak_emote = list("growls") - gloryhealth = 50 - glorymodifier = 0.625 /mob/living/simple_animal/hostile/asteroid/elite/death(gibbed) gibbed = FALSE ..(gibbed) -obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) var/mob/living/simple_animal/hostile/asteroid/elite/E = target @@ -32,8 +30,8 @@ obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) to_chat(E, "You have been revived by [user]. You owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk. (maxHealth/10 * glorymodifier) && glorykill && stat != DEAD) - glorykill = FALSE - unglory() - -/mob/living/simple_animal/hostile/asteroid/proc/glory() - desc += "
[src] is staggered and can be glory killed!" - animate(src, color = "#00FFFF", time = 5) - -/mob/living/simple_animal/hostile/asteroid/proc/unglory() - desc = initial(desc) - animate(src, color = initial(color), time = 5) - -/mob/living/simple_animal/hostile/asteroid/death(gibbed) - animate(src, color = initial(color), time = 3) - desc = initial(desc) - SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type) - var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) - if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item - spawn_crusher_loot() - ..(gibbed) - -/mob/living/simple_animal/hostile/asteroid/AltClick(mob/living/carbon/slayer) - if(!slayer.canUseTopic(src, TRUE)) - return - if(glorykill) - if(do_mob(slayer, src, 10) && (stat != DEAD)) - var/message - if(!slayer.get_active_held_item() || (!istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher) && !istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator)) && glorymessageshand.len) - message = pick(glorymessageshand) - else if(istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher) && glorymessagescrusher.len) - message = pick(glorymessagescrusher) - else if(istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator) && glorymessagespka.len) - message = pick(glorymessagespka) - var/obj/item/gun/energy/kinetic_accelerator/KA = get_active_held_item() - if(KA && KA.bayonet) - message = pick(glorymessagespka | glorymessagespkabayonet) - if(message) - visible_message(span_danger("[slayer] [message]")) - else - visible_message(span_danger("[slayer] does something generally considered brutal to [src]... Whatever that may be!")) - slayer.heal_overall_damage(gloryhealth,gloryhealth) - playsound(src.loc, death_sound, 150, TRUE, -1) - crusher_drop_mod *= 2 - adjustHealth(maxHealth, TRUE, TRUE) - if(mob_biotypes & MOB_ORGANIC) - new /obj/effect/gibspawner/generic(src.loc) - else if(mob_biotypes & MOB_ROBOTIC) - new /obj/effect/gibspawner/robot(src.loc) - else - to_chat(slayer, span_danger("You fail to glory kill [src]!")) diff --git a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm index 88c7396cf7..f5cc09e23a 100644 --- a/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm +++ b/modular_sand/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm @@ -36,10 +36,17 @@ robust_searching = FALSE footstep_type = FOOTSTEP_MOB_SHOE minimum_distance = 1 - glorymessageshand = list("grabs the miner's eyes and rips them out, shoving the bloody miner aside!", "grabs and crushes the miner's skull apart with their bare hands!", "rips the miner's head clean off with their bare hands!") - glorymessagespka = list("sticks their PKA into the miner's mouth and shoots it, showering everything in gore!", "bashes the miner's head into their chest with their PKA!", "shoots off both legs of the miner with their PKA!") - glorymessagespkabayonet = list("slices the imp's head off by the neck with the PKA's bayonet!", "repeatedly stabs the miner in their gut with the PKA's bayonet!") - glorymessagescrusher = list("chops the miner horizontally in half with their crusher in one swift move!", "chops off the miner's legs with their crusher and kicks their face hard, exploding it while they're in the air!", "slashes each of the miner's arms off by the shoulder with their crusher!") + +/mob/living/simple_animal/hostile/asteroid/miner/ComponentInitialize() + . = ..() + AddComponent(/datum/component/glory_kill, \ + messages_unarmed = list("grabs the miner's eyes and rips them out, shoving the bloody miner aside!", "grabs and crushes the miner's skull apart with their bare hands!", "rips the miner's head clean off with their bare hands!"), \ + messages_pka = list("sticks their PKA into the miner's mouth and shoots it, showering everything in gore!", "bashes the miner's head into their chest with their PKA!", "shoots off both legs of the miner with their PKA!"), \ + messages_pka_bayonet = list("slices the imp's head off by the neck with the PKA's bayonet!", "repeatedly stabs the miner in their gut with the PKA's bayonet!"), \ + messages_crusher = list("chops the miner horizontally in half with their crusher in one swift move!", "chops off the miner's legs with their crusher and kicks their face hard, exploding it while they're in the air!", "slashes each of the miner's arms off by the shoulder with their crusher!"), \ + health_given = 7.5, \ + threshold = (maxHealth/10 * 1.5), \ + crusher_drop_mod = 2) /mob/living/simple_animal/hostile/asteroid/miner/death(gibbed) . = ..() diff --git a/modular_sand/icons/mob/inhands/weapons/hammerspc_lefthand.dmi b/modular_sand/icons/mob/inhands/weapons/hammerspc_lefthand.dmi index beff0eaaf1..9525a1cf87 100644 Binary files a/modular_sand/icons/mob/inhands/weapons/hammerspc_lefthand.dmi and b/modular_sand/icons/mob/inhands/weapons/hammerspc_lefthand.dmi differ diff --git a/modular_sand/icons/mob/inhands/weapons/hammerspc_righthand.dmi b/modular_sand/icons/mob/inhands/weapons/hammerspc_righthand.dmi index daba9fd8ef..6b933382c7 100644 Binary files a/modular_sand/icons/mob/inhands/weapons/hammerspc_righthand.dmi and b/modular_sand/icons/mob/inhands/weapons/hammerspc_righthand.dmi differ diff --git a/modular_sand/icons/obj/mining.dmi b/modular_sand/icons/obj/mining.dmi index 9156285da0..2c7f775e4e 100644 Binary files a/modular_sand/icons/obj/mining.dmi and b/modular_sand/icons/obj/mining.dmi differ diff --git a/modular_sand/icons/obj/plushes.dmi b/modular_sand/icons/obj/plushes.dmi index 71bd3885c4..6cd4dcc5f6 100644 Binary files a/modular_sand/icons/obj/plushes.dmi and b/modular_sand/icons/obj/plushes.dmi differ diff --git a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm index 4b8655c76c..78aa7ba0ce 100644 --- a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm +++ b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm @@ -13,3 +13,6 @@ /datum/config_entry/flag/protolock_all_access /datum/config_entry/flag/character_color_limits + +/datum/config_entry/number/max_jukebox_songs + config_entry_value = -1 diff --git a/modular_splurt/code/modules/arousal/organs/belly.dm b/modular_splurt/code/modules/arousal/organs/belly.dm index 8f17da4a32..86b7be1956 100644 --- a/modular_splurt/code/modules/arousal/organs/belly.dm +++ b/modular_splurt/code/modules/arousal/organs/belly.dm @@ -25,7 +25,7 @@ if(!owner) return -/obj/item/organ/genital/belly/modify_size(modifier, min = -INFINITY, max = INFINITY) +/obj/item/organ/genital/belly/modify_size(modifier, min = -INFINITY, max = BELLY_SIZE_MAX) var/new_value = clamp(size_cached + modifier, max(min, min_size ? min_size : -INFINITY), min(max_size ? max_size : INFINITY, max)) if(new_value == size_cached) return diff --git a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm index 147d48e95a..b142451e47 100644 --- a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm @@ -109,7 +109,7 @@ icon_state = "runner_engi" /obj/item/clothing/suit/jacket/runner/syndicate - name = "Sydnicate Runner Jacket" + name = "Syndicate Runner Jacket" icon_state = "runner_syndi" /obj/item/clothing/suit/jacket/runner/winter diff --git a/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm b/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm index c7564a1019..705b13a92f 100644 --- a/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm +++ b/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm @@ -211,7 +211,8 @@ "Junior Scientist", "Rack Researcher", "Nanite Programmer", - "Tetromino Researcher" + "Tetromino Researcher", + "Xenoarchaeologist" ) LAZYADD(alt_titles, extra_titles) . = ..() diff --git a/modular_splurt/code/modules/language/signlanguage.dm b/modular_splurt/code/modules/language/signlanguage.dm new file mode 100644 index 0000000000..175f3d6836 --- /dev/null +++ b/modular_splurt/code/modules/language/signlanguage.dm @@ -0,0 +1,3 @@ +// Simply changes the icon to a proper one instead of it using the EAL's (which confuses people). +/datum/language/signlanguage + icon = 'modular_splurt/icons/misc/language.dmi' diff --git a/modular_splurt/code/modules/mob/living/emotes.dm b/modular_splurt/code/modules/mob/living/emotes.dm index db05d16b5f..714020731b 100644 --- a/modular_splurt/code/modules/mob/living/emotes.dm +++ b/modular_splurt/code/modules/mob/living/emotes.dm @@ -231,7 +231,7 @@ message = "speeeeens!" message_mime = "speeeeens silently!" restraint_check = TRUE - mob_type_allowed_typecache = list(/mob/living, /mob/dead/observer) + mob_type_allowed_typecache = list(/mob/living) mob_type_ignore_stat_typecache = list(/mob/dead/observer) emote_sound = 'modular_splurt/sound/voice/speen.ogg' // No cooldown var required diff --git a/modular_splurt/code/modules/mob/living/simple_animal/hostile/megafauna/penguinhiero.dm b/modular_splurt/code/modules/mob/living/simple_animal/hostile/megafauna/penguinhiero.dm new file mode 100644 index 0000000000..4b7654f7a3 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/simple_animal/hostile/megafauna/penguinhiero.dm @@ -0,0 +1,4 @@ +/mob/living/simple_animal/hostile/megafauna/hierophant + name = "Hierophant" + icon = 'modular_splurt/icons/mob/lavaland/hierophant.dmi' + desc = "A penguin-like entity, he's holding what appears to be a scepter of some sort..." diff --git a/modular_splurt/icons/misc/language.dmi b/modular_splurt/icons/misc/language.dmi new file mode 100644 index 0000000000..baa1375ac3 Binary files /dev/null and b/modular_splurt/icons/misc/language.dmi differ diff --git a/modular_splurt/icons/mob/lavaland/hierophant.dmi b/modular_splurt/icons/mob/lavaland/hierophant.dmi new file mode 100644 index 0000000000..2b73122d72 Binary files /dev/null and b/modular_splurt/icons/mob/lavaland/hierophant.dmi differ diff --git a/strings/randomizing_station_name_messages.txt b/strings/randomizing_station_name_messages.txt new file mode 100644 index 0000000000..9b12dba310 --- /dev/null +++ b/strings/randomizing_station_name_messages.txt @@ -0,0 +1,15 @@ +Due to internal affairs, the station is now named %NEW_STATION_NAME%. +The solar system's government has formally requested that the station now be named %NEW_STATION_NAME%. +A gorilla broke into the office and destroyed a bunch of paperwork. We don't know what your station's old name was. It's now %NEW_STATION_NAME%. +An intern said %NEW_STATION_NAME% would be a cool name. That's your station's name now. +Our predictive language model has renamed your station to %NEW_STATION_NAME%. +It's %NEW_STATION_NAME% now. +The CEO demanded that your station be named %NEW_STATION_NAME%. +Our intern accidentally wiped the database, so your station needs a new name: %NEW_STATION_NAME%. +Due to copyright infringement, the station is now temporarily renamed to %NEW_STATION_NAME%. +Due to recent corporate acquisitions, the station has been rebranded to %NEW_STATION_NAME%. +%NEW_STATION_NAME%. +%NEW_STATION_NAME%? %NEW_STATION_NAME%! %NEW_STATION_NAME%!!!!!!!! +A popular social network application had already claimed the trademark of %CURRENT_STATION_NAME%, the station has been renamed to %NEW_STATION_NAME%. +We're pulling a prank on %RANDOM_CREWMEMBER%, so we've changed the station's name to %NEW_STATION_NAME%. +%RANDOM_NAME% made us change the station name, which is now %NEW_STATION_NAME%. diff --git a/tgstation.dme b/tgstation.dme index 707330b354..41ad680975 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3998,6 +3998,7 @@ #include "modular_sand\code\datums\action.dm" #include "modular_sand\code\datums\ai_laws.dm" #include "modular_sand\code\datums\shuttles.dm" +#include "modular_sand\code\datums\components\glory_kill.dm" #include "modular_sand\code\datums\components\interaction_menu_granter.dm" #include "modular_sand\code\datums\components\mood.dm" #include "modular_sand\code\datums\components\riding.dm" @@ -4238,14 +4239,15 @@ #include "modular_sand\code\modules\mob\living\simple_animal\hostile\megafauna\rogueprocess.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\megafauna\sif.dm" +#include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\imp.dm" -#include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\miningmobs.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\shamblingminer.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\candy.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\drakeling.dm" +#include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\fanaticminer.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm" #include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" @@ -4385,8 +4387,8 @@ #include "modular_splurt\code\datums\components\crafting\recipes\recipes_robot.dm" #include "modular_splurt\code\datums\components\storage\concrete\pockets.dm" #include "modular_splurt\code\datums\elements\crawl_under.dm" -#include "modular_splurt\code\datums\elements\mob_holder.dm" #include "modular_splurt\code\datums\elements\flavor_text.dm" +#include "modular_splurt\code\datums\elements\mob_holder.dm" #include "modular_splurt\code\datums\elements\smalltalk.dm" #include "modular_splurt\code\datums\elements\spooky.dm" #include "modular_splurt\code\datums\elements\wuv.dm" @@ -4750,6 +4752,7 @@ #include "modular_splurt\code\modules\keybindings\keybind\communication.dm" #include "modular_splurt\code\modules\keybindings\keybind\human.dm" #include "modular_splurt\code\modules\keybindings\keybind\movement.dm" +#include "modular_splurt\code\modules\language\signlanguage.dm" #include "modular_splurt\code\modules\language\xenocommon.dm" #include "modular_splurt\code\modules\mapping\lavaland_jungle_gen.dm" #include "modular_splurt\code\modules\mapping\mapping_helpers\baseturf.dm" @@ -4759,8 +4762,8 @@ #include "modular_splurt\code\modules\mining\equipment\machine_vending.dm" #include "modular_splurt\code\modules\mining\lavaland\necropolis_chests.dm" #include "modular_splurt\code\modules\mob\emote.dm" -#include "modular_splurt\code\modules\mob\inventory.dm" #include "modular_splurt\code\modules\mob\femclaw.dm" +#include "modular_splurt\code\modules\mob\inventory.dm" #include "modular_splurt\code\modules\mob\mob.dm" #include "modular_splurt\code\modules\mob\mob_defines.dm" #include "modular_splurt\code\modules\mob\mob_helpers.dm" @@ -4837,6 +4840,7 @@ #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\deathclaw\funclaw.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\king_of_goats.dm" +#include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\penguinhiero.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm" #include "modular_splurt\code\modules\paperwork\pen.dm" #include "modular_splurt\code\modules\photography\photos\album.dm" diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js index fb1acf51d0..0ade3eb716 100644 --- a/tgui/packages/tgui/interfaces/Orbit.js +++ b/tgui/packages/tgui/interfaces/Orbit.js @@ -1,3 +1,4 @@ +import { classes } from 'common/react'; import { createSearch } from 'common/string'; import { multiline } from 'common/string'; import { resolveAsset } from '../assets'; @@ -62,6 +63,18 @@ const OrbitedButton = (props, context) => { onClick={() => act("orbit", { ref: thing.ref, })}> + {thing.assignment && ( + + + + )} {thing.name} {thing.orbiters && (