diff --git a/ModularTegustation/Teguicons/48x48.dmi b/ModularTegustation/Teguicons/48x48.dmi index 600f142b46d1..120f5f678551 100644 Binary files a/ModularTegustation/Teguicons/48x48.dmi and b/ModularTegustation/Teguicons/48x48.dmi differ diff --git a/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm b/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm index 8fc9b49b0657..321da10e7489 100644 --- a/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm +++ b/ModularTegustation/tegu_items/rcorp/!abno_overwrites.dm @@ -52,7 +52,9 @@ //Porccubus gets a much shorter dash cooldown to better maneuver itself with how big of a commitment dashing is. /mob/living/simple_animal/hostile/abnormality/porccubus/Initialize() if(IsCombatMap()) - ranged_cooldown_time = 3 SECONDS + maxHealth = 3000 + health = 3000 + ranged_cooldown_time = 0.5 SECONDS return ..() // Fairy gentleman gets a bump to his survival, damage, and a bigger ass. @@ -75,6 +77,24 @@ bullet_damage = 200 return ..() +//Due to Redblooded's very low damage and health, which is normaly fitting for a Teth. That causes them to underperform in R-Corp since they don't have any utility. +//For that reason his health is increased and let his ammo gimmick work by reducing his ranged cooldown. +/mob/living/simple_animal/hostile/abnormality/redblooded/Initialize() + if(SSmaptype.maptype == "rcorp") + ranged_cooldown_time = 0.5 SECONDS + maxHealth = 1200 + health = 1200 + melee_damage_lower = 15 + melee_damage_upper = 20 + casingtype = /obj/item/ammo_casing/caseless/rcorp_true_patriot + return ..() + +/mob/living/simple_animal/hostile/abnormality/ppodae/Initialize() + if(IsCombatMap()) + smash_damage_low = 32 + smash_damage_high = 40 + return ..() + //Warden deals even less damage then more bodies they eat, and they take more damage from all attacks. //Warden currently slowballs far to quickly, so this nerf should give R-Corp a better chance at fighting back against them. /mob/living/simple_animal/hostile/abnormality/warden/Initialize() @@ -96,3 +116,9 @@ heal_percent_per_second = 0.01275 r_corp_regen_start = 0.5 return ..() + +/mob/living/simple_animal/hostile/abnormality/greed_king/Initialize() + if(IsCombatMap()) + initial_charge_damage = 200 + growing_charge_damage = 80 + return ..() diff --git a/_maps/RandomRooms/rcorp/facility/nest.dmm b/_maps/RandomRooms/rcorp/facility/nest.dmm index b124257b9096..052aadc54be5 100644 --- a/_maps/RandomRooms/rcorp/facility/nest.dmm +++ b/_maps/RandomRooms/rcorp/facility/nest.dmm @@ -8,7 +8,7 @@ /area/city/outskirts) "as" = ( /obj/machinery/door/airlock/wood, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "aA" = ( /obj/effect/turf_decal/siding/wood/corner, @@ -134,7 +134,7 @@ /area/city/outskirts) "cK" = ( /obj/machinery/light/small, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "cS" = ( /obj/effect/turf_decal/trimline/green/filled/line{ @@ -298,7 +298,7 @@ /area/city/outskirts) "fs" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "fH" = ( /obj/effect/decal/cleanable/blood/drip, @@ -557,7 +557,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 10 }, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "lg" = ( /obj/effect/turf_decal/siding/wood, @@ -705,7 +705,7 @@ "nG" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/dry_ramen, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "ob" = ( /obj/structure/fluff/bus/passable, @@ -831,11 +831,11 @@ /turf/open/floor/plasteel/dark, /area/city/outskirts) "pP" = ( -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "pU" = ( /obj/machinery/griddle, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "pV" = ( /obj/machinery/conveyor{ @@ -1295,7 +1295,7 @@ /area/city/outskirts) "yk" = ( /obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "yy" = ( /turf/open/floor/plating/ashplanet/rocky, @@ -1621,7 +1621,7 @@ /obj/structure/sink/kitchen{ pixel_y = 14 }, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "Ft" = ( /obj/machinery/light/broken, @@ -2066,7 +2066,7 @@ pixel_x = -7; pixel_y = 4 }, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "OC" = ( /obj/structure/fluff/bus/passable/seat, @@ -2384,7 +2384,7 @@ /area/city/outskirts) "Tc" = ( /obj/machinery/vending/dinnerware, -/turf/open/floor/plasteel/airless/white, +/turf/open/floor/plasteel/white, /area/city/outskirts) "Td" = ( /obj/machinery/light/floor, diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index c95c9f4eed8f..2fc5875bfddd 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -35,6 +35,7 @@ /// the higher this number, the more projectiles are created as shrapnel var/shrapnel_radius var/shrapnel_initialized + var/thrower /obj/item/grenade/suicide_act(mob/living/carbon/user) user.visible_message("[user] primes [src], then eats it! It looks like [user.p_theyre()] trying to commit suicide!") @@ -107,6 +108,7 @@ active = TRUE icon_state = initial(icon_state) + "_active" SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time, delayoverride) + thrower = user addtimer(CALLBACK(src, PROC_REF(detonate)), isnull(delayoverride)? det_time : delayoverride) /** @@ -116,6 +118,7 @@ * * lanced_by- If this grenade was detonated by an elance, we need to pass that along with the COMSIG_GRENADE_DETONATE signal for pellet clouds */ /obj/item/grenade/proc/detonate(mob/living/lanced_by) + thrower = null if(shrapnel_type && shrapnel_radius && !shrapnel_initialized) // add a second check for adding the component in case whatever triggered the grenade went straight to prime (badminnery for example) shrapnel_initialized = TRUE AddComponent(/datum/component/pellet_cloud, projectile_type=shrapnel_type, magnitude=shrapnel_radius) diff --git a/code/game/objects/items/grenades/r_corp.dm b/code/game/objects/items/grenades/r_corp.dm index 9ee69341da9b..14e98b54f07e 100644 --- a/code/game/objects/items/grenades/r_corp.dm +++ b/code/game/objects/items/grenades/r_corp.dm @@ -3,10 +3,11 @@ desc = "An anti-abnormality grenade, this weapon excels at damaging abnormality using the tech from L-Corp. It deals 90% less damage to humans." icon_state = "r_corp" var/explosion_damage_type = RED_DAMAGE - var/explosion_damage = 300 + var/explosion_damage = 200 var/explosion_range = 2 /obj/item/grenade/r_corp/detonate(mob/living/lanced_by) + var/aThrower = thrower . = ..() update_mob() new /obj/effect/temp_visual/explosion(get_turf(src)) @@ -14,7 +15,7 @@ for(var/mob/living/simple_animal/H in view(explosion_range, src)) H.apply_damage(explosion_damage, explosion_damage_type, null, H.run_armor_check(null, RED_DAMAGE)) for(var/mob/living/carbon/C in view(explosion_range, src)) - C.apply_damage(explosion_damage * 0.1, explosion_damage_type, null, C.run_armor_check(null, RED_DAMAGE)) + C.apply_damage(C == aThrower ? explosion_damage * 0.5 : explosion_damage * 0.1, explosion_damage_type, null, C.run_armor_check(null, RED_DAMAGE)) qdel(src) /obj/item/grenade/r_corp/white @@ -31,4 +32,4 @@ name = "r-corp pale grenade" icon_state = "r_corp_pale" explosion_damage_type = PALE_DAMAGE - explosion_damage = 250 + explosion_damage = 150 diff --git a/code/modules/mob/living/simple_animal/abnormality/he/eris.dm b/code/modules/mob/living/simple_animal/abnormality/he/eris.dm index 21b1487061c6..baf042185d12 100644 --- a/code/modules/mob/living/simple_animal/abnormality/he/eris.dm +++ b/code/modules/mob/living/simple_animal/abnormality/he/eris.dm @@ -56,7 +56,6 @@ Hours later, Eris dines with another stranger.
My head is resting on that very same plate." var/girlboss_level = 0 - var/can_heal = TRUE /mob/living/simple_animal/hostile/abnormality/eris/Login() . = ..() @@ -64,7 +63,7 @@ |Humanoid Disguise|: You are only able to attack humans who only have a very low amount of health, or if they are dead.
\ If they attack a human who fulfills the above conditions, you will devor them, and gain a stack of 'Girl Boss'
\
\ - |Dine with me...|: Every second, you heal ALL targets that you can see if they are bellow half health.
\ + |Dine with me...|: Every second, you heal ALL targets that you can see.
\ Your healing increases depending on the amount of 'Girl Boss' you have.
\
\ |Elegant Form|: When you are attacked by a human, deal WHITE damage to the attack. This damage is increase depending on your 'Girl Boss' stacks.
") @@ -192,17 +191,12 @@ //Okay, but here's the math /mob/living/simple_animal/hostile/abnormality/eris/proc/healpulse() for(var/mob/living/H in view(10, get_turf(src))) - can_heal = TRUE if(H.stat >= SOFT_CRIT) continue //Shamelessly fucking stolen from risk of rain's teddy bear. Maxes out at 20. - if(SSmaptype.maptype == "rcorp") - if(H.health > H.maxHealth*0.5) - can_heal = FALSE - if (can_heal == TRUE) - var/healamount = 20 * (TOUGHER_TIMES(girlboss_level)) - H.adjustBruteLoss(-healamount) //Healing for those around. - new /obj/effect/temp_visual/heal(get_turf(H), "#FF4444") + var/healamount = 20 * (TOUGHER_TIMES(girlboss_level)) + H.adjustBruteLoss(-healamount) //Healing for those around. + new /obj/effect/temp_visual/heal(get_turf(H), "#FF4444") //Okay but here's the defensive options /mob/living/simple_animal/hostile/abnormality/eris/bullet_act(obj/projectile/Proj) diff --git a/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm b/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm index cff432a39da1..47cf24cd06b4 100644 --- a/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm +++ b/code/modules/mob/living/simple_animal/abnormality/he/porccubus.dm @@ -59,9 +59,25 @@ var/teleport_cooldown_time = 5 MINUTES var/teleport_cooldown var/damage_taken = FALSE + var/leap_recharge_time = 2 SECONDS + var/leap_charges = 3 + var/max_leap_charges = 3 + var/timer_added = FALSE + var/in_charging = FALSE + attack_action_types = list(/datum/action/innate/abnormality_attack/toggle/porccubus_dash_toggle) + +/mob/living/simple_animal/hostile/abnormality/porccubus/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, "

You are Porccubus, A Tank Role Abnormality.


\ + |Fluttering|: You are immune to all projectiles. However you are unable to move. \ + However, If you click on a tile that is at least 3 tiles away from you. You will spend a leap charge to dash to that tile. \ + You regain a leap charge every 3 seconds, and you can hold a max of 3 at a time.
\ +
\ + |Happiness|: Your melee attack has a range of 2 tiles.
") //PLAYABLE ATTACKS - attack_action_types = list(/datum/action/innate/abnormality_attack/toggle/porccubus_dash_toggle) /datum/action/innate/abnormality_attack/toggle/porccubus_dash_toggle name = "Toggle Dash" @@ -171,31 +187,52 @@ //Breach Code Attacks /mob/living/simple_animal/hostile/abnormality/porccubus/OpenFire(atom/A) if(client) - if(ranged_cooldown > world.time || chosen_attack != 1) - RangedAttack(A) + if(!IsCombatMap()) + if(ranged_cooldown > world.time || chosen_attack != 1) + RangedAttack(A) switch(chosen_attack) if(1) - PorcDash(target) + DashChecker(target) return if(!target) return if(!isliving(target)) return - PorcDash(A) + DashChecker(A) -/mob/living/simple_animal/hostile/abnormality/porccubus/proc/PorcDash(atom/target)//additionally, it can dash to its target every 15 seconds if it's out of range +/mob/living/simple_animal/hostile/abnormality/porccubus/proc/DashChecker(atom/target) var/dist = get_dist(target, src) - if(dist > 2 && ranged_cooldown < world.time) - ranged_cooldown = world.time + ranged_cooldown_time - var/list/dash_line = getline(src, target) - for(var/turf/line_turf in dash_line) //checks if there's a valid path between the turf and the friend - if(line_turf.is_blocked_turf(exclude_mobs = TRUE)) - break - forceMove(line_turf) - SLEEP_CHECK_DEATH(0.8) - playsound(src, 'sound/abnormalities/porccubus/porccu_giggle.ogg', 10, FALSE, 4) // This thing is absurdly loud - ranged_cooldown = world.time + ranged_cooldown_time + if(IsCombatMap()) + if(dist > 2 && leap_charges > 0 && !in_charging) + PorcDash(target) + else + if(dist > 2 && ranged_cooldown < world.time) + ranged_cooldown = world.time + ranged_cooldown_time + PorcDash(target) + +/mob/living/simple_animal/hostile/abnormality/porccubus/proc/PorcDash(atom/target)//additionally, it can dash to its target every 15 seconds if it's out of range + // var/dist = get_dist(target, src) + // if(IsCombatMap()) + // if(dist > 2 && charges > 0) + // else + // if(dist > 2 && ranged_cooldown < world.time) + // ranged_cooldown = world.time + ranged_cooldown_time + in_charging = TRUE + var/list/dash_line = getline(src, target) + for(var/turf/line_turf in dash_line) //checks if there's a valid path between the turf and the friend + if(line_turf.is_blocked_turf(exclude_mobs = TRUE)) + break + forceMove(line_turf) + SLEEP_CHECK_DEATH(1) + playsound(src, 'sound/abnormalities/porccubus/porccu_giggle.ogg', 10, FALSE, 4) // This thing is absurdly loud + ranged_cooldown = world.time + ranged_cooldown_time + if(IsCombatMap()) + leap_charges -= 1 + if(!timer_added) + addtimer(CALLBACK(src, PROC_REF(AddCharge)), leap_recharge_time) + timer_added = TRUE + in_charging = FALSE /mob/living/simple_animal/hostile/abnormality/porccubus/AttackingTarget(atom/attacked_target) var/mob/living/carbon/human/H @@ -214,6 +251,15 @@ LoseTarget() H.faction += "porccubus" //that guy's already fucked, even if they can kill porccubus safely now, porccubus has done its job of being a cunt +/mob/living/simple_animal/hostile/abnormality/porccubus/proc/AddCharge() + if(leap_charges < max_leap_charges) + leap_charges++ + to_chat(src, " You now have [leap_charges]/[max_leap_charges] leap charges.") + timer_added = FALSE + if(leap_charges < max_leap_charges) + addtimer(CALLBACK(src, PROC_REF(AddCharge)), leap_recharge_time) + timer_added = TRUE + //Drug Item //this is only obtainable if someone else dies from the addiction, but it's the only way to get drugged without working on porccubus /obj/item/porccubus_drug diff --git a/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm b/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm index 7f54df0e2df4..6164b866d5e1 100644 --- a/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm +++ b/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm @@ -58,6 +58,94 @@ var/finishing = FALSE var/braineating = TRUE var/healthmodifier = 0.05 // Can restore 30% of HP + var/attack_healthmodifier = 0.05 + var/target_hit = FALSE + var/hunger = FALSE + + attack_action_types = list(/datum/action/cooldown/hungering) + +/mob/living/simple_animal/hostile/abnormality/scarecrow/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, "

You are Scarecrow Searching for Wisdom, A Tank Role Abnormality.


\ + |Seeking Wisdom|: When you attack corpses, You heal.
\ + Unlike other abnormalities which use corpses, you are able to reuse the corpses you drain as many times as you would like.
\ + |Hungering for Wisdom|: You have an ability which causes you to enter a 'Hungering' State.
\ + While you are in the 'Hungering' State, You have increased movement speed and melee damage. As well, Your melee attack heal 5% of your max HP on hit.
\ + You will need to hit at least on human every 6 seconds in order to keep this state active.
\ + However, If you don't hit any humans you will lose 5% of your max HP, become slowed down for 3.5 seconds and lose your 'Hungering' state.
") + +/datum/action/cooldown/hungering + name = "Hungering for Wisdom" + icon_icon = 'icons/mob/actions/actions_rcorp.dmi' + button_icon_state = "hungering" + desc = "Gain a short speed/damage boost to rush at your foes!" + cooldown_time = 300 + var/speeded_up = 1.5 + var/punishment_speed = 6 + var/speed_duration = 60 + var/weaken_duration = 30 + var/min_dam_buff = 35 + var/max_dam_buff = 40 + var/min_dam_old + var/max_dam_old + var/old_speed + +/datum/action/cooldown/hungering/Trigger() + if(!..()) + return FALSE + if (istype(owner, /mob/living/simple_animal/hostile/abnormality/scarecrow)) + var/sound/heartbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE) + var/mob/living/simple_animal/hostile/abnormality/scarecrow/H = owner + if(H.hunger == TRUE) + to_chat(H, span_nicegreen("YOU ARE RUSHING RIGHT NOW!")) + return FALSE + else + old_speed = H.move_to_delay + H.move_to_delay = speeded_up + H.playsound_local(get_turf(H),heartbeat,40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + H.UpdateSpeed() + H.target_hit = FALSE + H.color = "#ff5770" + H.manual_emote("starts twitching...") + H.hunger = TRUE + min_dam_old = H.melee_damage_lower + max_dam_old = H.melee_damage_upper + H.melee_damage_lower = min_dam_buff + H.melee_damage_upper = max_dam_buff + to_chat(H, span_nicegreen("THEIR WISDOM, SHALL BE YOURS!")) + addtimer(CALLBACK(src, PROC_REF(Hunger)), speed_duration) + StartCooldown() + +/datum/action/cooldown/hungering/proc/Hunger() + if (istype(owner, /mob/living/simple_animal/hostile/abnormality/scarecrow)) + var/mob/living/simple_animal/hostile/abnormality/scarecrow/H = owner + if (H.target_hit) + addtimer(CALLBACK(src, PROC_REF(Hunger)), speed_duration) + H.target_hit = FALSE + to_chat(H, span_nicegreen("YOUR FEAST CONTINUES!")) + else + H.stop_sound_channel(CHANNEL_HEARTBEAT) + H.melee_damage_lower = min_dam_old + H.melee_damage_upper = max_dam_old + H.move_to_delay = punishment_speed + H.deal_damage(100, WHITE_DAMAGE) + H.color = null + H.manual_emote("starts slowing down...") + to_chat(H, span_userdanger("No... I need that wisdom...")) + H.target_hit = TRUE + addtimer(CALLBACK(src, PROC_REF(RushEnd)), weaken_duration) + H.UpdateSpeed() + +/datum/action/cooldown/hungering/proc/RushEnd() + if (istype(owner, /mob/living/simple_animal/hostile/abnormality/scarecrow)) + var/mob/living/simple_animal/hostile/abnormality/scarecrow/H = owner + H.move_to_delay = old_speed + to_chat(H, span_nicegreen("You calm down from your feast...")) + H.hunger = FALSE + H.UpdateSpeed() + /mob/living/simple_animal/hostile/abnormality/scarecrow/CanAttack(atom/the_target) if(finishing) @@ -80,7 +168,11 @@ if(.) if(!istype(attacked_target, /mob/living/carbon/human)) return - var/mob/living/carbon/human/H = attacked_target + target_hit = TRUE + if (hunger == TRUE) + adjustBruteLoss(-(maxHealth*attack_healthmodifier)) + playsound(get_turf(src), 'sound/abnormalities/scarecrow/start_drink.ogg', 50, 1) + var/mob/living/carbon/human/H = target if(H.health < 0 && stat != DEAD && !finishing && H.getorgan(/obj/item/organ/brain)) finishing = TRUE H.Stun(10 SECONDS) @@ -91,10 +183,11 @@ finishing = FALSE return playsound(get_turf(src), 'sound/abnormalities/scarecrow/drink.ogg', 50, 1) - if(H.health < -120) //prevents infinite healing, corpse is too mangled - break + if (!IsCombatMap()) + if(H.health < -120) //prevents infinite healing, corpse is too mangled + break + H.adjustBruteLoss(20) adjustBruteLoss(-(maxHealth*healthmodifier)) - H.adjustBruteLoss(20) SLEEP_CHECK_DEATH(4) if(!targets_from.Adjacent(H) || QDELETED(H)) finishing = FALSE diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm b/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm index 9aacdb8453c4..634b1b1a988c 100644 --- a/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm +++ b/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm @@ -35,6 +35,7 @@ ) gift_type = /datum/ego_gifts/cute abnormality_origin = ABNORMALITY_ORIGIN_LOBOTOMY + attack_action_types = list(/datum/action/cooldown/ppodae_transform) observation_prompt = "Before me stands a creature, eagerly awaiting its next meal. The creature is..." observation_choices = list("A puppy", "A monster") @@ -47,6 +48,80 @@ var/smash_length = 2 var/smash_width = 1 var/can_act = TRUE + var/buff_form = TRUE + //Buff Form stuff + var/buff_resist_red = 0.5 + var/buff_resist_white = 0.5 + var/buff_resist_black = 0.5 + var/buff_resist_pale = 0.5 + var/buff_speed = 2 + var/can_slam = TRUE + //Cute Form stuff + var/cute_resist_red = 1.5 + var/cute_resist_white = 0.8 + var/cute_resist_black = 1 + var/cute_resist_pale = 2 + var/cute_speed = 1 + //Other Stuff + var/limb_heal = 0.1 + + +/mob/living/simple_animal/hostile/abnormality/ppodae/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, "

You are Ppodae, A Support/Combat Role Abnormality.


\ + |How adorable!|: You are able to switch between a 'Cute' and 'Buff' form. \ + Switching between forms has a 5 second cooldown and each time you switch forms you create smoke which lasts for 9 seconds.
\ +
\ + |Cute!|: While you are in your 'Cute' form, you have a MASSIVE speed boost and if you try to melee attack mechs or living mobs, you will crawl under them.
\ +
\ + |Strong!|: While you are in your 'Buff' form, you take 50% less damage from all attacks and you prefrom a 3x3 AoE attack when you try to melee attack, (Really good at breaking down Structures)
\ +
\ + |He's just Playing|: When you melee attack a unconscious or dead human body, you are able to tear off a limb, which heals you 10% of your max HP. (You can do this 4 time per body)
") + +/datum/action/cooldown/ppodae_transform + name = "Transform!" + icon_icon = 'icons/mob/actions/actions_abnormality.dmi' + button_icon_state = "ppodae_transform" + check_flags = AB_CHECK_CONSCIOUS + transparent_when_unavailable = TRUE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/ppodae_transform/Trigger() + if(!..()) + return FALSE + if(!istype(owner, /mob/living/simple_animal/hostile/abnormality/ppodae)) + return FALSE + var/mob/living/simple_animal/hostile/abnormality/ppodae/ppodae = owner + if(ppodae.IsContained()) // No more using cooldowns while contained + return FALSE + StartCooldown() + if(ppodae.buff_form) + ppodae.buff_form = FALSE + ppodae.UpdateForm() + else + ppodae.buff_form = TRUE + ppodae.UpdateForm() + return TRUE + +/mob/living/simple_animal/hostile/abnormality/ppodae/proc/UpdateForm() + if(buff_form) + ChangeResistances(list(RED_DAMAGE = buff_resist_red, WHITE_DAMAGE = buff_resist_white, BLACK_DAMAGE = buff_resist_black, PALE_DAMAGE = buff_resist_pale)) + move_to_delay = buff_speed + icon_state = "ppodae_active" + can_slam = TRUE + else + ChangeResistances(list(RED_DAMAGE = cute_resist_red, WHITE_DAMAGE = cute_resist_white, BLACK_DAMAGE = cute_resist_black, PALE_DAMAGE = cute_resist_pale)) + move_to_delay = cute_speed + icon_state = "ppodae" + can_slam = FALSE + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(1, src) + smoke.start() + qdel(smoke) + UpdateSpeed() + playsound(get_turf(src), 'sound/abnormalities/scaredycat/cateleport.ogg', 50, 0, 5) /mob/living/simple_animal/hostile/abnormality/ppodae/Move() if(!can_act) @@ -56,23 +131,49 @@ /mob/living/simple_animal/hostile/abnormality/ppodae/AttackingTarget(atom/attacked_target) if(!can_act) return FALSE - var/mob/living/carbon/L = attacked_target - if(iscarbon(attacked_target) && (L.health < 0 || L.stat == DEAD)) - if(HAS_TRAIT(L, TRAIT_NODISMEMBER)) + var/mob/living/carbon/L = target + if(IsCombatMap()) + if(iscarbon(target) && (L.stat == DEAD)) + LimbSteal(L) + return + else + if(iscarbon(target) && (L.health < 0 || L.stat == DEAD)) + LimbSteal(L) return - var/list/parts = list() - for(var/X in L.bodyparts) - var/obj/item/bodypart/bp = X - if(bp.body_part != HEAD && bp.body_part != CHEST) - if(bp.dismemberable) - parts += bp - if(length(parts)) - var/obj/item/bodypart/bp = pick(parts) - bp.dismember() - bp.forceMove(get_turf(datum_reference.landmark)) // Teleports limb to containment - QDEL_NULL(src) + // Taken from eldritch_demons.dm - return Smash(attacked_target) + if(IsCombatMap()) + if(can_slam) + return Smash(target) + else if(isvehicle(target)) + var/obj/vehicle/V = target + var/turf/target_turf = get_turf(V) + forceMove(target_turf) + manual_emote("crawls under [V]!") + else if (istype(target, /mob/living)) + if (target != src) + var/turf/target_turf = get_turf(target) + forceMove(target_turf) + manual_emote("crawls under [target]!") + else + return Smash(target) + +/mob/living/simple_animal/hostile/abnormality/ppodae/proc/LimbSteal(mob/living/carbon/L) + if(HAS_TRAIT(L, TRAIT_NODISMEMBER)) + return + var/list/parts = list() + for(var/X in L.bodyparts) + var/obj/item/bodypart/bp = X + if(bp.body_part != HEAD && bp.body_part != CHEST) + if(bp.dismemberable) + parts += bp + if(length(parts)) + var/obj/item/bodypart/bp = pick(parts) + bp.dismember() + if(IsCombatMap()) + adjustHealth(-(maxHealth * limb_heal)) + bp.forceMove(get_turf(datum_reference.landmark)) // Teleports limb to containment + QDEL_NULL(src) //AoE attack taken from woodsman /mob/living/simple_animal/hostile/abnormality/ppodae/proc/Smash(target) @@ -165,7 +266,7 @@ var/smash_damage = rand(smash_damage_low, smash_damage_high) for(var/turf/T in area_of_effect) new /obj/effect/temp_visual/smash_effect(T) - HurtInTurf(T, list(), smash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE) + HurtInTurf(T, list(), smash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE) playsound(get_turf(src), 'sound/abnormalities/ppodae/bark.wav', 100, 0, 5) playsound(get_turf(src), 'sound/abnormalities/ppodae/attack.wav', 50, 0, 5) SLEEP_CHECK_DEATH(0.5 SECONDS) @@ -185,3 +286,5 @@ . = ..() icon_state = "ppodae_active" GiveTarget(user) + if(IsCombatMap()) + UpdateForm() diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm b/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm index f1d80feee7c4..3b6722d4fd15 100644 --- a/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm +++ b/code/modules/mob/living/simple_animal/abnormality/teth/redblooded.dm @@ -61,6 +61,10 @@ \"Without a flag to protect, without a goal to achieve...\"
\ \"Are you any better than an animal?
Get out of my sight.\"" + var/ammo = 6 + var/max_ammo = 6 + var/reload_time = 2 SECONDS + var/last_reload_time = 0 var/bloodlust = 0 //more you do repression, more damage it deals. decreases on other works. var/list/fighting_quotes = list( "Go ahead, freakshit! Do your best!", @@ -86,6 +90,14 @@ "This is going to be fun!", ) +/mob/living/simple_animal/hostile/abnormality/redblooded/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, "

You are Red Blooded American, A Support Role Abnormality.


\ + |The American Way|: When you pick on a tile at least 2 sqrs away, You will consume 1 ammo to fire 6 pellets which deal 18 damage each.
\ + You passively reload 1 ammo every 2 seconds, but you can also reload 1 ammo by hitting humans or mechs.
") + /mob/living/simple_animal/hostile/abnormality/redblooded/AttemptWork(mob/living/carbon/human/user, work_type) work_damage_amount = 6 + bloodlust if(work_type == ABNORMALITY_WORK_REPRESSION) @@ -123,6 +135,27 @@ BreachEffect() return +//Breach +/mob/living/simple_animal/hostile/abnormality/redblooded/proc/Reload() + playsound(src, 'sound/weapons/gun/general/bolt_rack.ogg', 25, TRUE) + to_chat(src, span_nicegreen("You reload your shotgun...")) + ammo += 1 + +/mob/living/simple_animal/hostile/abnormality/redblooded/Life() + . = ..() + if (last_reload_time < world.time - reload_time) + last_reload_time = world.time + if (ammo < max_ammo) + Reload() + +/mob/living/simple_animal/hostile/abnormality/redblooded/AttackingTarget() + if(ammo < max_ammo) + if(isliving(target)) + Reload() + if(ismecha(target)) + Reload() + return ..() + /mob/living/simple_animal/hostile/abnormality/redblooded/BreachEffect(mob/living/carbon/human/user, breach_type) . = ..() icon_state = "american_aggro" @@ -134,9 +167,15 @@ return ..() /mob/living/simple_animal/hostile/abnormality/redblooded/OpenFire(atom/A) - if(get_dist(src, A) <= 2) + if(get_dist(src, A) >= 2) + if(ammo <= 0) + to_chat(src, span_warning("Out of ammo!")) + return FALSE + else + ammo -= 1 + return ..() + else return FALSE - return ..() //Projectiles /obj/item/ammo_casing/caseless/true_patriot @@ -152,3 +191,17 @@ damage_type = RED_DAMAGE damage = 8 + +/obj/item/ammo_casing/caseless/rcorp_true_patriot + name = "true patriot casing" + desc = "a true patriot casing" + projectile_type = /obj/projectile/rcorp_true_patriot + pellets = 6 + variance = 25 + +/obj/projectile/rcorp_true_patriot + name = "american pellet" + desc = "100% real, surplus military ammo." + damage_type = RED_DAMAGE + + damage = 18 diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm index 878d3cf3dd27..98c94cf91957 100644 --- a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm +++ b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm @@ -59,6 +59,7 @@ var/charge_damage = 350 var/eaten = FALSE var/damage_taken + var/slam_damage = 100 attack_action_types = list( /datum/action/innate/abnormality_attack/toggle/monk_charge, @@ -159,6 +160,7 @@ damage_taken += . if(damage_taken >= 200 && !charge_ready) charge_ready = TRUE + to_chat(src, span_userdanger("YOU ARE READY TO CHARGE!")) /mob/living/simple_animal/hostile/abnormality/clouded_monk/Goto(target, delay, minimum_distance) if(revving_charge || charging) @@ -239,7 +241,7 @@ SLEEP_CHECK_DEATH(get_dist(src, T) * movespeed) EndCharge() -/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/EndCharge() +/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/EndCharge(bump = FALSE) if(!charging) return charging = FALSE @@ -247,6 +249,22 @@ walk(src, 0) // cancel the movement icon_state = icon_aggro + if (!bump && SSmaptype.maptype == "rcorp") + var/turf/T = get_turf(src) + for(var/turf/TF in range(2, T))//Smash AOE visual + new /obj/effect/temp_visual/smash_effect(TF) + for(var/mob/living/L in range(2, T))//damage applied to targets in range + if(faction_check_mob(L)) + continue + if(L.z != z) + continue + visible_message(span_boldwarning("[src] slams [L]!")) + to_chat(L, span_userdanger("[src] slams you!")) + var/turf/LT = get_turf(L) + new /obj/effect/temp_visual/kinetic_blast(LT) + L.apply_damage(slam_damage,RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) + playsound(L, 'sound/creatures/lc13/lovetown/slam.ogg', 75, 1) + /mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/ResetCharge() monk_charge_cooldown = world.time + monk_charge_cooldown_time charge_ready = FALSE //redundancy is good @@ -276,11 +294,12 @@ playsound(src, 'sound/abnormalities/clouded_monk/eat_groggy.ogg', 75, 1) else L.adjustRedLoss(charge_damage/10) - EndCharge() + EndCharge(TRUE) ResetCharge() else if(isvehicle(A)) var/obj/vehicle/V = A - V.take_damage(charge_damage/10, RED_DAMAGE) + V.take_damage(charge_damage*1.5, RED_DAMAGE) for(var/mob/living/occupant in V.occupants) to_chat(occupant, span_userdanger("Your [V.name] is bit by [src]!")) + EndCharge(FALSE) return ..() diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm b/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm index f6e25e918c58..ef45cf2f8667 100644 --- a/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm +++ b/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm @@ -54,6 +54,8 @@ var/dash_num = 50 //Mostly a safeguard var/list/been_hit = list() var/can_act = TRUE + var/initial_charge_damage = 800 + var/growing_charge_damage = 0 var/nihil_present = FALSE @@ -83,8 +85,8 @@ |Gilded Cage|: Your size is 3 by 3 tiles wide, however you can still fit in 1 by 1 areas.
\
\ |Endless Hunger|: When you click on a tile outside your melee range, you will start charging into the direction you clicked.
\ - There is a 1.5 second delay before you start charging, once you start charging into a direction you will constantly move in one direction.
\ - If human gets within your melee range while charging, you will instantly gib them. If a abnormality appears in your path, you will deal damage to them.
\ + Once you start charging into a direction you will constantly move in one direction.
\ + Initialy, your charge deal 200 RED damage, but for every tile you move you deal an extra 40 RED damage.
\ Your charge ends after you move into a wall, or any dense object. (RHINOS/OTHER ABNORMALITIES WILL STOP YOUR CHARGE)
") /datum/action/innate/abnormality_attack/kog_dash @@ -170,7 +172,7 @@ var/dir_to_target = get_cardinal_dir(get_turf(src), get_turf(target)) if(dir_to_target) can_act = FALSE - addtimer(CALLBACK(src, PROC_REF(charge), dir_to_target, 0, target), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(charge), dir_to_target, 0, initial_charge_damage), 2 SECONDS) return return @@ -183,35 +185,10 @@ var/dir_to_target = get_cardinal_dir(get_turf(src), get_turf(target)) can_act = FALSE // do particle effect - if (IsCombatMap()) - manual_emote("starts shaking...") - SLEEP_CHECK_DEATH(15) - addtimer(CALLBACK(src, PROC_REF(warning_effect), get_turf(src), dir_to_target, 0, target), 0 SECONDS) - charge(dir_to_target, 0, target) + charge(dir_to_target, 0, initial_charge_damage) return -/obj/effect/temp_visual/cult/sparks/greed - duration = 4 - -/mob/living/simple_animal/hostile/abnormality/greed_king/proc/warning_effect(turf, move_dir, times_ran, target) - var/stop_warning = FALSE - if(times_ran >= dash_num) - stop_warning = TRUE - var/turf/T = get_step(turf, move_dir) - if(!T) - stop_warning = TRUE - return - if(T.density) - stop_warning = TRUE - for(var/obj/machinery/door/D in T.contents) - if(D.density) - stop_warning = TRUE - for(var/turf/open/R in range(1, T)) - new /obj/effect/temp_visual/cult/sparks/greed(R) - if (!stop_warning) - addtimer(CALLBACK(src, PROC_REF(warning_effect), T, move_dir, (times_ran + 1)), 1) - -/mob/living/simple_animal/hostile/abnormality/greed_king/proc/charge(move_dir, times_ran, target) +/mob/living/simple_animal/hostile/abnormality/greed_king/proc/charge(move_dir, times_ran, charge_damage) setDir(move_dir) var/stop_charge = FALSE if(times_ran >= dash_num) @@ -251,7 +228,7 @@ playsound(L, attack_sound, 75, 1) new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) if(ishuman(L)) - L.deal_damage(800, RED_DAMAGE) + L.deal_damage(charge_damage, RED_DAMAGE) else L.adjustRedLoss(80) if(L.stat >= HARD_CRIT) @@ -278,7 +255,9 @@ playsound(src,'sound/effects/bamf.ogg', 70, TRUE, 20) for(var/turf/open/R in range(1, src)) new /obj/effect/temp_visual/small_smoke/halfsecond(R) - addtimer(CALLBACK(src, PROC_REF(charge), move_dir, (times_ran + 1)), 2) + if (IsCombatMap()) + charge_damage = charge_damage + growing_charge_damage + addtimer(CALLBACK(src, PROC_REF(charge), move_dir, (times_ran + 1), charge_damage), 2) /mob/living/simple_animal/hostile/abnormality/greed_king/proc/endCharge() can_act = TRUE diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm b/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm index a38b22cdd280..27293fabcd5f 100644 --- a/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm +++ b/code/modules/mob/living/simple_animal/abnormality/waw/warden.dm @@ -56,7 +56,7 @@ var/captured_souls = 0 - var/resistance_decrease = 0.5 + var/resistance_decrease = 0.2 var/base_red_resistance = 0.7 var/base_white_resistance = 1.2 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d8453dbb326b..cb9469f97c39 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -375,8 +375,10 @@ projectile_piercing = PASSMOB /obj/projectile/beam/laser/iff/on_hit(atom/target, blocked = FALSE) - if(ishuman(target)) - return + if(isliving(target)) + var/mob/living/L = target + if("neutral" in L.faction) + return nodamage = FALSE . = ..() qdel(src) diff --git a/icons/mob/actions/actions_abnormality.dmi b/icons/mob/actions/actions_abnormality.dmi index 0e9f0cea9b0a..2af44ab1be4a 100644 Binary files a/icons/mob/actions/actions_abnormality.dmi and b/icons/mob/actions/actions_abnormality.dmi differ diff --git a/icons/mob/actions/actions_rcorp.dmi b/icons/mob/actions/actions_rcorp.dmi new file mode 100644 index 000000000000..c3ccc57061ca Binary files /dev/null and b/icons/mob/actions/actions_rcorp.dmi differ