mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 16:44:33 +01:00
There's a few things in this revision made by me, and some made by other people that
requested I commit into the SVN. Please PM the collective coders if you find any bugs in
their work.
AI:
The AI now has a verb that lets it change its appearance. It doesn't do much, but but
it's some neat aesthetics that compliment the little display panes scattered around the
station that the AI can modify. This was a combined effort between Firecage, Petethegoat,
and Superxpdude.
Miscellaneous Changes (by Petethegreat):
- Cup Ramen sprite changed to a nicer one by Cheridan
- Plasma sheet sprite changed to a thicker one by Aru
Metroids:
They work. There might be some lingering bugs I simply cannot catch by testing alone,
but they WORK. They act as an entire new player-controllable race, are found in
xeniobiology, and I refuse to say anything else on the matter that would spoil anything. If
you feel so entitled to, you can view the source code to spoil everything like a little
cheater! I haven't completed everything I would like to, and as a result Metroids are
pretty useless. They're still very fun though!
Xenobiology, as a result of Metroids, got a bit of expansion. Scientists have access
to Xenobiology now, for now. If anyone wants Xenobiology to become a standalone job or
whatever, here's the place to post feedback.
Bugfixes:
- Perriot's Throat virus no longer makes you mute, instead, does what it was intended
to HONKHONKHONKHONK!!!!
- Some bugfixes with Turrets.
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1774 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -208,6 +208,9 @@ datum
|
||||
T.overlays -= T.wet_overlay
|
||||
T.wet_overlay = null
|
||||
|
||||
for(var/mob/living/carbon/metroid/M in T)
|
||||
M.toxloss+=rand(10,50)
|
||||
|
||||
var/hotspot = (locate(/obj/hotspot) in T)
|
||||
if(hotspot && !istype(T, /turf/space))
|
||||
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
|
||||
@@ -645,6 +648,8 @@ datum
|
||||
T.overlays = image('effects.dmi',icon_state = "thermite")
|
||||
return
|
||||
|
||||
|
||||
|
||||
mutagen
|
||||
name = "Unstable mutagen"
|
||||
id = "mutagen"
|
||||
@@ -791,6 +796,10 @@ datum
|
||||
T.clean_blood()
|
||||
for(var/obj/decal/cleanable/C in src)
|
||||
del(C)
|
||||
|
||||
for(var/mob/living/carbon/metroid/M in T)
|
||||
M.toxloss+=rand(10,50)
|
||||
|
||||
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
M.clean_blood()
|
||||
if(istype(M, /mob/living/carbon))
|
||||
|
||||
@@ -1097,23 +1097,29 @@
|
||||
if (fullness > (550 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
|
||||
M << "\red You cannot force any more of [src] to go down your throat."
|
||||
return 0
|
||||
else //If you're feeding it to someone else.
|
||||
var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25)
|
||||
if (fullness <= (550 * (1 + M.overeatduration / 1000)))
|
||||
else
|
||||
if(!istype(M, /mob/living/carbon/metroid)) //If you're feeding it to someone else.
|
||||
var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25)
|
||||
if (fullness <= (550 * (1 + M.overeatduration / 1000)))
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message("\red [user] attempts to feed [M] [src].", 1)
|
||||
else
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message("\red [user] cannot force anymore of [src] down [M]'s throat.", 1)
|
||||
return 0
|
||||
|
||||
if(!do_mob(user, M)) return
|
||||
|
||||
M.attack_log += text("<font color='orange'>[world.time] - has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]</font>")
|
||||
user.attack_log += text("<font color='red'>[world.time] - has fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]</font>")
|
||||
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message("\red [user] attempts to feed [M] [src].", 1)
|
||||
O.show_message("\red [user] feeds [M] [src].", 1)
|
||||
|
||||
else
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message("\red [user] cannot force anymore of [src] down [M]'s throat.", 1)
|
||||
return 0
|
||||
user << "This creature does not seem to have a mouth!"
|
||||
return
|
||||
|
||||
if(!do_mob(user, M)) return
|
||||
|
||||
M.attack_log += text("<font color='orange'>[world.time] - has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]</font>")
|
||||
user.attack_log += text("<font color='red'>[world.time] - has fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]</font>")
|
||||
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message("\red [user] feeds [M] [src].", 1)
|
||||
if(reagents) //Handle ingestion of the reagent.
|
||||
if(reagents.total_volume)
|
||||
reagents.reaction(M, INGEST)
|
||||
@@ -2035,7 +2041,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen
|
||||
name = "Cup Ramen"
|
||||
desc = "Just add 10ml water, self heats! A taste that reminds you of your shcool years."
|
||||
icon_state = "coffee"
|
||||
icon_state = "ramen"
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("dry_ramen", 30)
|
||||
|
||||
@@ -6,14 +6,16 @@
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "baby metroid"
|
||||
pass_flags = PASSTABLE
|
||||
voice_message = "chatters"
|
||||
voice_message = "skrees!"
|
||||
say_message = "says"
|
||||
|
||||
health = 250
|
||||
health = 150
|
||||
gender = NEUTER
|
||||
|
||||
update_icon = 0
|
||||
nutrition = 100
|
||||
nutrition = 800 // 1000 = max
|
||||
|
||||
see_in_dark = 8
|
||||
|
||||
var/amount_grown = 0// controls how long the metroid has been overfed, if 10, grows into an adult
|
||||
// if adult: if 10: reproduces
|
||||
@@ -21,14 +23,18 @@
|
||||
|
||||
var/mob/living/Victim = null // the person the metroid is currently feeding on
|
||||
|
||||
var/mob/living/Target = null // AI variable - tells the Metroid to hunt this down
|
||||
|
||||
var/attacked = 0 // determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
|
||||
|
||||
/mob/living/carbon/metroid/adult
|
||||
name = "adult metroid"
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "adult metroid"
|
||||
|
||||
health = 300
|
||||
health = 200
|
||||
gender = NEUTER
|
||||
|
||||
update_icon = 0
|
||||
nutrition = 100
|
||||
nutrition = 1000 // 1200 = max
|
||||
|
||||
|
||||
@@ -18,6 +18,13 @@
|
||||
src.attack_paw(user)
|
||||
return
|
||||
|
||||
|
||||
// for metroids
|
||||
/atom/proc/attack_metroid(mob/user as mob)
|
||||
return
|
||||
|
||||
|
||||
|
||||
/atom/proc/hand_h(mob/user as mob)
|
||||
return
|
||||
|
||||
@@ -360,6 +367,10 @@
|
||||
else
|
||||
if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)|| istype(usr, /mob/living/silicon/hivebot))
|
||||
src.attack_ai(usr, usr.hand)
|
||||
|
||||
else
|
||||
if(istype(usr, /mob/living/carbon/metroid))
|
||||
src.attack_metroid(usr)
|
||||
else
|
||||
if (istype(usr, /mob/living/carbon/human))
|
||||
src.hand_h(usr, usr.hand)
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
var/obj/machinery/sleeper/connected = null
|
||||
anchored = 1 //About time someone fixed this.
|
||||
density = 1
|
||||
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
|
||||
|
||||
|
||||
/obj/machinery/sleep_console/ex_act(severity)
|
||||
switch(severity)
|
||||
@@ -27,7 +29,12 @@
|
||||
/obj/machinery/sleep_console/New()
|
||||
..()
|
||||
spawn( 5 )
|
||||
src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST))
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeperconsole-r"
|
||||
src.connected = locate(/obj/machinery/sleeper, get_step(src, EAST))
|
||||
else
|
||||
src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST))
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
@@ -121,6 +128,17 @@
|
||||
var/occupied = 0 // So there won't be multiple persons trying to get into one sleeper
|
||||
var/mob/occupant = null
|
||||
anchored = 1
|
||||
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
|
||||
|
||||
|
||||
/obj/machinery/sleeper/New()
|
||||
..()
|
||||
spawn( 5 )
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_0-r"
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/sleeper/dummy//For effects only.
|
||||
icon_state = "sleeper_1"
|
||||
@@ -178,6 +196,9 @@
|
||||
M.loc = src
|
||||
src.occupant = M
|
||||
src.icon_state = "sleeper_1"
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_1-r"
|
||||
|
||||
for(var/obj/O in src)
|
||||
O.loc = src.loc
|
||||
src.add_fingerprint(user)
|
||||
@@ -245,7 +266,9 @@
|
||||
src.occupant.loc = src.loc
|
||||
src.occupant.metabslow = 0
|
||||
src.occupant = null
|
||||
src.icon_state = "sleeper_0"
|
||||
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_0-r"
|
||||
return
|
||||
|
||||
/obj/machinery/sleeper/proc/inject_inap(mob/user as mob)
|
||||
@@ -360,6 +383,9 @@
|
||||
usr.metabslow = 1
|
||||
src.occupant = usr
|
||||
src.icon_state = "sleeper_1"
|
||||
if(orient == "RIGHT")
|
||||
icon_state = "sleeper_1-r"
|
||||
|
||||
for(var/obj/O in src)
|
||||
del(O)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
@@ -477,9 +477,10 @@ Neutralize All Unidentified Life Signs: []<BR>"},
|
||||
var/obj/item/projectile/A
|
||||
if(!installation) // if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
|
||||
A = new /obj/item/projectile/electrode( loc )
|
||||
use_power(200)
|
||||
if(!emagged) use_power(200)
|
||||
else use_power(400)
|
||||
playsound(src.loc, 'Taser.ogg', 75, 1)
|
||||
icon_state = "orange_target_prism"
|
||||
icon_state = "target_prism"
|
||||
else
|
||||
// Shooting Code:
|
||||
var/obj/item/weapon/gun/energy/E=new installation
|
||||
@@ -489,16 +490,19 @@ Neutralize All Unidentified Life Signs: []<BR>"},
|
||||
if (istype(E, /obj/item/weapon/gun/energy/laser))
|
||||
A = new /obj/item/projectile/beam( loc )
|
||||
icon_state = "orange_target_prism"
|
||||
use_power(500)
|
||||
if(!emagged) use_power(500)
|
||||
else use_power(1000)
|
||||
else if(istype(E, /obj/item/weapon/gun/energy/pulse_rifle))
|
||||
A = new /obj/item/projectile/beam/pulse( loc )
|
||||
icon_state = "orange_target_prism"
|
||||
use_power(700)
|
||||
if(!emagged) use_power(700)
|
||||
else use_power(1400)
|
||||
|
||||
else if(istype(E, /obj/item/weapon/gun/energy/taser))
|
||||
A = new /obj/item/projectile/electrode( loc )
|
||||
icon_state = "orange_target_prism"
|
||||
use_power(200)
|
||||
icon_state = "target_prism"
|
||||
if(!emagged) use_power(200)
|
||||
else use_power(400)
|
||||
|
||||
else // Energy gun shots
|
||||
|
||||
@@ -510,7 +514,7 @@ Neutralize All Unidentified Life Signs: []<BR>"},
|
||||
else // if it has been emagged, use laser shots
|
||||
A = new /obj/item/projectile/beam( loc )
|
||||
icon_state = "orange_target_prism"
|
||||
use_power(500)
|
||||
use_power(1000)
|
||||
|
||||
del(E)
|
||||
A.current = T
|
||||
|
||||
@@ -73,6 +73,20 @@
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/grille/attack_metroid(var/obj/M)
|
||||
if(!istype(usr, /mob/living/carbon/metroid/adult))
|
||||
return
|
||||
|
||||
usr<< text("\green You smash against the grille.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [] smashes against the grille.", usr)
|
||||
playsound(src.loc, 'grillehit.ogg', 80, 1)
|
||||
src.health -= rand(2,3)
|
||||
healthcheck()
|
||||
return
|
||||
return
|
||||
|
||||
/obj/grille/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
if(istype(mover) && mover.checkpass(PASSGRILLE))
|
||||
|
||||
@@ -212,10 +212,49 @@
|
||||
//spawn(1800) // this wont work right
|
||||
// M.lastattacker = null
|
||||
/////////////////////////
|
||||
|
||||
var/power = src.force
|
||||
if(!istype(M, /mob/living/carbon/human))
|
||||
if(istype(src, /mob/living/carbon/metroid))
|
||||
var/mob/living/carbon/metroid/Metroid = M
|
||||
if(prob(25))
|
||||
user << "\red [src] passes right through [M]!"
|
||||
return
|
||||
|
||||
if(power > 0)
|
||||
Metroid.attacked += 10
|
||||
|
||||
|
||||
for(var/mob/O in viewers(messagesource, null))
|
||||
O.show_message(text("\red <B>[] has been attacked with [][] </B>", M, src, (user ? text(" by [].", user) : ".")), 1)
|
||||
var/power = src.force
|
||||
|
||||
|
||||
if(power >= 3)
|
||||
var/mob/living/carbon/metroid/Metroid = M
|
||||
if(istype(Metroid, /mob/living/carbon/metroid/adult))
|
||||
if(prob(5 + round(power/2)))
|
||||
Metroid.Victim = null
|
||||
spawn(0)
|
||||
Metroid.canmove = 0
|
||||
step_away(Metroid, user)
|
||||
if(prob(25 + power*2))
|
||||
sleep(2)
|
||||
step_away(Metroid, user)
|
||||
Metroid.canmove = 1
|
||||
|
||||
else
|
||||
if(prob(10 + power*2))
|
||||
Metroid.Victim = null
|
||||
spawn(0)
|
||||
step_away(Metroid, user)
|
||||
Metroid.canmove = 0
|
||||
if(prob(25 + power*4))
|
||||
sleep(2)
|
||||
step_away(Metroid, user)
|
||||
Metroid.canmove = 1
|
||||
|
||||
|
||||
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if (ishuman(user) || isrobot(user) || ishivebot(user) || ismonkey(user) || isalien(user))
|
||||
@@ -359,11 +398,16 @@
|
||||
else
|
||||
switch(src.damtype)
|
||||
if("brute")
|
||||
M.take_organ_damage(power)
|
||||
if (prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/location = M.loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood_floor(M)
|
||||
if(istype(src, /mob/living/carbon/metroid))
|
||||
M.bruteloss += power
|
||||
|
||||
else
|
||||
|
||||
M.take_organ_damage(power)
|
||||
if (prob(33)) // Added blood for whacking non-humans too
|
||||
var/turf/location = M.loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood_floor(M)
|
||||
if("fire")
|
||||
if (!(M.mutations & COLD_RESISTANCE))
|
||||
M.take_organ_damage(0, power)
|
||||
@@ -392,7 +436,7 @@
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
||||
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes!
|
||||
user << "\red You cannot locate any eyes on this creature!"
|
||||
return
|
||||
|
||||
@@ -405,7 +449,6 @@
|
||||
M.weakened += 4
|
||||
M.bruteloss += 10
|
||||
*/
|
||||
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1)
|
||||
|
||||
@@ -147,6 +147,30 @@
|
||||
return
|
||||
return
|
||||
|
||||
/obj/window/attack_metroid()
|
||||
if(!istype(usr, /mob/living/carbon/metroid/adult))
|
||||
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)
|
||||
playsound(src.loc, 'Glasshit.ogg', 100, 1)
|
||||
src.health -= rand(10,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/stack/rods(src.loc)
|
||||
src.density = 0
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/window/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/screwdriver))
|
||||
if(reinf && state >= 1)
|
||||
|
||||
+12
-11
@@ -174,7 +174,7 @@
|
||||
else
|
||||
M.inertia_dir = 0
|
||||
return
|
||||
else
|
||||
else if(!istype(M, /mob/living/carbon/metroid))
|
||||
if (M.m_intent == "run")
|
||||
M.pulling = null
|
||||
step(M, M.dir)
|
||||
@@ -187,16 +187,17 @@
|
||||
return
|
||||
|
||||
if(2) //lube
|
||||
M.pulling = null
|
||||
step(M, M.dir)
|
||||
spawn(1) step(M, M.dir)
|
||||
spawn(2) step(M, M.dir)
|
||||
spawn(3) step(M, M.dir)
|
||||
spawn(4) step(M, M.dir)
|
||||
M.take_organ_damage(2) // Was 5 -- TLE
|
||||
M << "\blue You slipped on the floor!"
|
||||
playsound(src.loc, 'slip.ogg', 50, 1, -3)
|
||||
M.weakened = 10
|
||||
if(!istype(M, /mob/living/carbon/metroid))
|
||||
M.pulling = null
|
||||
step(M, M.dir)
|
||||
spawn(1) step(M, M.dir)
|
||||
spawn(2) step(M, M.dir)
|
||||
spawn(3) step(M, M.dir)
|
||||
spawn(4) step(M, M.dir)
|
||||
M.take_organ_damage(2) // Was 5 -- TLE
|
||||
M << "\blue You slipped on the floor!"
|
||||
playsound(src.loc, 'slip.ogg', 50, 1, -3)
|
||||
M.weakened = 10
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -647,6 +647,18 @@ var/showadminmessages = 1
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["makemetroid"])
|
||||
if (src.level>=3)
|
||||
var/mob/M = locate(href_list["makemetroid"])
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
usr.client.cmd_admin_metroidize(M)
|
||||
else
|
||||
alert("Wrong mob. Must be human.")
|
||||
return
|
||||
else
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["makerobot"])
|
||||
if (src.level>=3)
|
||||
var/mob/M = locate(href_list["makerobot"])
|
||||
@@ -1518,6 +1530,7 @@ var/showadminmessages = 1
|
||||
foo += text("<A HREF='?src=\ref[src];makeai=\ref[M]'>Make AI</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];makerobot=\ref[M]'>Make Robot</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];makealien=\ref[M]'>Make Alien</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];makemetroid=\ref[M]'>Make Metroid</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];tdome1=\ref[M]'>Thunderdome 1</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> | ")
|
||||
foo += text("<A HREF='?src=\ref[src];tdomeadmin=\ref[M]'>Thunderdome Admin</A> | ")
|
||||
|
||||
@@ -191,6 +191,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M:Alienize()
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/client/proc/cmd_admin_metroidize(var/mob/M in world)
|
||||
set category = "Fun"
|
||||
set name = "Make Metroid"
|
||||
|
||||
if(!ticker)
|
||||
alert("Wait until the game starts")
|
||||
return
|
||||
if(ishuman(M))
|
||||
log_admin("[key_name(src)] has metroidized [M.key].")
|
||||
spawn(10)
|
||||
M:Metroidize()
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/*
|
||||
/client/proc/cmd_admin_monkeyize(var/mob/M in world)
|
||||
set category = "Fun"
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 150 - (oxyloss + fireloss + bruteloss)
|
||||
health = 150 - (oxyloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 50) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 150 - (oxyloss + fireloss + bruteloss)
|
||||
health = 150 - (oxyloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 50) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -71,6 +71,14 @@
|
||||
|
||||
/mob/living/carbon/alien/humanoid/bullet_act(flag, A as obj)
|
||||
var/shielded = 0
|
||||
|
||||
if(prob(50))
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
if(M.Victim == src)
|
||||
M.bullet_act(flag, A)
|
||||
return
|
||||
|
||||
|
||||
for(var/obj/item/device/shield/S in src)
|
||||
if (S.active)
|
||||
if (flag == "bullet")
|
||||
@@ -370,6 +378,10 @@
|
||||
. = ..()
|
||||
if ((s_active && !( s_active in contents ) ))
|
||||
s_active.close(src)
|
||||
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
M.UpdateFeed(src)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/update_clothing()
|
||||
@@ -568,6 +580,34 @@
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_metroid(mob/living/carbon/metroid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
bruteloss += damage
|
||||
|
||||
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
|
||||
@@ -376,7 +376,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 100 - (oxyloss + fireloss + bruteloss)
|
||||
health = 100 - (oxyloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 50) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 250 - (oxyloss + fireloss + bruteloss)
|
||||
health = 250 - (oxyloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 50) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -66,6 +66,14 @@
|
||||
|
||||
//This is okay I guess unless we add alien shields or something. Should be cleaned up a bit.
|
||||
/mob/living/carbon/alien/larva/bullet_act(flag, A as obj)
|
||||
|
||||
if(prob(50))
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
if(M.Victim == src)
|
||||
M.bullet_act(flag, A)
|
||||
return
|
||||
|
||||
|
||||
if (locate(/obj/item/weapon/grab, src))
|
||||
var/mob/safe = null
|
||||
if (istype(l_hand, /obj/item/weapon/grab))
|
||||
@@ -221,6 +229,7 @@
|
||||
for(var/mob/M in range(src, 1))
|
||||
if ((M.pulling == src && M.stat == 0 && !( M.restrained() )))
|
||||
t7 = null
|
||||
|
||||
if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving)))))
|
||||
var/turf/T = loc
|
||||
. = ..()
|
||||
@@ -273,6 +282,10 @@
|
||||
. = ..()
|
||||
if ((s_active && !( s_active in contents ) ))
|
||||
s_active.close(src)
|
||||
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
M.UpdateFeed(src)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/update_clothing()
|
||||
@@ -365,6 +378,34 @@
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_metroid(mob/living/carbon/metroid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
bruteloss += damage
|
||||
|
||||
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 25 - (oxyloss + fireloss + bruteloss)
|
||||
health = 25 - (oxyloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 50) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 100 - (oxyloss + toxloss + fireloss + bruteloss)
|
||||
health = 100 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 25) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -186,6 +186,14 @@
|
||||
var/shielded = 0
|
||||
var/list/armor
|
||||
//Preparing the var for grabbing the armor information, can't grab the values yet because we don't know what kind of bullet was used. --NEO
|
||||
|
||||
if(prob(50))
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
if(M.Victim == src)
|
||||
M.bullet_act(flag, A) // the bullet hits them, not src!
|
||||
return
|
||||
|
||||
|
||||
for(var/obj/item/device/shield/S in src)
|
||||
if (S.active)
|
||||
if (flag == "bullet")
|
||||
@@ -952,6 +960,7 @@
|
||||
if (restrained())
|
||||
pulling = null
|
||||
|
||||
|
||||
var/t7 = 1
|
||||
if (restrained())
|
||||
for(var/mob/M in range(src, 1))
|
||||
@@ -1022,6 +1031,10 @@
|
||||
. = ..()
|
||||
if ((s_active && !( s_active in contents ) ))
|
||||
s_active.close(src)
|
||||
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
M.UpdateFeed(src)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/update_clothing()
|
||||
@@ -1656,6 +1669,83 @@
|
||||
O.show_message(text("\red <B>[] has tried to disarm []!</B>", M, src), 1)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_metroid(mob/living/carbon/metroid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
|
||||
var/dam_zone = pick("head", "chest", "l_hand", "r_hand", "l_leg", "r_leg", "groin")
|
||||
|
||||
|
||||
if (dam_zone == "chest")
|
||||
if ((((wear_suit && wear_suit.body_parts_covered & UPPER_TORSO) || (w_uniform && w_uniform.body_parts_covered & LOWER_TORSO)) && prob(10)))
|
||||
if(prob(20))
|
||||
show_message("\blue You have been protected from a hit to the chest.")
|
||||
return
|
||||
|
||||
|
||||
|
||||
if (istype(organs[text("[]", dam_zone)], /datum/organ/external))
|
||||
var/datum/organ/external/temp = organs[text("[]", dam_zone)]
|
||||
if (temp.take_damage(damage, 0))
|
||||
UpdateDamageIcon()
|
||||
else
|
||||
UpdateDamage()
|
||||
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = 10
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
|
||||
switch(M.powerlevel)
|
||||
if(1 to 2) stunprob = 20
|
||||
if(3 to 4) stunprob = 30
|
||||
if(5 to 6) stunprob = 40
|
||||
if(7 to 8) stunprob = 60
|
||||
if(9) stunprob = 70
|
||||
if(10) stunprob = 95
|
||||
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
|
||||
if (weakened < power)
|
||||
weakened = power
|
||||
if (stuttering < power)
|
||||
stuttering = power
|
||||
if (stunned < power)
|
||||
stunned = power
|
||||
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
fireloss += M.powerlevel * rand(6,10)
|
||||
|
||||
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
@@ -1751,6 +1841,10 @@
|
||||
M.attack_log += text("<font color='red'>[world.time] - has punched [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("<font color='orange'>[world.time] - has been punched by [M.name] ([M.ckey])</font>")
|
||||
|
||||
M.attack_log += text("<font color='red'>[world.time] - has punched [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("<font color='orange'>[world.time] - has been punched by [M.name] ([M.ckey])</font>")
|
||||
|
||||
|
||||
if (def_zone == "head")
|
||||
if ((((head && head.body_parts_covered & HEAD) || (wear_mask && wear_mask.body_parts_covered & HEAD)) && prob(99)))
|
||||
if (prob(20))
|
||||
|
||||
@@ -13,19 +13,18 @@
|
||||
for(var/i = 0,i<imax,i++)
|
||||
message += "E"
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(istype(D, /datum/disease/pierrot_throat))
|
||||
var/list/temp_message = dd_text2list(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++)
|
||||
pick_list += i
|
||||
for(var/i=1, ((i <= src.virus.stage) && (i <= temp_message.len)), i++)
|
||||
if(prob(5 * src.virus.stage))
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = "HONK"
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
for(var/datum/disease/pierrot_throat/D in viruses)
|
||||
var/list/temp_message = dd_text2list(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++)
|
||||
pick_list += i
|
||||
for(var/i=1, ((i <= D.stage) && (i <= temp_message.len)), i++)
|
||||
if(prob(5 * D.stage))
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = "HONK"
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
|
||||
//Ninja mask obscures text and voice if set to do so.
|
||||
//Would make it more global but it's sort of ninja specific.
|
||||
@@ -87,4 +86,6 @@
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/brain))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/metroid))
|
||||
return 1
|
||||
return ..()
|
||||
@@ -23,6 +23,7 @@
|
||||
if (src.blind)
|
||||
src.blind.layer = 0
|
||||
src.lying = 1
|
||||
src.icon_state = "baby metroid dead"
|
||||
|
||||
var/h = src.hand
|
||||
src.hand = 0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/carbon/alien/larva/emote(var/act)
|
||||
/mob/living/carbon/metroid/emote(var/act)
|
||||
|
||||
|
||||
if (findtext(act, "-", 1, null))
|
||||
@@ -10,55 +10,40 @@
|
||||
var/message
|
||||
|
||||
switch(act)
|
||||
if ("burp")
|
||||
message = "<B>The [src]</B> burps."
|
||||
m_type = 2
|
||||
if("scratch")
|
||||
if (!src.restrained())
|
||||
message = "<B>The [src.name]</B> scratches."
|
||||
m_type = 1
|
||||
if("whimper")
|
||||
message = "<B>The [src.name]</B> whimpers."
|
||||
if("moan")
|
||||
message = "<B>The [src.name]</B> moans."
|
||||
m_type = 2
|
||||
// if("roar")
|
||||
// if (!muzzled)
|
||||
// message = "<B>The [src.name]</B> roars." Commenting out since larva shouldn't roar /N
|
||||
// m_type = 2
|
||||
if("gasp")
|
||||
message = "<B>The [src.name]</B> gasps."
|
||||
m_type = 2
|
||||
|
||||
if("shiver")
|
||||
message = "<B>The [src.name]</B> shivers."
|
||||
m_type = 2
|
||||
if("drool")
|
||||
message = "<B>The [src.name]</B> drools."
|
||||
m_type = 1
|
||||
if("scretch")
|
||||
message = "<B>The [src.name]</B> scretches."
|
||||
m_type = 2
|
||||
if("choke")
|
||||
message = "<B>The [src.name]</B> chokes."
|
||||
m_type = 2
|
||||
if("moan")
|
||||
message = "<B>The [src.name]</B> moans!"
|
||||
m_type = 2
|
||||
if("nod")
|
||||
message = "<B>The [src.name]</B> nods its head."
|
||||
m_type = 1
|
||||
if("sway")
|
||||
message = "<B>The [src.name]</B> sways around dizzily."
|
||||
m_type = 1
|
||||
if("sulk")
|
||||
message = "<B>The [src.name]</B> sulks down sadly."
|
||||
m_type = 1
|
||||
if("twitch")
|
||||
message = "<B>The [src.name]</B> twitches violently."
|
||||
message = "<B>The [src.name]</B> twitches."
|
||||
m_type = 1
|
||||
if("shake")
|
||||
message = "<B>The [src.name]</B> shakes its head."
|
||||
if("vibrate")
|
||||
message = "<B>The [src.name]</B> vibrates!"
|
||||
m_type = 1
|
||||
if("jump")
|
||||
message = "<B>The [src.name]</B> jumps!"
|
||||
if("light")
|
||||
message = "<B>The [src.name]</B> lights up for a bit, then stops."
|
||||
m_type = 1
|
||||
if("click")
|
||||
message = "<B>The [src.name]</B> makes a clicking noise!"
|
||||
m_type = 1
|
||||
if("chatter")
|
||||
message = "<B>The [src.name]</B> makes a noisy chattering sound!"
|
||||
m_type = 1
|
||||
if("growl")
|
||||
message = "<B>The [src.name]</B> growls!"
|
||||
m_type = 1
|
||||
if("shriek")
|
||||
message = "<B>The [src.name]</B> makes a high-pitched shriek!"
|
||||
m_type = 1
|
||||
else
|
||||
src << text("Invalid Emote: []", act)
|
||||
|
||||
@@ -7,23 +7,23 @@
|
||||
usr << text("\red [] is limp and unresponsive.", src.name)
|
||||
else
|
||||
if (src.bruteloss)
|
||||
if (src.bruteloss < 30)
|
||||
usr << text("\red [] looks slightly damaged!", src.name)
|
||||
if (src.bruteloss < 40)
|
||||
usr << text("\red [] has some punctures in its flesh!", src.name)
|
||||
else
|
||||
usr << text("\red <B>[] looks severely damaged!</B>", src.name)
|
||||
usr << text("\red <B>[] has a lot of punctures and tears in its flesh!</B>", src.name)
|
||||
|
||||
switch(powerlevel)
|
||||
|
||||
if(2 to 3)
|
||||
usr << text("[] seems to have very little electrical activity inside it.", src.name)
|
||||
usr << text("\blue [] seems to have little bit of electrical activity inside it.", src.name)
|
||||
|
||||
if(4 to 5)
|
||||
usr << text("[] seems to some electricity inside of it.", src.name)
|
||||
usr << text("\blue [] seems to some electricity inside of it.", src.name)
|
||||
|
||||
if(6 to 9)
|
||||
usr << text("[] seems to have a lot of electricity inside of it.", src.name)
|
||||
usr << text("\blue [] seems to have a lot of electricity inside of it.", src.name)
|
||||
|
||||
if(10)
|
||||
usr << text("<B>[] seems to have extreme electrical activity inside it!</B>", src.name)
|
||||
usr << text("\blue <B>[] seems to have extreme electrical activity inside it!</B>", src.name)
|
||||
|
||||
return
|
||||
@@ -1,5 +1,10 @@
|
||||
|
||||
/mob/living/carbon/metroid/proc/regular_hud_updates()
|
||||
if(client)
|
||||
for(var/hud in client.screen)
|
||||
del(hud)
|
||||
|
||||
/*
|
||||
/obj/hud/proc/metroid_hud()
|
||||
|
||||
src.adding = list( )
|
||||
@@ -47,3 +52,4 @@
|
||||
src.station_explosion.mouse_opacity = 0
|
||||
src.station_explosion.screen_loc = "1,3"
|
||||
|
||||
*/
|
||||
@@ -20,6 +20,10 @@
|
||||
//Disease Check
|
||||
handle_virus_updates()
|
||||
|
||||
|
||||
// Basically just deletes any screen objects :<
|
||||
regular_hud_updates()
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
/*
|
||||
if(environment) // More error checking -- TLE
|
||||
@@ -38,22 +42,177 @@
|
||||
|
||||
handle_nutrition()
|
||||
|
||||
if(attacked > 50) attacked = 50
|
||||
|
||||
if(attacked > 0)
|
||||
if(prob(85))
|
||||
attacked--
|
||||
|
||||
|
||||
// Grabbing
|
||||
|
||||
if(!client && !stat)
|
||||
if(!client && stat != 2)
|
||||
|
||||
// DO AI STUFF HERE
|
||||
if(prob(33) && canmove && isturf(loc))
|
||||
step(src, pick(cardinal))
|
||||
if(prob(1))
|
||||
emote(pick("scratch","jump","roll","tail"))
|
||||
|
||||
|
||||
|
||||
if(Victim) return // if it's eating someone already, continue eating!
|
||||
|
||||
|
||||
if(prob(5))
|
||||
emote(pick("click","chatter","sway","light","vibrate","chatter","shriek"))
|
||||
|
||||
if(AIproc) return
|
||||
|
||||
|
||||
var/hungry = 0 // determines if the metroid is hungry
|
||||
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
|
||||
|
||||
else
|
||||
switch(nutrition)
|
||||
if(150 to 500) hungry = 1
|
||||
if(0 to 149) starving = 1
|
||||
|
||||
|
||||
if(!Target)
|
||||
var/list/targets = list()
|
||||
|
||||
for(var/mob/living/carbon/C in view(12,src))
|
||||
if(!istype(C, /mob/living/carbon/metroid)) // does not eat his bros! BROSBROSBROSBROS
|
||||
if(C.stat != 2 && C.health > 0) // chooses only healthy targets
|
||||
var/notarget = 0
|
||||
if(!C.canmove)
|
||||
for(var/mob/living/carbon/metroid/M in view(1,C))
|
||||
if(M.Victim == C)
|
||||
notarget = 1
|
||||
break // They don't go for prey already being eaten
|
||||
|
||||
|
||||
|
||||
if(!notarget) targets += C
|
||||
|
||||
|
||||
|
||||
|
||||
if((hungry || starving) && targets.len > 0)
|
||||
if(!istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(!starving)
|
||||
for(var/mob/living/carbon/monkey/M in targets)
|
||||
Target = M
|
||||
break
|
||||
for(var/mob/living/carbon/alien/larva/L in targets)
|
||||
Target = L
|
||||
break
|
||||
if(prob(1))
|
||||
for(var/mob/living/carbon/alien/humanoid/H in targets)
|
||||
Target = H
|
||||
break
|
||||
for(var/mob/living/carbon/human/H in targets)
|
||||
Target = H
|
||||
break
|
||||
|
||||
else
|
||||
Target = pick(targets)
|
||||
|
||||
else
|
||||
Target = pick(targets)
|
||||
|
||||
if(attacked > 0 && targets.len > 0)
|
||||
Target = targets[1] // should be the closest target
|
||||
|
||||
|
||||
|
||||
|
||||
if(!Target)
|
||||
|
||||
if(prob(33) && canmove && isturf(loc))
|
||||
step(src, pick(cardinal))
|
||||
|
||||
|
||||
else
|
||||
if(!AIproc)
|
||||
spawn() AIprocess()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/metroid
|
||||
var/AIproc = 0 // determines if the AI loop is activated
|
||||
var/Atkcool = 0 // attack cooldown
|
||||
proc
|
||||
|
||||
AIprocess() // the master AI process
|
||||
|
||||
AIproc = 1
|
||||
while(AIproc)
|
||||
if(Victim) // can't eat AND have this little process at the same time
|
||||
break
|
||||
|
||||
if(Target.health <= -70 || Target.stat == 2)
|
||||
Target = null
|
||||
AIproc = 0
|
||||
break
|
||||
|
||||
if(Target)
|
||||
for(var/mob/living/carbon/metroid/M in view(1,Target))
|
||||
if(M.Victim == Target)
|
||||
Target = null
|
||||
AIproc = 0
|
||||
break
|
||||
if(!AIproc)
|
||||
break
|
||||
|
||||
if(Target in view(1,src))
|
||||
|
||||
if(prob(80) && !Target.lying)
|
||||
|
||||
if(Target.client && Target.health >= rand(10,30))
|
||||
if(!Atkcool)
|
||||
spawn()
|
||||
Atkcool = 1
|
||||
sleep(10)
|
||||
Atkcool = 0
|
||||
|
||||
Target.attack_metroid(src)
|
||||
|
||||
|
||||
if(prob(30))
|
||||
step_to(src, Target)
|
||||
|
||||
else
|
||||
|
||||
Feedon(Target)
|
||||
|
||||
else
|
||||
Feedon(Target)
|
||||
|
||||
else
|
||||
if(Target in view(30, src))
|
||||
step_to(src, Target)
|
||||
|
||||
else
|
||||
Target = null
|
||||
AIproc = 0
|
||||
break
|
||||
|
||||
var/sleeptime = movement_delay()
|
||||
if(sleeptime <= 0) sleeptime = 1
|
||||
|
||||
sleep(sleeptime + 1) // this is about as fast as a player Metroid can go
|
||||
|
||||
AIproc = 0
|
||||
|
||||
|
||||
|
||||
|
||||
handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
@@ -90,9 +249,9 @@
|
||||
handle_regular_status_updates()
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
health = 300 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
|
||||
health = 200 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
|
||||
else
|
||||
health = 250 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
|
||||
health = 150 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
|
||||
|
||||
@@ -109,9 +268,12 @@
|
||||
|
||||
if(src.stat != 2) src.stat = 1
|
||||
|
||||
if(prob(80))
|
||||
oxyloss = max(oxyloss-5, 0)
|
||||
toxloss = max(toxloss-5, 0)
|
||||
if(prob(30))
|
||||
if(oxyloss>0) oxyloss = max(oxyloss-1, 0)
|
||||
if(toxloss>0) toxloss = max(toxloss-1, 0)
|
||||
if(fireloss>0) fireloss = max(fireloss-1,0)
|
||||
if(cloneloss>0) cloneloss = max(cloneloss-1,0)
|
||||
if(bruteloss>0) bruteloss = max(bruteloss-1,0)
|
||||
|
||||
|
||||
if (src.stat == 2)
|
||||
@@ -150,7 +312,10 @@
|
||||
|
||||
|
||||
handle_nutrition()
|
||||
if(prob(25)) nutrition--
|
||||
if(prob(30))
|
||||
if(istype(src, /mob/living/carbon/metroid/adult)) nutrition-=rand(2,6)
|
||||
else nutrition-=rand(1,4)
|
||||
|
||||
if(nutrition <= 0)
|
||||
nutrition = 0
|
||||
if(prob(75))
|
||||
@@ -159,13 +324,31 @@
|
||||
|
||||
else
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(nutrition >= 350)
|
||||
if(nutrition >= 1100)
|
||||
if(prob(40)) amount_grown++
|
||||
|
||||
else
|
||||
if(nutrition >= 250)
|
||||
if(nutrition >= 900)
|
||||
if(prob(40)) amount_grown++
|
||||
|
||||
if(amount_grown >= 10 && !Victim && !Target)
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(!client)
|
||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
||||
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)
|
||||
|
||||
del(src)
|
||||
|
||||
else
|
||||
if(!client)
|
||||
var/mob/living/carbon/metroid/adult/A = new/mob/living/carbon/metroid/adult(src.loc)
|
||||
A.nutrition = nutrition
|
||||
del(src)
|
||||
|
||||
|
||||
handle_virus_updates()
|
||||
if(bodytemperature > 406)
|
||||
for(var/datum/disease/D in viruses)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
if (bodytemperature < 283.222)
|
||||
tally += (283.222 - bodytemperature) / 10 * 1.75
|
||||
toxloss+=rand(5,20)
|
||||
|
||||
if(reagents)
|
||||
if(reagents.has_reagent("hyperzine")) // hyperzine slows Metroids down
|
||||
@@ -47,6 +48,36 @@
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
|
||||
if(isobj(AM))
|
||||
if(!client && powerlevel > 0)
|
||||
var/probab = 10
|
||||
switch(powerlevel)
|
||||
if(1 to 2) probab = 20
|
||||
if(3 to 4) probab = 30
|
||||
if(5 to 6) probab = 40
|
||||
if(7 to 8) probab = 60
|
||||
if(9) probab = 70
|
||||
if(10) probab = 95
|
||||
if(prob(probab))
|
||||
if(istype(AM, /obj/window) || istype(AM, /obj/grille))
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(nutrition <= 600 && !Atkcool)
|
||||
AM.attack_metroid(src)
|
||||
spawn()
|
||||
Atkcool = 1
|
||||
sleep(15)
|
||||
Atkcool = 0
|
||||
else
|
||||
if(nutrition <= 500 && !Atkcool)
|
||||
if(prob(5))
|
||||
if(prob(50))
|
||||
AM.attack_metroid(src)
|
||||
spawn()
|
||||
Atkcool = 1
|
||||
sleep(15)
|
||||
Atkcool = 0
|
||||
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
|
||||
@@ -85,53 +116,59 @@
|
||||
statpanel("Status")
|
||||
if (client && client.holder)
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
stat(null, "Health: [round(health)]/300")
|
||||
stat(null, "Health: [round(health)]/200")
|
||||
else
|
||||
stat(null, "Health: [round(health)]/250")
|
||||
stat(null, "Health: [round(health)]/150")
|
||||
|
||||
|
||||
if (client.statpanel == "Status")
|
||||
if(istype(src,/mob/living/carbon/metroid/adult))
|
||||
stat(null, "Nutrition: [nutrition]/400")
|
||||
if(amount_grown == 10)
|
||||
stat(null, "Nutrition: [nutrition]/1200")
|
||||
if(amount_grown >= 10)
|
||||
stat(null, "You can reproduce!")
|
||||
else
|
||||
stat(null, "Nutrition: [nutrition]/300")
|
||||
stat(null, "Nutrition: [nutrition]/1000")
|
||||
if(amount_grown >= 10)
|
||||
stat(null, "You can evolve!")
|
||||
|
||||
stat(null,"Power Level: [powerlevel]")
|
||||
|
||||
|
||||
/mob/living/carbon/metroid/bullet_act(flag, A as obj)
|
||||
if (locate(/obj/item/weapon/grab, src))
|
||||
var/mob/safe = null
|
||||
if (istype(l_hand, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = l_hand
|
||||
if ((G.state == 3 && get_dir(src, A) == dir))
|
||||
safe = G.affecting
|
||||
if (istype(r_hand, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon.grab/G = r_hand
|
||||
if ((G.state == 3 && get_dir(src, A) == dir))
|
||||
safe = G.affecting
|
||||
if (safe)
|
||||
return safe.bullet_act(flag, A)
|
||||
if(A)
|
||||
if (locate(/obj/item/weapon/grab, src))
|
||||
var/mob/safe = null
|
||||
if (istype(l_hand, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = l_hand
|
||||
if ((G.state == 3 && get_dir(src, A) == dir))
|
||||
safe = G.affecting
|
||||
if (istype(r_hand, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon.grab/G = r_hand
|
||||
if ((G.state == 3 && get_dir(src, A) == dir))
|
||||
safe = G.affecting
|
||||
if (safe)
|
||||
return safe.bullet_act(flag, A)
|
||||
|
||||
switch(flag)
|
||||
if(PROJECTILE_BULLET)
|
||||
var/d = 1
|
||||
|
||||
attacked += 10
|
||||
if (stat != 2)
|
||||
bruteloss += d
|
||||
|
||||
updatehealth()
|
||||
return
|
||||
if(PROJECTILE_TASER)
|
||||
if (prob(10))
|
||||
if(stunned <= 10)
|
||||
stunned = 10
|
||||
if (prob(70))
|
||||
powerlevel++
|
||||
if(powerlevel > 10) powerlevel = 10
|
||||
|
||||
if(PROJECTILE_LASER)
|
||||
var/d = 30
|
||||
|
||||
attacked += 10
|
||||
// if (!eye_blurry) eye_blurry = 4 //This stuff makes no sense but lasers need a buff./ It really doesn't make any sense. /N
|
||||
if (prob(25)) stunned++
|
||||
|
||||
if (stat != 2)
|
||||
bruteloss += d
|
||||
@@ -140,6 +177,7 @@
|
||||
if(PROJECTILE_PULSE)
|
||||
var/d = 100
|
||||
|
||||
attacked += 10
|
||||
if (stat != 2)
|
||||
bruteloss += d
|
||||
|
||||
@@ -322,29 +360,31 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/metroid/hand_p(mob/M as mob)
|
||||
/mob/living/carbon/metroid/attack_metroid(mob/living/carbon/metroid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if (M.a_intent == "hurt")
|
||||
if (health > 0)
|
||||
if(Victim) return // can't attack while eating!
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
if (health > -100)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has bit []!</B>", src), 1)
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
damage = rand(20, 60)
|
||||
else
|
||||
damage = rand(5, 45)
|
||||
var/damage = rand(1, 3)
|
||||
attacked += 5
|
||||
|
||||
bruteloss += damage
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
damage = rand(1, 6)
|
||||
else
|
||||
damage = rand(1, 3)
|
||||
|
||||
bruteloss += damage
|
||||
|
||||
|
||||
updatehealth()
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
@@ -368,6 +408,7 @@
|
||||
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
return
|
||||
if (health > 0)
|
||||
attacked += 10
|
||||
playsound(loc, 'bite.ogg', 50, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
@@ -388,6 +429,45 @@
|
||||
|
||||
..()
|
||||
|
||||
if(Victim)
|
||||
if(Victim == M)
|
||||
if(prob(90))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message("\red [M] attempts to wrestle \the [name] off!", 1)
|
||||
playsound(loc, 'punchmiss.ogg', 25, 1, -1)
|
||||
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message("\red [M] manages to wrestle \the [name] off!", 1)
|
||||
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
Victim = null
|
||||
step_away(src,M)
|
||||
|
||||
return
|
||||
|
||||
else
|
||||
if(prob(80))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message("\red [M] attempts to wrestle \the [name] off of [Victim]!", 1)
|
||||
playsound(loc, 'punchmiss.ogg', 25, 1, -1)
|
||||
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message("\red [M] manages to wrestle \the [name] off of [Victim]!", 1)
|
||||
playsound(loc, 'thudswoosh.ogg', 50, 1, -1)
|
||||
|
||||
Victim = null
|
||||
step_away(src,M)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
if(M.gloves && M.gloves.elecgen == 1)//Stungloves. Any contact will stun the alien.
|
||||
if(M.gloves.uses > 0)
|
||||
M.gloves.uses--
|
||||
@@ -420,10 +500,14 @@
|
||||
|
||||
else
|
||||
var/damage = rand(1, 9)
|
||||
|
||||
attacked += 10
|
||||
if (prob(90))
|
||||
if (M.mutations & HULK)
|
||||
damage += 5
|
||||
if(Victim) Victim = null
|
||||
spawn(0)
|
||||
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
@@ -431,10 +515,7 @@
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has punched []!</B>", M, src), 1)
|
||||
if (damage > 4.9)
|
||||
for(var/mob/O in viewers(M, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has weakened []!</B>", M, src), 1, "\red You hear someone fall.", 2)
|
||||
|
||||
bruteloss += damage
|
||||
updatehealth()
|
||||
else
|
||||
@@ -462,7 +543,9 @@
|
||||
O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1)
|
||||
|
||||
if ("hurt")
|
||||
|
||||
if ((prob(95) && health > 0))
|
||||
attacked += 10
|
||||
playsound(loc, 'slice.ogg', 25, 1, -1)
|
||||
var/damage = rand(15, 30)
|
||||
if (damage >= 25)
|
||||
@@ -502,10 +585,20 @@
|
||||
if ("disarm")
|
||||
playsound(loc, 'pierce.ogg', 25, 1, -1)
|
||||
var/damage = 5
|
||||
attacked += 10
|
||||
|
||||
if(prob(95))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has tackled down [name]!</B>", M), 1)
|
||||
O.show_message(text("\red <B>[] has tackled [name]!</B>", M), 1)
|
||||
|
||||
if(Victim) Victim = null
|
||||
spawn(0)
|
||||
|
||||
step_away(src,M,15)
|
||||
sleep(3)
|
||||
step_away(src,M,15)
|
||||
|
||||
else
|
||||
drop_item()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
|
||||
@@ -1,17 +1,26 @@
|
||||
/mob/living/carbon/metroid/verb/Feed(mob/M as mob in view(1))
|
||||
|
||||
/mob/living/carbon/metroid/verb/Feed()
|
||||
set category = "Metroid"
|
||||
set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process."
|
||||
if(Victim)
|
||||
Feedstop()
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/C in view(1,src))
|
||||
if(C!=src && !istype(C,/mob/living/carbon/metroid))
|
||||
choices += C
|
||||
|
||||
var/mob/living/carbon/M = input(src,"Who do you wish to feed on?") in null|choices
|
||||
if(!M) return
|
||||
|
||||
if(istype(M, /mob/living/carbon) && !istype(src, /mob/living/carbon/brain))
|
||||
if(!istype(M, /mob/living/carbon/metroid))
|
||||
if(stat != 2)
|
||||
if(health > -50)
|
||||
if(health > -70)
|
||||
|
||||
for(var/mob/living/carbon/metroid/met in view())
|
||||
if(met.Victim == M && met != src)
|
||||
src << "<i>The [M.name] is already feeding on this subject...</i>"
|
||||
src << "<i>The [met.name] is already feeding on this subject...</i>"
|
||||
return
|
||||
src << "\blue <i>I have latched onto the subject and begun feeding...</i>"
|
||||
M << "\red <b>The [src.name] has latched onto your head!</b>"
|
||||
@@ -28,54 +37,155 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/metroid/proc/Feedon(var/mob/M)
|
||||
/mob/living/carbon/metroid/proc/Feedon(var/mob/living/carbon/M)
|
||||
Victim = M
|
||||
src.loc = M.loc
|
||||
canmove = 0
|
||||
var/lastnut = nutrition
|
||||
M << "\red You legs become paralyzed!"
|
||||
//if(M.client) M << "\red You legs become paralyzed!"
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
icon_state = "adult metroid eat"
|
||||
else
|
||||
icon_state = "baby metroid eat"
|
||||
|
||||
while(Victim && M.health > -50)
|
||||
M.canmove = 0
|
||||
if(prob(35) && M.client)
|
||||
while(Victim && M.health > -70)
|
||||
// M.canmove = 0
|
||||
canmove = 0
|
||||
if(prob(15) && M.client)
|
||||
M << "\red [pick("You can feel your body becoming weak!", \
|
||||
"You feel like you're about to die!", \
|
||||
"You feel every part of your body screaming in agony!", \
|
||||
"A low, rolling pain passes through your body!")]"
|
||||
"A low, rolling pain passes through your body!", \
|
||||
"Your body feels as if it's falling apart!", \
|
||||
"You feel extremely weak!", \
|
||||
"A sharp, deep pain bathes every inch of your body!")]"
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
M.cloneloss += rand(5,10)
|
||||
if(M.health <= 0)
|
||||
M.toxloss += rand(5,10)
|
||||
else
|
||||
M.oxyloss += rand(10,20)
|
||||
Victim.cloneloss += rand(1,10)
|
||||
Victim.toxloss += rand(1,2)
|
||||
if(Victim.health <= 0)
|
||||
Victim.toxloss += rand(2,5)
|
||||
|
||||
if(toxloss > 0)
|
||||
toxloss -= 5
|
||||
|
||||
if(oxyloss > 0)
|
||||
oxyloss -= 5
|
||||
|
||||
if(bruteloss > 0)
|
||||
bruteloss -= 5
|
||||
|
||||
if(fireloss > 0)
|
||||
fireloss -= 5
|
||||
|
||||
if(cloneloss > 0)
|
||||
cloneloss -= 5
|
||||
|
||||
if(Victim)
|
||||
for(var/mob/living/carbon/metroid/Metroid in view(1,M))
|
||||
if(Metroid.Victim == M && Metroid != src)
|
||||
Metroid.Feedstop()
|
||||
|
||||
if(toxloss<0) toxloss = 0
|
||||
if(oxyloss<0) oxyloss = 0
|
||||
if(bruteloss<0) bruteloss = 0
|
||||
if(fireloss<0) fireloss = 0
|
||||
if(cloneloss<0) cloneloss = 0
|
||||
|
||||
nutrition += rand(5,20)
|
||||
if(nutrition >= lastnut + 50)
|
||||
if(nutrition >= lastnut + 100)
|
||||
if(prob(20))
|
||||
lastnut = nutrition
|
||||
powerlevel++
|
||||
if(powerlevel > 10)
|
||||
powerlevel = 10
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(nutrition > 400)
|
||||
nutrition = 400
|
||||
if(nutrition > 1200)
|
||||
nutrition = 1200
|
||||
else
|
||||
if(nutrition > 300)
|
||||
nutrition = 300
|
||||
if(nutrition > 1000)
|
||||
nutrition = 1000
|
||||
|
||||
Victim.updatehealth()
|
||||
updatehealth()
|
||||
|
||||
sleep(rand(5,25))
|
||||
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
icon_state = "adult metroid"
|
||||
else
|
||||
icon_state = "baby metroid"
|
||||
|
||||
Victim = null
|
||||
canmove = 1
|
||||
|
||||
if(M.health <= -50)
|
||||
if(M.health <= -70)
|
||||
M.canmove = 0
|
||||
src << "<i>This subject does not have a strong enough life energy anymore...</i>"
|
||||
if(client) src << "<i>This subject does not have a strong enough life energy anymore...</i>"
|
||||
else
|
||||
M.canmove = 1
|
||||
|
||||
src << "<i>I have stopped feeding...</i>"
|
||||
if(client) src << "<i>I have stopped feeding...</i>"
|
||||
|
||||
/mob/living/carbon/metroid/proc/Feedstop()
|
||||
if(Victim)
|
||||
Victim << "[src] has let go of your head!"
|
||||
if(Victim.client) Victim << "[src] has let go of your head!"
|
||||
Victim = null
|
||||
|
||||
/mob/living/carbon/metroid/proc/UpdateFeed(var/mob/M)
|
||||
if(Victim)
|
||||
if(Victim == M)
|
||||
loc = M.loc // simple "attach to head" effect!
|
||||
|
||||
|
||||
/mob/living/carbon/metroid/verb/Evolve()
|
||||
set category = "Metroid"
|
||||
set desc = "This will let you evolve from baby to adult metroid."
|
||||
if(!istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(amount_grown >= 10)
|
||||
var/mob/living/carbon/metroid/adult/new_metroid = new /mob/living/carbon/metroid/adult (loc)
|
||||
new_metroid.mind_initialize(src)
|
||||
new_metroid.key = key
|
||||
new_metroid.nutrition = nutrition
|
||||
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid << "<B>You are now an adult Metroid.</B>"
|
||||
del(src)
|
||||
else
|
||||
src << "<i>I am not ready to evolve yet...</i>"
|
||||
else
|
||||
src << "<i>I have already evolved...</i>"
|
||||
|
||||
/mob/living/carbon/metroid/verb/Reproduce()
|
||||
set category = "Metroid"
|
||||
set desc = "This will make you split into a random number of Metroids (usually 2). NOTE: this will KILL you, but you will be transferred into one of the babies."
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(amount_grown >= 10)
|
||||
switch(input("Are you absolutely sure you want to reproduce? Your current body will cease to be, but your consciousness will be transferred into a produced metroid.") in list("Yes","No"))
|
||||
if("Yes")
|
||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
||||
var/list/babies = list()
|
||||
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)
|
||||
babies += M
|
||||
|
||||
|
||||
var/mob/living/carbon/metroid/new_metroid = pick(babies)
|
||||
|
||||
new_metroid.mind_initialize(src)
|
||||
new_metroid.key = key
|
||||
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
||||
del(src)
|
||||
else
|
||||
src << "<i>I am not ready to reproduce yet...</i>"
|
||||
else
|
||||
src << "<i>I am not old enough to reproduce yet...</i>"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
|
||||
handle_regular_status_updates()
|
||||
|
||||
health = 100 - (oxyloss + toxloss + fireloss + bruteloss)
|
||||
health = 100 - (oxyloss + toxloss + fireloss + bruteloss + cloneloss)
|
||||
|
||||
if(oxyloss > 25) paralysis = max(paralysis, 3)
|
||||
|
||||
|
||||
@@ -108,6 +108,13 @@
|
||||
|
||||
/mob/living/carbon/monkey/bullet_act(flag)
|
||||
|
||||
if(prob(50))
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
if(M.Victim == src)
|
||||
M.bullet_act(flag)
|
||||
return
|
||||
|
||||
|
||||
if (flag == PROJECTILE_BULLET)
|
||||
if (stat != 2)
|
||||
take_organ_damage(60, 0)
|
||||
@@ -348,6 +355,66 @@
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/attack_metroid(mob/living/carbon/metroid/M as mob)
|
||||
if (!ticker)
|
||||
M << "You cannot attack people before the game has started."
|
||||
return
|
||||
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
damage = rand(20, 40)
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
bruteloss += damage
|
||||
|
||||
if(M.powerlevel > 0)
|
||||
var/stunprob = 10
|
||||
var/power = M.powerlevel + rand(0,3)
|
||||
|
||||
switch(M.powerlevel)
|
||||
if(1 to 2) stunprob = 20
|
||||
if(3 to 4) stunprob = 30
|
||||
if(5 to 6) stunprob = 40
|
||||
if(7 to 8) stunprob = 60
|
||||
if(9) stunprob = 70
|
||||
if(10) stunprob = 95
|
||||
|
||||
if(prob(stunprob))
|
||||
M.powerlevel -= 3
|
||||
if(M.powerlevel < 0)
|
||||
M.powerlevel = 0
|
||||
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>The [M.name] has [pick("bit","slashed")] []!</B>", src), 1)
|
||||
|
||||
if (weakened < power)
|
||||
weakened = power
|
||||
if (stuttering < power)
|
||||
stuttering = power
|
||||
if (stunned < power)
|
||||
stunned = power
|
||||
|
||||
if (prob(stunprob) && M.powerlevel >= 8)
|
||||
fireloss += M.powerlevel * rand(6,10)
|
||||
|
||||
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/Stat()
|
||||
..()
|
||||
statpanel("Status")
|
||||
@@ -481,6 +548,10 @@
|
||||
. = ..()
|
||||
if ((s_active && !( contents.Find(s_active) )))
|
||||
s_active.close(src)
|
||||
|
||||
for(var/mob/living/carbon/metroid/M in view(1,src))
|
||||
M.UpdateFeed(src)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/monkey/verb/removeinternal()
|
||||
|
||||
@@ -62,6 +62,33 @@
|
||||
spawn(0)
|
||||
ainame(src)
|
||||
|
||||
/mob/living/silicon/ai/verb/pick_icon()
|
||||
set category = "AI Commands"
|
||||
set name = "Change AI Core Display"
|
||||
|
||||
//if(icon_state == initial(icon_state))
|
||||
var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "HAL9000", "Monochrome", "Blue", "HAL9000 Mark2", "Inverted", "Firewall", "Green")
|
||||
if(icontype == "Clown")
|
||||
icon_state = "ai-clown2"
|
||||
else if(icontype == "HAL9000")
|
||||
icon_state = "ai-hal9000-2"
|
||||
else if(icontype == "Monochrome")
|
||||
icon_state = "ai-mono"
|
||||
else if(icontype == "Blue")
|
||||
icon_state = "ai"
|
||||
else if(icontype == "HAL9000 Mark2")
|
||||
icon_state = "ai-hal9000-3"
|
||||
else if(icontype == "Inverted")
|
||||
icon_state = "ai-u"
|
||||
else if(icontype == "Firewall")
|
||||
icon_state = "ai-magma"
|
||||
else//(icontype == "Green")
|
||||
icon_state = "ai-wierd"
|
||||
|
||||
//else
|
||||
//usr <<"You can only change your display once!"
|
||||
//return
|
||||
|
||||
/mob/living/silicon/ai/Stat()
|
||||
..()
|
||||
statpanel("Status")
|
||||
|
||||
@@ -249,7 +249,7 @@
|
||||
del(src)
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/Metroidize()
|
||||
/mob/living/carbon/human/proc/Metroidize(adult as num, reproduce as num)
|
||||
if (monkeyizing)
|
||||
return
|
||||
for(var/obj/item/W in src)
|
||||
@@ -262,13 +262,40 @@
|
||||
for(var/t in organs)
|
||||
del(organs[t])
|
||||
|
||||
var/mob/living/carbon/metroid/new_metroid = new /mob/living/carbon/metroid (loc)
|
||||
if(reproduce)
|
||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
||||
var/list/babies = list()
|
||||
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)
|
||||
babies += M
|
||||
|
||||
new_metroid.mind_initialize(src)
|
||||
new_metroid.key = key
|
||||
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid << "<B>You are now a Metroid.</B>"
|
||||
var/mob/living/carbon/metroid/new_metroid = pick(babies)
|
||||
|
||||
new_metroid.mind_initialize(src)
|
||||
new_metroid.key = key
|
||||
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
||||
|
||||
if(adult)
|
||||
var/mob/living/carbon/metroid/adult/new_metroid = new /mob/living/carbon/metroid/adult (loc)
|
||||
new_metroid.mind_initialize(src)
|
||||
new_metroid.key = key
|
||||
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid << "<B>You are now an adult Metroid.</B>"
|
||||
|
||||
else
|
||||
var/mob/living/carbon/metroid/new_metroid = new /mob/living/carbon/metroid (loc)
|
||||
|
||||
new_metroid.mind_initialize(src)
|
||||
new_metroid.key = key
|
||||
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid << "<B>You are now a baby Metroid.</B>"
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
del(src)
|
||||
return
|
||||
Reference in New Issue
Block a user