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