From ded43af1d73715576f9c86d776d64debc6dcd490 Mon Sep 17 00:00:00 2001 From: Geeves Date: Wed, 23 Sep 2020 12:16:30 +0200 Subject: [PATCH] Changeling Morph (#10010) --- aurorastation.dme | 1 + code/__defines/color.dm | 2 +- .../gamemodes/changeling/helpers/_store.dm | 86 +++----- .../changeling/implements/hivemind.dm | 16 +- .../changeling/implements/powers/hivemind.dm | 47 +++- .../living/simple_animal/hostile/hostile.dm | 4 + .../mob/living/simple_animal/hostile/morph.dm | 205 ++++++++++++++++++ .../mob/living/simple_animal/simple_animal.dm | 5 + code/modules/ventcrawl/ventcrawl.dm | 9 +- html/changelogs/geeves-morph_ling.yml | 9 + icons/mob/npc/animal.dmi | Bin 190891 -> 194591 bytes 11 files changed, 327 insertions(+), 57 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/morph.dm create mode 100644 html/changelogs/geeves-morph_ling.yml diff --git a/aurorastation.dme b/aurorastation.dme index e835075e320..3cfeef7dbce 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -2102,6 +2102,7 @@ #include "code\modules\mob\living\simple_animal\hostile\krampus.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\moghesfauna.dm" +#include "code\modules\mob\living\simple_animal\hostile\morph.dm" #include "code\modules\mob\living\simple_animal\hostile\phoron_worm.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" #include "code\modules\mob\living\simple_animal\hostile\pra.dm" diff --git a/code/__defines/color.dm b/code/__defines/color.dm index 522b3fffbfc..9f4e671dc7a 100644 --- a/code/__defines/color.dm +++ b/code/__defines/color.dm @@ -91,7 +91,7 @@ #define COLOR_OIL "#030303" #define COLOR_ASH "#615C5B" #define COLOR_SNOW "#9CADAD" -#define COLOR_LING_HIVEMIND "#94582e" +#define COLOR_LING_HIVEMIND "#583012" // Blood colors diff --git a/code/game/gamemodes/changeling/helpers/_store.dm b/code/game/gamemodes/changeling/helpers/_store.dm index 4aa63b2050b..7268650bf2f 100644 --- a/code/game/gamemodes/changeling/helpers/_store.dm +++ b/code/game/gamemodes/changeling/helpers/_store.dm @@ -1,5 +1,3 @@ -// READ: Don't use the apostrophe in name or desc. Causes script errors. - var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now var/list/datum/power/changeling/powerinstances = list() @@ -88,6 +86,12 @@ var/list/datum/power/changeling/powerinstances = list() genomecost = 0 verbpath = /mob/proc/changeling_eject_hivemind +/datum/power/changeling/hivemind_morph + name = "Hivemind Release Morph" + desc = "We release a hivemind member as a morph at the cost of a limb. They will be able to crawl inside vents and disguise themselves as objects." + genomecost = 2 + verbpath = /mob/living/carbon/human/proc/changeling_release_morph + //Stings and sting accessorries //Rest in pieces, unfat sting. - Geeves @@ -211,6 +215,7 @@ var/list/datum/power/changeling/powerinstances = list() // Modularchangling, totally stolen from the new player panel. YAYY //I'm too afraid to touch this, you win this time, oldcode - Geeves +// After an HTML course, I finally conquered this. Convert into VueUi eventually. - Geeves /datum/changeling/proc/EvolutionMenu()//The new one set category = "Changeling" set desc = "Buy new abilities with the genomes we obtained." @@ -233,38 +238,34 @@ var/list/datum/power/changeling/powerinstances = list() var locked_tabs = new Array(); - function updateSearch(){ + function updateSearch() { var filter_text = document.getElementById('filter'); var filter = filter_text.value.toLowerCase(); - if(complete_list != null && complete_list != ""){ + if(complete_list != null && complete_list != "") { var mtbl = document.getElementById("maintable_data_archive"); mtbl.innerHTML = complete_list; } - if(filter.value == ""){ + if(filter.value == "") { return; - }else{ - + } else { var maintable_data = document.getElementById('maintable_data'); var ltr = maintable_data.getElementsByTagName("tr"); for ( var i = 0; i < ltr.length; ++i ) { - try{ + try { var tr = ltr\[i\]; - if(tr.getAttribute("id").indexOf("data") != 0){ + if(tr.getAttribute("id").indexOf("data") != 0) { continue; } var ltd = tr.getElementsByTagName("td"); var td = ltd\[0\]; var lsearch = td.getElementsByTagName("b"); var search = lsearch\[0\]; - //var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element. - //document.write("

"+search.innerText+"
"+filter+"
"+search.innerText.indexOf(filter)) - if ( search.innerText.toLowerCase().indexOf(filter) == -1 ) - { + if ( search.innerText.toLowerCase().indexOf(filter) == -1 ) { //document.write("a"); //ltr.removeChild(tr); td.innerHTML = ""; @@ -283,29 +284,24 @@ var/list/datum/power/changeling/powerinstances = list() } function expand(id,name,desc,helptext,power,ownsthis){ - clearAll(); var span = document.getElementById(id); body = "
"; - body += ""; + body += ""+desc+"
"; - body += ""+desc+"
" + if(helptext) { + body += ""+helptext+"
"; + } - body += ""+helptext+"
" - - if(!ownsthis) - { - body += "Evolve" + if(!ownsthis) { + body += "Evolve"; } body += "
"; - body += "
"; - - span.innerHTML = body } @@ -316,13 +312,13 @@ var/list/datum/power/changeling/powerinstances = list() var id = span.getAttribute("id"); - if(!(id.indexOf("item")==0)) + if(!(id.indexOf("item") == 0)) continue; var pass = 1; - for(var j = 0; j < locked_tabs.length; j++){ - if(locked_tabs\[j\]==id){ + for(var j = 0; j < locked_tabs.length; j++) { + if(locked_tabs\[j\]==id) { pass = 0; break; } @@ -331,9 +327,6 @@ var/list/datum/power/changeling/powerinstances = list() if(pass != 1) continue; - - - span.innerHTML = ""; } } @@ -341,17 +334,17 @@ var/list/datum/power/changeling/powerinstances = list() function addToLocked(id,link_id,notice_span_id){ var link = document.getElementById(link_id); var decision = link.getAttribute("name"); - if(decision == "1"){ + if(decision == "1") { link.setAttribute("name","2"); - }else{ + } else { link.setAttribute("name","1"); removeFromLocked(id,link_id,notice_span_id); return; } var pass = 1; - for(var j = 0; j < locked_tabs.length; j++){ - if(locked_tabs\[j\]==id){ + for(var j = 0; j < locked_tabs.length; j++) { + if(locked_tabs\[j\] == id) { pass = 0; break; } @@ -361,12 +354,9 @@ var/list/datum/power/changeling/powerinstances = list() locked_tabs.push(id); var notice_span = document.getElementById(notice_span_id); notice_span.innerHTML = "Locked "; - //link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');"); - //document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')"); - //document.write("aa - "+link.getAttribute("onClick")); } - function attempt(ab){ + function attempt(ab) { return ab; } @@ -374,8 +364,8 @@ var/list/datum/power/changeling/powerinstances = list() //document.write("a"); var index = 0; var pass = 0; - for(var j = 0; j < locked_tabs.length; j++){ - if(locked_tabs\[j\]==id){ + for(var j = 0; j < locked_tabs.length; j++) { + if(locked_tabs\[j\] == id) { pass = 1; index = j; break; @@ -386,8 +376,6 @@ var/list/datum/power/changeling/powerinstances = list() locked_tabs\[index\] = ""; var notice_span = document.getElementById(notice_span_id); notice_span.innerHTML = ""; - //var link = document.getElementById(link_id); - //link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')"); } function selectTextField(){ @@ -440,9 +428,9 @@ var/list/datum/power/changeling/powerinstances = list() ownsthis = 1 - var/color = "#e6e6e6" + var/color = "#2b2b2b" if(i%2 == 0) - color = "#f2f2f2" + color = "#363636" dat += {" @@ -450,11 +438,7 @@ var/list/datum/power/changeling/powerinstances = list() - - Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost] - + Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]
@@ -476,7 +460,9 @@ var/list/datum/power/changeling/powerinstances = list() "} - usr << browse(dat, "window=powers;size=900x480") + var/datum/browser/power_win = new(usr, "powers", "Changeling Powers", 900, 480) + power_win.set_content(dat) + power_win.open() /datum/changeling/Topic(href, href_list) diff --git a/code/game/gamemodes/changeling/implements/hivemind.dm b/code/game/gamemodes/changeling/implements/hivemind.dm index 4fddfda3fe6..556cab80860 100644 --- a/code/game/gamemodes/changeling/implements/hivemind.dm +++ b/code/game/gamemodes/changeling/implements/hivemind.dm @@ -53,4 +53,18 @@ /mob/abstract/hivemind/emote() to_chat(src, SPAN_WARNING("You cannot emote.")) - return \ No newline at end of file + return + +/mob/abstract/hivemind/proc/release_as_morph() + to_chat(src, SPAN_DANGER(FONT_LARGE("You are a morph, released by [changeling_mob]!"))) + to_chat(src, SPAN_DANGER("As a morph, you can disguise as objects by alt-clicking on them.")) + to_chat(src, SPAN_DANGER("You can eat people and items by clicking on them, but only if they're dead.")) + + relay_hivemind("Hivemind member [src] has been released into the outside world as a morph!", changeling_mob) + log_and_message_admins("has released [src] as a morph.", changeling_mob, get_turf(changeling_mob)) + + var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(get_turf(changeling_mob)) + M.stop_thinking = TRUE // prevent the AI from taking over when the player ghosts + M.ckey = ckey + changeling_mob.mind.changeling.hivemind_members -= src + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/changeling/implements/powers/hivemind.dm b/code/game/gamemodes/changeling/implements/powers/hivemind.dm index 16a5b761e20..597e7071c5c 100644 --- a/code/game/gamemodes/changeling/implements/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/implements/powers/hivemind.dm @@ -9,7 +9,7 @@ if(!mind.changeling.hivemind_members.len) return var/chosen_player = input("Choose a hivemind member to eject.", "Eject") as null|anything in mind.changeling.hivemind_members - if(!chosen_player || chosen_player == "None") + if(!chosen_player) return var/mob/abstract/hivemind/M = mind.changeling.hivemind_members[chosen_player] M.ghost() //Deuces @@ -34,4 +34,47 @@ to_chat(ling, message) /mob/proc/changeling_message_process(var/message) - return "[src] says, \"[message]\"" \ No newline at end of file + message = capitalize(message) + + var/static/list/correct_punctuation = list("!" = TRUE, "." = TRUE, "?" = TRUE, "-" = TRUE, "~" = TRUE, "*" = TRUE, "/" = TRUE, ">" = TRUE, "\"" = TRUE, "'" = TRUE, "," = TRUE, ":" = TRUE, ";" = TRUE) + var/ending = copytext(message, length(message), (length(message) + 1)) + if(ending && !correct_punctuation[ending]) + message += "." + + return "[src] says, \"[message]\"" + +/mob/living/carbon/human/proc/changeling_release_morph() + set category = "Changeling" + set name = "Hivemind Release Morph" + set desc = "Releases a member of our internal hivemind as a morph, at the cost of one of our limbs." + + if(!mind?.changeling) + return + + if(!length(mind.changeling.hivemind_members)) + to_chat(src, SPAN_WARNING("We have no internal hivemind members to release!")) + return + + var/chosen_player = input("Choose a hivemind member to release as a morph.", "Hivemind Morph") as null|anything in mind.changeling.hivemind_members + if(!chosen_player) + return + + var/list/selectable_limb = list() + for(var/organ_name in list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG)) + var/obj/item/organ/external/limb = organs_by_name[organ_name] + if(limb && !limb.is_stump()) + selectable_limb += limb + + if(!length(selectable_limb)) + to_chat(src, SPAN_WARNING("We have no limbs to sacrifice!")) + return + + var/obj/item/organ/external/chosen_limb = input("Choose a limb to sacrifice.", "Limb Sacrifice") as null|anything in selectable_limb + if(!chosen_limb) + return + + chosen_limb.droplimb(TRUE, DROPLIMB_BLUNT) + + var/mob/abstract/hivemind/M = mind.changeling.hivemind_members[chosen_player] + M.release_as_morph() + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 782114ce320..ab2e6725dd5 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -205,6 +205,10 @@ mob/living/simple_animal/hostile/hitby(atom/movable/AM as mob|obj,var/speed = TH /mob/living/simple_animal/hostile/think() ..() + + if(stop_thinking) + return + switch(stance) if(HOSTILE_STANCE_IDLE) targets = ListTargets(10) diff --git a/code/modules/mob/living/simple_animal/hostile/morph.dm b/code/modules/mob/living/simple_animal/hostile/morph.dm new file mode 100644 index 00000000000..51edbacc6c6 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/morph.dm @@ -0,0 +1,205 @@ +#define MORPH_COOLDOWN 50 + +/mob/living/simple_animal/hostile/morph + name = "morph" + desc = "A revolting, pulsating pile of flesh." + speak_emote = list("gurgles") + emote_hear = list("gurgles") + icon = 'icons/mob/npc/animal.dmi' + icon_state = "morph" + icon_living = "morph" + icon_dead = "morph_dead" + speed = 2.5 + stop_automated_movement = TRUE + + response_help = "pets" + response_disarm = "shoves" + response_harm = "harmlessly punches" + + mob_size = 15 + + universal_speak = TRUE + universal_understand = TRUE + + tameable = FALSE + + status_flags = CANPUSH + pass_flags = PASSTABLE + + maxHealth = 125 + health = 125 + + melee_damage_lower = 12 + melee_damage_upper = 16 + + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_NOLIGHTING + + minbodytemp = 0 + maxbodytemp = 350 + min_oxy = 0 + max_co2 = 0 + max_tox = 0 + + wander = FALSE + + attacktext = "glomped" + attack_sound = 'sound/effects/blobattack.ogg' + + var/morphed = FALSE + var/melee_damage_disguised = 0 + var/eat_while_disguised = FALSE + var/atom/movable/form = null + var/morph_time = 0 + var/static/list/blacklist_typecache = typecacheof(list(/obj/screen, /obj/singularity, /mob/living/simple_animal/hostile/morph, /obj/effect)) + +/mob/living/simple_animal/hostile/morph/Initialize() + . = ..() + verbs += /mob/living/proc/ventcrawl + +/mob/living/simple_animal/hostile/morph/examine(mob/user) + if(morphed) + . = form.examine(user) + if(get_dist(src, user) > 2) + return + to_chat(user, SPAN_WARNING("It doesn't look quite right...")) + else + return ..() + +/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) + return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) + +/mob/living/simple_animal/hostile/morph/proc/eat(var/atom/movable/A, var/delay = 20) + if(morphed && !eat_while_disguised) + to_chat(src, SPAN_WARNING("You can't eat anything while you are disguised!")) + return FALSE + if(A?.loc == src) + return FALSE + visible_message(SPAN_WARNING("\The [src] begins swallowing \the [A] whole!"), SPAN_NOTICE("You begin swallowing \the [A] whole.")) + if(do_after(src, delay, act_target = A)) + visible_message(SPAN_WARNING("\The [src] swallows \the [A] whole!"), SPAN_NOTICE("You swallow \the [A] whole.")) + A.forceMove(src) + return TRUE + +/mob/living/simple_animal/hostile/morph/AltClickOn(atom/movable/A) + if(morph_time <= world.time && !stat) + if(A == src) + restore() + else if(istype(A) && allowed(A)) + assume(A) + else + to_chat(src, SPAN_WARNING("Your chameleon skin is still repairing itself!")) + +/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) + if(morphed) + to_chat(src, SPAN_WARNING("You must restore to your original form first!")) + return + morphed = TRUE + form = target + visible_message(SPAN_WARNING("\The [src] suddenly twists and changes shape, becoming a copy of \the [target]!"), SPAN_NOTICE("You twist your body and assume the form of \the [target].")) + appearance = target.appearance + alpha = max(alpha, 150) //fucking chameleons + transform = initial(transform) + pixel_y = initial(pixel_y) + pixel_x = initial(pixel_x) + + //Morphed is weaker + melee_damage_lower = melee_damage_disguised + melee_damage_upper = melee_damage_disguised + speed = 1 + mob_size = MOB_MINISCULE + + morph_time = world.time + MORPH_COOLDOWN + return + +/mob/living/simple_animal/hostile/morph/proc/restore() + if(!morphed) + to_chat(src, SPAN_WARNING("You're already in your normal form!")) + return + morphed = FALSE + form = null + alpha = initial(alpha) + color = initial(color) + desc = initial(desc) + animate_movement = SLIDE_STEPS + maptext = null + + visible_message(SPAN_WARNING("\The [src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), SPAN_NOTICE("You reform to your normal body.")) + name = initial(name) + icon = initial(icon) + icon_state = initial(icon_state) + cut_overlays() + overlays = null + + //Baseline stats + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + speed = 2.5 + mob_size = 15 + + morph_time = world.time + MORPH_COOLDOWN + +/mob/living/simple_animal/hostile/morph/death(gibbed) + if(morphed) + visible_message(SPAN_WARNING("\The [src] twists and dissolves into a pile of green flesh!"), SPAN_DANGER("Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--")) + restore() + barf_contents() + ..() + +/mob/living/simple_animal/hostile/morph/proc/barf_contents() + for(var/atom/movable/AM in src) + AM.forceMove(loc) + if(prob(90)) + step(AM, pick(global.alldirs)) + +/mob/living/simple_animal/hostile/morph/UnarmedAttack(atom/A, proximity) + if(morphed && !melee_damage_disguised) + to_chat(src, SPAN_WARNING("You can't attack while disguised!")) + return + if(isliving(A)) //Eat Corpses to regen health + var/mob/living/L = A + if(L.stat == DEAD) + if(eat(L, 30)) + adjustBruteLoss(-50) + return + else if(istype(A, /obj/item)) //Eat items just to be annoying + var/obj/item/I = A + if(!I.anchored) + eat(I, 20) + return + return ..() + +/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P, def_zone) + ..() + if (ismob(P.firer) && target_mob != P.firer) + target_mob = P.firer + stance = HOSTILE_STANCE_ATTACK + +/mob/living/simple_animal/hostile/morph/attackby(obj/item/O, mob/user) + ..() + if(morphed && user != src) + restore() + +/mob/living/simple_animal/hostile/morph/hitby(atom/movable/AM, speed) + ..() + if(morphed) + restore() + +/mob/living/simple_animal/hostile/morph/attack_generic(mob/user, damage, attack_message) + ..() + if(morphed) + restore() + +/mob/living/simple_animal/hostile/morph/attack_hand(mob/living/carbon/human/M) + ..() + if(morphed && M != src) + restore() + +/mob/living/simple_animal/hostile/morph/start_ventcrawl() + if(morphed) + to_chat(src, SPAN_WARNING("You can't ventcrawl while disguised!")) + return + return ..() + +/mob/living/simple_animal/hostile/morph/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override) + INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 5162133e800..d0bc9d9eaeb 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -27,6 +27,7 @@ universal_speak = 0 //No, just no. var/meat_amount = 0 var/meat_type + var/stop_thinking = FALSE // prevents them from doing any AI stuff whatsoever var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. var/wander = 1 // Does the mob wander around when idle? var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. @@ -239,6 +240,10 @@ /mob/living/simple_animal/think() ..() + + if(stop_thinking) + return + if(!stop_automated_movement && wander && !anchored) if(isturf(loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. if(turns_since_move >= turns_per_move && !(stop_automated_movement_when_pulled && pulledby)) //Some animals don't move when pulled diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 45305a0c55f..7f96ef520fa 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -58,9 +58,12 @@ var/global/list/can_enter_vent_with = list( /mob/living/proc/ventcrawl_carry() for(var/atom/A in src.contents) if(!is_allowed_vent_crawl_item(A)) - to_chat(src, "You can't be carrying that when vent crawling!") - return 0 - return 1 + to_chat(src, SPAN_WARNING("You can't be carrying that when vent crawling!")) + return FALSE + return TRUE + +/mob/living/simple_animal/hostile/morph/ventcrawl_carry() + return TRUE /obj/machinery/atmospherics/AltClick(mob/living/user) if(is_type_in_list(src, ventcrawl_machinery) && user.can_ventcrawl()) diff --git a/html/changelogs/geeves-morph_ling.yml b/html/changelogs/geeves-morph_ling.yml new file mode 100644 index 00000000000..4344d5d5539 --- /dev/null +++ b/html/changelogs/geeves-morph_ling.yml @@ -0,0 +1,9 @@ +author: Geeves, Sue + +delete-after: True + +changes: + - rscadd: "Lings can now evolve the ability to release members of their internal hivemind as morphs at the cost of their arm. The ability itself costs two genome points." + - rscadd: "Added morphs, creature capable of assuming the form of any object." + - tweak: "Messages spoken in the internal hivemind will automatically be capitalized and punctuated. Also improved the colour for readability." + - bugfix: "Fixed the script error in the Changeling DNA buy menu, improved the look of it." \ No newline at end of file diff --git a/icons/mob/npc/animal.dmi b/icons/mob/npc/animal.dmi index c42e0f9646afe4441fefb558861d20902815d87e..102c9556efce907ce72c8ed4346ea18b22ced600 100644 GIT binary patch delta 9227 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 delta 5498 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