diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm index da591f0570..6079a3c044 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm @@ -96,8 +96,8 @@ var/const/MAX_ACTIVE_TIME = 400 ..() if(stat == CONSCIOUS) icon_state = "[initial(icon_state)]" - Attach(hit_atom) throwing = 0 + GoIdle(30,100) //stunned for a few seconds - allows throwing them to be useful for positioning but not as an offensive action (unless you're setting up a trap) /obj/item/clothing/mask/facehugger/proc/Attach(M as mob) @@ -124,12 +124,14 @@ var/const/MAX_ACTIVE_TIME = 400 L.visible_message("\red \b [src] leaps at [L]'s face!") + /* Tentatively removed since huggers can't be thrown anymore if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.head && H.head.flags & HEADCOVERSMOUTH) H.visible_message("\red \b [src] smashes against [H]'s [H.head]!") Die() return + */ if(iscarbon(M)) var/mob/living/carbon/target = L @@ -191,7 +193,7 @@ var/const/MAX_ACTIVE_TIME = 400 return -/obj/item/clothing/mask/facehugger/proc/GoIdle() +/obj/item/clothing/mask/facehugger/proc/GoIdle(var/min_time=MIN_ACTIVE_TIME, var/max_time=MAX_ACTIVE_TIME) if(stat == DEAD || stat == UNCONSCIOUS) return @@ -200,7 +202,7 @@ var/const/MAX_ACTIVE_TIME = 400 stat = UNCONSCIOUS icon_state = "[initial(icon_state)]_inactive" - spawn(rand(MIN_ACTIVE_TIME,MAX_ACTIVE_TIME)) + spawn(rand(min_time,max_time)) GoActive() return diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index d53343b4c2..0f942f3c4d 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -59,12 +59,12 @@ set category = "Abilities" if (get_dist(src,M) <= 1) - src << "\green You need to be closer." + src << "You need to be closer." return var/datum/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name["plasma vessel"] if(!istype(I)) - src << "\green Their plasma vessel is missing." + src << "Their plasma vessel is missing." return var/amount = input("Amount:", "Transfer Plasma to [M]") as num @@ -72,8 +72,8 @@ amount = abs(round(amount)) if(check_alien_ability(amount,0,"plasma vessel")) M.gain_plasma(amount) - M << "\green [src] has transfered [amount] plasma to you." - src << "\green You have transferred [amount] plasma to [M]" + M << "[src] has transfered [amount] plasma to you." + src << "You have transferred [amount] plasma to [M]." return // Queen verbs. @@ -93,8 +93,7 @@ return if(check_alien_ability(75,1,"egg sac")) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\green [src] has laid an egg!"), 1) + visible_message("[src] has laid an egg!") new /obj/effect/alien/egg(loc) return @@ -110,9 +109,7 @@ return if(check_alien_ability(500)) - src << "\green You begin to evolve!" - for(var/mob/O in viewers(src, null)) - O.show_message(text("\green [src] begins to twist and contort!"), 1) + visible_message("[src] begins to twist and contort!", "You begin to evolve!") src.set_species("Xenomorph Queen") return @@ -123,8 +120,7 @@ set category = "Abilities" if(check_alien_ability(50,1,"resin spinner")) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\green [src] has planted some alien weeds!"), 1) + visible_message("[src] has planted some alien weeds!") new /obj/effect/alien/weeds/node(loc) return @@ -134,14 +130,14 @@ set category = "Abilities" if(!O in oview(1)) - src << "\green [O] is too far away." + src << "[O] is too far away." return // OBJ CHECK if(isobj(O)) var/obj/I = O if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid. - src << "\green You cannot dissolve this object." + src << "You cannot dissolve this object." return // TURF CHECK @@ -149,18 +145,18 @@ var/turf/T = O // R WALL if(istype(T, /turf/simulated/wall/r_wall)) - src << "\green You cannot dissolve this object." + src << "You cannot dissolve this object." return // R FLOOR if(istype(T, /turf/simulated/floor/engine)) - src << "\green You cannot dissolve this object." + src << "You cannot dissolve this object." return else// Not a type we can acid. return if(check_alien_ability(200,0,"acid gland")) new /obj/effect/alien/acid(get_turf(O), O) - visible_message("\green [src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") + visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!") return @@ -176,11 +172,7 @@ src << "You cannot spit neurotoxin in your current state." return - src << "\green You spit neurotoxin at [target]." - - for(var/mob/O in oviewers()) - if ((O.client && !(O.blinded ))) - O << "\red [src] spits neurotoxin at [target]!" + visible_message("[src] spits neurotoxin at [target]!", "You spit neurotoxin at [target].") //I'm not motivated enough to revise this. Prjectile code in general needs update. // Maybe change this to use throw_at? ~ Z @@ -218,9 +210,7 @@ if(!check_alien_ability(75,1,"resin spinner")) return - src << "\green You shape a [choice]." - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [src] vomits up a thick purple substance and begins to shape it!"), 1) + visible_message("[src] vomits up a thick purple substance and begins to shape it!", "You shape a [choice].") switch(choice) if("resin door") new /obj/structure/mineral_door/resin(loc) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 64d5974f25..51e466f176 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -86,17 +86,46 @@ if(!environment) return if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T) - if(H.health >= H.maxHealth - H.getCloneLoss()) + if(!regenerate(H)) var/datum/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"] P.stored_plasma += weeds_plasma_rate P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma) - else - H.adjustBruteLoss(-weeds_heal_rate) - H.adjustFireLoss(-weeds_heal_rate) - H.adjustOxyLoss(-weeds_heal_rate) - H.adjustToxLoss(-weeds_heal_rate) ..() +/datum/species/xenos/proc/regenerate(var/mob/living/carbon/human/H) + var/heal_rate = weeds_heal_rate + var/mend_prob = 10 + if (!H.resting) + heal_rate = weeds_heal_rate / 3 + mend_prob = 1 + + //first heal damages + if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss()) + H.adjustBruteLoss(-heal_rate) + H.adjustFireLoss(-heal_rate) + H.adjustOxyLoss(-heal_rate) + H.adjustToxLoss(-heal_rate) + if (prob(5)) + H << "You feel a soothing sensation come over you..." + return 1 + + //next internal organs + for(var/datum/organ/internal/I in H.internal_organs) + if(I.damage > 0) + I.damage = max(I.damage - heal_rate, 0) + if (prob(5)) + H << "You feel a soothing sensation within your [I.parent_organ]..." + return 1 + + //next mend broken bones, approx 10 ticks each + for(var/datum/organ/external/E in H.bad_external_organs) + if (E.status & ORGAN_BROKEN) + if (prob(mend_prob)) + if (E.mend_fracture()) + H << "You feel something mend itself inside your [E.display_name]." + return 1 + + return 0 /datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H) H.AddInfectionImages() @@ -110,7 +139,7 @@ name = "Xenomorph Drone" caste_name = "drone" weeds_plasma_rate = 15 - slowdown = 2 + slowdown = 1 tail = "xenos_drone_tail" rarity_value = 5 @@ -149,7 +178,7 @@ name = "Xenomorph Hunter" weeds_plasma_rate = 5 caste_name = "hunter" - slowdown = -1 + slowdown = -2 total_health = 150 tail = "xenos_hunter_tail" @@ -177,7 +206,7 @@ name = "Xenomorph Sentinel" weeds_plasma_rate = 10 caste_name = "sentinel" - slowdown = 1 + slowdown = 0 total_health = 125 tail = "xenos_sentinel_tail" @@ -209,7 +238,7 @@ weeds_heal_rate = 5 weeds_plasma_rate = 20 caste_name = "queen" - slowdown = 5 + slowdown = 4 tail = "xenos_queen_tail" rarity_value = 10 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 24b84050d0..e340909790 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -764,6 +764,15 @@ Note that amputating the affected organ does in fact remove the infection from t suit.supporting_limbs |= src return +/datum/organ/external/proc/mend_fracture() + if(status & ORGAN_ROBOT) + return 0 //ORGAN_BROKEN doesn't have the same meaning for robot limbs + if(brute_dam > min_broken_damage * config.organ_health_multiplier) + return 0 //will just immediately fracture again + + status &= ~ORGAN_BROKEN + return 1 + /datum/organ/external/proc/robotize() src.status &= ~ORGAN_BROKEN src.status &= ~ORGAN_BLEEDING diff --git a/code/stylesheet.dm b/code/stylesheet.dm index c722d86dd5..8a3eaf1a40 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -63,6 +63,8 @@ h1.alert, h2.alert {color: #000000;} .emote {font-style: italic;} +/* Game Messages */ + .attack {color: #ff0000;} .moderate {color: #CC0000;} .disarm {color: #990000;} @@ -73,6 +75,9 @@ h1.alert, h2.alert {color: #000000;} .rose {color: #ff5050;} .info {color: #0000CC;} .notice {color: #000099;} +.alium {color: #00ff00;} + +/* Languages */ .alien {color: #543354;} .tajaran {color: #803B56;}