mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-29 23:17:02 +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:
@@ -175,8 +175,9 @@ datum
|
||||
src = null
|
||||
if(self.data&&method == INGEST)
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(M.virus && D.type == self.data["viruses"])
|
||||
D.cure()
|
||||
if(D.type == self.data)
|
||||
D.stage--
|
||||
if(D.stage <= 0) D.cure()
|
||||
|
||||
M.resistances += self.data
|
||||
return
|
||||
|
||||
@@ -855,7 +855,7 @@
|
||||
|
||||
if(istype(target, /obj/item/metroid_core))
|
||||
var/obj/item/metroid_core/core = target
|
||||
core.Flush = 30
|
||||
core.Flush = 30 // reset flush counter
|
||||
|
||||
if(ismob(target) && target != user)
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
if(target == user && !user.stat)
|
||||
V.show_message("[usr] starts climbing into the disposal.", 3)
|
||||
if(target != user && !user.restrained())
|
||||
if(target.anchored) return
|
||||
V.show_message("[usr] starts stuffing [target.name] into the disposal.", 3)
|
||||
if(!do_after(usr, 20))
|
||||
return
|
||||
|
||||
@@ -28,9 +28,9 @@ to null does not delete the object itself. Thank you.
|
||||
var/mob/living/carbon/affected_mob = null //the mob which is affected by disease.
|
||||
var/holder = null //the atom containing the disease (mob or obj)
|
||||
var/carrier = 0.0 //there will be a small chance that the person will be a carrier
|
||||
var/curable = 1 //can this disease be cured? (By itself...)
|
||||
var/curable = 0 //can this disease be cured? (By itself...)
|
||||
var/list/strain_data = list() //This is passed on to infectees
|
||||
var/stage_prob = 5 // probability of advancing to next stage, default 5% per check
|
||||
var/stage_prob = 4 // probability of advancing to next stage, default 5% per check
|
||||
var/agent = "some microbes"//name of the disease agent
|
||||
var/permeability_mod = 1//permeability modifier coefficient.
|
||||
var/desc = null//description. Leave it null and this disease won't show in med records.
|
||||
@@ -49,7 +49,7 @@ to null does not delete the object itself. Thank you.
|
||||
|
||||
if(stage > max_stages)
|
||||
stage = max_stages
|
||||
if(prob(stage_prob) && stage != max_stages && !cure_present) //now the disease shouldn't get back up to stage 4 in no time
|
||||
if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present) //now the disease shouldn't get back up to stage 4 in no time
|
||||
stage++
|
||||
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
|
||||
stage--
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if(3)
|
||||
if(affected_mob.sleeping && prob(25))
|
||||
affected_mob << "\blue You feel better."
|
||||
affected_mob.virus.cure()
|
||||
src.cure()
|
||||
return
|
||||
if(prob(1) && prob(10))
|
||||
affected_mob << "\blue You feel better."
|
||||
|
||||
@@ -31,9 +31,12 @@
|
||||
|
||||
var/tame = 0 // if set to 1, the Metroid will not eat humans ever, or attack them
|
||||
|
||||
var/list/Friends = list() // Anything on this list the Metroid will never eat, or attack
|
||||
var/rabid = 0 // if set to 1, the Metroid will attack and eat anything it comes in contact with
|
||||
|
||||
// Metroids pass on genetic data, so all their offspring have the same "Friends"
|
||||
var/list/Friends = list() // A list of potential friends
|
||||
var/list/FriendsWeight = list() // A list containing values respective to Friends. This determines how many times a Metroid "likes" something. If the Metroid likes it more than 2 times, it becomes a friend
|
||||
|
||||
// Metroids pass on genetic data, so all their offspring have the same "Friends",
|
||||
|
||||
/mob/living/carbon/metroid/adult
|
||||
name = "adult metroid"
|
||||
|
||||
@@ -181,6 +181,9 @@
|
||||
statpanel("[P.panel]","",P)
|
||||
*/
|
||||
|
||||
//The last mob/living/carbon to push/drag/grab this mob (mostly used by Metroids friend recognition)
|
||||
var/mob/living/carbon/LAssailant = null
|
||||
|
||||
//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button
|
||||
var/obj/proc_holder/spell/list/spell_list = list()
|
||||
|
||||
@@ -220,4 +223,4 @@ the mob is also allowed to move without any sort of restriction. For instance, i
|
||||
|
||||
var/UI = 'screen1_old.dmi' // For changing the UI from preferences
|
||||
|
||||
var/obj/organstructure/organStructure = null //for dem organs
|
||||
var/obj/organstructure/organStructure = null //for dem organs
|
||||
|
||||
@@ -267,7 +267,7 @@
|
||||
item_state = "caparmor"
|
||||
w_class = 4//bulky item
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.02
|
||||
//permeability_coefficient = 0.02 // HAHAHA no captain's armor is not a bio suit
|
||||
heat_transfer_coefficient = 0.02
|
||||
radiation_protection = 0.25
|
||||
protective_temperature = 1000
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
if("Warden")
|
||||
return list(access_security, access_brig, access_armory, access_court)
|
||||
if("Scientist")
|
||||
return list(access_tox, access_tox_storage, access_research, access_medical)
|
||||
return list(access_tox, access_tox_storage, access_research, access_medical, access_xenobiology)
|
||||
if("Head of Security")
|
||||
return list(access_medical, access_morgue, access_tox, access_tox_storage, access_chemistry, access_medlab, access_court,
|
||||
access_teleporter, access_heads, access_tech_storage, access_security, access_brig, access_atmospherics,
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
set_ready_state(0)
|
||||
playsound(chassis, 'Laser.ogg', 50, 1)
|
||||
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(curloc)
|
||||
A.original = targloc
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
@@ -56,6 +57,7 @@
|
||||
|
||||
playsound(chassis, 'marauder.ogg', 50, 1)
|
||||
var/obj/item/projectile/beam/pulse/A = new /obj/item/projectile/beam/pulse/heavy(curloc)
|
||||
A.original = targloc
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
@@ -97,6 +99,7 @@
|
||||
|
||||
playsound(chassis, 'Laser.ogg', 50, 1)
|
||||
var/obj/item/projectile/electrode/A = new /obj/item/projectile/electrode(curloc)
|
||||
A.original = targloc
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
@@ -221,6 +224,7 @@
|
||||
playsound(chassis, 'Gunshot.ogg', 80, 1)
|
||||
var/obj/item/projectile/A = new /obj/item/projectile(curloc)
|
||||
src.projectiles--
|
||||
A.original = targloc
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
@@ -259,6 +263,7 @@
|
||||
playsound(chassis, 'Gunshot.ogg', 50, 1)
|
||||
var/obj/item/projectile/weakbullet/A = new /obj/item/projectile/weakbullet(curloc)
|
||||
src.projectiles--
|
||||
A.original = targloc
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
|
||||
@@ -237,6 +237,10 @@
|
||||
if(prob(5 + round(power/2)))
|
||||
Metroid.Victim = null
|
||||
Metroid.anchored = 0
|
||||
|
||||
if(prob(80) && !Metroid.client)
|
||||
Metroid.Discipline++
|
||||
|
||||
spawn(0)
|
||||
Metroid.canmove = 0
|
||||
step_away(Metroid, user)
|
||||
@@ -249,6 +253,13 @@
|
||||
if(prob(10 + power*2))
|
||||
Metroid.Victim = null
|
||||
Metroid.anchored = 0
|
||||
|
||||
if(prob(80) && !Metroid.client)
|
||||
Metroid.Discipline++
|
||||
|
||||
if(Metroid.Discipline == 1)
|
||||
Metroid.attacked = 0
|
||||
|
||||
spawn(0)
|
||||
step_away(Metroid, user)
|
||||
Metroid.canmove = 0
|
||||
|
||||
@@ -28,6 +28,10 @@ var/const/PROJECTILE_DART = 8
|
||||
yo = null
|
||||
xo = null
|
||||
current = null
|
||||
turf/original = null
|
||||
|
||||
bumped = 0
|
||||
|
||||
|
||||
weakbullet
|
||||
damage_type = PROJECTILE_WEAKBULLET
|
||||
@@ -59,10 +63,20 @@ var/const/PROJECTILE_DART = 8
|
||||
icon_state = "cbbolt"
|
||||
|
||||
Bump(atom/A as mob|obj|turf|area)
|
||||
if(A == firer)
|
||||
loc = A.loc
|
||||
return // cannot shoot yourself! NO!
|
||||
if(bumped) return
|
||||
|
||||
bumped = 1
|
||||
if(firer && istype(A, /mob))
|
||||
var/mob/M = A
|
||||
if(!silenced)
|
||||
visible_message("\red [A.name] has been shot by [firer.name].", "\blue You hear a [istype(src, /obj/item/projectile/beam) ? "gunshot" : "laser blast"].")
|
||||
/*
|
||||
for(var/mob/O in viewers(M))
|
||||
O.show_message("\red [A.name] has been shot by [firer.name]!", 1) */
|
||||
|
||||
visible_message("\red [A.name] has been shot by [firer.name]!", "\blue You hear a [istype(src, /obj/item/projectile/beam) ? "gunshot" : "laser blast"]!")
|
||||
else
|
||||
M << "\red You've been shot!"
|
||||
if(istype(firer, /mob))
|
||||
@@ -89,13 +103,22 @@ var/const/PROJECTILE_DART = 8
|
||||
|
||||
process()
|
||||
spawn while(src)
|
||||
|
||||
if ((!( current ) || loc == current))
|
||||
current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
|
||||
if ((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
|
||||
del(src)
|
||||
return
|
||||
step_towards(src, current)
|
||||
|
||||
sleep( 1 )
|
||||
|
||||
if(!bumped)
|
||||
if(loc == original)
|
||||
for(var/mob/M in original)
|
||||
Bump(M)
|
||||
sleep( 1 )
|
||||
|
||||
return
|
||||
|
||||
/obj/item/ammo_casing
|
||||
@@ -468,8 +491,8 @@ var/const/PROJECTILE_DART = 8
|
||||
update_icon()
|
||||
|
||||
energy
|
||||
icon_state = "energy"
|
||||
name = "Energy Gun"
|
||||
icon_state = "energy gun"
|
||||
name = "energy gun"
|
||||
desc = "A basic energy-based gun with two settings: Stun and kill."
|
||||
fire_sound = 'Taser.ogg'
|
||||
var
|
||||
@@ -718,6 +741,16 @@ var/const/PROJECTILE_DART = 8
|
||||
return 1
|
||||
return 0
|
||||
|
||||
freeze
|
||||
name = "freeze gun"
|
||||
icon_state = "freezegun100"
|
||||
fire_sound = 'pulse3.ogg'
|
||||
|
||||
attack_self(mob/living/user as mob)
|
||||
return
|
||||
|
||||
|
||||
|
||||
crossbow
|
||||
name = "mini energy-crossbow"
|
||||
desc = "A weapon favored by many of the syndicates stealth specialists."
|
||||
@@ -767,6 +800,7 @@ var/const/PROJECTILE_DART = 8
|
||||
in_chamber = new /obj/item/projectile/electrode(src)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc
|
||||
load_into_chamber()
|
||||
in_chamber = new /obj/item/projectile/weakbullet(src)
|
||||
@@ -847,6 +881,7 @@ var/const/PROJECTILE_DART = 8
|
||||
user.bullet_act(in_chamber.damage_type)
|
||||
del(in_chamber)
|
||||
else
|
||||
in_chamber.original = targloc
|
||||
in_chamber.loc = get_turf(user)
|
||||
user.next_move = world.time + 4
|
||||
in_chamber.silenced = silenced
|
||||
|
||||
@@ -210,7 +210,7 @@ CIRCULAR SAW
|
||||
|
||||
src.add_fingerprint(user)
|
||||
|
||||
if(user.zone_sel.selecting == "head")
|
||||
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
@@ -237,7 +237,8 @@ CIRCULAR SAW
|
||||
M << "\red [user] begins to cut open your flesh with [src]!"
|
||||
user << "\red You cut [M]'s flesh open with [src]!"
|
||||
M:brain_op_stage = 1.0
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
@@ -275,15 +276,15 @@ CIRCULAR SAW
|
||||
M << "\red [user] begins to cut apart your innards with [src]!"
|
||||
user << "\red You cut [M]'s silky innards apart with [src]!"
|
||||
M:brain_op_stage = 2.0
|
||||
return
|
||||
return
|
||||
if(2.0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
if(M.stat == 2)
|
||||
var/mob/living/carbon/metroid/Metroid = M
|
||||
if(Metroid.cores > 0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
user << "\red You attempt to remove [M]'s core, but your [src] is ineffective!"
|
||||
return
|
||||
user << "\red You attempt to remove [M]'s core, but [src] is ineffective!"
|
||||
return
|
||||
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
@@ -387,7 +388,7 @@ CIRCULAR SAW
|
||||
|
||||
src.add_fingerprint(user)
|
||||
|
||||
if(user.zone_sel.selecting == "head")
|
||||
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
@@ -454,7 +455,7 @@ CIRCULAR SAW
|
||||
if(Metroid.cores <= 0)
|
||||
M.icon_state = "baby metroid dead-nocore"
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
if(3.0)
|
||||
if(M != user)
|
||||
|
||||
@@ -150,4 +150,26 @@
|
||||
viewers(src) << "\red <b>[src] is thrashing wildly! It looks like \he's trying to commit suicide.</b>"
|
||||
//put em at -175
|
||||
oxyloss = max(100 - fireloss - bruteloss, oxyloss)
|
||||
updatehealth()
|
||||
updatehealth()
|
||||
|
||||
|
||||
/mob/living/carbon/metroid/verb/suicide()
|
||||
set hidden = 1
|
||||
if (stat == 2)
|
||||
src << "You're already dead!"
|
||||
return
|
||||
|
||||
if (suiciding)
|
||||
src << "You're already committing suicide! Be patient!"
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
|
||||
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
oxyloss = 100
|
||||
bruteloss = 100
|
||||
toxloss = 100
|
||||
cloneloss = 100
|
||||
|
||||
updatehealth()
|
||||
|
||||
@@ -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