For some reason, viruses were being "cured" just a bit too fast. I lowered the rate which a virus advanced through stages. I also fixed vaccines; they now actually cure viruses as well as providing immunity to any further infection. 


Metroids:
     The beginning of my Metroid ranching phase; Metroids may now, theoretically, be tamed to an extent. Baby Metroids are suceptible to simulated discipline, meaning if you beat them over the head with a toolbox for trying to eat your fellow scientists they will probably get the message. This also works when you're trying to wrestle a metroid off of someone's head. Additionally, they may also identify who the people who feed them are and in a situation where they have to fight to defend themselves or eat, they will spare their "friends". This is a pretty big AI change, so if you see any bugs please report them immediately!

     Metroids can also "vent-crawl" like monkies, but fully-grown adults are too big to do this. NPC Metroids will never vent-crawl. 


Weapons/Guns:
     A lot of you are going to like this one; you can no longer shoot yourself with your own gun! This happens sometimes when the game lags up for a bit, but no more!

     Additionally, you can now shoot people who are on the ground simply by clicking them. I can only imagine how easy this will make being an officer (or traitor/syndicate) now. This applies to both handheld guns and mecha weapon installments.


Xenobiology:
     Scientists now, hopefully, have proper Xenobio access. Metroid dissection has been slightly changed; you can extract Metroid cores from dead Metroids no matter where you're aiming. You will not see me talk about metroid cores anymore because they're a secret. I haven't done anything with them yet, however.


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1813 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
vageyenaman@gmail.com
2011-07-09 22:11:46 +00:00
parent 9de83c2aae
commit 4d60c67d1a
22 changed files with 320 additions and 38 deletions
@@ -31,6 +31,11 @@
..()
if (!istype(AM, /atom/movable))
return
if (ismob(AM))
var/mob/tmob = AM
tmob.LAssailant = src
if (!now_pushing)
now_pushing = 1
if (!AM.anchored)
@@ -701,6 +706,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
@@ -35,6 +35,8 @@
M << "\red <B>[src] fails to push [tmob]'s fat ass out of the way.</B>"
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
..()
if (!( istype(AM, /atom/movable) ))
@@ -464,6 +466,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
@@ -112,6 +112,9 @@
"\red <B>You fail to push [tmob]'s fat ass out of the way.</B>")
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
spawn(0)
..()
@@ -119,6 +122,7 @@
return
if (!now_pushing)
now_pushing = 1
if (!AM.anchored)
var/t = get_dir(src, AM)
if (istype(AM, /obj/window))
@@ -1546,6 +1550,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
@@ -1810,6 +1817,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
+71 -9
View File
@@ -53,6 +53,14 @@
if(prob(85))
attacked--
if(Discipline > 0)
if(Discipline >= 5 && rabid)
if(prob(60)) rabid = 0
if(prob(20))
Discipline--
// Grabbing
@@ -77,8 +85,9 @@
var/starving = 0 // determines if the metroid is starving-hungry
if(istype(src, /mob/living/carbon/metroid/adult))
switch(nutrition)
if(200 to 600) hungry = 1
if(0 to 199) starving = 1
if(400 to 800) hungry = 1
if(0 to 399)
starving = 1
else
switch(nutrition)
@@ -86,6 +95,11 @@
if(0 to 149) starving = 1
if(starving && !client) // if a metroid is starving, it starts losing its friends
if(prob(45))
var/mob/nofriend = pick(Friends)
Friends -= nofriend
if(!Target)
var/list/targets = list()
@@ -98,11 +112,24 @@
if(H.mutantrace == "metroid")
notarget = 1 // don't hurt metroidmen!
if(!istype(src, /mob/living/carbon/metroid/adult))
if(!starving && Discipline > 0)
notarget = 1
break
if(!C.canmove)
for(var/mob/living/carbon/metroid/M in view(1,C))
if(M.Victim == C)
notarget = 1
if(C in Friends)
notarget = 1
if(tame && istype(C, /mob/living/carbon/human))
notarget = 1
if(!notarget) targets += C
@@ -118,7 +145,7 @@
for(var/mob/living/carbon/alien/larva/L in targets)
Target = L
break
if(prob(1))
if(prob(5))
for(var/mob/living/carbon/alien/humanoid/H in targets)
Target = H
break
@@ -132,8 +159,9 @@
else
Target = pick(targets)
if(attacked > 0 && targets.len > 0)
Target = targets[1] // should be the closest target
if(targets.len > 0)
if(attacked > 0 || rabid)
Target = targets[1] // should be the closest target
@@ -158,6 +186,8 @@
var/AIproc = 0 // determines if the AI loop is activated
var/Atkcool = 0 // attack cooldown
var/Tempstun = 0 // temporary temperature stuns
var/Discipline = 0 // if a metroid has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
var/turf/Charging = null // turf a metroid is "charging" at
proc
AIprocess() // the master AI process
@@ -167,6 +197,23 @@
if(Victim) // can't eat AND have this little process at the same time
break
if(Charging)
step_to(src,Charging)
if(Charging == loc)
Charging = null
sleep(15)
if(Target in view(1,src))
Charging = null
if(prob(90)) Feedon(Target)
else
Target.attack_metroid(src)
sleep(5)
sleep(2)
continue
if(Target.health <= -70 || Target.stat == 2)
Target = null
AIproc = 0
@@ -207,7 +254,14 @@
else
if(Target in view(30, src))
step_to(src, Target)
if(get_dist(Target,src) >= 5 && prob(45))
Charging = Target.loc
for(var/mob/O in viewers(src, null))
O.show_message("<b>The [src.name] lunges swiftly at [Target]!</b>", 1)
continue
else
step_to(src, Target)
else
Target = null
@@ -319,7 +373,7 @@
death()
return
else if(src.health < 0)
else if(src.health < -50)
// if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
//if(!src.rejuv) src.oxyloss++
@@ -388,7 +442,7 @@
handle_nutrition()
if(prob(30))
if(istype(src, /mob/living/carbon/metroid/adult)) nutrition-=rand(2,6)
if(istype(src, /mob/living/carbon/metroid/adult)) nutrition-=rand(4,7)
else nutrition-=rand(1,4)
if(nutrition <= 0)
@@ -413,7 +467,11 @@
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
M.nutrition = round(nutrition/number)
step_away(M,src)
M.powerlevel = round(powerlevel / number)
M.Friends = Friends
M.tame = tame
M.rabid = rabid
if(i != 1) step_away(M,src)
del(src)
@@ -421,6 +479,10 @@
if(!client)
var/mob/living/carbon/metroid/adult/A = new/mob/living/carbon/metroid/adult(src.loc)
A.nutrition = nutrition
A.powerlevel = max(0, powerlevel-1)
A.Friends = Friends
A.tame = tame
A.rabid = rabid
del(src)
@@ -33,8 +33,8 @@
if(reagents.has_reagent("hyperzine")) // hyperzine slows Metroids down
tally *= 2 // moves twice as slow
if(reagents.has_reagent("frostoil")) // frostoil also makes them move pretty slow
tally *= 3
if(reagents.has_reagent("frostoil")) // frostoil also makes them move VEEERRYYYYY slow
tally *= 5
if(health <= 0) // if damaged, the metroid moves twice as slow
tally *= 2
@@ -61,7 +61,9 @@
if(7 to 8) probab = 60
if(9) probab = 70
if(10) probab = 95
if(prob(probab))
if(prob(probab) || Charging)
if(Charging) Charging = null
if(istype(AM, /obj/window) || istype(AM, /obj/grille))
if(istype(src, /mob/living/carbon/metroid/adult))
if(nutrition <= 600 && !Atkcool)
@@ -444,6 +446,9 @@
O.show_message("\red [M] manages to wrestle \the [name] off!", 1)
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
if(prob(90) && !client)
Discipline++
Victim = null
anchored = 0
step_away(src,M)
@@ -463,6 +468,9 @@
O.show_message("\red [M] manages to wrestle \the [name] off of [Victim]!", 1)
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
if(prob(50) && !client)
Discipline++
Victim = null
anchored = 0
step_away(src,M)
@@ -496,6 +504,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
@@ -511,11 +522,15 @@
if(Victim)
Victim = null
anchored = 0
if(prob(80) && !client)
Discipline++
spawn(0)
step_away(src,M,15)
sleep(3)
step_away(src,M,15)
playsound(loc, "punch", 25, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
@@ -583,6 +598,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [] has grabbed [name] passively!", M), 1)
@@ -600,6 +618,8 @@
if(Victim)
Victim = null
anchored = 0
if(prob(80) && !client)
Discipline++
spawn(0)
@@ -640,7 +660,13 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75
/mob/living/carbon/metroid/updatehealth()
if (nodamage == 0)
// metroids can't suffocate unless they suicide. They are also not harmed by fire
health = 25 - oxyloss - bruteloss
if(istype(src, /mob/living/carbon/metroid/adult))
health = 200 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
else
health = 150 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
else
health = 25
if(istype(src, /mob/living/carbon/metroid/adult))
health = 200
else
health = 150
stat = 0
@@ -124,6 +124,22 @@
if(M.health <= -70)
M.canmove = 0
if(!client)
if(Victim && !rabid && !attacked)
if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50))
var/Found = 0
for(var/mob/F in Friends)
if(F == Victim.LAssailant)
Found = 1
if(!Found)
Friends += Victim.LAssailant
if(M.client && istype(src, /mob/living/carbon/human))
if(prob(85))
rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
if(client) src << "<i>This subject does not have a strong enough life energy anymore...</i>"
else
M.canmove = 1
@@ -150,6 +166,7 @@
new_metroid.mind_initialize(src)
new_metroid.key = key
new_metroid.nutrition = nutrition
new_metroid.powerlevel = max(0, powerlevel-1)
new_metroid.a_intent = "hurt"
new_metroid << "<B>You are now an adult Metroid.</B>"
@@ -171,7 +188,8 @@
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
M.nutrition = round(nutrition/number)
step_away(M,src)
M.powerlevel = round(powerlevel / number)
if(i != 1) step_away(M,src)
babies += M
@@ -190,4 +208,60 @@
/mob/living/carbon/metroid/verb/ventcrawl()
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
set category = "Metroid"
if(istype(src, /mob/living/carbon/metroid/adult))
src << "<i>I am much too big to fit in this small vent...</i>"
return
if(!stat)
if(Victim)
src << "<i>Not while I am a feeding...</i>"
return
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
if(!v.welded)
vent_found = v
else
src << "\red <i>That vent is welded...</i>"
if(vent_found)
if(vent_found.network&&vent_found.network.normal_members.len)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
if(temp_vent.loc == loc)
continue
vents.Add(temp_vent)
var/list/choices = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
if(vent.loc.z != loc.z)
continue
var/atom/a = get_turf_loc(vent)
choices.Add(a.loc)
var/turf/startloc = loc
var/obj/selection = input("Select a destination.", "Duct System") in choices
var/selection_position = choices.Find(selection)
if(loc==startloc)
var/obj/target_vent = vents[selection_position]
if(target_vent)
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O.show_message(text("<B>[src] scrambles into the ventillation ducts!</B>"), 1)
loc = target_vent.loc
else
src << "<i>I must remain still while entering a vent...</i>"
else
src << "<i>This vent is not connected to anything...</i>"
else
src << "<i>I must be standing on or beside an air vent to enter it...</i>"
else
src << "<i>I must be conscious to do this...</i>"
return
@@ -52,6 +52,8 @@
M << "\red <B>[src] fails to push [tmob]'s fat ass out of the way.</B>"
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
..()
if (!( istype(AM, /atom/movable) ))
@@ -254,6 +256,7 @@
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)
@@ -264,6 +267,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [] has grabbed [name] passively!", M), 1)
@@ -334,6 +340,9 @@
G.affecting = src
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [] has grabbed [name] passively!", M), 1)
+6
View File
@@ -1675,6 +1675,12 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return
if (!( anchored ))
usr.pulling = src
if(ismob(src))
var/mob/M = src
if(!istype(usr, /mob/living/carbon))
M.LAssailant = null
else
M.LAssailant = usr
return
/atom/verb/examine()