diff --git a/ModularTegustation/Teguicons/32x32.dmi b/ModularTegustation/Teguicons/32x32.dmi index a9d7c27f0d6e..8c33953a3adf 100644 Binary files a/ModularTegustation/Teguicons/32x32.dmi and b/ModularTegustation/Teguicons/32x32.dmi differ diff --git a/ModularTegustation/Teguicons/48x96.dmi b/ModularTegustation/Teguicons/48x96.dmi index 8d3dc81b330a..8a78bffbaa64 100644 Binary files a/ModularTegustation/Teguicons/48x96.dmi and b/ModularTegustation/Teguicons/48x96.dmi differ diff --git a/ModularTegustation/ego_weapons/melee/_lists.dm b/ModularTegustation/ego_weapons/melee/_lists.dm index 01b65568d47f..8d6bca6773b5 100644 --- a/ModularTegustation/ego_weapons/melee/_lists.dm +++ b/ModularTegustation/ego_weapons/melee/_lists.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(small_ego, list ( //EGO weapons /obj/item/ego_weapon/ranged/pistol, /obj/item/ego_weapon/mini, - /obj/item/ego_weapon/warp/knife, + /obj/item/ego_weapon/dimension_shredder, /obj/item/ego_weapon/support/letter_opener, /obj/item/ego_weapon/warring, /obj/item/ego_weapon/feather, diff --git a/ModularTegustation/ego_weapons/melee/he.dm b/ModularTegustation/ego_weapons/melee/he.dm index 586c72b1cd06..6e07ebd291fe 100644 --- a/ModularTegustation/ego_weapons/melee/he.dm +++ b/ModularTegustation/ego_weapons/melee/he.dm @@ -1044,23 +1044,22 @@ T.throw_at(throw_target, range, whack_speed, firer, spin = FALSE) return TRUE -/obj/item/ego_weapon/warp - name = "dimensional ripple" - desc = "They should've died after bleeding so much. You usually don't quarantine a corpse...." +/obj/item/ego_weapon/dimension_shredder + name = "dimension shredder" + desc = "The path is intent on thwarting all attempts to memorize it." special = "This weapon builds charge every 10 steps you've taken." - icon_state = "warp2" - force = 16 //Spears get increased damage, but this one has an ability - lefthand_file = 'icons/mob/inhands/weapons/ego_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/ego_righthand.dmi' - inhand_x_dimension = 32 - inhand_y_dimension = 32 - hitsound = 'sound/abnormalities/wayward_passenger/attack1.ogg' - reach = 2 - stuntime = 5 //Longer reach, gives you a short stun. + icon_state = "warp" + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + force = 13 + hitsound = 'sound/abnormalities/wayward_passenger/attack2.ogg' damtype = RED_DAMAGE + swingstyle = WEAPONSWING_LARGESWEEP + attack_speed = 0.8 attack_verb_continuous = list("stabs", "slashes", "attacks") attack_verb_simple = list("stab", "slash", "attack") - hitsound = 'sound/abnormalities/wayward_passenger/attack2.ogg' attribute_requirements = list( JUSTICE_ATTRIBUTE = 40 ) @@ -1070,35 +1069,40 @@ charge_cost = 10 var/accumulated_charge = 0 charge_effect = "Teleport and create a temporary two-way portal." + ability_type = ABILITY_UNIQUE + successfull_activation = "You will now create a dimensional rift at your target!" + cancel_activation = "You will no longer teleport through a rift." + failed_activation = "You fail to produce a dimensional rift." + var/current_holder -/obj/item/ego_weapon/warp/equipped(mob/living/carbon/human/user, slot) +/obj/item/ego_weapon/dimension_shredder/equipped(mob/living/carbon/human/user, slot) . = ..() if(!user) return RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(UserMoved)) current_holder = user -/obj/item/ego_weapon/warp/Destroy(mob/user) +/obj/item/ego_weapon/dimension_shredder/Destroy(mob/user) if(!user) return ..() UnregisterSignal(current_holder, COMSIG_MOVABLE_MOVED) current_holder = null return ..() -/obj/item/ego_weapon/warp/dropped(mob/user) +/obj/item/ego_weapon/dimension_shredder/dropped(mob/user) . = ..() if(!user) return - UnregisterSignal(current_holder, COMSIG_MOVABLE_MOVED) + UnregisterSignal(current_holder, COMSIG_MOVABLE_MOVED)//these cause runtimes current_holder = null -/obj/item/ego_weapon/warp/proc/UserMoved() +/obj/item/ego_weapon/dimension_shredder/proc/UserMoved() SIGNAL_HANDLER HandleCharge(0.1) -/obj/item/ego_weapon/warp/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) +/obj/item/ego_weapon/dimension_shredder/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) if(!CanUseEgo(user)) to_chat(user, span_notice("You cannot use this!")) return @@ -1124,7 +1128,7 @@ P2.link_portal(P1) P1.teleport(user) -/obj/item/ego_weapon/warp/HandleCharge(added_charge) // Proc override so that charge icon appears every 1 charge gained +/obj/item/ego_weapon/dimension_shredder/HandleCharge(added_charge) // Proc override so that charge icon appears every 1 charge gained if(charge_amount < 0) // ??? charge_amount = initial(charge_amount) CRASH("[src] has somehow aquired a negative charge amount, automatically reset it to the initial charge amount") @@ -1144,26 +1148,59 @@ teleport_channel = TELEPORT_CHANNEL_FREE /obj/effect/portal/warp/Crossed(atom/movable/AM, oldloc, force_stop = 0) - playsound(src, 'sound/abnormalities/wayward_passenger/teleport2.ogg', 50, TRUE)//doesn't work + playsound(src, 'sound/abnormalities/wayward_passenger/teleport2.ogg', 50, TRUE) ..() /obj/effect/portal/warp/Initialize() QDEL_IN(src, 3 SECONDS) return ..() -/obj/item/ego_weapon/warp/knife // knife subtype of the above. knife has to be the subtype because it fits in a belt - name = "dimension shredder" - desc = "The path is intent on thwarting all attempts to memorize it." - icon_state = "warp" - lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - inhand_x_dimension = 64 - inhand_y_dimension = 64 - force = 13 - swingstyle = WEAPONSWING_LARGESWEEP - attack_speed = 0.8 - reach = 1 - stuntime = 0 +/obj/item/ego_weapon/dimension_spear + name = "dimension shredder MK II" + desc = "They should've died after bleeding so much. You usually don't quarantine a corpse...." + icon_state = "warp2" + force = 20 + reach = 2 + stuntime = 5 //Longer reach, gives you a short stun. + attack_verb_continuous = list("stabs", "slashes", "attacks") + attack_verb_simple = list("stab", "slash", "attack") + hitsound = 'sound/abnormalities/wayward_passenger/attack1.ogg' + attribute_requirements = list( + JUSTICE_ATTRIBUTE = 40 + ) + + charge = TRUE + charge_cost = 0 + charge_effect = "Dump all charge into a distant strike. Performs an additional attack for every 2 charge spent." + ability_type = ABILITY_UNIQUE + successfull_activation = "You will now cleave your target through a rift!" + cancel_activation = "You will no longer attack your target through a rift." + failed_activation = "You fail to produce a dimensional rift." + +/obj/item/ego_weapon/dimension_spear/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) + if(!CanUseEgo(user)) + to_chat(user, span_notice("You cannot use this!")) + return + if(!currently_charging) + return + if(!proximity_flag) + currently_charging = FALSE + ChargeAttack(target, user) + +/obj/item/ego_weapon/dimension_spear/ChargeAttack(mob/living/target, mob/living/user) + if(!isliving(target)) + return + var/mob/living/carbon/human/H = user + var/justice_mod = 1 + (get_modified_attribute_level(H, JUSTICE_ATTRIBUTE)/100) + var/hit_damage = ((force * justice_mod)/2) + for(charge_amount, charge_amount >= 0, charge_amount -= 2) + var/turf/T = get_turf(target) + playsound(src, 'sound/abnormalities/wayward_passenger/attack2.ogg', 50, TRUE) + new /obj/effect/temp_visual/dimshredder_in(get_turf(src)) + new /obj/effect/temp_visual/dimshredder_out(T) + user.HurtInTurf(T, list(), hit_damage, RED_DAMAGE, check_faction = TRUE) + sleep(0.1 SECONDS) + charge_amount = 0 /obj/item/ego_weapon/marionette name = "marionette" diff --git a/code/datums/abnormality/_ego_datum/he.dm b/code/datums/abnormality/_ego_datum/he.dm index d6155066a0f6..994ac3f81431 100644 --- a/code/datums/abnormality/_ego_datum/he.dm +++ b/code/datums/abnormality/_ego_datum/he.dm @@ -336,18 +336,18 @@ cost = 35 //Wayward Passenger - Dimension Shredder -/datum/ego_datum/armor/warp - item_path = /obj/item/clothing/suit/armor/ego_gear/he/warp +/datum/ego_datum/armor/dimension_shredder + item_path = /obj/item/clothing/suit/armor/ego_gear/he/dimension_shredder cost = 35 -/datum/ego_datum/weapon/warp +/datum/ego_datum/weapon/dimension_shredder item_category = "Weapon (Knife)" - item_path = /obj/item/ego_weapon/warp/knife + item_path = /obj/item/ego_weapon/dimension_shredder cost = 35 -/datum/ego_datum/weapon/warp/spear +/datum/ego_datum/weapon/dimension_spear item_category = "Weapon (Spear)" - item_path = /obj/item/ego_weapon/warp + item_path = /obj/item/ego_weapon/dimension_spear cost = 35 //Missed Reaper - Grasp diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 00301c555ac2..20944f7f1651 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -1121,3 +1121,34 @@ icon = 'ModularTegustation/Teguicons/32x32.dmi' icon_state = "seasons_wisp_death" duration = 15 + +/obj/effect/temp_visual/dimshredder_in + icon = 'ModularTegustation/Teguicons/32x32.dmi' + icon_state = "ripper_in" + duration = 20 + pixel_y = 10 + pixel_x = 20 + +/obj/effect/temp_visual/dimshredder_in/Initialize() + . = ..() + var/matrix/M = matrix() + if(prob(50)) + pixel_x = -20 + transform = M.Turn(rand(-30, -90)) + else + transform = M.Turn(rand(30, 90)) + animate(src, transform = transform, time = 2) + +/obj/effect/temp_visual/dimshredder_out + icon = 'ModularTegustation/Teguicons/32x32.dmi' + icon_state = "ripper_out" + duration = 20 + layer = ABOVE_MOB_LAYER + +/obj/effect/temp_visual/dimshredder_out/Initialize() + . = ..() + var/matrix/M = matrix() + pixel_y = rand(10, 30) + transform = M.Turn(180) + transform = M.Turn(rand(-60, 60)) + animate(src, transform = transform, time = 2) diff --git a/code/modules/clothing/suits/ego_gear/he.dm b/code/modules/clothing/suits/ego_gear/he.dm index c0c5f5f04af8..a964b6c36d49 100644 --- a/code/modules/clothing/suits/ego_gear/he.dm +++ b/code/modules/clothing/suits/ego_gear/he.dm @@ -331,7 +331,7 @@ JUSTICE_ATTRIBUTE = 40 ) -/obj/item/clothing/suit/armor/ego_gear/he/warp +/obj/item/clothing/suit/armor/ego_gear/he/dimension_shredder name = "dimension shredder" desc = "I thought WARP trains were supposed to arrive in just ten seconds?" icon_state = "warp" diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/realizer.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/realizer.dm index 479ffe287d2c..065691b52fa4 100644 --- a/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/realizer.dm +++ b/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/realizer.dm @@ -32,7 +32,7 @@ /obj/item/clothing/suit/armor/ego_gear/he/logging = /obj/item/clothing/suit/armor/ego_gear/realization/empathy, /obj/item/clothing/suit/armor/ego_gear/he/courage = /obj/item/clothing/suit/armor/ego_gear/realization/valor, /obj/item/clothing/suit/armor/ego_gear/he/homing_instinct = /obj/item/clothing/suit/armor/ego_gear/realization/home, - /obj/item/clothing/suit/armor/ego_gear/he/warp = /obj/item/clothing/suit/armor/ego_gear/realization/dimension_ripper, + /obj/item/clothing/suit/armor/ego_gear/he/dimension_shredder = /obj/item/clothing/suit/armor/ego_gear/realization/dimension_ripper, // WAW /obj/item/clothing/suit/armor/ego_gear/waw/goldrush = /obj/item/clothing/suit/armor/ego_gear/realization/goldexperience, /obj/item/clothing/suit/armor/ego_gear/waw/despair = /obj/item/clothing/suit/armor/ego_gear/realization/quenchedblood, diff --git a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm index 03e838090205..a71c826b83fe 100644 --- a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm +++ b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm @@ -28,9 +28,9 @@ start_qliphoth = 1 work_chances = list( ABNORMALITY_WORK_INSTINCT = list(50, 55, 55, 55, 60), - ABNORMALITY_WORK_INSIGHT = list(40, 30, 20, 40, 40), - ABNORMALITY_WORK_ATTACHMENT = 30, - ABNORMALITY_WORK_REPRESSION = list(55, 60, 60, 60, 55), + ABNORMALITY_WORK_INSIGHT = 20, + ABNORMALITY_WORK_ATTACHMENT = 20, + ABNORMALITY_WORK_REPRESSION = 20, ) work_damage_upper = 6 work_damage_lower = 3 @@ -42,9 +42,9 @@ pixel_x = -8 ego_list = list( - /datum/ego_datum/weapon/warp, - /datum/ego_datum/weapon/warp/spear, - /datum/ego_datum/armor/warp, + /datum/ego_datum/weapon/dimension_shredder, + /datum/ego_datum/weapon/dimension_spear, + /datum/ego_datum/armor/dimension_shredder, ) gift_type = /datum/ego_gifts/warp gift_message = "This lighter is branded with a certain company logo." @@ -87,6 +87,11 @@ var/dash_cooldown = 0 var/dash_cooldown_time = 4 SECONDS var/list/been_hit = list() // Don't get hit twice. + //work vars + var/portal_type = "RED" + var/rifting = FALSE + var/obj/structure/fakeportal/work_portal + /datum/action/innate/abnormality_attack/wayward_tele name = "Teleport" @@ -114,15 +119,13 @@ /mob/living/simple_animal/hostile/abnormality/wayward/Life() . = ..() - if(!.) - return if(IsContained()) + CheckView() return if(client || IsCombatMap()) return if((teleport_cooldown <= world.time) && can_act) TryTeleport() - return /mob/living/simple_animal/hostile/abnormality/wayward/Move() if(!can_act) @@ -145,17 +148,22 @@ Dash(target) //*** Work mechanics *** +/mob/living/simple_animal/hostile/abnormality/wayward/WorkChance(mob/living/carbon/human/user, chance, work_type) + if(work_type == ABNORMALITY_WORK_INSTINCT) + if(portal_type != "RED") + chance -= 35 + if(work_type == ABNORMALITY_WORK_INSIGHT && portal_type == "WHITE") + chance += 40 + if(work_type == ABNORMALITY_WORK_ATTACHMENT && portal_type == "BLACK") + chance += 40 + if(work_type == ABNORMALITY_WORK_REPRESSION && portal_type == "PALE") + chance += 40 + return chance + /mob/living/simple_animal/hostile/abnormality/wayward/FailureEffect(mob/living/carbon/human/user, work_type, pe) . = ..() if(prob(75)) datum_reference.qliphoth_change(-1) - return - -/mob/living/simple_animal/hostile/abnormality/wayward/NeutralEffect(mob/living/carbon/human/user, work_type, pe) - . = ..() - if(prob(20)) - datum_reference.qliphoth_change(-1) - return /mob/living/simple_animal/hostile/abnormality/wayward/FearEffectText(mob/affected_mob, level = 0) level = num2text(clamp(level, -1, 4)) @@ -167,6 +175,43 @@ ) return pick(result_text_list[level]) +/mob/living/simple_animal/hostile/abnormality/wayward/proc/CheckView() + for(var/mob/living/carbon/human/H in ohearers(7, src)) + if(!rifting) + return + playsound(src, 'sound/abnormalities/wayward_passenger/teleport2.ogg', 100, 1) + flick("wayward_tpend", src) + work_portal.alpha = 0 + icon_state = initial(icon_state) + rifting = FALSE + return + if(rifting) + return + rifting = TRUE + portal_type = pick(list("RED", "WHITE", "BLACK", "PALE")) + playsound(src, 'sound/abnormalities/wayward_passenger/teleport.ogg', 600, 1) + flick("wayward_tpstart", src) + SLEEP_CHECK_DEATH(3) + icon_state = "" + work_portal.alpha = 255 + switch(portal_type)//TODO: Make unique sprites for each portal + if("RED") + work_portal.color = "#CC0C0C" + if("WHITE") + work_portal.color = "#1ef2af"//It's yellow tinted + if("BLACK") + work_portal.color = "#571278" + if("PALE") + work_portal.color = null + +/mob/living/simple_animal/hostile/abnormality/wayward/HandleStructures() + . = ..() + if(!.) + return + if(!locate(/obj/structure/fakeportal) in datum_reference.connected_structures) + SpawnConnectedStructure(/obj/structure/fakeportal) + work_portal = locate(/obj/structure/fakeportal) in datum_reference.connected_structures + //*** Breach mechanics *** /mob/living/simple_animal/hostile/abnormality/wayward/BreachEffect(mob/living/carbon/human/user, breach_type) @@ -174,11 +219,21 @@ playsound(src, 'sound/abnormalities/thunderbird/tbird_zombify.ogg', 45, FALSE, 5)//this is the sound effect used for Tomerry in the lovetown reception . = ..() +/mob/living/simple_animal/hostile/abnormality/wayward/proc/CleaveAttack() + for(var/turf/T in view(1, src)) + new /obj/effect/temp_visual/revenant(T) + SLEEP_CHECK_DEATH(10) + playsound(get_turf(src), attack_sound, 75, 0, 3) + for(var/turf/T in view(1, src)) + new /obj/effect/temp_visual/smash_effect(T) + HurtInTurf(T, list(), (melee_damage_upper * 2), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE) + SLEEP_CHECK_DEATH(3) + //*** Teleport code ***// /mob/living/simple_animal/hostile/abnormality/wayward/proc/TryTeleport(turf/teleport_target)//argument is used when the proc is called with a client if(teleport_cooldown > world.time || !can_act) return FALSE - teleport_cooldown = world.time + teleport_cooldown_time//so it doesn't get called twice by life() + teleport_cooldown = world.time + teleport_cooldown_time if(!teleport_target) var/list/teleport_potential = list() for(var/mob/living/L in GLOB.mob_living_list) @@ -193,7 +248,7 @@ if(H.is_working) continue teleport_potential += get_turf(L) - if(!LAZYLEN(teleport_potential)) + if(!LAZYLEN(teleport_potential))//Are there no human targets available? if(!LAZYLEN(GLOB.department_centers)) return var/turf/P = pick(GLOB.department_centers) @@ -215,9 +270,9 @@ P2.link_portal(P1) icon_state = "wayward_tpend" playsound(src, 'sound/abnormalities/wayward_passenger/teleport2.ogg', 100, 1) + CleaveAttack() SLEEP_CHECK_DEATH(2 SECONDS) //2 seconds to teleport density = TRUE - SLEEP_CHECK_DEATH(4) can_act = TRUE icon_state = "wayward_breach" can_dash = TRUE @@ -291,6 +346,14 @@ been_hit += V addtimer(CALLBACK(src, PROC_REF(Do_Dash), move_dir, (times_ran + 1)), 1) +/obj/structure/fakeportal + name = "dimensional rift" + desc = "A glowing, pulsating rift through space and time." + icon = 'ModularTegustation/Teguicons/48x96.dmi' + icon_state = "rift_big" + base_pixel_x = -8 + pixel_x = -8 + /obj/effect/portal/abno_warp name = "dimensional rift" desc = "A glowing, pulsating rift through space and time." diff --git a/code/modules/paperwork/records/info/he.dm b/code/modules/paperwork/records/info/he.dm index e712ca3f7802..9dfec115ea0c 100644 --- a/code/modules/paperwork/records/info/he.dm +++ b/code/modules/paperwork/records/info/he.dm @@ -460,11 +460,10 @@ abno_type = /mob/living/simple_animal/hostile/abnormality/wayward abno_code = "T-02-170"// T-02-21-07 in LCB abno_info = list( - "When the work result was Neutral, the Qliphoth Counter lowered at a low probability.", + "The entity rips open and enters a dimensional door in regular intervals. However, it has been confirmed to return should another being enter the containment unit.", + "Its work preferences shifted based on which color of dimensional door it had entered immediately prior.", "When the work result was Bad, the Qliphoth Counter lowered at a high probability.", - "Agents who witnessed the movements of Wayward Passenger reported unusually high levels of mental corruption.", - "When Wayward Passenger breached containment, it created spacial anomalies, dubbed T-01-170-1.", - "Agent Alex who entered T-01-170-1 found that it aided the suppression process.") + "Agents who witnessed the movements of Wayward Passenger reported unusually high levels of mental corruption.") // Norinori /obj/item/paper/fluff/info/he/norinori diff --git a/sound/abnormalities/wayward_passenger/attack2.ogg b/sound/abnormalities/wayward_passenger/attack2.ogg index 82c5d6d6d5df..6a42c64f5f28 100644 Binary files a/sound/abnormalities/wayward_passenger/attack2.ogg and b/sound/abnormalities/wayward_passenger/attack2.ogg differ