mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 23:27:34 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into #verifyvenuz
# Conflicts: # icons/obj/guns/projectile.dmi
This commit is contained in:
@@ -132,9 +132,9 @@
|
||||
|
||||
|
||||
/obj/item/device/assembly/flash/emp_act(severity)
|
||||
if(!try_use_flash())
|
||||
if(!try_use_flash() || !loc)
|
||||
return 0
|
||||
for(var/mob/living/carbon/M in viewers(3, null))
|
||||
for(var/mob/living/carbon/M in viewers(3, loc))
|
||||
flash_carbon(M, null, 10, 0)
|
||||
burn_out()
|
||||
..()
|
||||
|
||||
@@ -13,9 +13,8 @@
|
||||
Nanotrasen's operational area and start your new life.<br><br>\
|
||||
<b>Gateway Operation Basics</b><br>\
|
||||
All Nanotrasen approved Gateways operate on the same basic principals. They operate off \
|
||||
area equipment power as you would expect, but they also require a backup wire with at least \
|
||||
128, 000 Watts of power running through it. Without this supply, it cannot safely function \
|
||||
and will reject all attempts at operation.<br><br>\
|
||||
area equipment power as you would expect, and without this supply, it cannot safely function, \
|
||||
causinng it to reject all attempts at operation.<br><br>\
|
||||
Once it is correctly setup, and once it has enough power to operate, the Gateway will begin \
|
||||
searching for an output location. The amount of time this takes is variable, but the Gateway \
|
||||
interface will give you an estimate accurate to the minute. Power loss will not interrupt the \
|
||||
@@ -35,4 +34,4 @@
|
||||
|
||||
//we don't want the silly text overlay!
|
||||
/obj/item/weapon/paper/pamphlet/update_icon()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
var/copiedobjs = list()
|
||||
|
||||
for (var/turf/T in refined_src)
|
||||
for (var/turf/simulated/T in refined_src)
|
||||
//var/datum/coords/C_src = refined_src[T]
|
||||
var/coordstring = refined_src[T]
|
||||
var/turf/B = refined_trg[coordstring]
|
||||
@@ -83,7 +83,7 @@
|
||||
var/old_icon_state1 = T.icon_state
|
||||
var/old_icon1 = T.icon
|
||||
|
||||
var/turf/X = new T.type(B)
|
||||
var/turf/simulated/X = new T.type(B)
|
||||
X.dir = old_dir1
|
||||
X.icon = old_icon1
|
||||
X.icon_state = old_icon_state1
|
||||
@@ -100,6 +100,9 @@
|
||||
|
||||
var/global/list/forbidden_vars = list("type","stat","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity")
|
||||
for(var/V in T.vars - forbidden_vars)
|
||||
if(V == "air")
|
||||
X.air.copy_from(T.air)
|
||||
continue
|
||||
X.vars[V] = T.vars[V]
|
||||
toupdate += X
|
||||
|
||||
|
||||
@@ -406,7 +406,11 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
|
||||
else
|
||||
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
|
||||
alert("Upload Complete. Uploaded title will be unavailable for printing for a short period")
|
||||
|
||||
if(href_list["orderbyid"])
|
||||
var/orderid = input("Enter your order:") as num|null
|
||||
if(orderid)
|
||||
if(isnum(orderid))
|
||||
href_list["targetid"] = orderid
|
||||
if(href_list["targetid"])
|
||||
var/sqlid = sanitizeSQL(href_list["targetid"])
|
||||
establish_db_connection()
|
||||
@@ -433,12 +437,6 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
|
||||
B.icon_state = "book[rand(1,7)]"
|
||||
src.visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?")
|
||||
break
|
||||
if(href_list["orderbyid"])
|
||||
var/orderid = input("Enter your order:") as num|null
|
||||
if(orderid)
|
||||
if(isnum(orderid))
|
||||
var/nhref = "src=\ref[src];targetid=[orderid]"
|
||||
spawn() src.Topic(nhref, params2list(nhref), src)
|
||||
src.add_fingerprint(usr)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
@@ -238,7 +238,7 @@
|
||||
else
|
||||
dat += "<tr><td><B>Uniform:</B></td><td><A href='?src=\ref[src];item=[slot_w_uniform]'>[(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
|
||||
if(w_uniform == null || (slot_w_uniform in obscured) || (dna && dna.species.nojumpsuit))
|
||||
if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (slot_w_uniform in obscured))
|
||||
dat += "<tr><td><font color=grey> ↳<B>Pockets:</B></font></td></tr>"
|
||||
dat += "<tr><td><font color=grey> ↳<B>ID:</B></font></td></tr>"
|
||||
dat += "<tr><td><font color=grey> ↳<B>Belt:</B></font></td></tr>"
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
if(istype(AM, /obj/item))
|
||||
I = AM
|
||||
throwpower = I.throwforce
|
||||
if(check_shields(throwpower, "\the [AM.name]", AM, THROWN_PROJECTILE_ATTACK))
|
||||
if(I.thrownby != src && check_shields(throwpower, "\the [AM.name]", AM, THROWN_PROJECTILE_ATTACK))
|
||||
hitpush = 0
|
||||
skipcatch = 1
|
||||
blocked = 1
|
||||
|
||||
@@ -37,6 +37,14 @@
|
||||
weaponscheck = 0
|
||||
auto_patrol = 1
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/beepsky/explode()
|
||||
var/turf/Tsec = get_turf(src)
|
||||
new /obj/item/weapon/stock_parts/cell/potato(Tsec)
|
||||
var/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/S = new(Tsec)
|
||||
S.list_reagents = list("whiskey" = 15)
|
||||
S.on_reagent_change()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/pingsky
|
||||
name = "Officer Pingsky"
|
||||
desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment."
|
||||
|
||||
@@ -20,17 +20,13 @@
|
||||
ventcrawler = 2
|
||||
gold_core_spawnable = 2
|
||||
var/squish_chance = 50
|
||||
loot = list(/obj/effect/decal/cleanable/deadcockroach)
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/cockroach/death(gibbed)
|
||||
if(ticker.cinematic) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
|
||||
return
|
||||
if(!ckey || gibbed)// stupid staff of change fucking everything up.
|
||||
..(1)
|
||||
new /obj/effect/decal/cleanable/deadcockroach(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM)
|
||||
if(ismob(AM))
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
)
|
||||
|
||||
if( ! ( item_to_add.type in allowed_types ) )
|
||||
usr << "<span class='warning'>You set [item_to_add] on [src]'s back, but \he shakes it off!</span>"
|
||||
usr << "<span class='warning'>You set [item_to_add] on [src]'s back, but it falls off!</span>"
|
||||
if(!usr.drop_item())
|
||||
usr << "<span class='warning'>\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!</span>"
|
||||
return
|
||||
@@ -260,7 +260,7 @@
|
||||
if(user && !user.drop_item())
|
||||
user << "<span class='warning'>\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!</span>"
|
||||
return 0
|
||||
user << "<span class='warning'>You set [item_to_add] on [src]'s head, but \he shakes it off!</span>"
|
||||
user << "<span class='warning'>You set [item_to_add] on [src]'s head, but it falls off!</span>"
|
||||
item_to_add.loc = loc
|
||||
if(prob(25))
|
||||
step_rand(item_to_add)
|
||||
|
||||
@@ -658,6 +658,7 @@
|
||||
user << "[G.bio_fluff_string]."
|
||||
G.attacktext = "swarms"
|
||||
G.speak_emote = list("chitters")
|
||||
G.mind.name = "[G.real_name]"
|
||||
|
||||
/obj/item/weapon/guardiancreator/choose
|
||||
random = FALSE
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
//Spaceborn beings don't get hurt by space
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
@@ -34,12 +35,6 @@
|
||||
..()
|
||||
update_bees()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
|
||||
..(1)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Life()
|
||||
..()
|
||||
update_bees()
|
||||
|
||||
@@ -47,12 +47,7 @@
|
||||
icon_living = "holocarp"
|
||||
maxbodytemp = INFINITY
|
||||
gold_core_spawnable = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/holocarp/death()
|
||||
..(1)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/megacarp
|
||||
icon = 'icons/mob/alienqueen.dmi'
|
||||
|
||||
@@ -23,9 +23,4 @@
|
||||
flying = 1
|
||||
|
||||
faction = list("spooky")
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/eyeball/death()
|
||||
..(1)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
del_on_death = 1
|
||||
@@ -250,7 +250,7 @@
|
||||
C.player_spiders = 1
|
||||
C.poison_type = poison_type
|
||||
C.poison_per_bite = poison_per_bite
|
||||
C.faction = faction
|
||||
C.faction = faction.Copy()
|
||||
fed--
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
@@ -23,6 +23,12 @@
|
||||
minbodytemp = 0
|
||||
speak_emote = list("states")
|
||||
gold_core_spawnable = 1
|
||||
del_on_death = 1
|
||||
loot = (/obj/effect/decal/cleanable/robot_debris)
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/New()
|
||||
..()
|
||||
deathmessage = "[src] blows apart!"
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/range
|
||||
name = "hivebot"
|
||||
@@ -44,12 +50,7 @@
|
||||
ranged = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
|
||||
..(1)
|
||||
visible_message("<span class='warning'>[src] blows apart!</span>")
|
||||
new /obj/effect/decal/cleanable/robot_debris(src.loc)
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
..(1)
|
||||
@@ -16,6 +16,7 @@
|
||||
var/life_span = INFINITY //how long until they despawn
|
||||
var/mob/living/parent_mob
|
||||
var/multiply_chance = 0 //if we multiply on hit
|
||||
del_on_death = 1
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/Life()
|
||||
@@ -33,13 +34,14 @@
|
||||
melee_damage_upper = damage
|
||||
multiply_chance = replicate
|
||||
faction -= "neutral"
|
||||
transform = initial(transform)
|
||||
pixel_y = initial(pixel_y)
|
||||
pixel_x = initial(pixel_x)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/death()
|
||||
/mob/living/simple_animal/hostile/illusion/New()
|
||||
..()
|
||||
visible_message("<span class='warning'>[src] vanishes in a puff of smoke! It was a fake!</span>")
|
||||
qdel(src)
|
||||
|
||||
deathmessage = "[src] vanishes into thin air! It was a fake!"
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/examine(mob/user)
|
||||
if(parent_mob)
|
||||
@@ -71,4 +73,4 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -27,12 +27,7 @@
|
||||
faction = list("mimic")
|
||||
move_to_delay = 9
|
||||
gold_core_spawnable = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/death()
|
||||
..(1)
|
||||
visible_message("[src] stops moving!")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
del_on_death = 1
|
||||
|
||||
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
|
||||
/mob/living/simple_animal/hostile/mimic/crate
|
||||
@@ -119,6 +114,8 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/copy/Life()
|
||||
..()
|
||||
if(!target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
|
||||
adjustBruteLoss(1)
|
||||
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
|
||||
death()
|
||||
|
||||
@@ -280,4 +277,4 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
minimum_distance = 1
|
||||
return
|
||||
icon_state = TrueGun.icon_state
|
||||
icon_living = TrueGun.icon_state
|
||||
icon_living = TrueGun.icon_state
|
||||
|
||||
@@ -78,6 +78,8 @@
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 2
|
||||
turns_per_move = 5
|
||||
loot = list(/obj/item/weapon/ore/diamond{layer = 4.1},
|
||||
/obj/item/weapon/ore/diamond{layer = 4.1})
|
||||
|
||||
/obj/item/projectile/temp/basilisk
|
||||
name = "freezing blast"
|
||||
@@ -105,14 +107,6 @@
|
||||
if(3)
|
||||
adjustBruteLoss(110)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/death(gibbed)
|
||||
var/counter
|
||||
for(counter=0, counter<2, counter++)
|
||||
var/obj/item/weapon/ore/diamond/D = new /obj/item/weapon/ore/diamond(src.loc)
|
||||
D.layer = 4.1
|
||||
..(gibbed)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub
|
||||
name = "goldgrub"
|
||||
desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name."
|
||||
@@ -142,22 +136,22 @@
|
||||
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
|
||||
/obj/item/weapon/ore/uranium)
|
||||
|
||||
var/list/ore_types_eaten = list()
|
||||
var/alerted = 0
|
||||
var/ore_eaten = 1
|
||||
var/chase_time = 100
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/New()
|
||||
..()
|
||||
ore_types_eaten += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond)
|
||||
ore_eaten = rand(1,3)
|
||||
deathmessage = "[src] spits up the contents of its stomach before dying!"
|
||||
var/i = rand(1,3)
|
||||
while(i)
|
||||
loot += pick(/obj/item/weapon/ore/silver, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/diamond)
|
||||
i--
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target)
|
||||
target = new_target
|
||||
if(target != null)
|
||||
if(istype(target, /obj/item/weapon/ore))
|
||||
if(istype(target, /obj/item/weapon/ore) && loot.len < 10)
|
||||
visible_message("<span class='notice'>The [src.name] looks at [target.name] with hungry eyes.</span>")
|
||||
|
||||
else if(isliving(target))
|
||||
Aggro()
|
||||
visible_message("<span class='danger'>The [src.name] tries to flee from [target.name]!</span>")
|
||||
@@ -165,7 +159,6 @@
|
||||
minimum_distance = 10
|
||||
Burrow()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
|
||||
if(istype(target, /obj/item/weapon/ore))
|
||||
EatOre(target)
|
||||
@@ -174,12 +167,9 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/targeted_ore)
|
||||
for(var/obj/item/weapon/ore/O in targeted_ore.loc)
|
||||
ore_eaten++
|
||||
if(!(O.type in ore_types_eaten))
|
||||
ore_types_eaten += O.type
|
||||
qdel(O)
|
||||
if(ore_eaten > 10)//Limit the scope of the reward you can get, or else things might get silly
|
||||
ore_eaten = 10
|
||||
if(loot.len < 10)
|
||||
loot += O.type
|
||||
qdel(O)
|
||||
visible_message("<span class='notice'>The ore was swallowed whole!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
|
||||
@@ -190,27 +180,10 @@
|
||||
visible_message("<span class='danger'>The [src.name] buries into the ground, vanishing from sight!</span>")
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Reward()
|
||||
if(!ore_eaten || ore_types_eaten.len == 0)
|
||||
return
|
||||
visible_message("<span class='danger'>[src] spits up the contents of its stomach before dying!</span>")
|
||||
var/counter
|
||||
for(var/R in ore_types_eaten)
|
||||
for(counter=0, counter < ore_eaten, counter++)
|
||||
new R(src.loc)
|
||||
ore_types_eaten.Cut()
|
||||
ore_eaten = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P)
|
||||
visible_message("<span class='danger'>The [P.name] was repelled by [src.name]'s girth!</span>")
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed)
|
||||
alerted = 0
|
||||
Reward()
|
||||
..(gibbed)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(damage)
|
||||
idle_vision_range = 9
|
||||
..()
|
||||
@@ -246,6 +219,7 @@
|
||||
retreat_distance = 3
|
||||
minimum_distance = 3
|
||||
pass_flags = PASSTABLE
|
||||
loot = list(/obj/item/organ/internal/hivelord_core)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target)
|
||||
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood(src.loc)
|
||||
@@ -258,7 +232,6 @@
|
||||
OpenFire()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
|
||||
new /obj/item/organ/internal/hivelord_core(src.loc)
|
||||
mouse_opacity = 1
|
||||
..(gibbed)
|
||||
|
||||
@@ -338,15 +311,13 @@
|
||||
throw_message = "falls right through the strange body of the"
|
||||
environment_smash = 0
|
||||
pass_flags = PASSTABLE
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New()
|
||||
..()
|
||||
spawn(100)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath
|
||||
name = "goliath"
|
||||
desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions."
|
||||
@@ -379,6 +350,7 @@
|
||||
anchored = 1 //Stays anchored until death as to be unpullable
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
var/pre_attack = 0
|
||||
loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
|
||||
..()
|
||||
@@ -462,11 +434,6 @@
|
||||
spawn(50)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed)
|
||||
var/obj/item/asteroid/goliath_hide/G = new /obj/item/asteroid/goliath_hide(src.loc)
|
||||
G.layer = 4.1
|
||||
..(gibbed)
|
||||
|
||||
/obj/item/asteroid/goliath_hide
|
||||
name = "goliath hide plates"
|
||||
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
|
||||
@@ -545,6 +512,7 @@
|
||||
environment_smash = 0
|
||||
var/wumbo = 0
|
||||
var/inflate_cooldown = 0
|
||||
loot = list(/obj/item/asteroid/fugu_gland{layer = 4.1})
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/Life()
|
||||
if(!wumbo)
|
||||
@@ -611,8 +579,6 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/fugu/death(gibbed)
|
||||
Deflate()
|
||||
var/obj/item/asteroid/fugu_gland/F = new /obj/item/asteroid/fugu_gland(src.loc)
|
||||
F.layer = 4.1
|
||||
..(gibbed)
|
||||
|
||||
/obj/item/asteroid/fugu_gland
|
||||
@@ -640,4 +606,4 @@
|
||||
A.transform *= 2
|
||||
A.environment_smash += 2
|
||||
user << "<span class='info'>You increase the size of [A], giving it a surge of strength!</span>"
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
cap_dead.color = cap_color
|
||||
UpdateMushroomCap()
|
||||
health = maxHealth
|
||||
deathmessage = "[src] fainted."
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/adjustBruteLoss(damage)//Possibility to flee from a fight just to make it more visually interesting
|
||||
@@ -90,8 +91,6 @@
|
||||
UpdateMushroomCap()
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/death(gibbed)
|
||||
if(!gibbed)
|
||||
visible_message("[src] fainted.")
|
||||
..(gibbed)
|
||||
UpdateMushroomCap()
|
||||
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
speak_emote = list("yarrs")
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/pirate
|
||||
var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate
|
||||
|
||||
loot = list(/obj/effect/landmark/mobcorpse/pirate,
|
||||
/obj/item/weapon/melee/energy/sword/pirate)
|
||||
del_on_death = 1
|
||||
faction = list("pirate")
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ranged
|
||||
@@ -38,17 +38,5 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/beam
|
||||
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
|
||||
weapon1 = /obj/item/weapon/gun/energy/laser
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/death()
|
||||
..(1)
|
||||
visible_message("[src] stops moving.")
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
if(weapon1)
|
||||
new weapon1 (src.loc)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged,
|
||||
/obj/item/weapon/gun/energy/laser)
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
attacktext = "attacks"
|
||||
attack_sound = 'sound/items/bikehorn.ogg'
|
||||
environment_smash = 0
|
||||
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/clown
|
||||
del_on_death = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/clown)
|
||||
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 270
|
||||
@@ -36,10 +36,3 @@
|
||||
adjustBruteLoss(10)
|
||||
else if(bodytemperature > maxbodytemp)
|
||||
adjustBruteLoss(15)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/death(gibbed)
|
||||
..(gibbed)
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -19,19 +19,20 @@
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
a_intent = "harm"
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/russian
|
||||
var/weapon1 = /obj/item/weapon/kitchen/knife
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian,
|
||||
/obj/item/weapon/kitchen/knife)
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("russian")
|
||||
status_flags = CANPUSH
|
||||
del_on_death = 1
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged
|
||||
icon_state = "russianranged"
|
||||
icon_living = "russianranged"
|
||||
corpse = /obj/effect/landmark/mobcorpse/russian/ranged
|
||||
weapon1 = /obj/item/weapon/gun/projectile/revolver/mateba
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged,
|
||||
/obj/item/weapon/gun/projectile/revolver/mateba)
|
||||
ranged = 1
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
@@ -39,18 +40,9 @@
|
||||
casingtype = /obj/item/ammo_casing/a357
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/New()
|
||||
if(prob(50) && ispath(weapon1,/obj/item/weapon/gun/projectile/revolver/mateba)) //to preserve varedits
|
||||
weapon1 = /obj/item/weapon/gun/projectile/shotgun/boltaction
|
||||
var/obj/item/weapon/gun/projectile/revolver/mateba/M
|
||||
if(prob(50) && is_type_in_list(M, loot)) //to preserve varedits
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged,
|
||||
/obj/item/weapon/gun/projectile/shotgun/boltaction)
|
||||
casingtype = /obj/item/ammo_casing/a762
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/death(gibbed)
|
||||
..(1)
|
||||
visible_message("[src] stops moving.")
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
if(weapon1)
|
||||
new weapon1 (src.loc)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -30,20 +30,9 @@
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
see_in_dark = 8
|
||||
layer = MOB_LAYER - 0.1
|
||||
var/remains = /obj/effect/decal/remains/human
|
||||
var/loot
|
||||
var/deathmessage = "The skeleton collaspes into a pile of bones!"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/death(gibbed)
|
||||
..(gibbed)
|
||||
if(remains)
|
||||
new remains (src.loc)
|
||||
if(loot)
|
||||
new loot (src.loc)
|
||||
visible_message("<span class='danger'>[deathmessage]</span>")
|
||||
qdel(src)
|
||||
return
|
||||
deathmessage = "The skeleton collaspes into a pile of bones!"
|
||||
del_on_death = 1
|
||||
loot = list(/obj/effect/decal/remains/human)
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/eskimo
|
||||
name = "undead eskimo"
|
||||
@@ -58,7 +47,8 @@
|
||||
melee_damage_lower = 17
|
||||
melee_damage_upper = 20
|
||||
deathmessage = "The skeleton collaspes into a pile of bones, its gear falling to the floor!"
|
||||
loot = list(/obj/item/weapon/twohanded/spear,
|
||||
loot = list(/obj/effect/decal/remains/human,
|
||||
/obj/item/weapon/twohanded/spear,
|
||||
/obj/item/clothing/shoes/winterboots,
|
||||
/obj/item/clothing/suit/hooded/wintercoat)
|
||||
|
||||
@@ -75,14 +65,16 @@
|
||||
speed = 2
|
||||
gold_core_spawnable = 0
|
||||
speak_chance = 1
|
||||
speak = list("THE GODS WILL IT!","DUES VULT!","REMOVE KABAB!")
|
||||
speak = list("THE GODS WILL IT!","DEUS VULT!","REMOVE KABAB!")
|
||||
force_threshold = 10 //trying to simulate actually having armor
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 30
|
||||
deathmessage = "The templar knight collaspes into a pile of bones, its gear clanging as it hits the ground!"
|
||||
loot = list(/obj/item/clothing/suit/armor/riot/knight/templar,
|
||||
loot = list(/obj/effect/decal/remains/human,
|
||||
/obj/item/clothing/suit/armor/riot/knight/templar,
|
||||
/obj/item/clothing/head/helmet/knight/templar,
|
||||
/obj/item/weapon/claymore/hog{name = "holy sword"})
|
||||
|
||||
/mob/living/simple_animal/hostile/skeleton/templar/bullet_act(obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
return
|
||||
@@ -100,4 +92,4 @@
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
color = rgb(114,228,250)
|
||||
remains = /obj/effect/decal/remains/human{color = rgb(114,228,250)}
|
||||
loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)})
|
||||
@@ -222,6 +222,6 @@
|
||||
faction -= "neutral"
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/restrained()
|
||||
. == ..()
|
||||
. = ..()
|
||||
if(can_be_seen(loc))
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -21,24 +21,12 @@
|
||||
attacktext = "punches"
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
a_intent = "harm"
|
||||
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
|
||||
var/weapon1
|
||||
var/weapon2
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier)
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("syndicate")
|
||||
status_flags = CANPUSH
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/death(gibbed)
|
||||
..(gibbed)
|
||||
if(corpse)
|
||||
new corpse (src.loc)
|
||||
if(weapon1)
|
||||
new weapon1 (src.loc)
|
||||
if(weapon2)
|
||||
new weapon2 (src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
del_on_death = 1
|
||||
|
||||
///////////////Sword and shield////////////
|
||||
|
||||
@@ -47,8 +35,9 @@
|
||||
melee_damage_upper = 30
|
||||
icon_state = "syndicatemelee"
|
||||
icon_living = "syndicatemelee"
|
||||
weapon1 = /obj/item/weapon/melee/energy/sword/saber/red
|
||||
weapon2 = /obj/item/weapon/shield/energy
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier,
|
||||
/obj/item/weapon/melee/energy/sword/saber/red,
|
||||
/obj/item/weapon/shield/energy)
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
armour_penetration = 28
|
||||
@@ -72,7 +61,9 @@
|
||||
icon_state = "syndicatemeleespace"
|
||||
icon_living = "syndicatemeleespace"
|
||||
name = "Syndicate Commando"
|
||||
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando,
|
||||
/obj/item/weapon/melee/energy/sword/saber/red,
|
||||
/obj/item/weapon/shield/energy)
|
||||
speed = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0)
|
||||
@@ -87,8 +78,9 @@
|
||||
icon_living = "syndicateranged"
|
||||
casingtype = /obj/item/ammo_casing/c45nostamina
|
||||
projectilesound = 'sound/weapons/Gunshot_smg.ogg'
|
||||
|
||||
weapon1 = /obj/item/weapon/gun/projectile/automatic/c20r/unrestricted
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier,
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r/unrestricted,
|
||||
/obj/item/weapon/shield/energy)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space
|
||||
icon_state = "syndicaterangedpsace"
|
||||
@@ -96,8 +88,10 @@
|
||||
name = "Syndicate Commando"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
corpse = /obj/effect/landmark/mobcorpse/syndicatecommando
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando,
|
||||
/obj/item/weapon/gun/projectile/automatic/c20r/unrestricted,
|
||||
/obj/item/weapon/shield/energy)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0)
|
||||
return
|
||||
@@ -133,9 +127,8 @@
|
||||
flying = 1
|
||||
speak_emote = list("states")
|
||||
gold_core_spawnable = 1
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/viscerator/death(gibbed)
|
||||
..(gibbed)
|
||||
visible_message("<span class='danger'><b>[src]</b> is smashed into pieces!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
/mob/living/simple_animal/hostile/viscerator/New()
|
||||
..()
|
||||
deathmessage = "<b>[src]</b> is smashed into pieces!"
|
||||
|
||||
@@ -33,8 +33,9 @@
|
||||
maxbodytemp = 1200
|
||||
|
||||
faction = list("hostile")
|
||||
var/drop_type = /obj/item/stack/sheet/mineral/wood
|
||||
loot = list(/obj/item/stack/sheet/mineral/wood)
|
||||
gold_core_spawnable = 1
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/Life()
|
||||
..()
|
||||
@@ -57,12 +58,9 @@
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/death(gibbed)
|
||||
..(1)
|
||||
visible_message("<span class='danger'>[src] is hacked into pieces!</span>")
|
||||
new drop_type(loc)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
/mob/living/simple_animal/hostile/tree/New()
|
||||
..()
|
||||
deathmessage = "[src] is hacked into pieces!"
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/festivus
|
||||
name = "festivus pole"
|
||||
@@ -71,6 +69,5 @@
|
||||
icon_living = "festivus_pole"
|
||||
icon_dead = "festivus_pole"
|
||||
icon_gib = "festivus_pole"
|
||||
drop_type = /obj/item/stack/rods
|
||||
loot = list(/obj/item/stack/rods)
|
||||
speak_emote = list("polls")
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
var/grasp_chance = 20
|
||||
var/grasp_pull_chance = 85
|
||||
var/grasp_range = 4
|
||||
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
|
||||
if(..())
|
||||
@@ -107,8 +107,3 @@
|
||||
if(.)
|
||||
if(the_target in grasping)
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/venus_human_trap/death()
|
||||
qdel(src)
|
||||
@@ -25,6 +25,9 @@
|
||||
|
||||
retreat_distance = 3 //out of fireball range
|
||||
minimum_distance = 3
|
||||
del_on_death = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/wizard,
|
||||
/obj/item/weapon/staff)
|
||||
|
||||
var/obj/effect/proc_holder/spell/dumbfire/fireball/fireball = null
|
||||
var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null
|
||||
@@ -54,13 +57,6 @@
|
||||
blink.outer_tele_radius = 3
|
||||
AddSpell(blink)
|
||||
|
||||
/mob/living/simple_animal/hostile/wizard/death(gibbed)
|
||||
..(gibbed)
|
||||
new /obj/effect/landmark/mobcorpse/wizard(src.loc)
|
||||
new /obj/item/weapon/staff(src.loc)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/wizard/handle_automated_action()
|
||||
. = ..()
|
||||
if(target && next_cast < world.time)
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
spawn_text = "emerges from"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
faction = list("zombie")
|
||||
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/zombie/lesser
|
||||
name = "lesser corpse pit"
|
||||
@@ -124,9 +124,9 @@
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/zombie/death()
|
||||
visible_message("<span class='danger'>[src] collapes, stopping the flow of zombies!</span>")
|
||||
qdel(src)
|
||||
/mob/living/simple_animal/hostile/spawner/zombie/New()
|
||||
..()
|
||||
deathmessage = "[src] collapes, stopping the flow of zombies!"
|
||||
|
||||
|
||||
/obj/item/weapon/shovel/cursed
|
||||
@@ -157,7 +157,7 @@
|
||||
AIStatus = AI_OFF
|
||||
stop_automated_movement = 1
|
||||
density = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/zombie/holder/New()
|
||||
..()
|
||||
spawn(rand(800,1200))
|
||||
|
||||
@@ -69,6 +69,10 @@
|
||||
|
||||
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
|
||||
|
||||
var/list/loot = list() //list of things spawned at mob's loc when it dies
|
||||
var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses
|
||||
var/deathmessage = ""
|
||||
|
||||
/mob/living/simple_animal/New()
|
||||
..()
|
||||
verbs -= /mob/verb/observe
|
||||
@@ -390,15 +394,24 @@
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/death(gibbed)
|
||||
health = 0
|
||||
icon_state = icon_dead
|
||||
stat = DEAD
|
||||
density = 0
|
||||
if(nest)
|
||||
nest.spawned_mobs -= src
|
||||
nest = null
|
||||
if(!gibbed)
|
||||
if(loot.len)
|
||||
for(var/i in loot)
|
||||
new i(loc)
|
||||
if(deathmessage && !gibbed)
|
||||
visible_message("<span class='danger'>[deathmessage]</span>")
|
||||
else if(!del_on_death)
|
||||
visible_message("<span class='danger'>\the [src] stops moving...</span>")
|
||||
if(del_on_death)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
else
|
||||
health = 0
|
||||
icon_state = icon_dead
|
||||
stat = DEAD
|
||||
density = 0
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/ex_act(severity, target)
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
var/power_produced = power / power_loss
|
||||
add_avail(power_produced*input_power_multiplier)
|
||||
flick("coilhit", src)
|
||||
playsound(src.loc, 'sound/magic/LightningShock.ogg', 100, 1, extrarange = 5)
|
||||
tesla_zap(src, 5, power_produced)
|
||||
spawn(10)
|
||||
being_shocked = 0
|
||||
|
||||
@@ -16,7 +16,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
|
||||
/obj/structure/disposalpipe)
|
||||
|
||||
/obj/singularity/energy_ball
|
||||
name = "energy eall"
|
||||
name = "energy ball"
|
||||
desc = "An energy ball."
|
||||
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
|
||||
icon_state = "energy_ball"
|
||||
@@ -40,15 +40,16 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
|
||||
if(!is_orbiting)
|
||||
handle_energy()
|
||||
var/amount_to_move = 2 + orbiting_balls.len * 2
|
||||
var/what_does_the_scouter_say_about_the_balls_power_level = (TESLA_DEFAULT_POWER + (TESLA_MINI_POWER * orbiting_balls.len))
|
||||
move_the_basket_ball(amount_to_move)
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
tesla_zap(src, 7, TESLA_DEFAULT_POWER)
|
||||
playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 5)
|
||||
tesla_zap(src, 7, what_does_the_scouter_say_about_the_balls_power_level)
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
energy += rand(1,3) // ensure it generates energy without needing to be blasted by the PA too much due to its size, and that a tesla engine will always get bigger over time
|
||||
else
|
||||
tesla_zap(src, 7, TESLA_MINI_POWER)
|
||||
energy = 0 // ensure we dont have miniballs of miniballs
|
||||
return
|
||||
|
||||
@@ -67,17 +68,19 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
|
||||
|
||||
/obj/singularity/energy_ball/proc/handle_energy()
|
||||
if(energy >= 300)
|
||||
energy = 0
|
||||
var/obj/singularity/energy_ball/EB = new(loc)
|
||||
orbiting_balls.Add(EB)
|
||||
EB.transform *= pick(0.3,0.4,0.5,0.6,0.7)
|
||||
EB.is_orbiting = 1
|
||||
var/icon/I = icon(icon,icon_state,dir)
|
||||
energy -= 300
|
||||
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 5)
|
||||
spawn(100)
|
||||
var/obj/singularity/energy_ball/EB = new(loc)
|
||||
orbiting_balls.Add(EB)
|
||||
EB.transform *= pick(0.3,0.4,0.5,0.6,0.7)
|
||||
EB.is_orbiting = 1
|
||||
var/icon/I = icon(icon,icon_state,dir)
|
||||
|
||||
var/orbitsize = (I.Width()+I.Height())*pick(0.5,0.6,0.7)
|
||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||
spawn(1)
|
||||
EB.orbit(src,orbitsize, pick(FALSE,TRUE), rand(10,25), pick(3,4,5,6,36))
|
||||
var/orbitsize = (I.Width()+I.Height())*pick(0.5,0.6,0.7)
|
||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||
spawn(1)
|
||||
EB.orbit(src,orbitsize, pick(FALSE,TRUE), rand(10,25), pick(3,4,5,6,36))
|
||||
|
||||
|
||||
|
||||
@@ -110,7 +113,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
|
||||
return closest_atom
|
||||
|
||||
/proc/tesla_zap(var/atom/source, zap_range = 3, power)
|
||||
if(power < 1000)
|
||||
if(power < 500)
|
||||
return
|
||||
var/list/tesla_coils = list()
|
||||
var/list/grounding_rods = list()
|
||||
@@ -176,6 +179,9 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
|
||||
if(istype(L, /mob/living/silicon))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(2)
|
||||
tesla_zap(S, 7, power / 1.5) // metallic folks bounce it further
|
||||
else
|
||||
tesla_zap(L, 5, power / 1.5)
|
||||
return
|
||||
if(!closest_atom)
|
||||
closest_atom = get_closest_atom(/obj/machinery, potential_machine_zaps, source)
|
||||
|
||||
@@ -29,8 +29,10 @@
|
||||
|
||||
/datum/reagent/blob/ripping_tendrils/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
M.adjustStaminaLoss(0.6*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.adjustStaminaLoss(0.6*reac_volume)
|
||||
if(iscarbon(M))
|
||||
M.emote("scream")
|
||||
|
||||
@@ -44,7 +46,8 @@
|
||||
|
||||
/datum/reagent/blob/sporing_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, TOX)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, TOX)
|
||||
|
||||
/datum/reagent/blob/sporing_pods/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
|
||||
if(!isnull(cause) && damage < 20 && original_health - damage <= 0 && prob(50)) //if the cause isn't fire or a bomb, the damage is less than 20, we're going to die from that damage, 50% chance of a shitty spore.
|
||||
@@ -71,7 +74,8 @@
|
||||
|
||||
/datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/replicating_foam/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
|
||||
if(damage > 0 && original_health - damage > 0 && prob(100 - damage))
|
||||
@@ -96,8 +100,10 @@
|
||||
|
||||
/datum/reagent/blob/energized_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, BURN)
|
||||
M.adjustStaminaLoss(0.8*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, BURN)
|
||||
if(M)
|
||||
M.adjustStaminaLoss(0.8*reac_volume)
|
||||
|
||||
/datum/reagent/blob/energized_fibers/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
|
||||
if(damage_type == STAMINA)
|
||||
@@ -118,8 +124,9 @@
|
||||
/datum/reagent/blob/boiling_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.adjust_fire_stacks(round(reac_volume/12))
|
||||
M.apply_damage(0.6*reac_volume, BURN)
|
||||
M.IgniteMob()
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BURN)
|
||||
if(iscarbon(M))
|
||||
M.emote("scream")
|
||||
|
||||
@@ -135,11 +142,12 @@
|
||||
|
||||
/datum/reagent/blob/hallucinogenic_nectar/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, TOX)
|
||||
M.hallucination += 0.6*reac_volume
|
||||
M.druggy += 0.6*reac_volume
|
||||
if(M.reagents)
|
||||
M.reagents.add_reagent("spore", 0.2*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, TOX)
|
||||
|
||||
//toxin, stamina, and some bonus spore toxin
|
||||
/datum/reagent/blob/envenomed_filaments
|
||||
@@ -151,10 +159,12 @@
|
||||
|
||||
/datum/reagent/blob/envenomed_filaments/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, TOX)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
if(M.reagents)
|
||||
M.reagents.add_reagent("spore", 0.2*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, TOX)
|
||||
if(M)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
|
||||
//does tons of oxygen damage and a little brute
|
||||
/datum/reagent/blob/lexorin_jelly
|
||||
@@ -166,9 +176,11 @@
|
||||
|
||||
/datum/reagent/blob/lexorin_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
M.apply_damage(0.6*reac_volume, OXY)
|
||||
M.losebreath += round(0.2*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, OXY)
|
||||
|
||||
//does semi-random brute damage and reacts to brute damage
|
||||
/datum/reagent/blob/reactive
|
||||
@@ -182,7 +194,8 @@
|
||||
/datum/reagent/blob/reactive/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
var/damage = rand(10, 25)/25
|
||||
M.apply_damage(damage*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(damage*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/reactive/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
|
||||
if(damage && damage_type == BRUTE && original_health - damage > 0 && isliving(cause)) //is there any damage, is it brute, will we be alive, and is the cause a mob?
|
||||
@@ -203,11 +216,13 @@
|
||||
|
||||
/datum/reagent/blob/cryogenic_liquid/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, BURN)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
if(M.reagents)
|
||||
M.reagents.add_reagent("frostoil", 0.4*reac_volume)
|
||||
M.reagents.add_reagent("ice", 0.4*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, BURN)
|
||||
if(M)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
|
||||
//does brute damage, bonus damage for each nearby blob, and spreads damage out
|
||||
/datum/reagent/blob/synchronous_mesh
|
||||
@@ -220,13 +235,14 @@
|
||||
|
||||
/datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
for(var/obj/effect/blob/B in range(1, M)) //if the target is completely surrounded, this is 0.8*reac_volume bonus damage, total of 1.2*reac_volume
|
||||
M.apply_damage(0.1*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
if(M)
|
||||
for(var/obj/effect/blob/B in range(1, M)) //if the target is completely surrounded, this is 0.8*reac_volume bonus damage, total of 1.2*reac_volume
|
||||
if(M)
|
||||
M.apply_damage(0.1*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
|
||||
if(istype(cause, /obj/effect/blob)) //if a blob is doing it, that means we're splitting the damage, so don't modify it.
|
||||
return ..()
|
||||
if(!isnull(cause)) //the cause isn't fire or bombs, so split the damage
|
||||
var/damagesplit = 0.8 //maximum split is 7.2, reducing the damage each blob takes to 14% but doing that damage to 9 blobs
|
||||
for(var/obj/effect/blob/C in orange(1, B))
|
||||
@@ -234,7 +250,7 @@
|
||||
damagesplit += 0.8
|
||||
for(var/obj/effect/blob/C in orange(1, B))
|
||||
if(C.overmind && C.overmind.blob_reagent_datum == B.overmind.blob_reagent_datum && !istype(C, /obj/effect/blob/core)) //only hurt blobs that have the same overmind chemical and aren't cores
|
||||
C.take_damage(damage/damagesplit, CLONE, B)
|
||||
C.take_damage(damage/damagesplit, CLONE, B, 0)
|
||||
return damage/damagesplit
|
||||
else
|
||||
return damage*1.25
|
||||
@@ -251,12 +267,15 @@
|
||||
|
||||
/datum/reagent/blob/pressurized_slime/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
M.apply_damage(0.4*reac_volume, OXY)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
var/turf/simulated/T = get_turf(M)
|
||||
if(istype(T, /turf/simulated))
|
||||
T.MakeSlippery(TURF_WET_WATER)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, OXY)
|
||||
if(M)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
|
||||
/datum/reagent/blob/pressurized_slime/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
|
||||
for(var/turf/simulated/T in range(1, B))
|
||||
@@ -282,7 +301,8 @@
|
||||
/datum/reagent/blob/dark_matter/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reagent_vortex(M, 0, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
|
||||
//does brute damage and throws or pushes nearby objects away from the target
|
||||
/datum/reagent/blob/b_sorium
|
||||
@@ -295,36 +315,38 @@
|
||||
/datum/reagent/blob/b_sorium/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
reagent_vortex(M, 1, reac_volume)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/proc/reagent_vortex(mob/living/M, setting_type, reac_volume)
|
||||
var/turf/pull = get_turf(M)
|
||||
var/range_power = Clamp(round(reac_volume/5, 1), 1, 5)
|
||||
for(var/atom/movable/X in range(range_power,pull))
|
||||
if(istype(X, /obj/effect))
|
||||
continue
|
||||
if(!X.anchored)
|
||||
var/distance = get_dist(X, pull)
|
||||
var/moving_power = max(range_power - distance, 1)
|
||||
spawn(0)
|
||||
if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
|
||||
if(setting_type)
|
||||
var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
|
||||
var/throw_range = 5 - distance
|
||||
X.throw_at(throw_target, throw_range, 1)
|
||||
if(M)
|
||||
var/turf/pull = get_turf(M)
|
||||
var/range_power = Clamp(round(reac_volume/5, 1), 1, 5)
|
||||
for(var/atom/movable/X in range(range_power,pull))
|
||||
if(istype(X, /obj/effect))
|
||||
continue
|
||||
if(!X.anchored)
|
||||
var/distance = get_dist(X, pull)
|
||||
var/moving_power = max(range_power - distance, 1)
|
||||
spawn(0)
|
||||
if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
|
||||
if(setting_type)
|
||||
var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
|
||||
var/throw_range = 5 - distance
|
||||
X.throw_at(throw_target, throw_range, 1)
|
||||
else
|
||||
X.throw_at(pull, distance, 1)
|
||||
else
|
||||
X.throw_at(pull, distance, 1)
|
||||
else
|
||||
if(setting_type)
|
||||
for(var/i = 0, i < moving_power, i++)
|
||||
sleep(2)
|
||||
if(!step_away(X, pull))
|
||||
break
|
||||
else
|
||||
for(var/i = 0, i < moving_power, i++)
|
||||
sleep(2)
|
||||
if(!step_towards(X, pull))
|
||||
break
|
||||
if(setting_type)
|
||||
for(var/i in 0 to moving_power-1)
|
||||
sleep(2)
|
||||
if(!step_away(X, pull))
|
||||
break
|
||||
else
|
||||
for(var/i in 0 to moving_power-1)
|
||||
sleep(2)
|
||||
if(!step_towards(X, pull))
|
||||
break
|
||||
|
||||
|
||||
/datum/reagent/blob/proc/send_message(mob/living/M)
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
/datum/reagent/medicine/cryoxadone
|
||||
name = "Cryoxadone"
|
||||
id = "cryoxadone"
|
||||
description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 170K for it to metabolise correctly."
|
||||
description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly."
|
||||
color = "#0000C8"
|
||||
|
||||
/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/M)
|
||||
@@ -390,21 +390,23 @@
|
||||
/datum/reagent/medicine/sal_acid
|
||||
name = "Salicyclic Acid"
|
||||
id = "sal_acid"
|
||||
description = "Very slowly restores low bruising. Primarily used as an ingredient in other medicines. Overdose causes slight bruising."
|
||||
description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
overdose_threshold = 25
|
||||
|
||||
|
||||
/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/M)
|
||||
if(M.getBruteLoss() < 50)
|
||||
M.adjustBruteLoss(-0.25*REM)
|
||||
if(M.getBruteLoss() > 50)
|
||||
M.adjustBruteLoss(-4*REM) //Twice as effective as styptic powder for severe bruising
|
||||
else
|
||||
M.adjustBruteLoss(-0.5*REM) //But only a quarter as effective for more minor ones
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
|
||||
if(M.getBruteLoss() < 50)
|
||||
M.adjustBruteLoss(0.5*REM)
|
||||
if(M.getBruteLoss()) //It only makes existing bruises worse
|
||||
M.adjustBruteLoss(4.5*REM) // it's going to be healing either 4 or 0.5
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
@@ -78,10 +78,11 @@ Borg Hypospray
|
||||
if(isrobot(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
if(R && R.cell)
|
||||
var/datum/reagents/RG = reagent_list[mode]
|
||||
if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full.
|
||||
R.cell.use(charge_cost) //Take power from borg...
|
||||
RG.add_reagent(reagent_ids[mode], 5) //And fill hypo with reagent.
|
||||
for(var/i in 1 to reagent_ids.len)
|
||||
var/datum/reagents/RG = reagent_list[i]
|
||||
if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full.
|
||||
R.cell.use(charge_cost) //Take power from borg...
|
||||
RG.add_reagent(reagent_ids[i], 5) //And fill hypo with reagent.
|
||||
|
||||
/obj/item/weapon/reagent_containers/borghypo/attack(mob/living/carbon/M, mob/user)
|
||||
var/datum/reagents/R = reagent_list[mode]
|
||||
|
||||
@@ -440,8 +440,9 @@
|
||||
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
|
||||
G.mind.store_memory("<b>Serve [user.real_name], your creator.</b>")
|
||||
if(user.mind.special_role)
|
||||
message_admins("[G.real_name] has been summoned by [user.real_name], an antagonist.")
|
||||
log_game("[G.real_name] ([G.key]) was made a golem by [user.real_name]([user.key]).")
|
||||
message_admins("[key_name_admin(G)](<A HREF='?_src_=holder;adminmoreinfo=\ref[G]'>?</A>) has been summoned by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>), an antagonist.")
|
||||
log_game("[key_name(G)] was made a golem by [key_name(user)].")
|
||||
log_admin("[key_name(G)] was made a golem by [key_name(user)].")
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user