From 84ef02ebfc607afca80bb83999452c7ae1c66848 Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Wed, 24 Apr 2024 01:07:19 -0700 Subject: [PATCH 1/9] pasted --- yogstation.dme | 1 + .../modules/mining/lavaland/doppelmirror.dm | 274 ++++++++++++++++++ yogstation/icons/obj/lavaland/artefacts.dmi | Bin 516 -> 1325 bytes 3 files changed, 275 insertions(+) create mode 100644 yogstation/code/modules/mining/lavaland/doppelmirror.dm diff --git a/yogstation.dme b/yogstation.dme index 85e3eae2ba8d..6b322d85e586 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -4367,6 +4367,7 @@ #include "yogstation\code\modules\mentor\mentorsay.dm" #include "yogstation\code\modules\mentor\mentortickets.dm" #include "yogstation\code\modules\mining\lavaland\bloodbook.dm" +#include "yogstation\code\modules\mining\lavaland\doppelmirror.dm" #include "yogstation\code\modules\mob\mob.dm" #include "yogstation\code\modules\mob\say.dm" #include "yogstation\code\modules\mob\dead\new_player\sprite_accessories.dm" diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm new file mode 100644 index 000000000000..095267f27d43 --- /dev/null +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -0,0 +1,274 @@ +#define COOLDOWN_RECALL 50 +/obj/item/dopmirror + name = "ominous mirror" + desc = "What do you see looking back at you?" + icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' + icon_state = "mirrornormal" + actions_types = list(/datum/action/item_action/mirrorrecall) + var/possessed = FALSE + var/list/reflection = list() + var/next_recall = 0 + var/mob/living/carbon/original = null + +/obj/item/dopmirror/pickup(mob/user) + ..() + original = user + +/obj/item/dopmirror/attack_self(mob/living/user) + if(possessed) + return + if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) + to_chat(user, span_notice("Anomalous otherworldly energies keep the mirror from reflecting anything!")) + return + + to_chat(user, "You peer into the mirror...") + possessed = TRUE + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the living reflection in service of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) + if(LAZYLEN(candidates)) + var/mob/dead/observer/C = pick(candidates) + var/mob/living/simple_animal/hostile/double/S = new(src) + reflection |= S + S.ckey = C.ckey + S.fully_replace_character_name(null, "living reflection") + S.copy_languages(user, LANGUAGE_MASTER) + S.update_atom_languages() + S.mirror = src + S.faction = user.faction + to_chat(S, span_warning("As a resident of the mirror, your topmost priority is the safety of your home.")) + to_chat(S, span_warning("Physically defending the mirror without a host is impossible. Ensure the mirror is always in someone's hands so you can act.")) + to_chat(S, span_warning("You are moderately strong and are able to deal stronger blows to typical lavaland fauna.")) + to_chat(S, span_warning("You are fragile but cannot truly be destroyed until the mirror is. You are able to recover inside the mirror, and excessive damage will seal\ + you inside of it for 20 seconds.")) + to_chat(S, span_warning("Additionally, you possess the ability to swap places with the current host while outside the mirror.")) + grant_all_languages(FALSE, FALSE, TRUE) + to_chat(user, "... and you see your reflection trying to leave!") + playsound(src, 'sound/effects/glassbr2.ogg', 75) + src.update_icon() + else + to_chat(user, "... and your reflection stares back at you. Try again later.") + possessed = FALSE + +/obj/item/dopmirror/Destroy() + for(var/mob/living/simple_animal/hostile/double/S in reflection) + to_chat(S, "You were destroyed along with the mirror!") + qdel(S) + return ..() + + +/obj/item/dopmirror/ui_action_click(mob/living/user, action) + if(istype(action, /datum/action/item_action/mirrorrecall)) + if(next_recall > world.time) + to_chat(user, span_warning("You can't do that yet!")) + return + if(reflection.len < 1) + to_chat(user, span_notice("You don't have anything to call back!")) + return + playsound(src, 'sound/effects/glassknock.ogg', 75) + to_chat(user, span_notice("You knock on the mirror and call your reflection back into focus.")) + for(var/mob/living/simple_animal/hostile/double/doppelganger in reflection) + doppelganger.forceMove(src) + update_icon(inhabited = TRUE) + next_recall = world.time + COOLDOWN_RECALL + +/obj/item/dopmirror/update_icon(inhabited = FALSE) + if(inhabited == TRUE) + icon_state = "mirrornormal" + return + icon_state = "mirrorcrack" + return + +/obj/item/dopmirror/dropped(mob/user, silent) + . = ..() + if(src in user) + return + original = null + + +/datum/action/item_action/mirrorrecall + name = "Recall" + desc = "Bring the reflection back into the mirror." + button_icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' + button_icon_state = "mirrornormal" + +//doppelganger code + +/mob/living/simple_animal/hostile/double + name = "living reflection" + real_name = "living reflection" + desc = "A bound spirit." + gender = PLURAL + icon = 'icons/mob/mob.dmi' + icon_state = "shade" + icon_living = "shade" + mob_biotypes = list(MOB_SPIRIT) + maxHealth = 20 + health = 20 + speed = -1 + projectiletype = /obj/projectile/doppshot + projectilesound = 'sound/weapons/pierce.ogg' + ranged = TRUE + ranged_message = "fires at" + ranged_cooldown_time = 25 + see_in_dark = 8 + spacewalk = TRUE + speak_emote = list("echoes") + melee_damage_lower = 14 + melee_damage_upper = 14 + obj_damage = 10 + attacktext = "metaphysically strikes" + minbodytemp = 0 + maxbodytemp = INFINITY + 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) + movement_type = FLYING + var/obj/item/dopmirror/mirror = null// the mirror that's returned to on dying + var/melee_fauna_bonus = 36 + var/hibernating = FALSE + var/move_range = 20 + var/datum/action/innate/jumpback/jumpback + var/datum/action/innate/appear/appear + var/datum/action/innate/swap/swap + +/mob/living/simple_animal/hostile/double/Initialize() + . = ..() + jumpback = new + jumpback.Grant(src) + appear = new + appear.Grant(src) + swap = new + swap.Grant(src) + +/mob/living/simple_animal/hostile/double/Bump(atom/A) + . = ..() + if(ismineralturf(A)) + var/turf/closed/mineral/M = A + M.attempt_drill() + +/mob/living/simple_animal/hostile/double/start_pulling(atom/movable/AM, state, force, supress_message) + if(isliving(AM)) + return + . = ..() + +/mob/living/simple_animal/hostile/double/death() + playsound(src, 'sound/effects/glassbr3.ogg', 75) + src.forceMove(mirror) + hibernating = TRUE + appearance = mirror.original.appearance + for(jumpback in src.actions) + jumpback.Activate() + for(var/datum/action/innate/appear/appear in src.actions) + appear.Activate(died = TRUE) + return FALSE // want the way to kill it being linked directly to the mirror + + +/mob/living/simple_animal/hostile/double/Life() + if(hibernating == TRUE) + src.heal_bodypart_damage(3) + +/mob/living/simple_animal/hostile/double/Move(NewLoc, Dir = 0) + . = ..() + if(hibernating == TRUE) + hibernating = FALSE + if(get_dist(src,mirror) > move_range) + to_chat(src, span_notice("You can't move that far from the mirror and are called back!")) + for(jumpback in src.actions) + jumpback.Activate() + +/mob/living/simple_animal/hostile/double/AttackingTarget() + ..() + var/mob/living/simple_animal/M = target + if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid)) + M.apply_damage(melee_fauna_bonus, BRUTE) + + +/mob/living/simple_animal/hostile/double/dust(just_ash, drop_items, force) + death() + +/mob/living/simple_animal/hostile/double/gib() + death() + +//reflection's abilities + +/datum/action/innate/jumpback + name = "Return to Mirror" + button_icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' + button_icon_state = "mirrornormal" + +/datum/action/innate/jumpback/Activate() + var/mob/living/simple_animal/hostile/double/doppelganger = owner + doppelganger.forceMove(doppelganger.mirror) + doppelganger.hibernating = TRUE + doppelganger.mirror.update_icon(inhabited = TRUE) + doppelganger.appearance = doppelganger.mirror.original.appearance + doppelganger.alpha = 130 + playsound(doppelganger, 'sound/effects/glassknock.ogg', 75) + + +#define RESET_TIME 200 +/datum/action/innate/appear + name = "Exit Mirror" + button_icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' + button_icon_state = "mirrorcrack" + var/next_appearance = 0 + +/datum/action/innate/appear/Activate(died = FALSE) + var/mob/living/simple_animal/hostile/double/doppelganger = owner + var/turf/M = get_turf(doppelganger.mirror) + if(next_appearance > world.time) + to_chat(doppelganger, span_warning("You can't leave the mirror yet!")) + return + if(doppelganger.mirror.original == null) //for the sake of avoiding setting up play dates with megafauna + to_chat(doppelganger, span_warning("You can't leave the mirror without an original to copy!")) + return + doppelganger.mirror.update_icon() + if(died == TRUE) + next_appearance = world.time + RESET_TIME + return + doppelganger.forceMove(M) + doppelganger.appearance = doppelganger.mirror.original.appearance + doppelganger.alpha = 130 + + +#define SWAP_TIME 150 +/datum/action/innate/swap + name = "Swap" + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "separate" + var/next_swap = 0 + +/datum/action/innate/swap/Activate(died = FALSE) + var/mob/living/simple_animal/hostile/double/doppelganger = owner + var/turf/going = get_turf(doppelganger.mirror) + var/turf/doppspot = get_turf(doppelganger) + if(next_swap > world.time) + to_chat(doppelganger, span_warning("You can't exchange locations yet!")) + return + if(!isturf(doppelganger.loc)) //so it's not used from inside the mirror + return + if(istype(doppspot, /turf/open/chasm)) + to_chat(doppelganger, span_warning("You probably shouldn't risk the mirror falling from such a height.")) + return + if(istype(doppspot, /turf/open/lava)) + to_chat(doppelganger, span_warning("You probably shouldn't risk the mirror falling into lava.")) + return + next_swap = world.time + SWAP_TIME + doppelganger.forceMove(going) + doppelganger.mirror.original.forceMove(doppspot) + playsound(going, 'sound/effects/bamf.ogg', 50) + playsound(doppspot, 'sound/effects/bamf.ogg', 50) + to_chat(doppelganger, span_warning("You exchange places with the mirror's holder!")) + + +/obj/projectile/doppshot + name = "mirrored shot" + icon_state = "greyscale_bolt" + nodamage = TRUE //for the sake of welding tanks + damage_type = BRUTE + damage = 0 + var/actual_damage = 5 + var/ranged_fauna_bonus = 15 + +/obj/projectile/doppshot/on_hit(atom/target, blocked = FALSE) + var/mob/living/M = target + M.apply_damage(actual_damage, BRUTE) + if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid)) + M.apply_damage(ranged_fauna_bonus, BRUTE) diff --git a/yogstation/icons/obj/lavaland/artefacts.dmi b/yogstation/icons/obj/lavaland/artefacts.dmi index db0991743ac2d42c3035cb31e361444e86d0079c..eeedbe0617a2c1e82c11314db6193a4ddca1b793 100644 GIT binary patch delta 1199 zcmV;g1W@~g1g#2xiBL{Q4GJ0x0000DNk~Le0000$0000$2m=5B0G+pi>;M1&)lf`S zMZmzo0003iD=R%cJvB;H6%`eelas8hth>9riEvUgNKj>EWmZ;JSW7_N-Q9C@b1+0s zI#FDloSa--TrWaOK38H&N=n4p+2QN!V`F13KS(xBS3OlmU_V)9)YQ~KL_{k+L_=R{ zDLOzoClb)m(2l34teTU_$;rgk);UjEtE;Q0j}0#<0F!YzbH2`2bW@H1y?^8u&V(@fH$??k~e$+00VSML_t(oh1HhpQrj>Pg^`t1 zK$1diij)Lm3bhqXOK-H$mX@}IdH+Z1?n=JJvf}*cOuNHnAalMwTFE-z+4+0L>VE`5 zz?-#E&IUEYkn?Aa61#tU8|3?g8eqsr0%}~;WITSpd*G8Ff__>80?>y-1Z5#a>_(mX zqa)P6C;+y9bPOexghIls(*v8&5BC?-lhZn2DIzK3SSn=*$FPXdZGoMEfyLtF^koT{ zfP)Biag6$y2(ykkvNP-t1{w~Qqz3?)APiU#p=$~3ob*)16fb|cSO%nr{;??>!z+ga z(9aJCi=voaf*=RbIZ5IKf5RI1ENwer=Vzq>235=;jKF~+eVnM6hQMd-eMJ3ye_-U* zzlU5z8uVpJvz0A?=|8Bv*8nRpo?wB03url@{s6cfu!i0O6xxSx{DC{!cEC#gnzIX@ z!V;)E_OAd34*h?+eFG3tCar(i2Hc0X1JdIY)Y1bWgo9`u#C9Lx9E5u<{pDp_PD>y_ zOczO&0~H)Z@bx2FKu?TMN=SXae58 zd;h_$-x+=!!DUbZ@JN7z#>2#JK7GEu^8!?{1RNu7LRx>n57^C@ueaa203062$nF9H zU?bsL6SXC<`>XHFv4JH)gb@;yGDk5BI@J~+q9CaXPQgsn^mo@k{Q#aW z;Z_WyqVQ%HbH3tCjIv@hns8Pf6Qvh@iupnGe4Ttb$ ztM=(e`G0>=+vk6?w$A^Se!Ki{`QI}Co&DjMDqC8^2t4`k1T0Aoc|nLw^GRp^I{=jb z=FNd9N@jf0mH%!BOVU5u7Z6-TSN^+-^1td&9Nm%s9ZP@_=#2X3a9f~0bLW2-0P;Vh z{&`Lpmy*hv|6Ksge=RfA=T?tv*b1=H)E@w-e}sR1Xy?BlVEX4d=y3{i8wZsCTIEkq zR*z#e`7e3`ApfB@?XikItNm% z=f59-`Hx!CyRer3egMX|hRP8@dU%`O;$b2{rdP_G11$|8?SCIo{_7PQFx#Ni zsF^$e8wrsAna=V`KWgNEAAm3a`>es6|Gfyl{O?EbnpQP%uPJI#FCNLP|bYVlF>OHceMORbW3^Wh*^ILtknsIzTy3S*MQ; zFDL+$ehZ_F4NXD?erpSldkdh64JjG`H6Z{#CR>Wi@K%dI#K3RKL)CD3VsY-pYsE_iM+1a0X6P@JddzgwkG8_zzVDNW-II%cKbuui^B2LorM#I=0eQoi(hZz sjt_l%7lp^OZ$d&SLAand0{>L37kecL%4xmeG5`Po07*qoM6N<$g33dgVgLXD From 6ecad59ad3e831a40556cd75c33dc850b2be08f8 Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:11:11 -0700 Subject: [PATCH 2/9] Update doppelmirror.dm --- .../modules/mining/lavaland/doppelmirror.dm | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index 095267f27d43..7821949b37d5 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -4,30 +4,28 @@ desc = "What do you see looking back at you?" icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' icon_state = "mirrornormal" - actions_types = list(/datum/action/item_action/mirrorrecall) - var/possessed = FALSE - var/list/reflection = list() + actions_types = list(/datum/action/item_action/mirrorrecall, /datum/action/item_action/rerollmirror) var/next_recall = 0 var/mob/living/carbon/original = null + var/mob/living/simple_animal/hostile/double/reflected = null /obj/item/dopmirror/pickup(mob/user) ..() original = user /obj/item/dopmirror/attack_self(mob/living/user) - if(possessed) + if(reflected) return if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) to_chat(user, span_notice("Anomalous otherworldly energies keep the mirror from reflecting anything!")) return to_chat(user, "You peer into the mirror...") - possessed = TRUE var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the living reflection in service of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) var/mob/living/simple_animal/hostile/double/S = new(src) - reflection |= S + reflected = S S.ckey = C.ckey S.fully_replace_character_name(null, "living reflection") S.copy_languages(user, LANGUAGE_MASTER) @@ -46,37 +44,51 @@ src.update_icon() else to_chat(user, "... and your reflection stares back at you. Try again later.") - possessed = FALSE /obj/item/dopmirror/Destroy() - for(var/mob/living/simple_animal/hostile/double/S in reflection) - to_chat(S, "You were destroyed along with the mirror!") - qdel(S) + to_chat(reflected, span_userdanger("Your world shatters.")) + qdel(reflected) return ..() - /obj/item/dopmirror/ui_action_click(mob/living/user, action) if(istype(action, /datum/action/item_action/mirrorrecall)) if(next_recall > world.time) to_chat(user, span_warning("You can't do that yet!")) return - if(reflection.len < 1) + if(!reflected) to_chat(user, span_notice("You don't have anything to call back!")) return playsound(src, 'sound/effects/glassknock.ogg', 75) to_chat(user, span_notice("You knock on the mirror and call your reflection back into focus.")) - for(var/mob/living/simple_animal/hostile/double/doppelganger in reflection) - doppelganger.forceMove(src) + reflected.forceMove(src) update_icon(inhabited = TRUE) next_recall = world.time + COOLDOWN_RECALL + if(istype(action, /datum/action/item_action/rerollmirror)) + if(!reflected) + to_chat(user, span_notice("The mirror is dormant.")) + return + if(tgui_alert(user, "Are you sure? This will likely replace the current reflection with someone else!",,list("Yes","No")) != "Yes") + return + to_chat(user, span_notice("You shake the mirror violently.")) + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the living reflection in service of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) + if (!LAZYLEN(candidates)) + to_chat(src, span_notice("There were no other residents willing to work with you. Looks like you're stuck with this one for now.")) + return + var/mob/dead/observer/C = pick(candidates) + to_chat(reflected, span_notice("Your host shook you off, and you were replaced by one of your neighbors. Looks like they weren't happy with your performance.")) + to_chat(user, span_notice(span_bold("The reflection in the mirror looks back at you differently now."))) + log_game("[key_name(user)] has reset their reflection, it is now [key_name(reflected)] (initiated by [user])") + reflected.key = C.key /obj/item/dopmirror/update_icon(inhabited = FALSE) + . = ..() if(inhabited == TRUE) icon_state = "mirrornormal" return icon_state = "mirrorcrack" return + /obj/item/dopmirror/dropped(mob/user, silent) . = ..() if(src in user) @@ -90,6 +102,12 @@ button_icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' button_icon_state = "mirrornormal" +/datum/action/item_action/rerollmirror + name = "Shake Mirror" + desc = "Attempt to have a different mirror resident replace the current one." + button_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "mindswap" + //doppelganger code /mob/living/simple_animal/hostile/double @@ -219,6 +237,7 @@ if(doppelganger.mirror.original == null) //for the sake of avoiding setting up play dates with megafauna to_chat(doppelganger, span_warning("You can't leave the mirror without an original to copy!")) return + doppelganger.hibernating = FALSE doppelganger.mirror.update_icon() if(died == TRUE) next_appearance = world.time + RESET_TIME From e31905d04f73f7f8ed7f325a190927cc82e939fc Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Wed, 24 Apr 2024 15:12:09 -0700 Subject: [PATCH 3/9] a --- .../mining/lavaland/necropolis_chests.dm | 2 +- .../modules/mining/lavaland/doppelmirror.dm | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 859732d9b6d3..8abbbc931d7c 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(aide_list) if(16) new /obj/item/clothing/suit/space/hardsuit/powerarmor_advanced(src) if(17) - new /obj/item/book_of_babel(src) + new /obj/item/dopmirror(src) if(18) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index 7821949b37d5..9ba7306a1a0a 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -1,4 +1,4 @@ -#define COOLDOWN_RECALL 50 +#define COOLDOWN_RECALL 5 SECONDS /obj/item/dopmirror name = "ominous mirror" desc = "What do you see looking back at you?" @@ -194,7 +194,7 @@ /mob/living/simple_animal/hostile/double/AttackingTarget() ..() var/mob/living/simple_animal/M = target - if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid)) + if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/yog_jungle)) M.apply_damage(melee_fauna_bonus, BRUTE) @@ -221,7 +221,7 @@ playsound(doppelganger, 'sound/effects/glassknock.ogg', 75) -#define RESET_TIME 200 +#define RESET_TIME 20 SECONDS /datum/action/innate/appear name = "Exit Mirror" button_icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' @@ -234,8 +234,13 @@ if(next_appearance > world.time) to_chat(doppelganger, span_warning("You can't leave the mirror yet!")) return - if(doppelganger.mirror.original == null) //for the sake of avoiding setting up play dates with megafauna - to_chat(doppelganger, span_warning("You can't leave the mirror without an original to copy!")) + if(doppelganger.mirror.original == null) + if(!(doppelganger.hibernating)) + return + if(doppelganger.mirror.original.stat != CONSCIOUS) + to_chat(doppelganger, span_warning("You wouldn't be able to do anything as they are now!")) + return + to_chat(doppelganger, span_warning("You can't leave the mirror without a host to copy!")) return doppelganger.hibernating = FALSE doppelganger.mirror.update_icon() @@ -247,7 +252,7 @@ doppelganger.alpha = 130 -#define SWAP_TIME 150 +#define SWAP_TIME 15 SECONDS /datum/action/innate/swap name = "Swap" button_icon = 'icons/mob/actions/actions_minor_antag.dmi' @@ -289,5 +294,5 @@ /obj/projectile/doppshot/on_hit(atom/target, blocked = FALSE) var/mob/living/M = target M.apply_damage(actual_damage, BRUTE) - if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid)) + if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/yog_jungle)) M.apply_damage(ranged_fauna_bonus, BRUTE) From b155d7ce7b163f560c3446434edbeabac5dbd050 Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Wed, 24 Apr 2024 16:35:51 -0700 Subject: [PATCH 4/9] dense --- yogstation/code/modules/mining/lavaland/doppelmirror.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index 9ba7306a1a0a..a4097dd33a70 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -122,6 +122,7 @@ maxHealth = 20 health = 20 speed = -1 + density = FALSE projectiletype = /obj/projectile/doppshot projectilesound = 'sound/weapons/pierce.ogg' ranged = TRUE From 8704357d181d0912f4193ac37c582023c0811291 Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:29:29 -0700 Subject: [PATCH 5/9] bullets pass thorugh --- yogstation/code/modules/mining/lavaland/doppelmirror.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index a4097dd33a70..b417ab4645e5 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -198,6 +198,10 @@ if(ismegafauna(M) || istype(M, /mob/living/simple_animal/hostile/asteroid) || istype(M, /mob/living/simple_animal/hostile/yog_jungle)) M.apply_damage(melee_fauna_bonus, BRUTE) +/mob/living/simple_animal/hostile/double/bullet_act(obj/projectile/P) + src.adjustBruteLoss(0.25* P.damage) + return BULLET_ACT_FORCE_PIERCE + /mob/living/simple_animal/hostile/double/dust(just_ash, drop_items, force) death() From 82572901c4f5c40c9b12da2b38a1bcb47b62d43b Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Fri, 26 Apr 2024 21:04:54 -0700 Subject: [PATCH 6/9] stop beating on the ears of all ghosts --- yogstation/code/modules/mining/lavaland/doppelmirror.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index b417ab4645e5..02d5780524b0 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -1,4 +1,6 @@ #define COOLDOWN_RECALL 5 SECONDS +#define COOLDOWN_MIRRORSEARCH 10 SECONDS + /obj/item/dopmirror name = "ominous mirror" desc = "What do you see looking back at you?" @@ -6,6 +8,7 @@ icon_state = "mirrornormal" actions_types = list(/datum/action/item_action/mirrorrecall, /datum/action/item_action/rerollmirror) var/next_recall = 0 + var/next_search = 0 var/mob/living/carbon/original = null var/mob/living/simple_animal/hostile/double/reflected = null @@ -19,8 +22,11 @@ if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) to_chat(user, span_notice("Anomalous otherworldly energies keep the mirror from reflecting anything!")) return + if(next_search > world.time) + return to_chat(user, "You peer into the mirror...") + next_search = world.time + COOLDOWN_MIRRORSEARCH var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the living reflection in service of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) From 5711bfc17d4fbde4a1e58b9c8b4457a6bcce61b4 Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Fri, 26 Apr 2024 22:52:37 -0700 Subject: [PATCH 7/9] ecooldown --- .../modules/mining/lavaland/doppelmirror.dm | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index 02d5780524b0..38c9191574c1 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -7,8 +7,8 @@ icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' icon_state = "mirrornormal" actions_types = list(/datum/action/item_action/mirrorrecall, /datum/action/item_action/rerollmirror) - var/next_recall = 0 - var/next_search = 0 + COOLDOWN_DECLARE(next_search) + COOLDOWN_DECLARE(next_recall) var/mob/living/carbon/original = null var/mob/living/simple_animal/hostile/double/reflected = null @@ -22,11 +22,11 @@ if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) to_chat(user, span_notice("Anomalous otherworldly energies keep the mirror from reflecting anything!")) return - if(next_search > world.time) + if(!COOLDOWN_FINISHED(src, next_search)) return + COOLDOWN_START(src, next_search, COOLDOWN_MIRRORSEARCH) to_chat(user, "You peer into the mirror...") - next_search = world.time + COOLDOWN_MIRRORSEARCH var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the living reflection in service of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) @@ -58,7 +58,7 @@ /obj/item/dopmirror/ui_action_click(mob/living/user, action) if(istype(action, /datum/action/item_action/mirrorrecall)) - if(next_recall > world.time) + if(!COOLDOWN_FINISHED(src, next_recall)) to_chat(user, span_warning("You can't do that yet!")) return if(!reflected) @@ -68,7 +68,7 @@ to_chat(user, span_notice("You knock on the mirror and call your reflection back into focus.")) reflected.forceMove(src) update_icon(inhabited = TRUE) - next_recall = world.time + COOLDOWN_RECALL + COOLDOWN_START(src, next_search, COOLDOWN_RECALL) if(istype(action, /datum/action/item_action/rerollmirror)) if(!reflected) to_chat(user, span_notice("The mirror is dormant.")) @@ -232,17 +232,17 @@ playsound(doppelganger, 'sound/effects/glassknock.ogg', 75) -#define RESET_TIME 20 SECONDS +#define COOLDOWN_REAPPEAR 20 SECONDS /datum/action/innate/appear name = "Exit Mirror" button_icon = 'yogstation/icons/obj/lavaland/artefacts.dmi' button_icon_state = "mirrorcrack" - var/next_appearance = 0 + COOLDOWN_DECLARE(next_appearance) /datum/action/innate/appear/Activate(died = FALSE) var/mob/living/simple_animal/hostile/double/doppelganger = owner var/turf/M = get_turf(doppelganger.mirror) - if(next_appearance > world.time) + if(!COOLDOWN_FINISHED(src, next_appearance)) to_chat(doppelganger, span_warning("You can't leave the mirror yet!")) return if(doppelganger.mirror.original == null) @@ -256,25 +256,25 @@ doppelganger.hibernating = FALSE doppelganger.mirror.update_icon() if(died == TRUE) - next_appearance = world.time + RESET_TIME + COOLDOWN_START(src, next_appearance, COOLDOWN_REAPPEAR) return doppelganger.forceMove(M) doppelganger.appearance = doppelganger.mirror.original.appearance doppelganger.alpha = 130 -#define SWAP_TIME 15 SECONDS +#define COOLDOWN_SPOTSWAP 15 SECONDS /datum/action/innate/swap name = "Swap" button_icon = 'icons/mob/actions/actions_minor_antag.dmi' button_icon_state = "separate" - var/next_swap = 0 + COOLDOWN_DECLARE(next_swap) /datum/action/innate/swap/Activate(died = FALSE) var/mob/living/simple_animal/hostile/double/doppelganger = owner var/turf/going = get_turf(doppelganger.mirror) var/turf/doppspot = get_turf(doppelganger) - if(next_swap > world.time) + if(!COOLDOWN_FINISHED(src, next_swap)) to_chat(doppelganger, span_warning("You can't exchange locations yet!")) return if(!isturf(doppelganger.loc)) //so it's not used from inside the mirror @@ -285,7 +285,7 @@ if(istype(doppspot, /turf/open/lava)) to_chat(doppelganger, span_warning("You probably shouldn't risk the mirror falling into lava.")) return - next_swap = world.time + SWAP_TIME + COOLDOWN_START(src, next_swap, COOLDOWN_SPOTSWAP) doppelganger.forceMove(going) doppelganger.mirror.original.forceMove(doppspot) playsound(going, 'sound/effects/bamf.ogg', 50) From 2f3b79e27111faee0d4a25378c707d7da0fc4f0f Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:28:02 -0700 Subject: [PATCH 8/9] think i removed correctly --- yogstation/code/modules/mining/lavaland/doppelmirror.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index 38c9191574c1..a9e11fd5a295 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -53,6 +53,9 @@ /obj/item/dopmirror/Destroy() to_chat(reflected, span_userdanger("Your world shatters.")) + reflected.jumpback.Remove(reflected) + reflected.appear.Remove(reflected) + reflected.swap.Remove(reflected) qdel(reflected) return ..() From e88b001177c1c0f0b1b945eb35c2d7c93bd85f1a Mon Sep 17 00:00:00 2001 From: LazennG <58535870+LazennG@users.noreply.github.com> Date: Fri, 3 May 2024 19:18:52 -0700 Subject: [PATCH 9/9] next review in another week --- .../code/modules/mining/lavaland/doppelmirror.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/yogstation/code/modules/mining/lavaland/doppelmirror.dm b/yogstation/code/modules/mining/lavaland/doppelmirror.dm index a9e11fd5a295..9ddd50f45dcc 100644 --- a/yogstation/code/modules/mining/lavaland/doppelmirror.dm +++ b/yogstation/code/modules/mining/lavaland/doppelmirror.dm @@ -53,9 +53,6 @@ /obj/item/dopmirror/Destroy() to_chat(reflected, span_userdanger("Your world shatters.")) - reflected.jumpback.Remove(reflected) - reflected.appear.Remove(reflected) - reflected.swap.Remove(reflected) qdel(reflected) return ..() @@ -187,6 +184,16 @@ appear.Activate(died = TRUE) return FALSE // want the way to kill it being linked directly to the mirror +/mob/living/simple_animal/hostile/double/Destroy() + jumpback.Remove(src) + appear.Remove(src) + swap.Remove(src) + qdel(jumpback) + qdel(appear) + qdel(swap) + . = ..() + + /mob/living/simple_animal/hostile/double/Life() if(hibernating == TRUE)