mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Collapsed Bump() down to carbon from alien and monkey. Stripped out extraneous stuff from carbon/alien HUD. Implemented some life stuff for aliens.
This commit is contained in:
@@ -5,58 +5,22 @@
|
|||||||
|
|
||||||
var/obj/screen/using
|
var/obj/screen/using
|
||||||
|
|
||||||
using = new /obj/screen()
|
|
||||||
using.name = "act_intent"
|
|
||||||
using.dir = SOUTHWEST
|
|
||||||
using.icon = 'icons/mob/screen1_alien.dmi'
|
|
||||||
using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent)
|
|
||||||
using.screen_loc = ui_acti
|
|
||||||
using.layer = 20
|
|
||||||
src.adding += using
|
|
||||||
action_intent = using
|
|
||||||
|
|
||||||
using = new /obj/screen()
|
using = new /obj/screen()
|
||||||
using.name = "mov_intent"
|
using.name = "mov_intent"
|
||||||
using.dir = SOUTHWEST
|
using.dir = SOUTHWEST
|
||||||
using.icon = 'icons/mob/screen1_alien.dmi'
|
using.icon = 'icons/mob/screen1_alien.dmi'
|
||||||
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
|
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
|
||||||
using.screen_loc = ui_movi
|
using.screen_loc = ui_acti
|
||||||
using.layer = 20
|
using.layer = 20
|
||||||
src.adding += using
|
src.adding += using
|
||||||
move_intent = using
|
move_intent = using
|
||||||
|
|
||||||
mymob.oxygen = new /obj/screen()
|
|
||||||
mymob.oxygen.icon = 'icons/mob/screen1_alien.dmi'
|
|
||||||
mymob.oxygen.icon_state = "oxy0"
|
|
||||||
mymob.oxygen.name = "oxygen"
|
|
||||||
mymob.oxygen.screen_loc = ui_alien_oxygen
|
|
||||||
|
|
||||||
mymob.toxin = new /obj/screen()
|
|
||||||
mymob.toxin.icon = 'icons/mob/screen1_alien.dmi'
|
|
||||||
mymob.toxin.icon_state = "tox0"
|
|
||||||
mymob.toxin.name = "toxin"
|
|
||||||
mymob.toxin.screen_loc = ui_alien_toxin
|
|
||||||
|
|
||||||
|
|
||||||
mymob.fire = new /obj/screen()
|
|
||||||
mymob.fire.icon = 'icons/mob/screen1_alien.dmi'
|
|
||||||
mymob.fire.icon_state = "fire0"
|
|
||||||
mymob.fire.name = "fire"
|
|
||||||
mymob.fire.screen_loc = ui_alien_fire
|
|
||||||
|
|
||||||
|
|
||||||
mymob.healths = new /obj/screen()
|
mymob.healths = new /obj/screen()
|
||||||
mymob.healths.icon = 'icons/mob/screen1_alien.dmi'
|
mymob.healths.icon = 'icons/mob/screen1_alien.dmi'
|
||||||
mymob.healths.icon_state = "health0"
|
mymob.healths.icon_state = "health0"
|
||||||
mymob.healths.name = "health"
|
mymob.healths.name = "health"
|
||||||
mymob.healths.screen_loc = ui_alien_health
|
mymob.healths.screen_loc = ui_alien_health
|
||||||
|
|
||||||
mymob.pullin = new /obj/screen()
|
|
||||||
mymob.pullin.icon = 'icons/mob/screen1_alien.dmi'
|
|
||||||
mymob.pullin.icon_state = "pull0"
|
|
||||||
mymob.pullin.name = "pull"
|
|
||||||
mymob.pullin.screen_loc = ui_pull_resist
|
|
||||||
|
|
||||||
mymob.blind = new /obj/screen()
|
mymob.blind = new /obj/screen()
|
||||||
mymob.blind.icon = 'icons/mob/screen1_full.dmi'
|
mymob.blind.icon = 'icons/mob/screen1_full.dmi'
|
||||||
mymob.blind.icon_state = "blackimageoverlay"
|
mymob.blind.icon_state = "blackimageoverlay"
|
||||||
@@ -71,11 +35,6 @@
|
|||||||
mymob.flash.screen_loc = "1,1 to 15,15"
|
mymob.flash.screen_loc = "1,1 to 15,15"
|
||||||
mymob.flash.layer = 17
|
mymob.flash.layer = 17
|
||||||
|
|
||||||
mymob.zone_sel = new /obj/screen/zone_sel()
|
|
||||||
mymob.zone_sel.overlays.Cut()
|
|
||||||
mymob.zone_sel.overlays += image("icon" = 'icons/mob/zone_sel.dmi', "icon_state" = text("[]", mymob.zone_sel.selecting))
|
|
||||||
|
|
||||||
mymob.client.screen = null
|
mymob.client.screen = null
|
||||||
|
mymob.client.screen += list( mymob.healths, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach )
|
||||||
mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach )
|
mymob.client.screen += src.adding + src.other
|
||||||
mymob.client.screen += src.adding + src.other
|
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
|
|
||||||
if(H.species.flags & IS_SYNTHETIC)
|
if(H.species.flags & IS_SYNTHETIC || H.species.insulated)
|
||||||
return
|
return
|
||||||
|
|
||||||
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
|
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
|
||||||
|
|||||||
@@ -11,18 +11,20 @@
|
|||||||
attack_sound = null
|
attack_sound = null
|
||||||
friendly = "nuzzles"
|
friendly = "nuzzles"
|
||||||
wall_smash = 0
|
wall_smash = 0
|
||||||
|
health = 100
|
||||||
|
maxHealth = 100
|
||||||
|
|
||||||
var/adult_form
|
var/adult_form
|
||||||
var/dead_icon
|
var/dead_icon
|
||||||
var/amount_grown = 0
|
var/amount_grown = 0
|
||||||
var/max_grown = 10
|
var/max_grown = 10
|
||||||
var/time_of_birth
|
var/time_of_birth
|
||||||
var/co2overloadtime = null
|
|
||||||
var/temperature_resistance = T0C+75
|
|
||||||
var/language
|
var/language
|
||||||
|
|
||||||
/mob/living/carbon/alien/New()
|
/mob/living/carbon/alien/New()
|
||||||
|
|
||||||
|
time_of_birth = world.time
|
||||||
|
|
||||||
verbs += /mob/living/proc/ventcrawl
|
verbs += /mob/living/proc/ventcrawl
|
||||||
verbs += /mob/living/proc/hide
|
verbs += /mob/living/proc/hide
|
||||||
|
|
||||||
@@ -44,38 +46,6 @@
|
|||||||
/mob/living/carbon/alien/u_equip(obj/item/W as obj)
|
/mob/living/carbon/alien/u_equip(obj/item/W as obj)
|
||||||
return
|
return
|
||||||
|
|
||||||
//This is fine, works the same as a human
|
|
||||||
/mob/living/carbon/alien/Bump(atom/movable/AM as mob|obj, yes)
|
|
||||||
|
|
||||||
spawn( 0 )
|
|
||||||
if ((!( yes ) || now_pushing))
|
|
||||||
return
|
|
||||||
now_pushing = 1
|
|
||||||
if(ismob(AM))
|
|
||||||
var/mob/tmob = AM
|
|
||||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
|
||||||
if(prob(70))
|
|
||||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
|
||||||
now_pushing = 0
|
|
||||||
return
|
|
||||||
if(!(tmob.status_flags & CANPUSH))
|
|
||||||
now_pushing = 0
|
|
||||||
return
|
|
||||||
tmob.LAssailant = src
|
|
||||||
|
|
||||||
now_pushing = 0
|
|
||||||
..()
|
|
||||||
if (!( istype(AM, /atom/movable) ))
|
|
||||||
return
|
|
||||||
if (!( now_pushing ))
|
|
||||||
now_pushing = 1
|
|
||||||
if (!( AM.anchored ))
|
|
||||||
var/t = get_dir(src, AM)
|
|
||||||
step(AM, t)
|
|
||||||
now_pushing = null
|
|
||||||
return
|
|
||||||
return
|
|
||||||
|
|
||||||
/mob/living/carbon/alien/Stat()
|
/mob/living/carbon/alien/Stat()
|
||||||
..()
|
..()
|
||||||
stat(null, "Progress: [amount_grown]/[max_grown]")
|
stat(null, "Progress: [amount_grown]/[max_grown]")
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
/* TODO
|
//Dionaea regenerate health and nutrition in light.
|
||||||
if(alien) //Diona nymphs are the only alien monkey currently.
|
/mob/living/carbon/alien/diona/handle_environment(datum/gas_mixture/environment)
|
||||||
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
|
||||||
if(isturf(loc)) //else, there's considered to be no light
|
|
||||||
var/turf/T = loc
|
|
||||||
var/area/A = T.loc
|
|
||||||
if(A)
|
|
||||||
if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
|
|
||||||
else light_amount = 5
|
|
||||||
|
|
||||||
nutrition += light_amount
|
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
||||||
traumatic_shock -= light_amount
|
if(isturf(loc)) //else, there's considered to be no light
|
||||||
|
var/turf/T = loc
|
||||||
|
var/area/A = T.loc
|
||||||
|
if(A)
|
||||||
|
if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
|
||||||
|
else light_amount = 5
|
||||||
|
|
||||||
if(nutrition > 500)
|
nutrition += light_amount
|
||||||
nutrition = 500
|
|
||||||
if(light_amount > 2) //if there's enough light, heal
|
if(nutrition > 500)
|
||||||
adjustBruteLoss(-1)
|
nutrition = 500
|
||||||
adjustToxLoss(-1)
|
if(light_amount > 2) //if there's enough light, heal
|
||||||
adjustOxyLoss(-1)
|
adjustBruteLoss(-1)
|
||||||
*/
|
adjustFireLoss(-1)
|
||||||
|
adjustToxLoss(-1)
|
||||||
|
adjustOxyLoss(-1)
|
||||||
14
code/modules/mob/living/carbon/alien/larva/life.dm
Normal file
14
code/modules/mob/living/carbon/alien/larva/life.dm
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
//Larvae regenerate health and nutrition from plasma and alien weeds.
|
||||||
|
/mob/living/carbon/alien/larva/handle_environment()
|
||||||
|
|
||||||
|
var/turf/T = loc
|
||||||
|
if(!T) return
|
||||||
|
var/datum/gas_mixture/environment = T.return_air()
|
||||||
|
if(!environment) return
|
||||||
|
|
||||||
|
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T.contents)
|
||||||
|
update_progression()
|
||||||
|
adjustBruteLoss(-1)
|
||||||
|
adjustFireLoss(-1)
|
||||||
|
adjustToxLoss(-1)
|
||||||
|
adjustOxyLoss(-1)
|
||||||
@@ -4,8 +4,8 @@
|
|||||||
set invisibility = 0
|
set invisibility = 0
|
||||||
set background = 1
|
set background = 1
|
||||||
|
|
||||||
if (monkeyizing)
|
if (monkeyizing) return
|
||||||
return
|
if(!loc) return
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
@@ -50,14 +50,131 @@
|
|||||||
adjustToxLoss(-(rads))
|
adjustToxLoss(-(rads))
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/carbon/alien/proc/handle_environment(enviroment)
|
|
||||||
//TODO: Work out if larvae breathe/suffer from pressure/suffer from heat.
|
|
||||||
if(!enviroment)
|
|
||||||
return
|
|
||||||
|
|
||||||
/mob/living/carbon/alien/proc/handle_regular_status_updates()
|
/mob/living/carbon/alien/proc/handle_regular_status_updates()
|
||||||
// TODO: sleep, blind, stunned, paralyzed?
|
|
||||||
return
|
if(status_flags & GODMODE) return 0
|
||||||
|
|
||||||
|
if(stat == DEAD)
|
||||||
|
blinded = 1
|
||||||
|
silent = 0
|
||||||
|
else
|
||||||
|
updatehealth()
|
||||||
|
|
||||||
|
if(health <= 0)
|
||||||
|
death()
|
||||||
|
blinded = 1
|
||||||
|
silent = 0
|
||||||
|
return 1
|
||||||
|
|
||||||
|
if(paralysis)
|
||||||
|
AdjustParalysis(-1)
|
||||||
|
blinded = 1
|
||||||
|
stat = UNCONSCIOUS
|
||||||
|
if(halloss > 0)
|
||||||
|
adjustHalLoss(-3)
|
||||||
|
else if(sleeping)
|
||||||
|
|
||||||
|
adjustHalLoss(-3)
|
||||||
|
if (mind)
|
||||||
|
if((mind.active && client != null) || immune_to_ssd)
|
||||||
|
sleeping = max(sleeping-1, 0)
|
||||||
|
blinded = 1
|
||||||
|
stat = UNCONSCIOUS
|
||||||
|
|
||||||
|
else if(resting)
|
||||||
|
if(halloss > 0)
|
||||||
|
adjustHalLoss(-3)
|
||||||
|
|
||||||
|
//CONSCIOUS
|
||||||
|
else
|
||||||
|
stat = CONSCIOUS
|
||||||
|
if(halloss > 0)
|
||||||
|
adjustHalLoss(-1)
|
||||||
|
|
||||||
|
// Eyes and blindness.
|
||||||
|
if(!has_eyes())
|
||||||
|
eye_blind = 1
|
||||||
|
blinded = 1
|
||||||
|
eye_blurry = 1
|
||||||
|
else if(eye_blind)
|
||||||
|
eye_blind = max(eye_blind-1,0)
|
||||||
|
blinded = 1
|
||||||
|
else if(eye_blurry)
|
||||||
|
eye_blurry = max(eye_blurry-1, 0)
|
||||||
|
|
||||||
|
//Ears
|
||||||
|
if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
|
||||||
|
ear_deaf = max(ear_deaf, 1)
|
||||||
|
else if(ear_deaf) //deafness, heals slowly over time
|
||||||
|
ear_deaf = max(ear_deaf-1, 0)
|
||||||
|
ear_damage = max(ear_damage-0.05, 0)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
/mob/living/carbon/alien/proc/handle_regular_hud_updates()
|
/mob/living/carbon/alien/proc/handle_regular_hud_updates()
|
||||||
return //TODO: Not sure what to do with this yet.
|
|
||||||
|
if (stat == 2 || (XRAY in src.mutations))
|
||||||
|
sight |= SEE_TURFS
|
||||||
|
sight |= SEE_MOBS
|
||||||
|
sight |= SEE_OBJS
|
||||||
|
see_in_dark = 8
|
||||||
|
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||||
|
else if (stat != 2)
|
||||||
|
sight &= ~SEE_TURFS
|
||||||
|
sight &= ~SEE_MOBS
|
||||||
|
sight &= ~SEE_OBJS
|
||||||
|
see_in_dark = 2
|
||||||
|
see_invisible = SEE_INVISIBLE_LIVING
|
||||||
|
|
||||||
|
if (healths)
|
||||||
|
if (stat != 2)
|
||||||
|
switch(health)
|
||||||
|
if(100 to INFINITY)
|
||||||
|
healths.icon_state = "health0"
|
||||||
|
if(80 to 100)
|
||||||
|
healths.icon_state = "health1"
|
||||||
|
if(60 to 80)
|
||||||
|
healths.icon_state = "health2"
|
||||||
|
if(40 to 60)
|
||||||
|
healths.icon_state = "health3"
|
||||||
|
if(20 to 40)
|
||||||
|
healths.icon_state = "health4"
|
||||||
|
if(0 to 20)
|
||||||
|
healths.icon_state = "health5"
|
||||||
|
else
|
||||||
|
healths.icon_state = "health6"
|
||||||
|
else
|
||||||
|
healths.icon_state = "health7"
|
||||||
|
|
||||||
|
if(pullin)
|
||||||
|
pullin.icon_state = "pull[pulling ? 1 : 0]"
|
||||||
|
|
||||||
|
if (client)
|
||||||
|
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
|
||||||
|
|
||||||
|
if ((blind && stat != 2))
|
||||||
|
if ((blinded))
|
||||||
|
blind.layer = 18
|
||||||
|
else
|
||||||
|
blind.layer = 0
|
||||||
|
if (disabilities & NEARSIGHTED)
|
||||||
|
client.screen += global_hud.vimpaired
|
||||||
|
if (eye_blurry)
|
||||||
|
client.screen += global_hud.blurry
|
||||||
|
if (druggy)
|
||||||
|
client.screen += global_hud.druggy
|
||||||
|
|
||||||
|
if (stat != 2)
|
||||||
|
if (machine)
|
||||||
|
if (!( machine.check_eye(src) ))
|
||||||
|
reset_view(null)
|
||||||
|
else
|
||||||
|
if(client && !client.adminobs)
|
||||||
|
reset_view(null)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/mob/living/carbon/alien/proc/handle_environment(datum/gas_mixture/environment)
|
||||||
|
// At the moment, neither of the alien species breathe or suffer from pressure.
|
||||||
|
// TODO: Implement heat and phoron exposure checks.
|
||||||
|
return
|
||||||
@@ -428,71 +428,38 @@
|
|||||||
if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes")
|
if(alert(src,"You sure you want to sleep for a while?","Sleep","Yes","No") == "Yes")
|
||||||
usr.sleeping = 20 //Short nap
|
usr.sleeping = 20 //Short nap
|
||||||
|
|
||||||
//Brain slug proc for voluntary removal of control.
|
/mob/living/carbon/Bump(atom/movable/AM as mob|obj, yes)
|
||||||
/mob/living/carbon/proc/release_control()
|
|
||||||
|
|
||||||
set category = "Abilities"
|
spawn( 0 )
|
||||||
set name = "Release Control"
|
if ((!( yes ) || now_pushing))
|
||||||
set desc = "Release control of your host's body."
|
return
|
||||||
|
now_pushing = 1
|
||||||
|
if(ismob(AM))
|
||||||
|
var/mob/tmob = AM
|
||||||
|
if(istype(tmob, /mob/living/carbon/human) && (HULK in tmob.mutations))
|
||||||
|
if(prob(70))
|
||||||
|
usr << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||||
|
now_pushing = 0
|
||||||
|
return
|
||||||
|
if(!(tmob.status_flags & CANPUSH))
|
||||||
|
now_pushing = 0
|
||||||
|
return
|
||||||
|
|
||||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
tmob.LAssailant = src
|
||||||
|
now_pushing = 0
|
||||||
if(B && B.host_brain)
|
..()
|
||||||
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
|
if (!( istype(AM, /atom/movable) ))
|
||||||
|
return
|
||||||
B.detatch()
|
if (!( now_pushing ))
|
||||||
|
now_pushing = 1
|
||||||
verbs -= /mob/living/carbon/proc/release_control
|
if (!( AM.anchored ))
|
||||||
verbs -= /mob/living/carbon/proc/punish_host
|
var/t = get_dir(src, AM)
|
||||||
verbs -= /mob/living/carbon/proc/spawn_larvae
|
if (istype(AM, /obj/structure/window))
|
||||||
|
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||||
else
|
for(var/obj/structure/window/win in get_step(AM,t))
|
||||||
src << "\red <B>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</B>"
|
now_pushing = 0
|
||||||
|
return
|
||||||
//Brain slug proc for tormenting the host.
|
step(AM, t)
|
||||||
/mob/living/carbon/proc/punish_host()
|
now_pushing = null
|
||||||
set category = "Abilities"
|
|
||||||
set name = "Torment host"
|
|
||||||
set desc = "Punish your host with agony."
|
|
||||||
|
|
||||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
|
||||||
|
|
||||||
if(!B)
|
|
||||||
return
|
return
|
||||||
|
return
|
||||||
if(B.host_brain.ckey)
|
|
||||||
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
|
|
||||||
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
|
|
||||||
|
|
||||||
//Check for brain worms in head.
|
|
||||||
/mob/proc/has_brain_worms()
|
|
||||||
|
|
||||||
for(var/I in contents)
|
|
||||||
if(istype(I,/mob/living/simple_animal/borer))
|
|
||||||
return I
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/mob/living/carbon/proc/spawn_larvae()
|
|
||||||
set category = "Abilities"
|
|
||||||
set name = "Reproduce"
|
|
||||||
set desc = "Spawn several young."
|
|
||||||
|
|
||||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
|
||||||
|
|
||||||
if(!B)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(B.chemicals >= 100)
|
|
||||||
src << "\red <B>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</B>"
|
|
||||||
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
|
|
||||||
B.chemicals -= 100
|
|
||||||
B.has_reproduced = 1
|
|
||||||
|
|
||||||
new /obj/effect/decal/cleanable/vomit(get_turf(src))
|
|
||||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
|
||||||
new /mob/living/simple_animal/borer(get_turf(src))
|
|
||||||
|
|
||||||
else
|
|
||||||
src << "You do not have enough chemicals stored to reproduce."
|
|
||||||
return
|
|
||||||
@@ -37,3 +37,63 @@
|
|||||||
src.reagents.add_reagent("nutriment", target.weedlevel)
|
src.reagents.add_reagent("nutriment", target.weedlevel)
|
||||||
target.weedlevel = 0
|
target.weedlevel = 0
|
||||||
src.visible_message("\red [src] begins rooting through [target], ripping out weeds and eating them noisily.","\red You begin rooting through [target], ripping out weeds and eating them noisily.")
|
src.visible_message("\red [src] begins rooting through [target], ripping out weeds and eating them noisily.","\red You begin rooting through [target], ripping out weeds and eating them noisily.")
|
||||||
|
|
||||||
|
//Brain slug proc for voluntary removal of control.
|
||||||
|
/mob/living/carbon/proc/release_control()
|
||||||
|
|
||||||
|
set category = "Abilities"
|
||||||
|
set name = "Release Control"
|
||||||
|
set desc = "Release control of your host's body."
|
||||||
|
|
||||||
|
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||||
|
|
||||||
|
if(B && B.host_brain)
|
||||||
|
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
|
||||||
|
|
||||||
|
B.detatch()
|
||||||
|
|
||||||
|
verbs -= /mob/living/carbon/proc/release_control
|
||||||
|
verbs -= /mob/living/carbon/proc/punish_host
|
||||||
|
verbs -= /mob/living/carbon/proc/spawn_larvae
|
||||||
|
|
||||||
|
else
|
||||||
|
src << "\red <B>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</B>"
|
||||||
|
|
||||||
|
//Brain slug proc for tormenting the host.
|
||||||
|
/mob/living/carbon/proc/punish_host()
|
||||||
|
set category = "Abilities"
|
||||||
|
set name = "Torment host"
|
||||||
|
set desc = "Punish your host with agony."
|
||||||
|
|
||||||
|
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||||
|
|
||||||
|
if(!B)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(B.host_brain.ckey)
|
||||||
|
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
|
||||||
|
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
|
||||||
|
|
||||||
|
/mob/living/carbon/proc/spawn_larvae()
|
||||||
|
set category = "Abilities"
|
||||||
|
set name = "Reproduce"
|
||||||
|
set desc = "Spawn several young."
|
||||||
|
|
||||||
|
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||||
|
|
||||||
|
if(!B)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(B.chemicals >= 100)
|
||||||
|
src << "\red <B>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</B>"
|
||||||
|
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
|
||||||
|
B.chemicals -= 100
|
||||||
|
B.has_reproduced = 1
|
||||||
|
|
||||||
|
new /obj/effect/decal/cleanable/vomit(get_turf(src))
|
||||||
|
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||||
|
new /mob/living/simple_animal/borer(get_turf(src))
|
||||||
|
|
||||||
|
else
|
||||||
|
src << "You do not have enough chemicals stored to reproduce."
|
||||||
|
return
|
||||||
@@ -69,10 +69,12 @@
|
|||||||
|
|
||||||
/datum/species/xenos/handle_environment_special(var/mob/living/carbon/human/H)
|
/datum/species/xenos/handle_environment_special(var/mob/living/carbon/human/H)
|
||||||
|
|
||||||
if(!H.loc)
|
var/turf/T = H.loc
|
||||||
return
|
if(!T) return
|
||||||
|
var/datum/gas_mixture/environment = T.return_air()
|
||||||
|
if(!environment) return
|
||||||
|
|
||||||
if(locate(/obj/effect/alien/weeds) in H.loc)
|
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
|
||||||
if(H.health >= H.maxHealth - H.getCloneLoss())
|
if(H.health >= H.maxHealth - H.getCloneLoss())
|
||||||
var/datum/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"]
|
var/datum/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"]
|
||||||
P.stored_plasma += weeds_plasma_rate
|
P.stored_plasma += weeds_plasma_rate
|
||||||
@@ -82,7 +84,8 @@
|
|||||||
H.adjustFireLoss(-weeds_heal_rate)
|
H.adjustFireLoss(-weeds_heal_rate)
|
||||||
H.adjustOxyLoss(-weeds_heal_rate)
|
H.adjustOxyLoss(-weeds_heal_rate)
|
||||||
H.adjustToxLoss(-weeds_heal_rate)
|
H.adjustToxLoss(-weeds_heal_rate)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|
||||||
/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H)
|
/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H)
|
||||||
H.AddInfectionImages()
|
H.AddInfectionImages()
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
var/mutantrace // Safeguard due to old code.
|
var/mutantrace // Safeguard due to old code.
|
||||||
var/list/speech_sounds // A list of sounds to potentially play when speaking.
|
var/list/speech_sounds // A list of sounds to potentially play when speaking.
|
||||||
var/has_fine_manipulation = 1 // Can use small items.
|
var/has_fine_manipulation = 1 // Can use small items.
|
||||||
var/insulated // Immune to electrocution.
|
var/insulated // Immune to electrocution and glass shards to the feet.
|
||||||
|
|
||||||
// Some species-specific gibbing data.
|
// Some species-specific gibbing data.
|
||||||
var/gibbed_anim = "gibbed-h"
|
var/gibbed_anim = "gibbed-h"
|
||||||
|
|||||||
@@ -111,42 +111,6 @@
|
|||||||
tally += (283.222 - bodytemperature) / 10 * 1.75
|
tally += (283.222 - bodytemperature) / 10 * 1.75
|
||||||
return tally+config.monkey_delay
|
return tally+config.monkey_delay
|
||||||
|
|
||||||
/mob/living/carbon/monkey/Bump(atom/movable/AM as mob|obj, yes)
|
|
||||||
|
|
||||||
spawn( 0 )
|
|
||||||
if ((!( yes ) || now_pushing))
|
|
||||||
return
|
|
||||||
now_pushing = 1
|
|
||||||
if(ismob(AM))
|
|
||||||
var/mob/tmob = AM
|
|
||||||
if(istype(tmob, /mob/living/carbon/human) && (HULK in tmob.mutations))
|
|
||||||
if(prob(70))
|
|
||||||
usr << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
|
||||||
now_pushing = 0
|
|
||||||
return
|
|
||||||
if(!(tmob.status_flags & CANPUSH))
|
|
||||||
now_pushing = 0
|
|
||||||
return
|
|
||||||
|
|
||||||
tmob.LAssailant = src
|
|
||||||
now_pushing = 0
|
|
||||||
..()
|
|
||||||
if (!( istype(AM, /atom/movable) ))
|
|
||||||
return
|
|
||||||
if (!( now_pushing ))
|
|
||||||
now_pushing = 1
|
|
||||||
if (!( AM.anchored ))
|
|
||||||
var/t = get_dir(src, AM)
|
|
||||||
if (istype(AM, /obj/structure/window))
|
|
||||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
|
||||||
for(var/obj/structure/window/win in get_step(AM,t))
|
|
||||||
now_pushing = 0
|
|
||||||
return
|
|
||||||
step(AM, t)
|
|
||||||
now_pushing = null
|
|
||||||
return
|
|
||||||
return
|
|
||||||
|
|
||||||
/mob/living/carbon/monkey/Topic(href, href_list)
|
/mob/living/carbon/monkey/Topic(href, href_list)
|
||||||
..()
|
..()
|
||||||
if (href_list["mach_close"])
|
if (href_list["mach_close"])
|
||||||
|
|||||||
@@ -1036,3 +1036,12 @@ mob/proc/yank_out_object()
|
|||||||
if(paralysis)
|
if(paralysis)
|
||||||
AdjustParalysis(-1)
|
AdjustParalysis(-1)
|
||||||
return paralysis
|
return paralysis
|
||||||
|
|
||||||
|
//Check for brain worms in head.
|
||||||
|
/mob/proc/has_brain_worms()
|
||||||
|
|
||||||
|
for(var/I in contents)
|
||||||
|
if(istype(I,/mob/living/simple_animal/borer))
|
||||||
|
return I
|
||||||
|
|
||||||
|
return 0
|
||||||
Reference in New Issue
Block a user