mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 11:37:40 +01:00
Viruses:
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:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user