diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm index a462e967bc01..9fe0f4edd9e5 100644 --- a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm +++ b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm @@ -3,17 +3,31 @@ desc = "A very wide humanoid with long arms made of green, dripping slime." icon = 'ModularTegustation/Teguicons/96x64.dmi' icon_state = "fairy_gentleman" - maxHealth = 600 - health = 600 + maxHealth = 900 + health = 900 + rapid_melee = 1 + melee_queue_distance = 2 + move_to_delay = 5 + damage_coeff = list(BRUTE = 1, RED_DAMAGE = 0.7, WHITE_DAMAGE = 1.5, BLACK_DAMAGE = 1, PALE_DAMAGE = 2) + melee_damage_lower = 6 + melee_damage_upper = 12 + melee_damage_type = WHITE_DAMAGE //Low damage - makes you drunk on a hit + armortype = WHITE_DAMAGE + stat_attack = HARD_CRIT + attack_sound = 'sound/abnormalities/fairygentleman/ego_sloshing.ogg' + attack_verb_continuous = "slaps" + attack_verb_simple = "slap" + can_breach = TRUE threat_level = TETH_LEVEL + start_qliphoth = 1 work_chances = list( ABNORMALITY_WORK_INSTINCT = 60, ABNORMALITY_WORK_INSIGHT = 45, ABNORMALITY_WORK_ATTACHMENT = list(50, 50, 55, 55, 60), ABNORMALITY_WORK_REPRESSION = list(30, 25, 25, 20, 15) ) - pixel_x = -32 - base_pixel_x = -32 + pixel_x = -16 + base_pixel_x = -16 work_damage_amount = 8 work_damage_type = RED_DAMAGE @@ -24,26 +38,55 @@ gift_type = /datum/ego_gifts/sloshing gift_message = "This wine tastes quite well..." abnormality_origin = ABNORMALITY_ORIGIN_LIMBUS + var/can_act = TRUE + var/jump_cooldown = 0 + var/jump_cooldown_time = 8 SECONDS + var/jump_damage = 30 + var/jump_sound = 'sound/abnormalities/fairygentleman/jump.ogg' + var/jump_aoe = 1 + var/list/give_drink = list( "You quite an interesting one, Feel free to take this drink! It is on the house!", - "Aright, I think you deserve this drink! Drink as much as you can!", - "HA HA HA HA!!! That was quite funny of you, Feel free to take this drink from my hands.", - "Come on now, No need to worry about this drink. I made it so you can just relax...", - "*Burp* Oh, That was quite rude of me. Here is a drink as an apology for my behavior" + "Attaboy, I think you deserve this! Drink! Drink 'til you're half seas over!", + "HA HA HA HA!!! You can really talk an earful! Here, have one on me!", + "Come on now, no need to worry. Try some of this giggle water, it's the bee's knees!", + "Plum outta luck for eatery, I’ve already had all the food. Would ya care for a drink?" ) var/list/disappointed = list( - "Really now? I don't think this will help any of us if you continue like this.", - "Okay, This is not funny, What did I do to you? I just offer drinks to people unlike the other ones.", - "This is quite sad, This is how you treat me after giving you all of you my finest drinks?", - "Come on now, Please try a bit better. Don't you want a free drink from me?", - "Hm... Let me just ask you this. Are you okay? What happend which caused you to work like this?" + "Pipe down, pinko. I don't think this will help any of us if you continue like this.", + "Come on now, what did I ever do to you? A little hootch never hurt nobody.", + "This is how you treat me after giving you all of you my finest drinks?", + "I have to go see a man about a dog.", + "Are you okay? A big shot like yourself has no need to hold back." + ) + + var/list/angry = list( + "I'll wring you out!", + "Come on, I'm taking you for a ride!", + "This is all I got!", + "I'll be havin' this!", + "Scram!" ) +//Action Buttons + attack_action_types = list( + /datum/action/innate/abnormality_attack/FairyJump + ) + +/datum/action/innate/abnormality_attack/FairyJump + name = "Leap" + icon_icon = 'ModularTegustation/Teguicons/tegumobs.dmi' + button_icon_state = "_TETH" + chosen_message = "You will now jump with your next attack." + chosen_attack_num = 1 + +//Work mechanics /mob/living/simple_animal/hostile/abnormality/fairy_gentleman/SuccessEffect(mob/living/carbon/human/user, work_type, pe) - var/turf/dispense_turf = get_step(src, pick(1,2,4,5,6,8,9,10)) - new/obj/item/reagent_containers/food/drinks/fairywine(dispense_turf) - visible_message("[src] gives out some fairy wine.") - say(pick(give_drink)) + if(pe >= 11) // Almost perfect work + var/turf/dispense_turf = get_step(src, pick(1,2,4,5,6,8,9,10)) + new/obj/item/reagent_containers/food/drinks/fairywine(dispense_turf) + visible_message("[src] gives out some fairy wine.") + say(pick(give_drink)) return /mob/living/simple_animal/hostile/abnormality/fairy_gentleman/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time) @@ -53,5 +96,103 @@ say("Quite a lot of thanks for sharing this drink with me. Not many people often want to share this drink with me.") return -/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/FailureEffect(mob/living/carbon/human/user, work_type, pe) +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/NeutralEffect(mob/living/carbon/human/user, work_type, pe) say(pick(disappointed)) + +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/FailureEffect(mob/living/carbon/human/user, work_type, pe) + datum_reference.qliphoth_change(-1) + return + +//Breach Mechanics +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/BreachEffect(mob/living/carbon/human/user) //he flies + . = ..() + AddComponent(/datum/component/knockback, 1, FALSE, TRUE) + say(pick(angry)) + is_flying_animal = TRUE + ADD_TRAIT(src, TRAIT_MOVE_FLYING, INNATE_TRAIT) + +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/AttackingTarget() + if(!can_act) + return + melee_damage_type = WHITE_DAMAGE + if(jump_cooldown <= world.time && prob(10) && !client) + FairyJump(target) + return + if(!ishuman(target)) + return ..() + var/mob/living/carbon/human/H = target + H.drunkenness += 5 + to_chat(H, "Yuck, some of it got in your mouth!") + if(H.sanity_lost) + melee_damage_type = RED_DAMAGE + return ..() + return ..() + + +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/Move() + if(!can_act) + return FALSE + return ..() + +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/OpenFire() + if(!can_act) + return FALSE + if(client) + switch(chosen_attack) + if(1) + FairyJump(target) + return + + var/dist = get_dist(target, src) + if(jump_cooldown <= world.time) + var/chance_to_jump = 25 + if(dist > 3) + chance_to_jump = 100 + if(prob(chance_to_jump)) + FairyJump(target) + return + return + +// Attacks +/mob/living/simple_animal/hostile/abnormality/fairy_gentleman/proc/FairyJump(mob/living/target) + if(!istype(target) || !can_act) + return + var/dist = get_dist(target, src) + if(dist > 1 && jump_cooldown < world.time) + say(pick(angry)) + jump_cooldown = world.time + jump_cooldown_time + can_act = FALSE + SLEEP_CHECK_DEATH(0.25 SECONDS) + animate(src, alpha = 1,pixel_x = 0, pixel_z = 16, time = 0.1 SECONDS) + src.pixel_z = 16 + playsound(src, 'sound/abnormalities/ichthys/jump.ogg', 50, FALSE, 4) + var/turf/target_turf = get_turf(target) + SLEEP_CHECK_DEATH(1 SECONDS) + forceMove(target_turf) //look out, someone is rushing you! + playsound(src, jump_sound, 50, FALSE, 4) + animate(src, alpha = 255,pixel_x = 0, pixel_z = -16, time = 0.1 SECONDS) + src.pixel_z = 0 + SLEEP_CHECK_DEATH(0.1 SECONDS) + var/target_drunk + for(var/turf/T in view(jump_aoe, src)) + var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(T) + FX.color = "#b52e19" + for(var/mob/living/L in T) + if(faction_check_mob(L)) + continue + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.drunkenness > 50) // easter egg - being drunk makes you stagger him + target_drunk = TRUE + jump_damage = 0 + else + jump_damage = initial(jump_damage) + L.apply_damage(jump_damage, BLACK_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE) + if(L.health < 0) + L.gib() + var/wait_time = 0.5 SECONDS + if(target_drunk) + wait_time += 3.5 SECONDS + visible_message("[src] staggers around, exposing a weak point!", "You feel dizzy!") + SLEEP_CHECK_DEATH(wait_time) + can_act = TRUE diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm index 4313ac83f6ca..4723474fa0eb 100644 --- a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm +++ b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm @@ -39,7 +39,7 @@ var/finishing = FALSE //cant move/attack when it's TRUE var/work_count = 0 var/raining = FALSE - var/covering = 0 //stores the agent's choice: 0 - disabled/1- taking cover/2- refused cover + var/ignored = 0 //stores the agent's choice: 0 - disabled/1- refused cover ego_list = list( /datum/ego_datum/weapon/fourleaf_clover, @@ -69,6 +69,9 @@ work_count++ if(work_count < 3) return + if(!raining && (IsContained(src))) + for(var/turf/open/O in view(3, src)) + new /obj/effect/rainy_effect(O) say("Oh dear, i'd advise against being hit by this rain.") //tries to trick people into getting cover sleep(1 SECONDS) say("Care to join me under my umbrella?") @@ -83,19 +86,15 @@ to_chat(user, "There's no reason, the skies are clear.") return FALSE if((work_type == "Take cover") && raining) //Uh oh, you goofed up - to_chat(user, "You take cover under the fairy's clover.") + to_chat(user, "You decide to take cover under the fairy's clover.") work_count = 0 - covering = 1 //user is taking cover + Execute(user) return FALSE if((work_type != "Take cover") && raining) - if (covering == 1) //if you already chose to take cover - say ("What do you say, it's so cozy under this umbrella, isn't it?") - raining = FALSE - return TRUE - to_chat(user, "The rain is oddly reinvigorating.") - user.adjustBruteLoss(-80) //The rain actually heals you, lying bastard... + for(var/obj/effect/rainy_effect/rain in range(3, src)) + rain.End(TRUE) //The rain actually heals you, lying bastard... work_count = 0 - covering = 2 //[[FAIRY-LONG-LEGS WILL REMEMBER THIS]] + ignored = TRUE raining = FALSE return TRUE @@ -107,17 +106,24 @@ /mob/living/simple_animal/hostile/abnormality/fairy_longlegs/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time) if(get_attribute_level(user, FORTITUDE_ATTRIBUTE) < 40) datum_reference.qliphoth_change(-2) - if (covering == 2) //refused his offer to take cover + if (ignored) //refused his offer to take cover say("Tch, this damn rain robs me of my food all the time.") - covering = 0 + ignored = FALSE datum_reference.qliphoth_change(-2) - if (covering == 1) //taking cover under the clover with the long legs (bad idea!) - covering = 0 - user.visible_message("You feel a stinging pain in your chest, is that...blood?!") - playsound(get_turf(src), 'sound/abnormalities/fairy_longlegs/attack.ogg', 50, 1) - user.apply_damage(80, RED_DAMAGE, null, user.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) - return +/mob/living/simple_animal/hostile/abnormality/fairy_longlegs/proc/Execute(mob/living/carbon/human/user) + user.Stun(3 SECONDS) + step_towards(user, src) + sleep(0.5 SECONDS) + step_towards(user, src) + sleep(1.5 SECONDS) + user.visible_message("You feel a stinging pain in your chest, is that...blood?!") + playsound(get_turf(src), 'sound/abnormalities/fairy_longlegs/attack.ogg', 50, 1) + user.apply_damage(100, RED_DAMAGE, null, user.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) + for(var/obj/effect/rainy_effect/rain in range(3, src)) + rain.End(FALSE) + +//Breach Stuff /mob/living/simple_animal/hostile/abnormality/fairy_longlegs/AttackingTarget() if(finishing) return FALSE @@ -131,3 +137,26 @@ SLEEP_CHECK_DEATH(15) icon_state = "fairy_longlegs" finishing = FALSE + +/mob/living/simple_animal/hostile/abnormality/fairy_longlegs/BreachEffect(mob/living/carbon/human/user) + . = ..() + if(raining) + for(var/obj/effect/rainy_effect/rain in range(3, src)) + rain.End(TRUE) + +//Misc. Objects +/obj/effect/rainy_effect + name = "rain" + desc = "It's pouring." + icon = 'icons/effects/weather_effects.dmi' + icon_state = "acid_rain" + layer = POINT_LAYER //want this high but not above warnings + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + +/obj/effect/rainy_effect/proc/End(healing) + if(healing) + for(var/mob/living/carbon/human/H in get_turf(src)) + to_chat(H, "The rain is oddly reinvigorating.") + H.adjustBruteLoss(-80) + QDEL_IN(src, 50) diff --git a/code/modules/paperwork/records/info/teth.dm b/code/modules/paperwork/records/info/teth.dm index d973c06f1714..3a6c351c38c6 100644 --- a/code/modules/paperwork/records/info/teth.dm +++ b/code/modules/paperwork/records/info/teth.dm @@ -263,9 +263,10 @@ abno_type = /mob/living/simple_animal/hostile/abnormality/fairy_gentleman abno_code = "F-01-161" abno_info = list( - "After getting a good result with the Fairy Gentleman, He gives the employee a bottle of what he calls “Fairy Wine.”", + "After generating 11 or more PE boxes with the Fairy Gentleman, he gives the employee a bottle of what he calls “Fairy Wine.”", "Drinking the “Fairy Wine” increase the prudence of the agent who drinks it and then heals their sanity. However, drinking this wine also will make the user become drunk incredibly quickly. Employees who drank too much fairy wine felt better after taking a special chemical using a sleeper.", - "Doing instinct work with the Fairy Gentleman will also cause the agent to take a drink with the Gentleman.") + "When the work result was Bad, the Qliphoth Counter lowered.", + "Performing instinct work with the Fairy Gentleman will also cause the agent to take a drink with the Gentleman.") //Fairy-Long-Legs /obj/item/paper/fluff/info/teth/fairy_longlegs diff --git a/sound/abnormalities/fairygentleman/jump.ogg b/sound/abnormalities/fairygentleman/jump.ogg new file mode 100644 index 000000000000..a8b310927df8 Binary files /dev/null and b/sound/abnormalities/fairygentleman/jump.ogg differ