Alium changes:

Aliens are now scary. Be careful of all those friendly xenos running about.
Scythe-like arms can now seriously injure you if they get an opportunity.
Spit now costs 50 plasma instead of 25. It works like a taser (no more homing spit). The effect is the same as the old spit but instead of fire loss, it deals toxin damage. Riot shields can still block spit 50% of the time. 
Spit overloads (stuns) a cyborg's receptor circuit for 5 seconds, dealing 10 fire damage.
Spit has a new projectile icon.
Aliens can now properly attack monkeys, dealing heavy damage.
Can now interact with other aliens via attack. Larva cannot interact as such. Currently bugged where two similar messages show up on interaction. Will be fixed asap.
Slightly higher damage to cyborgs. Aliens can now caress cyborgs with their scythe-like arms.
Slightly higher damage to exosuits.
Invisibility now works for 15 seconds instead of 30.
Resin wall now costs 100 plasma instead of 200.
Face huggers now have 10 health instead of 25. There is also a 30% chance of not being paralyzed after a facehugger leap. The paralysis itself lasts half as long.
Aliens can now break glass, grills, and tables, and light fixtures without using acid. 
Adult aliens can now also climb over tables/racks.
Fixed the acid verb not properly showing up.
Fixed stab/disarm never properly showing up.
Larva now get a verb to hide under tables as the old code didn't work.
More alien emote fixes. Larva should now properly be gender neutral.

General changes:
Devouring time has been extended so it takes 10 seconds for all mobs. You must remain still (and the target), to devour someone.
Hulks can break through grills a lot faster than before.
Added smoothwall shuttle code by Urist (and icons by Rolfero).
Added a new dmi for gimmick items. Moved a few gimmick items there.


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@694 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
noisomehollow@lycos.com
2010-12-24 03:13:33 +00:00
parent 82f9ce13cc
commit 41cd0a67b7
34 changed files with 2024 additions and 1744 deletions
@@ -63,6 +63,7 @@
//These are shuttle areas, they must contain two areas in a subgroup if you want to move a shuttle from one
//place to another. Look at escape shuttle for example.
//All shuttles show now be under shuttle since we have smooth-wall code.
/area/shuttle //DO NOT TURN THE SD_LIGHTING STUFF ON FOR SHUTTLES. IT BREAKS THINGS.
requires_power = 0
@@ -88,6 +89,12 @@
/area/shuttle/escape/centcom
icon_state = "shuttle"
/area/shuttle/transport1/centcom
icon_state = "shuttle"
/area/shuttle/transport2/centcom
icon_state = "shuttle"
/area/shuttle/prison/
name = "Prison Shuttle"
+2
View File
@@ -4,6 +4,8 @@
voice_message = "hisses"
say_message = "hisses"
icon = 'alien.dmi'
gender = NEUTER
flags = 258.0
toxloss = 250
var/alien_invis = 0.0
@@ -1,8 +1,6 @@
/mob/living/carbon/alien/larva
name = "alien larva"
icon_state = "larva"
gender = NEUTER
flags = 258.0
health = 25
+4 -1
View File
@@ -121,7 +121,6 @@
/obj/bullet/weakbullet
/obj/bullet/electrode
name = "electrode"
icon_state = "spark"
@@ -136,6 +135,10 @@
name = "crossbow bolt"
icon_state = "cbbolt"
/obj/bullet/neurodart
name = "acid"
icon_state = "toxin"
/obj/datacore
name = "datacore"
var/list/medical = list( )
+1 -1
View File
@@ -212,7 +212,7 @@
/obj/mecha/attack_alien(mob/user as mob)
if(!prob(src.deflect_chance))
src.take_damage(10)
src.take_damage(15)
//TODO: Add text
else
user << "No effect"
+9 -8
View File
@@ -38,8 +38,8 @@
var/list/path_idle = new/list()
var/alive = 1 //1 alive, 0 dead
var/health = 25
var/maxhealth = 25
var/health = 10
var/maxhealth = 10
var/lamarr = 0
flags = 258.0
@@ -59,13 +59,13 @@
set src in view()
..()
if(!alive)
usr << text("\red <B>the alien is not moving</B>")
else if (src.health > 15)
usr << text("\red <B>the alien looks fresh, just out of the egg</B>")
usr << text("\red <B>The alien is not moving.</B>")
else if (src.health > 5)
usr << text("\red <B>The alien looks fresh, just out of the egg.</B>")
else
usr << text("\red <B>the alien looks pretty beat up</B>")
usr << text("\red <B>The alien looks injured.</B>")
if (lamarr)
usr << text("\red <B>it looks like the proboscis has been removed</B>")
usr << text("\red <B>It looks like the proboscis has been removed.</B>")
return
@@ -240,7 +240,8 @@
O.show_message("\red <B>[src.target] has been leapt on by [lamarr ? src.name : "the alien"]!</B>", 1, "\red You hear someone fall", 2)
if (!lamarr)
target:bruteloss += 10
target:paralysis = max(target:paralysis, 10)
if(prob(70))
target:paralysis = max(target:paralysis, 5)
src.loc = target.loc
if(!target.alien_egg_flag && ( ishuman(target) || ismonkey(target) ) )
+4 -1
View File
@@ -50,7 +50,10 @@
for(var/mob/O in viewers(user, null))
if(status == 1)
O.show_message(text("\red [] blinds [] with the flash!", user, M))
if(!istype(M, /mob/living/carbon/alien)) //So aliens don't show up as being blinded when it has no effect on them./N
O.show_message(text("\red [] blinds [] with the flash!", user, M))
else
O.show_message(text("\red [] fails to blind [] with the flash!", user, M))
src.attack_self(user, 1)
return
+16 -4
View File
@@ -44,7 +44,7 @@
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] kicks the grille.", usr)
src.health -= 2
src.health -= 5
healthcheck()
return
else if(!shock(usr, 70))
@@ -53,7 +53,7 @@
if ((O.client && !( O.blinded )))
O << text("\red [] kicks the grille.", usr)
playsound(src.loc, 'grillehit.ogg', 80, 1)
src.health -= 1
src.health -= 3
/obj/grille/attack_paw(var/obj/M)
if ((usr.mutations & 8))
@@ -61,7 +61,7 @@
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] kicks the grille.", usr)
src.health -= 2
src.health -= 5
healthcheck()
return
else if(!shock(usr, 70))
@@ -70,7 +70,19 @@
if ((O.client && !( O.blinded )))
O << text("\red [] kicks the grille.", usr)
playsound(src.loc, 'grillehit.ogg', 80, 1)
src.health -= 1
src.health -= 3
/obj/grille/attack_alien(var/obj/M)
if (istype(usr, /mob/living/carbon/alien/larva))//Safety check for larva, in case they get attack_alien in the future. /N
return
if (!shock(usr, 70))
usr << text("\green You mangle the grille.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] mangles the grille.", usr)
src.health -= 3
healthcheck()
return
/obj/grille/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
@@ -11,6 +11,7 @@ DETECTIVES REVOLVER
LASER GUN
TASER GUN
CROSSBOW
ALIEN SPIT
TELEPORT GUN
*/
@@ -22,6 +23,7 @@ TELEPORT GUN
/var/const/PROJECTILE_BOLT = 5
/var/const/PROJECTILE_WEAKBULLET = 6
/var/const/PROJECTILE_TELEGUN = 7
/var/const/PROJECTILE_DART = 8
// PULSE RIFLE
@@ -1,7 +1,6 @@
/*
CONTAINS:
SYNDICATE UPLINK
*/
/obj/item/weapon/syndicate_uplink/proc/explode()
+2
View File
@@ -101,6 +101,8 @@
src.health -= 15
if(PROJECTILE_TASER)
src.health -= 5
if(PROJECTILE_DART)
src.health -= 10
if(PROJECTILE_WEAKBULLET)
src.health -= 8
if(PROJECTILE_LASER)
+16 -12
View File
@@ -32,7 +32,7 @@
usr << text("\blue You destroy the table.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] destroys the table.", usr)
O << text("\red [] smashes the table apart!", usr)
if(istype(src, /obj/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else
@@ -43,19 +43,23 @@
step(user, get_dir(user, src))
if (user.loc == src.loc)
user.layer = TURF_LAYER
for(var/mob/M in viewers(user, null))
M.show_message("The monkey hides under the table!", 1)
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("[] hides under the table!", user)
//Foreach goto(69)
return
/obj/table/attack_alien(mob/user as mob)
if(istype(user, /mob/living/carbon/alien/larva))
if (!( locate(/obj/table, user.loc) ))
step(user, get_dir(user, src))
if (user.loc == src.loc)
user.layer = TURF_LAYER
for(var/mob/M in viewers(user, null))
M.show_message("The alien larva hides under the table!", 1)
/obj/table/attack_alien(mob/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
usr << text("\green You destroy the table.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] slices the table apart!", user)
if(istype(src, /obj/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else
new /obj/item/weapon/table_parts( src.loc )
src.density = 0
del(src)
return
/obj/table/attack_hand(mob/user as mob)
@@ -63,7 +67,7 @@
usr << text("\blue You destroy the table.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] destroys the table.", usr)
O << text("\red [] smashes the table apart!", usr)
if(istype(src, /obj/table/reinforced))
new /obj/item/weapon/table_parts/reinforced( src.loc )
else
+10
View File
@@ -976,6 +976,16 @@
del(src)
return
/obj/bullet/neurodart/Bump(atom/A as mob|obj|turf|area)
spawn(0)
if(A)
A.bullet_act(PROJECTILE_DART)
if(istype(A,/turf))
for(var/obj/O in A)
O.bullet_act(PROJECTILE_DART, src)
del(src)
return
/obj/bullet/teleshot/Bump(atom/A as mob|obj|turf|area)
if (src.target == null)
var/list/turfs = list( )
+24 -2
View File
@@ -104,7 +104,7 @@
usr << text("\blue You smash through the window.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] smashes through the window.", usr)
O << text("\red [] smashes through the window!", usr)
src.health = 0
new /obj/item/weapon/shard( src.loc )
if(reinf) new /obj/item/weapon/rods( src.loc)
@@ -117,7 +117,7 @@
usr << text("\blue You smash through the window.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] smashes through the window.", usr)
O << text("\red [] smashes through the window!", usr)
src.health = 0
new /obj/item/weapon/shard( src.loc )
if(reinf) new /obj/item/weapon/rods( src.loc)
@@ -125,6 +125,28 @@
del(src)
return
/obj/window/attack_alien()
if (istype(usr, /mob/living/carbon/alien/larva))//Safety check for larva. /N
return
usr << text("\green You smash against the window.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] smashes against the window.", usr)
src.health -= 15
if(src.health <= 0)
usr << text("\green You smash through the window.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("\red [] smashes through the window!", usr)
src.health = 0
new /obj/item/weapon/shard(src.loc)
if(reinf)
new /obj/item/weapon/rods(src.loc)
src.density = 0
del(src)
return
return
/obj/window/attackby(obj/item/weapon/W as obj, mob/user as mob)
+60 -12
View File
@@ -1,28 +1,57 @@
//Separate dm because it relates to two types of atoms + ease of removal in case it's needed.
//Also assemblies.dm for falsewall checking for this when used.
//I should really make the shuttle wall check run every time it's moved, but centcom uses unsimulated floors so !effort
/atom/proc/relativewall() //atom because it should be useable both for walls and false walls
var/junction = 0 //will be used to determine from which side the wall is connected to other walls
for(var/turf/simulated/wall/W in orange(src,1))
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
junction |= get_dir(src,W)
if(!istype(src,/turf/simulated/shuttle/wall)) //or else we'd have wacky shuttle merging with walls action
for(var/turf/simulated/wall/W in orange(src,1))
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
junction |= get_dir(src,W)
for(var/obj/falsewall/W in orange(src,1))
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
junction |= get_dir(src,W)
for(var/obj/falsewall/W in orange(src,1))
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
junction |= get_dir(src,W)
/* Commenting this out for now until we figure out what to do with shuttle smooth walls, if anything.
As they are now, they sort of work screwy and may need further coding. Or just be scrapped.*/
else
for(var/turf/simulated/shuttle/wall/W in orange(src,1))
if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls
junction |= get_dir(src,W)
for(var/obj/machinery/shuttle/W in orange(src,1)) //stuff like engine and propulsion should merge with walls
if(abs(src.x-W.x)-abs(src.y-W.y))
junction |= get_dir(src,W)
for(var/obj/machinery/door/W in orange(src,1)) //doors should not result in diagonal walls, it just looks ugly. checking if area is shuttle so it won't merge with the station
if((abs(src.x-W.x)-abs(src.y-W.y)) && (istype(W.loc.loc,/area/shuttle) || istype(W.loc.loc,/area/supply)))
junction |= get_dir(src,W)
for(var/obj/grille/W in orange(src,1)) //same for grilles. checking if area is shuttle so it won't merge with the station
if((abs(src.x-W.x)-abs(src.y-W.y)) && (istype(W.loc.loc,/area/shuttle) || istype(W.loc.loc,/area/supply)))
junction |= get_dir(src,W)
if(istype(src,/turf/simulated/wall/r_wall) || istype(src,/obj/falserwall))
src.icon_state = "rwall[junction]"
else if(istype(src,/turf/simulated/wall) || istype(src,/obj/falsewall) || istype(src,/obj/falserwall))
src.icon_state = "wall[junction]"
else if(istype(src,/turf/simulated/shuttle/wall))
if(junction!=5 && junction!=6 && junction!=9 && junction!=10) //if it's not diagonal, all is well, no additional calculations needed
src.icon_state = "swall[junction]"
else //if it's diagonal, we need to figure out if we're using the floor diagonal or the space diagonal sprite
var/is_floor = 0
for(var/turf/simulated/floor/F in orange(src,1))
if(abs(src.x-F.x)-abs(src.y-F.y))
if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
is_floor = 1
for(var/turf/simulated/shuttle/floor/F in orange(src,1))
if(abs(src.x-F.x)-abs(src.y-F.y))
if((15-junction) & get_dir(src,F)) //if there's a floor in at least one of the empty space directions, return 1
is_floor = 1
if(is_floor) //if is_floor = 1, we use the floor diagonal sprite
src.icon_state = "swall_f[junction]"
else //otherwise, the space one
src.icon_state = "swall_s[junction]"
/* When we have animations for different directions of falsewalls, then it'd be needed. Not now.
if(istype(src,/obj/falsewall)) //saving the junctions for the falsewall because it changes icon_state often instead of once
var/obj/falsewall/F = src
F.junctions = junction
*/
return
/turf/simulated/wall/New()
@@ -45,6 +74,15 @@
..()
/turf/simulated/shuttle/wall/New()
spawn(20) //testing if this will make /obj/machinery/shuttle and /door count - It does, it stays.
if(src.icon_state in list("wall1", "wall", "diagonalWall", "wall_floor", "wall_space")) //so wizard den, syndie shuttle etc will remain black
for(var/turf/simulated/shuttle/wall/W in range(src,1))
W.relativewall()
..()
/turf/simulated/wall/Del()
var/temploc = src.loc
@@ -58,7 +96,7 @@
..()
/turf/falsewall/Del()
/obj/falsewall/Del()
var/temploc = src.loc
@@ -69,4 +107,14 @@
for(var/obj/falsewall/W in range(temploc,1))
W.relativewall()
..()
/turf/simulated/shuttle/wall/Del()
var/temploc = src.loc
spawn(10)
for(var/turf/simulated/shuttle/wall/W in range(temploc,1))
W.relativewall()
..()
-1
View File
@@ -287,7 +287,6 @@ They spawn as an assistant but there is no announcement. /N */
var/input = input(usr, "Please specify which key/client will be respawned. That person will not retain their traitor/other status when respawned.", "What?", "")
if(!input)
return
var/GKEY = input
var/GNAME = "none"
var/mob/dead/observer/GDEL //To properly delete the mob later on.
@@ -14,73 +14,65 @@ All I can think of right now./N
/mob/living/carbon/alien/humanoid/verb/invis()
set name = "Invisibility (50)"
set desc = "Makes you invisible for 30 seconds"
set desc = "Makes you invisible for 15 seconds"
set category = "Alien"
if(src.stat)
src << "You must be concious to do this"
src << "\green You must be conscious to do this"
return
if(src.toxloss >= 50)
src.toxloss -= 50
src.alien_invis = 1.0
src << "\green You are now invisible"
src << "\green You are now invisible."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] fades into the surroundings!</B>"), 1)
spawn(300)
spawn(150)
src.alien_invis = 0.0
src << "\green You are no longer invisible"
src << "\green You are no longer invisible."
else
src << "\green Not enough plasma stored"
return
/mob/living/carbon/alien/humanoid/verb/spit(mob/M as mob in oview())
set name = "Spit (25)"
set desc = "Spits acid at someone"
/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit.
Doesn't work on silicon mobs or other aliens.*/
/mob/living/carbon/alien/humanoid/verb/spit(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time."
set category = "Alien"
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
if(src.toxloss >= 25)
src.toxloss -= 25
if(istype(target, /mob/living/carbon/alien))
src << "\green Your allies are not a valid target."
return
if(src.toxloss >= 50)
src.toxloss -= 50
var/turf/T = usr.loc
var/turf/U = (istype(target, /atom/movable) ? target.loc : target)
if(!U || !T)
return
while(U && !istype(U,/turf))
U = U.loc
if(!istype(T, /turf))
return
if (U == T)
usr.bullet_act(PROJECTILE_DART)
return
if(!istype(U, /turf))
return
var/obj/bullet/neurodart/A = new /obj/bullet/neurodart(usr.loc)
A.current = U
A.yo = U.y - T.y
A.xo = U.x - T.x
A.process()
spawn(0)
var/obj/overlay/A = new /obj/overlay( usr.loc )
A.icon_state = "cbbolt"
A.icon = 'projectiles.dmi'
A.name = "acid"
A.anchored = 0
A.density = 0
A.layer = 4
var/i
for(i=0, i<20, i++)
var/obj/overlay/B = new /obj/overlay( A.loc )
B.icon_state = "cbbolt"
B.icon = 'projectiles.dmi'
B.name = "acid"
B.anchored = 1
B.density = 0
B.layer = 3
spawn(5)
del(B)
step_to(A,M,0)
if (get_dist(A,M) == 0)
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] has spat at [M.name]!</B>"), 1)
if (istype(M:l_hand, /obj/item/weapon/shield/riot) && prob(50))
del(A)
return
if (istype(M:r_hand, /obj/item/weapon/shield/riot) && prob(50))
del(A)
return
M.weakened += 5
M.fireloss += 10
del(A)
return
sleep(5)
del(A)
else
src << "\green Not enough plasma stored"
src << "\green Not enough plasma stored."
return
/mob/living/carbon/alien/humanoid/verb/plant()
@@ -89,7 +81,7 @@ All I can think of right now./N
set category = "Alien"
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
if(src.toxloss >= 100)
src.toxloss -= 100
@@ -99,7 +91,7 @@ All I can think of right now./N
W.Life()
else
src << "\green Not enough plasma stored"
src << "\green Not enough plasma stored."
return
/mob/living/carbon/alien/humanoid/verb/call_to()
@@ -108,7 +100,7 @@ All I can think of right now./N
set category = "Alien"
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
if(src.toxloss >= 5)
@@ -117,7 +109,7 @@ All I can think of right now./N
F.call_to(src)
emote("roar")
else
src << "\green Not enough plasma stored"
src << "\green Not enough plasma stored."
return
/mob/living/carbon/alien/humanoid/verb/whisp(mob/M as mob in oview())
@@ -126,7 +118,7 @@ All I can think of right now./N
set category = "Alien"
if(src.stat)
src << "You must be concious to do this"
src << "\green You must be conscious to do this."
return
var/msg = input("Message:", "Alien Whisper") as text
@@ -140,7 +132,7 @@ All I can think of right now./N
M << "\green You hear a strange alien voice in your head... \italic [msg]"
src << {"\green You said: "[msg]" to [M]"}
else
src << "\green Not enough plasma stored"
src << "\green Not enough plasma stored."
return
/mob/living/carbon/alien/humanoid/verb/transfer_plasma(mob/living/carbon/alien/M as mob in oview())
@@ -152,11 +144,11 @@ All I can think of right now./N
return
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "You don't have any plasma."
src << "\green You don't have any plasma."
return
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
@@ -169,7 +161,7 @@ All I can think of right now./N
M.toxloss += amount
src.toxloss -= amount
else
src << "You don't have enough plasma."
src << "\green Not enough plasma."
return
M << "\green [src] has transfered [amount] plasma to you."
@@ -185,43 +177,43 @@ All I can think of right now./N
set category = "Alien"
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "You don't have any plasma."
src << "\green You don't have any plasma."
return
if(src.toxloss >= 500)
src.toxloss -= 500
src << "You begin to evolve."
src << "\green You begin to evolve."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] begins to twist and contort!</B>"), 1)
var/mob/living/carbon/alien/humanoid/queen/Q = new (src.loc)
Q.key = src.key
del(src)
else
src << "You don't have enough plasma."
src << "\green Not enough plasma."
/mob/living/carbon/alien/humanoid/verb/resinwall() // -- TLE
set name = "Shape Resin Wall (200)"
set name = "Shape Resin Wall (100)"
set desc = "Produce a wall of resin that blocks entry and line of sight"
set category = "Alien"
if(src.stat)
src << "You must be concious to do this"
src << "\green You must be conscious to do this."
return
if(!src.toxloss)
src << "You don't have any plasma."
if(src.toxloss >= 200)
src.toxloss -= 200
src << "You begin to shape a wall of resin."
src << "\green You don't have any plasma."
if(src.toxloss >= 100)
src.toxloss -= 100
src << "\green You begin to shape a wall of resin."
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] vomits up a thick purple substance and begins to shape it!</B>"), 1)
//var/obj/alien/resin/R = new(src.loc)
new /obj/alien/resin(src.loc)
else
src << "You don't have enough plasma."
src << "\green Not enough plasma."
/mob/living/carbon/alien/humanoid/proc/ventcrawl() // -- TLE
set name = "Crawl through Vent"
@@ -231,7 +223,7 @@ All I can think of right now./N
// return
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
var/vent_found = 0
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
@@ -239,7 +231,7 @@ All I can think of right now./N
vent_found = v
if(!vent_found)
src << "You must be standing on or beside an open air vent to enter it."
src << "\green You must be standing on or beside an open air vent to enter it."
return
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
@@ -260,12 +252,12 @@ All I can think of right now./N
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(src.loc != startloc)
src << "You need to remain still while entering a vent."
src << "\green You need to remain still while entering a vent."
return
var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection_position]
if(target_vent)
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] scrambles into the ventillation ducts!</B>"), 1)
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
var/list/huggers = list()
for(var/obj/alien/facehugger/F in view(3, src))
if(istype(F, /obj/alien/facehugger))
@@ -309,7 +301,7 @@ I kind of like the right click only--the window version can get a little confusi
var/obj/A
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
var/list/xeno_target
xeno_target = list("ABORT COMMAND")
@@ -320,28 +312,28 @@ I kind of like the right click only--the window version can get a little confusi
if(A == "ABORT COMMAND")
return
if(src.toxloss < 200)
src << "Not enough plasma."
src << "\green Not enough plasma."
return
if(A in view(1))//Another check to see if the item is in range. So the alien does not run off with the window open.
A.acid()
else
src << "Target is too far away."
src << "\green Target is too far away."
return
/mob/living/carbon/alien/humanoid/verb/corrode(obj/O as anything in view(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Spit Corrosive Acid (200)"
/mob/living/carbon/alien/humanoid/verb/corrode(obj/O as anything in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Corrose with Acid (200)"
set desc = "Drench an object in acid, destroying it over time."
if(!istype(O, /obj))
return
if(src.stat)
src << "You must be concious to do this."
src << "\green You must be conscious to do this."
return
if(src.toxloss < 200)
src << "Not enough plasma."
src << "\green Not enough plasma."
return
if(O.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid.
src << "Cannot destroy this object."
src << "\green Cannot destroy this object."
return
else
O.acid()
@@ -182,6 +182,8 @@ to clean it up, or just beat the shit out of it (which takes ages).
src.weakened = 10
if (src.stuttering < 10)
src.stuttering = 10
else if (flag == PROJECTILE_DART)
return
else if(flag == PROJECTILE_LASER)
var/d = 20
@@ -720,8 +722,6 @@ to clean it up, or just beat the shit out of it (which takes ages).
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] has weakened []!</B>", M, src), 1, "\red You hear someone fall.", 2)
src.bruteloss += damage
src.updatehealth()
else
playsound(src.loc, 'punchmiss.ogg', 25, 1, -1)
@@ -748,14 +748,41 @@ to clean it up, or just beat the shit out of it (which takes ages).
O.show_message(text("\red <B>[] has attempted to disarm []!</B>", M, src), 1)
return
/* aliens attacking each other!!
/mob/living/carbon/alien/humanoid/attack_alien()
//todo, put code here
return
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
In all, this is a lot like the monkey code. /N
*/
/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
if (istype(src.loc, /turf) && istype(src.loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
..()
if (M.a_intent == "help")
src.sleeping = 0
src.resting = 0
if (src.paralysis >= 3) src.paralysis -= 3
if (src.stunned >= 3) src.stunned -= 3
if (src.weakened >= 3) src.weakened -= 3
for(var/mob/O in viewers(src, null))
O.show_message(text("\blue [M.name] nuzzles [] trying to wake it up!", src), 1)
else
if (src.health > 0)
var/damage = rand(1, 3)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[M.name] has bit []!</B>", src), 1)
src.bruteloss += damage
src.updatehealth()
else
M << "\green <B>[src.name] is too injured for that.</B>"
return
/mob/living/carbon/alien/humanoid/restrained()
@@ -31,7 +31,7 @@
message = "<B>The [src.name]</B> roars."
m_type = 2
if("tail")
message = "<B>The [src.name]</B> waves his tail."
message = "<B>The [src.name]</B> waves its tail."
m_type = 1
if("gasp")
message = "<B>The [src.name]</B> gasps."
@@ -53,11 +53,11 @@
message = "<B>The [src.name]</B> moans!"
m_type = 2
if("nod")
message = "<B>The [src.name]</B> nods his head."
m_type = 1
if("sit")
message = "<B>The [src.name]</B> sits down."
message = "<B>The [src.name]</B> nods its head."
m_type = 1
// if("sit")
// message = "<B>The [src.name]</B> sits down." //Larvan can't sit down, /N
// m_type = 1
if("sway")
message = "<B>The [src.name]</B> sways around dizzily."
m_type = 1
@@ -76,11 +76,11 @@
message = "<B>The [src.name]</B> rolls."
m_type = 1
if("shake")
message = "<B>The [src.name]</B> shakes his head."
message = "<B>The [src.name]</B> shakes its head."
m_type = 1
if("gnarl")
if (!muzzled)
message = "<B>The [src.name]</B> gnarls and shows his teeth.."
message = "<B>The [src.name]</B> gnarls and shows its teeth.."
m_type = 2
if("jump")
message = "<B>The [src.name]</B> jumps!"
@@ -90,7 +90,7 @@
message = text("<B>[]</B> collapses!", src)
m_type = 2
if("help")
src << "choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
src << "choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper"
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
@@ -144,6 +144,8 @@ to clean it up, or just beat the shit out of it (which takes ages).
src.weakened = 10
if (src.stuttering < 10)
src.stuttering = 10
else if (flag == PROJECTILE_DART)
return
else if(flag == PROJECTILE_LASER)
var/d = 20
@@ -500,21 +502,11 @@ to clean it up, or just beat the shit out of it (which takes ages).
return
return
/*
/mob/living/carbon/alien/larva/attack_alien()
//todo, put code here
return
*/
//Aliens attacking each other is defined in the humanoid.dm file.
/mob/living/carbon/alien/larva/restrained()
return 0
/mob/living/carbon/alien/larva/var/co2overloadtime = null
/mob/living/carbon/alien/larva/var/temperature_resistance = T0C+75
@@ -25,6 +25,25 @@
var/selection_position = choices.Find(selection)
var/obj/target_vent = vents[selection_position]
if(target_vent)
for(var/mob/O in viewers(src, null))
O.show_message(text("\green <B>[src] scrambles into the ventillation ducts!</B>"), 1)
src.loc = target_vent.loc
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("<B>[] scrambles into the ventillation ducts!</B>", src)
src.loc = target_vent.loc
/mob/living/carbon/alien/larva/verb/hide()
set name = "Hide"
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
set category = "Alien"
if (src.layer != TURF_LAYER)
src.layer = TURF_LAYER
src << text("\green You are now hiding.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("<B>[] scurries to the ground!</B>", src)
else
src.layer = MOB_LAYER
src << text("\green You have stopped hiding.")
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << text("[] slowly peaks up from the ground...", src)
+19 -11
View File
@@ -268,6 +268,13 @@
src.weakened = 10
if (src.stuttering < 10)
src.stuttering = 10
else if (flag == PROJECTILE_DART)
if (istype(src.l_hand, /obj/item/weapon/shield/riot)||istype(src.r_hand, /obj/item/weapon/shield/riot))
if (prob(50))
show_message("\red Your shield absorbs the hit!", 4)
else
src.weakened += 5
src.toxloss += 10
else if(flag == PROJECTILE_LASER)
var/d = 20
if (istype(src.wear_suit, /obj/item/clothing/suit/armor))
@@ -1404,7 +1411,7 @@
for(var/mob/O in viewers(src, null))
O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1)
else
//This will be changed to skin, where we can skin a dead human corpse
//This will be changed to skin, where we can skin a dead human corpse//Actually, that sounds kind of impractical./N
if (M.a_intent == "grab")
if (M == src)
return
@@ -1428,6 +1435,7 @@
if (src.w_uniform)
src.w_uniform.add_fingerprint(M)
var/damage = rand(15, 30) // How much damage aliens do to humans? Increasing -- TLE
// I've decreased the chance of humans being protected by uniforms. Now aliens can actually damage them.
var/datum/organ/external/affecting = src.organs["chest"]
var/t = M.zone_sel.selecting
if ((t in list( "eyes", "mouth" )))
@@ -1435,12 +1443,12 @@
var/def_zone = ran_zone(t)
if (src.organs[def_zone])
affecting = src.organs[def_zone]
if ((istype(affecting, /datum/organ/external) && prob(90)))
if ((istype(affecting, /datum/organ/external) && prob(95)))
playsound(src.loc, "punch", 25, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[] has slashed at []!</B>", M, src), 1)
if (def_zone == "head")
if ((((src.head && src.head.body_parts_covered & HEAD) || (src.wear_mask && src.wear_mask.body_parts_covered & HEAD)) && prob(99)))
if ((((src.head && src.head.body_parts_covered & HEAD) || (src.wear_mask && src.wear_mask.body_parts_covered & HEAD)) && prob(5)))
if (prob(20))
affecting.take_damage(damage, 0)
else
@@ -1450,12 +1458,12 @@
if (src.weakened < 10)
src.weakened = rand(10, 15)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] has weakened []!</B>", M, src), 1, "\red You hear someone fall.", 2)
O.show_message(text("\red <B>[] has wounded []!</B>", M, src), 1, "\red You hear someone fall.", 2)
affecting.take_damage(damage)
else
if (def_zone == "chest")
if ((((src.wear_suit && src.wear_suit.body_parts_covered & UPPER_TORSO) || (src.w_uniform && src.w_uniform.body_parts_covered & LOWER_TORSO)) && prob(85)))
src.show_message("\red You have been protected from a hit to the chest.")
if ((((src.wear_suit && src.wear_suit.body_parts_covered & UPPER_TORSO) || (src.w_uniform && src.w_uniform.body_parts_covered & LOWER_TORSO)) && prob(10)))
src.show_message("\blue You have been protected from a hit to the chest.")
return
if (damage > 4.9)
if (prob(50))
@@ -1463,7 +1471,7 @@
src.weakened = 5
playsound(src.loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[] has knocked down []!</B>", M, src), 1, "\red You hear someone fall.", 2)
O.show_message(text("\red <B>[] has tackled down []!</B>", M, src), 1, "\red You hear someone fall.", 2)
else
if (src.stunned < 5)
src.stunned = 5
@@ -1473,15 +1481,15 @@
affecting.take_damage(damage)
else
if (def_zone == "groin")
if ((((src.wear_suit && src.wear_suit.body_parts_covered & LOWER_TORSO) || (src.w_uniform && src.w_uniform.body_parts_covered & LOWER_TORSO)) && prob(75)))
src.show_message("\red You have been protected from a hit to the lower chest.")
if ((((src.wear_suit && src.wear_suit.body_parts_covered & LOWER_TORSO) || (src.w_uniform && src.w_uniform.body_parts_covered & LOWER_TORSO)) && prob(1)))
src.show_message("\blue You have been protected from a hit to the lower chest.")
return
if (damage > 4.9)
if (prob(50))
if (src.weakened < 3)
src.weakened = 3
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[] has knocked down []!</B>", M, src), 1, "\red You hear someone fall.", 2)
O.show_message(text("\red <B>[] has tackled down []!</B>", M, src), 1, "\red You hear someone fall.", 2)
else
if (src.stunned < 3)
src.stunned = 3
@@ -1508,7 +1516,7 @@
if (randn <= 25)
src.weakened = 2
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[] has knocked over []!</B>", M, src), 1)
O.show_message(text("\red <B>[] has tackled over []!</B>", M, src), 1)
else
if (randn <= 60)
src.drop_item()
+96 -19
View File
@@ -119,6 +119,9 @@
src.stunned = 15
else
src.weakened = 15
else if (flag == PROJECTILE_DART)
src.weakened += 5
src.toxloss += 10
else if(flag == PROJECTILE_LASER)
if (src.stat != 2)
src.bruteloss += 20
@@ -177,25 +180,30 @@
O.show_message("\red <B>[M.name] has attempted to bite [src.name]!</B>", 1)
return
/mob/living/carbon/monkey/attack_hand(mob/M as mob)
..()
if (istype(M, /mob/living/carbon/human))
if ((M:gloves && M:gloves.elecgen == 1 && M.a_intent == "hurt") /*&& (!istype(src:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
if(M:gloves.uses > 0)
M:gloves.uses--
if (src.weakened < 5)
src.weakened = 5
if (src.stuttering < 5)
src.stuttering = 5
if (src.stunned < 5)
src.stunned = 5
for(var/mob/O in viewers(src, null))
if (O.client)
O.show_message("\red <B>[src] has been touched with the stun gloves by [M]!</B>", 1, "\red You hear someone fall", 2)
else
M:gloves.elecgen = 0
M << "\red Not enough charge! "
return
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
if (istype(src.loc, /turf) && istype(src.loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
if ((M:gloves && M:gloves.elecgen == 1 && M.a_intent == "hurt") /*&& (!istype(src:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
if(M:gloves.uses > 0)
M:gloves.uses--
if (src.weakened < 5)
src.weakened = 5
if (src.stuttering < 5)
src.stuttering = 5
if (src.stunned < 5)
src.stunned = 5
for(var/mob/O in viewers(src, null))
if (O.client)
O.show_message("\red <B>[src] has been touched with the stun gloves by [M]!</B>", 1, "\red You hear someone fall", 2)
else
M:gloves.elecgen = 0
M << "\red Not enough charge! "
return
if (M.a_intent == "help")
src.sleeping = 0
@@ -265,6 +273,75 @@
O.show_message(text("\red <B>[] has disarmed [src.name]!</B>", M), 1)
return
/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
if (istype(src.loc, /turf) && istype(src.loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
if (M.a_intent == "help")
for(var/mob/O in viewers(src, null))
O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1)
else
if (M.a_intent == "hurt")
if ((prob(95) && src.health > 0))
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has slashed [src.name]!</B>", M), 1)
playsound(src.loc, "punch", 25, 1, -1)
var/damage = rand(5, 10)
if (prob(40))
damage = rand(20, 40)
if (src.paralysis < 5)
src.paralysis = rand(10, 15)
spawn( 0 )
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has wounded [src.name]!</B>", M), 1)
return
src.bruteloss += damage
src.updatehealth()
else
playsound(src.loc, 'punchmiss.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has attempted to lunge at [src.name]!</B>", M), 1)
else
if (M.a_intent == "grab")
if (M == src)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M )
G.assailant = M
if (M.hand)
M.l_hand = G
else
M.r_hand = G
G.layer = 20
G.affecting = src
src.grabbed_by += G
G.synch()
playsound(src.loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [] has grabbed [src.name] passively!", M), 1)
else
if (!( src.paralysis ))
if (prob(25))
src.paralysis = 2
playsound(src.loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has tackled down [src.name]!</B>", M), 1)
else
drop_item()
playsound(src.loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] has disarmed [src.name]!</B>", M), 1)
return
/mob/living/carbon/monkey/Stat()
..()
+2
View File
@@ -201,6 +201,8 @@
src.stunned = 15
else
src.weakened = 15
else if (flag == PROJECTILE_DART)
return
else if(flag == PROJECTILE_LASER)
if (src.stat != 2)
src.bruteloss += 20
+12 -2
View File
@@ -240,6 +240,12 @@
else if (flag == PROJECTILE_TASER)
return
else if (flag == PROJECTILE_DART)
if (src.stat != 2)
src.stunned += 5
src.fireloss += 10
src.updatehealth()
return
/*
else if (flag == PROJECTILE_WAVE)
if (src.stat != 2)
@@ -454,7 +460,11 @@
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if (M.a_intent == "grab")
if (M.a_intent == "help")
for(var/mob/O in viewers(src, null))
O.show_message(text("\blue [M] caresses [src]'s plating with its scythe like arm."), 1)
else if (M.a_intent == "grab")
if (M == src)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M )
@@ -472,7 +482,7 @@
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
else if (M.a_intent == "hurt")
var/damage = rand(5, 10)
var/damage = rand(10, 20)
if (prob(90))
/*
if (M.class == "combat")
+4 -1
View File
@@ -451,7 +451,7 @@
for(var/mob/N in viewers(user, null))
if(N.client)
N.show_message(text("\red <B>[user] is attempting to devour [src.affecting]!</B>"), 1)
if(!do_mob(user, src.affecting)) return
if(!do_mob(user, src.affecting)||!do_after(user, 100)) return
for(var/mob/N in viewers(user, null))
if(N.client)
N.show_message(text("\red <B>[user] devours [src.affecting]!</B>"), 1)
@@ -1478,6 +1478,9 @@
src.stunned = 10
else
src.weakened = 10
else if (flag == PROJECTILE_DART)
src.weakened += 5
src.toxloss += 10
else if(flag == PROJECTILE_LASER)
if (istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
+11 -2
View File
@@ -157,6 +157,7 @@
return
// attempt to break the light
//If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N
else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY)
@@ -173,7 +174,6 @@
src.electrocute(user, 50, null, 20000)
broken()
else
user << "You hit the light!"
@@ -200,7 +200,16 @@
/obj/machinery/light/attack_ai(mob/user)
return
// Aliens smash the bulb but do not get electrocuted./N
/obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs.
if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
user << "\green That object is useless to you."
return
else if (status == LIGHT_OK||status == LIGHT_BURNED)
for(var/mob/M in viewers(src))
M.show_message("\red [user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2)
broken()
return
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player