diff --git a/_maps/map_files/generic/City_of_Cogs.dmm b/_maps/map_files/generic/City_of_Cogs.dmm index 9ef765aa28..aba6569fd9 100644 --- a/_maps/map_files/generic/City_of_Cogs.dmm +++ b/_maps/map_files/generic/City_of_Cogs.dmm @@ -80,10 +80,6 @@ }, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) -"az" = ( -/obj/structure/destructible/clockwork/eminence_spire, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) "aA" = ( /obj/machinery/door/airlock/clockwork/brass{ name = "Infirmary" @@ -168,21 +164,6 @@ /obj/effect/clockwork/sigil/transmission, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) -"ew" = ( -/obj/structure/table/reinforced/brass, -/obj/item/clockwork/construct_chassis/cogscarab{ - pixel_y = 20 - }, -/obj/item/clockwork/construct_chassis/cogscarab{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/clockwork/construct_chassis/cogscarab{ - pixel_x = 7; - pixel_y = 6 - }, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) "hY" = ( /obj/item/clockwork/alloy_shards/pinion_lock, /turf/open/floor/clockwork/reebe, @@ -208,10 +189,6 @@ /obj/item/storage/belt/utility/servant, /turf/open/floor/clockwork/reebe, /area/reebe/city_of_cogs) -"vx" = ( -/obj/effect/clockwork/sigil/transmission, -/turf/open/floor/clockwork/reebe, -/area/reebe/city_of_cogs) "wV" = ( /obj/item/clockwork/alloy_shards/large, /turf/open/indestructible/reebe_void/spawning/lattices, @@ -244,6 +221,10 @@ /obj/item/clockwork/alloy_shards/small, /turf/open/indestructible/reebe_void/spawning/lattices, /area/reebe) +"Ox" = ( +/obj/structure/destructible/clockwork/eminence_spire, +/turf/open/floor/clockwork/reebe, +/area/reebe/city_of_cogs) "OB" = ( /obj/item/clockwork/component/geis_capacitor/fallen_armor, /turf/open/floor/clockwork/reebe, @@ -32770,7 +32751,7 @@ ae ae ag ah -ew +aL aj aj aj @@ -33284,8 +33265,8 @@ ab ab ae ai -az -vx +Ox +aj aj aj aE diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index faffea0e6e..ea48671d82 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -59,6 +59,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( //Human sub-species #define isabductor(A) (is_species(A, /datum/species/abductor)) #define isgolem(A) (is_species(A, /datum/species/golem)) +#define isclockworkgolem(A) (is_species(A, /datum/species/golem/clockwork/no_scrap)) #define islizard(A) (is_species(A, /datum/species/lizard)) #define isplasmaman(A) (is_species(A, /datum/species/plasmaman)) #define ispodperson(A) (is_species(A, /datum/species/pod)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index ac86912c84..f0a8a4e2c6 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -284,6 +284,17 @@ GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles", "caws", "gekkers", "clucks")) GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc, "xeno tongue" = /obj/item/organ/tongue/alien)) +/proc/get_roundstart_languages() + var/list/languages = subtypesof(/datum/language) + var/list/roundstart_languages = list("None") //default option for the list + for(var/some_language in languages) + var/datum/language/language = some_language + if(initial(language.chooseable_roundstart)) + roundstart_languages[initial(language.name)] = some_language + return roundstart_languages + +GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages()) + //SPECIES BODYPART LISTS //locked parts are those that your picked species requires to have //unlocked parts are those that anyone can choose on customisation regardless diff --git a/code/_onclick/hud/clockwork_marauder.dm b/code/_onclick/hud/clockwork_marauder.dm index 09f85db574..b1b24cc58b 100644 --- a/code/_onclick/hud/clockwork_marauder.dm +++ b/code/_onclick/hud/clockwork_marauder.dm @@ -3,7 +3,7 @@ var/obj/screen/blockchance var/obj/screen/counterchance -/datum/hud/marauder/New(mob/living/simple_animal/hostile/clockwork/marauder/guardian/owner) +/datum/hud/marauder/New(mob/living/simple_animal/hostile/clockwork/guardian/owner) ..() var/obj/screen/using @@ -24,7 +24,7 @@ hosthealth = null return ..() -/mob/living/simple_animal/hostile/clockwork/marauder/guardian/create_mob_hud() +/mob/living/simple_animal/hostile/clockwork/guardian/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud/marauder(src, ui_style2icon(client.prefs.UI_style)) @@ -37,8 +37,8 @@ desc = "Emerge or Return." /obj/screen/marauder/emerge/Click() - if(istype(usr, /mob/living/simple_animal/hostile/clockwork/marauder/guardian)) - var/mob/living/simple_animal/hostile/clockwork/marauder/guardian/G = usr + if(istype(usr, /mob/living/simple_animal/hostile/clockwork/guardian)) + var/mob/living/simple_animal/hostile/clockwork/guardian/G = usr if(G.is_in_host()) G.try_emerge() else diff --git a/code/datums/skills/modifiers/job.dm b/code/datums/skills/modifiers/job.dm index e989ab11e3..e751fbf120 100644 --- a/code/datums/skills/modifiers/job.dm +++ b/code/datums/skills/modifiers/job.dm @@ -34,3 +34,6 @@ /datum/skill_modifier/job/level/wiring/basic level_mod = JOB_SKILL_BASIC + +/datum/skill_modifier/job/level/dwarfy/blacksmithing + target_skills = /datum/skill/level/dwarfy/blacksmithing diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 659149a123..23fd75f982 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -219,19 +219,3 @@ /datum/quirk/night_vision/on_spawn() var/mob/living/carbon/human/H = quirk_holder H.update_sight() - -/datum/quirk/multilingual - name = "Multi-Lingual" - desc = "You spent a portion of your life learning to understand an additional language. You may or may not be able to speak it based on your anatomy." - value = 1 - mob_trait = TRAIT_MULTILINGUAL - gain_text = "You've learned an extra language!" - lose_text = "You've forgotten your extra language." - -/datum/quirk/multilingual/post_add() - var/mob/living/carbon/human/H = quirk_holder - H.grant_language(H.client.prefs.language, TRUE, TRUE, LANGUAGE_MULTILINGUAL) - -/datum/quirk/multilingual/remove() - var/mob/living/carbon/human/H = quirk_holder - H.remove_language(H.client.prefs.language, TRUE, TRUE, LANGUAGE_MULTILINGUAL) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 480e1966e9..2035b67b5e 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -469,7 +469,7 @@ //hijacking the minature first aids for hypospray boxes. <3 /obj/item/storage/hypospraykit name = "hypospray kit" - desc = "It's a kit containing a hypospray and specific treatment chemical-filled vials." + desc = "It's a kit designed for containing a hypospray and specific treatment chemical-filled vials." icon_state = "firstaid-mini" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index b868fb54c0..34370faa0a 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -144,7 +144,7 @@ to_chat(L, "\"You belong to me now.\"") if(!GLOB.application_scripture_unlocked) GLOB.application_scripture_unlocked = TRUE - hierophant_message("With the conversion of a new servant the Ark's power grows. Application scriptures are now available.") + hierophant_message("With the conversion of a new servant the Hierophant Network's power grows. Application scriptures are now available.") if(add_servant_of_ratvar(L)) L.log_message("conversion was done with a [sigil_name]", LOG_ATTACK, color="BE8700") if(iscarbon(L)) diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 58ee73ef5b..2b2720dea3 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -196,4 +196,68 @@ CL.visible_message("[CL] materialises out of thin air!") new /obj/effect/temp_visual/ratvar/sigil/transmission(T,2) +//summons a soul vessel, which is the clockwork cult version of a soul shard. It acts like a posibrain and, as long as the target has a brain, a soul shard. +/datum/clockwork_rite/soul_vessel + name = "Rite of the Vessel" //The name of the rite + desc = "This rite is used to summon a soul vessel, a special posibrain that makes whoever has their brain put into it loyal to the Justiciar.,\ + When put into a cyborg shell, the created cyborg will automatically be a servant of Ratvar." + required_ingredients = list(/obj/item/stack/cable_coil, /obj/item/stock_parts/cell/, /obj/item/organ/cyberimp) + power_cost = 2500 //These things are pretty strong, I won't lie + requires_full_power = TRUE + cast_time = 50 + limit = INFINITE + rite_cast_sound = 'sound/magic/summon_guns.ogg' + +/datum/clockwork_rite/soul_vessel/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) + . = ..() + if(!.) + return FALSE + var/obj/item/mmi/posibrain/soul_vessel/SV = new /obj/item/mmi/posibrain/soul_vessel(T) + SV.visible_message("[SV] materalizes out of thin air!") + new /obj/effect/temp_visual/ratvar/sigil/transmission(T,2) + + +/datum/clockwork_rite/cyborg_transform + name = "Rite of the Divine Form" + desc = "This rite is used to ascend into a cyborg, gaining unique scripture and a loadout that depends on which module is chosen. Consult the wiki for details on each cyborg module's loadout. Mutually exclusive to Enhanced Form." + required_ingredients = list(/obj/item/mmi/posibrain, /obj/item/stack/cable_coil, /obj/item/stock_parts/cell/super, /obj/item/bodypart/l_arm/robot, /obj/item/bodypart/r_arm/robot, /obj/item/bodypart/chest/robot, /obj/item/bodypart/head/robot, /obj/item/bodypart/r_leg/robot, /obj/item/bodypart/l_leg/robot) + power_cost = 20000 + requires_human = TRUE + requires_full_power = FALSE + cast_time = 100 + limit = INFINITE + rite_cast_sound = 'sound/magic/disable_tech.ogg' + +/datum/clockwork_rite/cyborg_transform/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) + . = ..() + if(!.) + return FALSE + if(isclockworkgolem(target)) + return FALSE + target.visible_message("The robotic parts magnetize to [target], the new frame's eyes glowing in a brilliant yellow!") + var/mob/living/silicon/robot/R = target.Robotize() + R.cell = new /obj/item/stock_parts/cell/super(R)//takes one to use the rite to begin with + new /obj/effect/temp_visual/ratvar/sigil/transmission(T,2) + +/datum/clockwork_rite/golem_transform + name = "Rite of the Enhanced Form" + desc = "This rite is used to shed one's flesh to become a clockwork automaton, becoming immune to many environmental hazards as well as being more resilient to incoming damage. Mutually exclusive to Divine Form." + required_ingredients = list(/obj/item/mmi/posibrain, /obj/item/stock_parts/cell/super, /obj/item/bodypart/l_arm/robot, /obj/item/bodypart/r_arm/robot, /obj/item/bodypart/chest/robot, /obj/item/bodypart/head/robot, /obj/item/bodypart/r_leg/robot, /obj/item/bodypart/l_leg/robot) + power_cost = 20000 + requires_human = TRUE + requires_full_power = FALSE + cast_time = 100 + limit = INFINITE + rite_cast_sound = 'sound/magic/disable_tech.ogg' + + +/datum/clockwork_rite/golem_transform/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) + . = ..() + if(!.) + return FALSE + target.visible_message("The robotic parts magnetize to [target], the humanoid shape's eye glowing with an inner flame!") + to_chat(target, "The rite's power warps your body into a clockwork form! You are now immune to many hazards, and your body is more robust against damage!") + target.set_species(/datum/species/golem/clockwork/no_scrap) + new /obj/effect/temp_visual/ratvar/sigil/transmission(T,2) + #undef INFINITE diff --git a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm index b0259c460e..99d1142990 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm @@ -350,3 +350,22 @@ // Winter coat /obj/item/clothing/suit/hooded/wintercoat/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //four sheets of metal return list("operation_time" = 30, "new_obj_type" = /obj/item/clothing/suit/hooded/wintercoat/ratvar, "power_cost" = POWER_METAL * 4, "spawn_dir" = SOUTH) + +//tools +/obj/item/crowbar/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //1 metal rod each + return list("operation_time" = 2, "new_obj_type" = /obj/item/crowbar/brass, "power_cost" = POWER_ROD * 1, "spawn_dir" = SOUTH) + +/obj/item/screwdriver/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 2, "new_obj_type" = /obj/item/screwdriver/brass, "power_cost" = POWER_ROD * 1, "spawn_dir" = SOUTH) + +/obj/item/weldingtool/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 2, "new_obj_type" = /obj/item/weldingtool/experimental/brass, "power_cost" = POWER_ROD * 1, "spawn_dir" = SOUTH) + +/obj/item/wirecutters/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 2, "new_obj_type" = /obj/item/wirecutters/brass, "power_cost" = POWER_ROD * 1, "spawn_dir" = SOUTH) + +/obj/item/wrench/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 2, "new_obj_type" = /obj/item/wrench/brass, "power_cost" = POWER_ROD * 1, "spawn_dir" = SOUTH) + +/obj/item/multitool/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) + return list("operation_time" = 2, "new_obj_type" = /obj/item/multitool/advanced/brass, "power_cost" = POWER_ROD * 1, "spawn_dir" = SOUTH) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm index 2131aa7160..ff19e8891b 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm @@ -5,7 +5,7 @@ name = "clock-themed arm-mounted implant" var/clockwork_desc = "According to Ratvar, this really shouldn't exist. Tell Him about this immediately." syndicate_implant = TRUE - icon_state = "clock_arm_implant" + icon_state = "toolkit_implant" /obj/item/organ/cyberimp/arm/clockwork/ui_action_click() if(is_servant_of_ratvar(owner) || (obj_flags & EMAGGED)) //If you somehow manage to steal a clockie's implant AND have an emag AND manage to get it implanted for yourself, good on ya! diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index dfda2bf152..d9938316b6 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -251,7 +251,9 @@ var/mob/camera/eminence/E = owner E.eminence_help() + /* + //Returns to the Ark - Commented out and replaced with obelisk_jump /datum/action/innate/eminence/ark_jump name = "Return to Ark" @@ -265,7 +267,7 @@ owner.playsound_local(owner, 'sound/magic/magic_missile.ogg', 50, TRUE) flash_color(owner, flash_color = "#AF0AAF", flash_time = 25) else - to_chat(owner, "There is no Ark!") + to_chat(owner, "There is no Ark!") */ //Warps to a chosen Obelisk diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm new file mode 100644 index 0000000000..5060f516c7 --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_guardian.dm @@ -0,0 +1,432 @@ +//Clockwork guardian: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture. +/mob/living/simple_animal/hostile/clockwork/guardian + name = "clockwork guardian" + desc = "A slow, armored clockwork machine, blazing with magenta flames. It's armed with a gladius and shield, and stands ready by its master." + icon_state = "clockwork_guardian" + health = 300 + maxHealth = 300 + speed = 1 + obj_damage = 40 + melee_damage_lower = 20//ranged attacks are the way to go for fighting these + melee_damage_upper = 20 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/bladeslice.ogg' + weather_immunities = list("lava") + movement_type = FLYING + AIStatus = AI_OFF //this has to be manually set so that the guardian doesn't start bashing the host, how annoying -_- + loot = list(/obj/structure/destructible/clockwork/taunting_trail) + var/true_name = "Meme Master 69" //Required to call forth the guardian + var/global/list/possible_true_names = list("Servant", "Warden", "Serf", "Page", "Usher", "Knave", "Vassal", "Escort") + var/mob/living/host //The mob that the guardian is living inside of + var/recovering = FALSE //If the guardian is recovering from recalling + var/blockchance = 17 //chance to block attacks entirely + var/counterchance = 30 //chance to counterattack after blocking + var/static/list/damage_heal_order = list(OXY, BURN, BRUTE, TOX) //we heal our host's damage in this order + light_color = "#AF0AAF" + light_range = 2 + light_power = 1.1 + playstyle_string = "You are a clockwork guardian, a living extension of Sevtug's will. As a guardian, you are somewhat slow, but may block attacks, \ + and have a chance to also counter blocked melee attacks for extra damage, in addition to being immune to extreme temperatures and pressures. \ + Your primary goal is to serve the creature that you are now a part of, as well as The Clockwork Justiciar, Ratvar. You can use The Hierophant Network to communicate silently with your master and their allies, \ + but can only exit if your master calls your true name or if they are exceptionally damaged. \ + \n\n\ + Stay near your host to protect and heal them; being too far from your host will rapidly cause you massive damage. Recall to your host if you are too weak and believe you cannot continue \ + fighting safely. As a final note, you should probably avoid harming any fellow servants of Ratvar." + +/mob/living/simple_animal/hostile/clockwork/guardian/Initialize() + . = ..() + true_name = pick(possible_true_names) + +/mob/living/simple_animal/hostile/clockwork/guardian/BiologicalLife(seconds, times_fired) + ..() + if(is_in_host()) + if(!is_servant_of_ratvar(host)) + emerge_from_host(FALSE, TRUE) + unbind_from_host() + return + if(!GLOB.ratvar_awakens && host.stat == DEAD) + death() + return + if(GLOB.ratvar_awakens) + adjustHealth(-50) + else + adjustHealth(-10) + if(!recovering) + heal_host() //also heal our host if inside of them and we aren't recovering + else if(health == maxHealth) + to_chat(src, "Your strength has returned. You can once again come forward!") + to_chat(host, "Your guardian is now strong enough to come forward again!") + recovering = FALSE + else + if(GLOB.ratvar_awakens) //If Ratvar is alive, guardians don't need a host and are downright impossible to kill + adjustHealth(-5) + heal_host() + else if(host) + if(!is_servant_of_ratvar(host)) + unbind_from_host() + return + if(host.stat == DEAD) + adjustHealth(50) + to_chat(src, "Your host is dead!") + return + if(z && host.z && z == host.z) + switch(get_dist(get_turf(src), get_turf(host))) + if(2) + adjustHealth(-1) + if(3) + //EQUILIBRIUM + if(4) + adjustHealth(1) + if(5) + adjustHealth(3) + if(6) + adjustHealth(6) + if(7) + adjustHealth(9) + if(8 to INFINITY) + adjustHealth(15) + to_chat(src, "You're too far from your host and rapidly taking damage!") + else //right next to or on top of host + adjustHealth(-2) + heal_host() //gradually heal host if nearby and host is very weak + else //well then, you're not even in the same zlevel + adjustHealth(15) + to_chat(src, "You're too far from your host and rapidly taking damage!") + +/mob/living/simple_animal/hostile/clockwork/guardian/death(gibbed) + emerge_from_host(FALSE, TRUE) + unbind_from_host() + visible_message("[src]'s equipment fades into a purple mist as the flames within sputter and dissipate.", \ + "Your equipment fades away. You feel a moment of confusion before your fragile form is annihilated.") + . = ..() + +/mob/living/simple_animal/hostile/clockwork/guardian/Stat() + ..() + if(statpanel("Status")) + stat(null, "Current True Name: [true_name]") + stat(null, "Host: [host ? host : "NONE"]") + if(host) + var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5) + if(iscarbon(host)) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100) + stat(null, "Host Health: [resulthealth]%") + if(GLOB.ratvar_awakens) + stat(null, "You are [recovering ? "un" : ""]able to deploy!") + else + if(resulthealth > GUARDIAN_EMERGE_THRESHOLD) + stat(null, "You are [recovering ? "unable to deploy" : "able to deploy on hearing your True Name"]!") + else + stat(null, "You are [recovering ? "unable to deploy" : "able to deploy to protect your host"]!") + stat(null, "You do [melee_damage_upper] damage on melee attacks.") + +/mob/living/simple_animal/hostile/clockwork/guardian/Process_Spacemove(movement_dir = 0) + return 1 + +/mob/living/simple_animal/hostile/clockwork/guardian/proc/bind_to_host(mob/living/new_host) + if(!new_host) + return FALSE + host = new_host + var/datum/action/innate/summon_guardian/SG = new() + SG.linked_guardian = src + SG.Grant(host) + var/datum/action/innate/linked_minds/LM = new() + LM.linked_guardian = src + LM.Grant(host) + return TRUE + +/mob/living/simple_animal/hostile/clockwork/guardian/proc/unbind_from_host() + if(host) + for(var/datum/action/innate/summon_guardian/SG in host.actions) + qdel(SG) + for(var/datum/action/innate/linked_minds/LM in host.actions) + qdel(LM) + host = null + return TRUE + return FALSE + +//DAMAGE and FATIGUE +/mob/living/simple_animal/hostile/clockwork/guardian/proc/heal_host() + if(!host) + return + var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5) + if(iscarbon(host)) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100) + if(GLOB.ratvar_awakens || resulthealth <= GUARDIAN_EMERGE_THRESHOLD) + new /obj/effect/temp_visual/heal(host.loc, "#AF0AAF") + host.heal_ordered_damage(4, damage_heal_order) + +/mob/living/simple_animal/hostile/clockwork/guardian/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + if(amount > 0) + for(var/mob/living/L in view(2, src)) + if(L.is_holding_item_of_type(/obj/item/nullrod)) + to_chat(src, "The presence of a brandished holy artifact weakens your armor!") + amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage + break + . = ..() + if(src && updating_health) + update_health_hud() + update_stats() + +/mob/living/simple_animal/hostile/clockwork/guardian/update_health_hud() + if(hud_used && hud_used.healths) + if(istype(hud_used, /datum/hud)) + var/datum/hud/marauder/G = hud_used + var/resulthealth + if(host) + if(iscarbon(host)) + resulthealth = "[round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)]%" + else + resulthealth = "[round((host.health / host.maxHealth) * 100, 0.5)]%" + else + resulthealth = "NONE" + G.hosthealth.maptext = "
"
+ dat += "Speech preferences" + dat += "Custom Speech Verb:" + dat += "[custom_speech_verb] " + dat += "Custom Tongue: " + dat += "[custom_tongue] " + dat += "Additional Language " + dat += "[additional_language] " + dat += " | "
+ dat += "
"
dat += "General Settings" @@ -846,7 +868,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" - if(3) + if(4) //calculate your gear points from the chosen item gear_points = CONFIG_GET(number/initial_gear_points) var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"] @@ -965,7 +987,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += " | [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required] |
"
dat += "Fetish content prefs" dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]" @@ -989,7 +1011,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Automatic Wagging: [(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"] " dat += " |