Merge pull request #8984 from VOREStation/upstream-merge-7620

[MIRROR] Increase a bunch of mobs MELEE AP power.
This commit is contained in:
Novacat
2020-09-05 12:35:57 -04:00
committed by GitHub
9 changed files with 418 additions and 405 deletions

View File

@@ -28,6 +28,7 @@
melee_damage_lower = 10 melee_damage_lower = 10
melee_damage_upper = 25 melee_damage_upper = 25
attack_armor_pen = 15
heat_resist = 0.75 heat_resist = 0.75
cold_resist = -0.50 cold_resist = -0.50

View File

@@ -1,252 +1,253 @@
// Parrots can talk, and may repeat things it hears. // Parrots can talk, and may repeat things it hears.
/mob/living/simple_mob/animal/passive/bird/parrot /mob/living/simple_mob/animal/passive/bird/parrot
name = "parrot" name = "parrot"
description_info = "You can give it a headset by clicking on it with a headset. \ description_info = "You can give it a headset by clicking on it with a headset. \
To remove it, click the bird while on grab intent." To remove it, click the bird while on grab intent."
has_langs = list("Galactic Common", "Bird") has_langs = list("Galactic Common", "Bird")
ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot
// A headset, so that talking parrots can yell at the crew over comms. // A headset, so that talking parrots can yell at the crew over comms.
// If set to a type, on initialize it will be instantiated into that type. // If set to a type, on initialize it will be instantiated into that type.
var/obj/item/device/radio/headset/my_headset = null var/obj/item/device/radio/headset/my_headset = null
// Say list // Say list
/datum/say_list/bird/poly /datum/say_list/bird/poly
speak = list( speak = list(
"Poly wanna cracker!", "Poly wanna cracker!",
"Check the singulo, you chucklefucks!", "Check the singulo, you chucklefucks!",
"Wire the solars, you lazy bums!", "Wire the solars, you lazy bums!",
"WHO TOOK THE DAMN HARDSUITS?", "WHO TOOK THE DAMN HARDSUITS?",
"OH GOD ITS FREE CALL THE SHUTTLE", "OH GOD ITS FREE CALL THE SHUTTLE",
"Danger! Crystal hyperstructure instability!", "Danger! Crystal hyperstructure instability!",
"CRYSTAL DELAMINATION IMMINENT.", "CRYSTAL DELAMINATION IMMINENT.",
"Tweet tweet, I'm a Teshari.", "Tweet tweet, I'm a Teshari.",
"Chitters.", "Chitters.",
"Meteors have been detected on a collision course with the station!" "Meteors have been detected on a collision course with the station!"
) )
// Lets the AI use headsets. // Lets the AI use headsets.
// Player-controlled parrots will need to do it manually. // Player-controlled parrots will need to do it manually.
/mob/living/simple_mob/animal/passive/bird/parrot/ISay(message) /mob/living/simple_mob/animal/passive/bird/parrot/ISay(message)
if(my_headset && prob(50)) if(my_headset && prob(50))
var/list/keys = list() var/list/keys = list()
for(var/channel in my_headset.channels) for(var/channel in my_headset.channels)
var/key = get_radio_key_from_channel(channel) var/key = get_radio_key_from_channel(channel)
if(key) if(key)
keys += key keys += key
if(keys.len) if(keys.len)
var/key_used = pick(keys) var/key_used = pick(keys)
return say("[key_used] [message]") return say("[key_used] [message]")
return say(message) return say(message)
// Ugly saycode so parrots can use their headsets. // Ugly saycode so parrots can use their headsets.
/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios) /mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios)
..() ..()
if(message_mode) if(message_mode)
if(my_headset && istype(my_headset, /obj/item/device/radio)) if(my_headset && istype(my_headset, /obj/item/device/radio))
my_headset.talk_into(src, message, message_mode, verb, speaking) my_headset.talk_into(src, message, message_mode, verb, speaking)
used_radios += my_headset used_radios += my_headset
// Clicked on while holding an object. // Clicked on while holding an object.
/mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user) /mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/device/radio/headset)) if(istype(I, /obj/item/device/radio/headset))
give_headset(I, user) give_headset(I, user)
return return
return ..() return ..()
// Clicked on by empty hand. // Clicked on by empty hand.
/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L) /mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L)
if(L.a_intent == I_GRAB && my_headset) if(L.a_intent == I_GRAB && my_headset)
remove_headset(L) remove_headset(L)
else else
..() ..()
/mob/living/simple_mob/animal/passive/bird/parrot/proc/give_headset(obj/item/device/radio/headset/new_headset, mob/living/user) /mob/living/simple_mob/animal/passive/bird/parrot/proc/give_headset(obj/item/device/radio/headset/new_headset, mob/living/user)
if(!istype(new_headset)) if(!istype(new_headset))
to_chat(user, span("warning", "\The [new_headset] isn't a headset.")) to_chat(user, span("warning", "\The [new_headset] isn't a headset."))
return return
if(my_headset) if(my_headset)
to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset].")) to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset]."))
return return
else else
user.drop_item(new_headset) user.drop_item(new_headset)
my_headset = new_headset my_headset = new_headset
new_headset.forceMove(src) new_headset.forceMove(src)
to_chat(user, span("warning", "You place \a [new_headset] on \the [src]. You monster.")) to_chat(user, span("warning", "You place \a [new_headset] on \the [src]. You monster."))
to_chat(src, span("notice", "\The [user] gives you \a [new_headset]. You should put it to good use immediately.")) to_chat(src, span("notice", "\The [user] gives you \a [new_headset]. You should put it to good use immediately."))
return return
/mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user) /mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user)
if(!my_headset) if(!my_headset)
to_chat(user, "<span class='warning'>\The [src] doesn't have a headset to remove, thankfully.</span>") to_chat(user, "<span class='warning'>\The [src] doesn't have a headset to remove, thankfully.</span>")
else else
ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
my_headset.forceMove(get_turf(src)) my_headset.forceMove(get_turf(src))
user.put_in_hands(my_headset) user.put_in_hands(my_headset)
to_chat(user, span("notice", "You take away \the [src]'s [my_headset.name]. Finally.")) to_chat(user, span("notice", "You take away \the [src]'s [my_headset.name]. Finally."))
to_chat(src, span("warning", "\The [user] takes your [my_headset.name] away! How cruel!")) to_chat(src, span("warning", "\The [user] takes your [my_headset.name] away! How cruel!"))
my_headset = null my_headset = null
/mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user) /mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user)
. = ..() . = ..()
if(my_headset) if(my_headset)
. += "It is wearing \a [my_headset]." . += "It is wearing \a [my_headset]."
/mob/living/simple_mob/animal/passive/bird/parrot/Initialize() /mob/living/simple_mob/animal/passive/bird/parrot/Initialize()
if(my_headset) if(my_headset)
my_headset = new my_headset(src) my_headset = new my_headset(src)
return ..() return ..()
// Subtypes. // Subtypes.
// Best Bird // Best Bird
/mob/living/simple_mob/animal/passive/bird/parrot/poly /mob/living/simple_mob/animal/passive/bird/parrot/poly
name = "Poly" name = "Poly"
desc = "It's a parrot. An expert on quantum cracker theory." desc = "It's a parrot. An expert on quantum cracker theory."
icon_state = "poly" icon_state = "poly"
icon_rest = "poly-held" icon_rest = "poly-held"
icon_dead = "poly-dead" icon_dead = "poly-dead"
tt_desc = "E Ara macao" tt_desc = "E Ara macao"
//my_headset = /obj/item/device/radio/headset/headset_eng //VOREStation Removal attack_armor_pen = 20 //HE HAS THE B E A K
say_list_type = /datum/say_list/bird/poly my_headset = /obj/item/device/radio/headset/headset_eng
say_list_type = /datum/say_list/bird/poly
// Best Bird with best headset.
/mob/living/simple_mob/animal/passive/bird/parrot/poly/ultimate // Best Bird with best headset.
my_headset = /obj/item/device/radio/headset/omni /mob/living/simple_mob/animal/passive/bird/parrot/poly/ultimate
my_headset = /obj/item/device/radio/headset/omni
/mob/living/simple_mob/animal/passive/bird/parrot/kea
name = "kea" /mob/living/simple_mob/animal/passive/bird/parrot/kea
desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \ name = "kea"
They are known to be intelligent and curious, which has made some consider them a pest." desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \
icon_state = "kea" They are known to be intelligent and curious, which has made some consider them a pest."
icon_rest = "kea-held" icon_state = "kea"
icon_dead = "kea-dead" icon_rest = "kea-held"
tt_desc = "E Nestor notabilis" icon_dead = "kea-dead"
tt_desc = "E Nestor notabilis"
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus
name = "eclectus" /mob/living/simple_mob/animal/passive/bird/parrot/eclectus
desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \ name = "eclectus"
A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage." desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \
icon_state = "eclectus" A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage."
icon_rest = "eclectus-held" icon_state = "eclectus"
icon_dead = "eclectus-dead" icon_rest = "eclectus-held"
tt_desc = "E Eclectus roratus" icon_dead = "eclectus-dead"
tt_desc = "E Eclectus roratus"
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
gender = pick(MALE, FEMALE) /mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
if(gender == FEMALE) gender = pick(MALE, FEMALE)
icon_state = "eclectusf" if(gender == FEMALE)
icon_rest = "eclectusf-held" icon_state = "eclectusf"
icon_dead = "eclectusf-dead" icon_rest = "eclectusf-held"
return ..() icon_dead = "eclectusf-dead"
return ..()
/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
name = "grey parrot" /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
desc = "A species of parrot. This one is predominantly grey, but has red tail feathers." name = "grey parrot"
icon_state = "agrey" desc = "A species of parrot. This one is predominantly grey, but has red tail feathers."
icon_rest = "agrey-held" icon_state = "agrey"
icon_dead = "agrey-dead" icon_rest = "agrey-held"
tt_desc = "E Psittacus erithacus" icon_dead = "agrey-dead"
tt_desc = "E Psittacus erithacus"
/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
name = "black-headed caique" /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques." name = "black-headed caique"
icon_state = "bcaique" desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques."
icon_rest = "bcaique-held" icon_state = "bcaique"
icon_dead = "bcaique-dead" icon_rest = "bcaique-held"
tt_desc = "E Pionites melanocephalus" icon_dead = "bcaique-dead"
tt_desc = "E Pionites melanocephalus"
/mob/living/simple_mob/animal/passive/bird/parrot/white_caique
name = "white-bellied caique" /mob/living/simple_mob/animal/passive/bird/parrot/white_caique
desc = "A species of parrot, they are also known as the Green-Thighed Parrot." name = "white-bellied caique"
icon_state = "wcaique" desc = "A species of parrot, they are also known as the Green-Thighed Parrot."
icon_rest = "wcaique-held" icon_state = "wcaique"
icon_dead = "wcaique-dead" icon_rest = "wcaique-held"
tt_desc = "E Pionites leucogaster" icon_dead = "wcaique-dead"
tt_desc = "E Pionites leucogaster"
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
name = "budgerigar" /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \ name = "budgerigar"
This one is has its natural colors of green and yellow." desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
icon_state = "gbudge" This one is has its natural colors of green and yellow."
icon_rest = "gbudge-held" icon_state = "gbudge"
icon_dead = "gbudge-dead" icon_rest = "gbudge-held"
tt_desc = "E Melopsittacus undulatus" icon_dead = "gbudge-dead"
tt_desc = "E Melopsittacus undulatus"
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
icon_state = "bbudge" /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
icon_rest = "bbudge-held" icon_state = "bbudge"
icon_dead = "bbudge-dead" icon_rest = "bbudge-held"
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \ icon_dead = "bbudge-dead"
This one has a mutation which altered its color to be blue instead of green and yellow." desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
This one has a mutation which altered its color to be blue instead of green and yellow."
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen
icon_state = "bgbudge" /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen
icon_rest = "bgbudge-held" icon_state = "bgbudge"
icon_dead = "bgbudge-dead" icon_rest = "bgbudge-held"
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \ icon_dead = "bgbudge-dead"
This one has a mutation which altered its color to be a mix of blue and green." desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
This one has a mutation which altered its color to be a mix of blue and green."
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel
name = "cockatiel" /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel
desc = "A species of parrot. This one has a highly visible crest." name = "cockatiel"
icon_state = "tiel" desc = "A species of parrot. This one has a highly visible crest."
icon_rest = "tiel-held" icon_state = "tiel"
icon_dead = "tiel-dead" icon_rest = "tiel-held"
tt_desc = "E Nymphicus hollandicus" icon_dead = "tiel-dead"
tt_desc = "E Nymphicus hollandicus"
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
icon_state = "wtiel" /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
icon_rest = "wtiel-held" icon_state = "wtiel"
icon_dead = "wtiel-dead" icon_rest = "wtiel-held"
icon_dead = "wtiel-dead"
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
icon_state = "luttiel" /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
icon_rest = "luttiel-held" icon_state = "luttiel"
icon_dead = "luttiel-dead" icon_rest = "luttiel-held"
icon_dead = "luttiel-dead"
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey
icon_state = "blutiel" // idk why this is blu. /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey
icon_rest = "blutiel-held" icon_state = "blutiel" // idk why this is blu.
icon_dead = "blutiel-dead" icon_rest = "blutiel-held"
icon_dead = "blutiel-dead"
// This actually might be the yellow-crested cockatoo but idk.
/mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo // This actually might be the yellow-crested cockatoo but idk.
name = "sulphur-crested cockatoo" /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo
desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow." name = "sulphur-crested cockatoo"
icon_state = "too" desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow."
icon_rest = "too-held" icon_state = "too"
icon_dead = "too-dead" icon_rest = "too-held"
tt_desc = "E Cacatua galerita" icon_dead = "too-dead"
tt_desc = "E Cacatua galerita"
// This was originally called 'hooded_too', which might not mean the unbrella cockatoo but idk.
/mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo // This was originally called 'hooded_too', which might not mean the unbrella cockatoo but idk.
name = "white cockatoo" /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo
desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest." name = "white cockatoo"
icon_state = "utoo" desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest."
icon_rest = "utoo-held" icon_state = "utoo"
icon_dead = "utoo-dead" icon_rest = "utoo-held"
tt_desc = "E Cacatua alba" icon_dead = "utoo-dead"
tt_desc = "E Cacatua alba"
/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
name = "pink cockatoo" /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \ name = "pink cockatoo"
in honor of a human surveyor and explorer who existed before humans fully explored their home planet." desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \
icon_state = "mtoo" in honor of a human surveyor and explorer who existed before humans fully explored their home planet."
icon_rest = "mtoo-held" icon_state = "mtoo"
icon_dead = "mtoo-dead" icon_rest = "mtoo-held"
tt_desc = "E Lophochroa leadbeateri" icon_dead = "mtoo-dead"
tt_desc = "E Lophochroa leadbeateri"
// AI
/datum/ai_holder/simple_mob/passive/parrot // AI
speak_chance = 2 /datum/ai_holder/simple_mob/passive/parrot
base_wander_delay = 8 speak_chance = 2
base_wander_delay = 8
/datum/ai_holder/simple_mob/passive/parrot/on_hear_say(mob/living/speaker, message)
if(holder.stat || !holder.say_list || !message || speaker == holder) /datum/ai_holder/simple_mob/passive/parrot/on_hear_say(mob/living/speaker, message)
return if(holder.stat || !holder.say_list || !message || speaker == holder)
var/datum/say_list/S = holder.say_list return
S.speak |= message var/datum/say_list/S = holder.say_list
S.speak |= message

View File

@@ -22,6 +22,7 @@
harm_intent_damage = 5 harm_intent_damage = 5
melee_damage_lower = 25 melee_damage_lower = 25
melee_damage_upper = 25 melee_damage_upper = 25
attack_armor_pen = 15 //It's a freaking alien.
attack_sharp = TRUE attack_sharp = TRUE
attack_edge = TRUE attack_edge = TRUE

View File

@@ -24,6 +24,7 @@
harm_intent_damage = 5 harm_intent_damage = 5
melee_damage_lower = 15 //Tac Knife damage melee_damage_lower = 15 //Tac Knife damage
melee_damage_upper = 15 melee_damage_upper = 15
attack_armor_pen = 20
attack_sharp = 1 attack_sharp = 1
attack_edge = 1 attack_edge = 1
attacktext = list("slashed", "stabbed") attacktext = list("slashed", "stabbed")

View File

@@ -15,7 +15,7 @@
harm_intent_damage = 5 harm_intent_damage = 5
melee_damage_lower = 30 melee_damage_lower = 30
melee_damage_upper = 30 melee_damage_upper = 30
attack_armor_pen = 50 attack_armor_pen = 30
attack_sharp = 1 attack_sharp = 1
attack_edge = 1 attack_edge = 1

View File

@@ -14,6 +14,7 @@
response_harm = "hits" response_harm = "hits"
harm_intent_damage = 5 harm_intent_damage = 5
attack_armor_pen = 15
melee_damage_lower = 15 melee_damage_lower = 15
melee_damage_upper = 15 melee_damage_upper = 15
attacktext = list("punched") attacktext = list("punched")

View File

@@ -1,152 +1,153 @@
// The GOLEM is a spell-flinging synthetic. // The GOLEM is a spell-flinging synthetic.
/mob/living/simple_mob/mechanical/technomancer_golem /mob/living/simple_mob/mechanical/technomancer_golem
name = "unknown synthetic" name = "unknown synthetic"
desc = "A rather unusual looking synthetic." desc = "A rather unusual looking synthetic."
icon = 'icons/mob/mob.dmi' icon = 'icons/mob/mob.dmi'
icon_state = "golem" icon_state = "golem"
health = 300 health = 300
maxHealth = 300 maxHealth = 300
faction = "golem" faction = "golem"
response_help = "pets" response_help = "pets"
response_disarm = "pushes away" response_disarm = "pushes away"
response_harm = "punches" response_harm = "punches"
harm_intent_damage = 3 harm_intent_damage = 3
friendly = "hugs" friendly = "hugs"
melee_damage_lower = 30 // It has a built in esword. melee_damage_lower = 30 // It has a built in esword.
melee_damage_upper = 30 melee_damage_upper = 30
attack_sound = 'sound/weapons/blade1.ogg' attack_armor_pen = 20
attacktext = list("slashed") attack_sound = 'sound/weapons/blade1.ogg'
melee_attack_delay = 0.5 SECONDS // Even has custom attack animations. attacktext = list("slashed")
ranged_attack_delay = 0.5 SECONDS melee_attack_delay = 0.5 SECONDS // Even has custom attack animations.
special_attack_delay = 1 SECOND ranged_attack_delay = 0.5 SECONDS
special_attack_delay = 1 SECOND
special_attack_min_range = 0
special_attack_max_range = 7 special_attack_min_range = 0
special_attack_max_range = 7
ai_holder_type = /datum/ai_holder/simple_mob/melee
ai_holder_type = /datum/ai_holder/simple_mob/melee
var/obj/item/weapon/technomancer_core/golem/core = null
var/obj/item/weapon/spell/active_spell = null // Shield and ranged spells var/obj/item/weapon/technomancer_core/golem/core = null
var/mob/living/master = null var/obj/item/weapon/spell/active_spell = null // Shield and ranged spells
var/casting = FALSE // Used to ensure the correct animation is played. Testing if a spell exists won't always work as some spells delete themselves upon use. var/mob/living/master = null
var/casting = FALSE // Used to ensure the correct animation is played. Testing if a spell exists won't always work as some spells delete themselves upon use.
var/list/known_spells = list(
"beam" = /obj/item/weapon/spell/projectile/beam, var/list/known_spells = list(
"chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning, "beam" = /obj/item/weapon/spell/projectile/beam,
"force missile" = /obj/item/weapon/spell/projectile/force_missile, "chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning,
"ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt, "force missile" = /obj/item/weapon/spell/projectile/force_missile,
"lightning" = /obj/item/weapon/spell/projectile/lightning, "ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt,
"blink" = /obj/item/weapon/spell/blink, "lightning" = /obj/item/weapon/spell/projectile/lightning,
"dispel" = /obj/item/weapon/spell/dispel, "blink" = /obj/item/weapon/spell/blink,
"oxygenate" = /obj/item/weapon/spell/oxygenate, "dispel" = /obj/item/weapon/spell/dispel,
"mend life" = /obj/item/weapon/spell/modifier/mend_life, "oxygenate" = /obj/item/weapon/spell/oxygenate,
"mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic, "mend life" = /obj/item/weapon/spell/modifier/mend_life,
"mend organs" = /obj/item/weapon/spell/mend_organs, "mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
"purify" = /obj/item/weapon/spell/modifier/purify, "mend organs" = /obj/item/weapon/spell/mend_organs,
"resurrect" = /obj/item/weapon/spell/resurrect, "purify" = /obj/item/weapon/spell/modifier/purify,
"passwall" = /obj/item/weapon/spell/passwall, "resurrect" = /obj/item/weapon/spell/resurrect,
"repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles, "passwall" = /obj/item/weapon/spell/passwall,
"corona" = /obj/item/weapon/spell/modifier/corona, "repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
"haste" = /obj/item/weapon/spell/modifier/haste "corona" = /obj/item/weapon/spell/modifier/corona,
) "haste" = /obj/item/weapon/spell/modifier/haste
)
/mob/living/simple_mob/mechanical/technomancer_golem/Initialize()
core = new(src) /mob/living/simple_mob/mechanical/technomancer_golem/Initialize()
return ..() core = new(src)
return ..()
/mob/living/simple_mob/mechanical/technomancer_golem/Destroy()
qdel(core) /mob/living/simple_mob/mechanical/technomancer_golem/Destroy()
return ..() qdel(core)
return ..()
/mob/living/simple_mob/mechanical/technomancer_golem/unref_spell()
active_spell = null /mob/living/simple_mob/mechanical/technomancer_golem/unref_spell()
return ..() active_spell = null
return ..()
/mob/living/simple_mob/mechanical/technomancer_golem/death()
..() /mob/living/simple_mob/mechanical/technomancer_golem/death()
visible_message("\The [src] disintegrates!") ..()
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) visible_message("\The [src] disintegrates!")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
s.set_up(3, 1, src) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.start() s.set_up(3, 1, src)
qdel(src) s.start()
qdel(src)
/mob/living/simple_mob/mechanical/technomancer_golem/place_spell_in_hand(var/path)
if(!path || !ispath(path)) /mob/living/simple_mob/mechanical/technomancer_golem/place_spell_in_hand(var/path)
return FALSE if(!path || !ispath(path))
if(active_spell) return FALSE
qdel(active_spell) if(active_spell)
qdel(active_spell)
active_spell = new path(src)
active_spell = new path(src)
/mob/living/simple_mob/mechanical/technomancer_golem/verb/test_giving_spells()
var/choice = input(usr, "What spell?", "Give spell") as null|anything in known_spells /mob/living/simple_mob/mechanical/technomancer_golem/verb/test_giving_spells()
if(choice) var/choice = input(usr, "What spell?", "Give spell") as null|anything in known_spells
place_spell_in_hand(known_spells[choice]) if(choice)
else place_spell_in_hand(known_spells[choice])
qdel(active_spell) else
qdel(active_spell)
/mob/living/simple_mob/mechanical/technomancer_golem/get_technomancer_core()
return core /mob/living/simple_mob/mechanical/technomancer_golem/get_technomancer_core()
return core
/mob/living/simple_mob/mechanical/technomancer_golem/can_special_attack(atom/A)
if(active_spell) // Don't bother checking everything else if no spell is ready. /mob/living/simple_mob/mechanical/technomancer_golem/can_special_attack(atom/A)
return ..() if(active_spell) // Don't bother checking everything else if no spell is ready.
return FALSE return ..()
return FALSE
/mob/living/simple_mob/mechanical/technomancer_golem/should_special_attack(atom/A)
return instability < 50 // Don't kill ourselves by casting everything. /mob/living/simple_mob/mechanical/technomancer_golem/should_special_attack(atom/A)
return instability < 50 // Don't kill ourselves by casting everything.
/mob/living/simple_mob/mechanical/technomancer_golem/do_special_attack(atom/A)
var/proximity = Adjacent(A) /mob/living/simple_mob/mechanical/technomancer_golem/do_special_attack(atom/A)
if(active_spell) var/proximity = Adjacent(A)
if(proximity && active_spell.cast_methods & CAST_MELEE) // Use melee method if available and close enough. if(active_spell)
return active_spell.on_melee_cast(A, src) if(proximity && active_spell.cast_methods & CAST_MELEE) // Use melee method if available and close enough.
else if(active_spell.cast_methods & CAST_RANGED) // Otherwise use ranged if possible. Will also work for point-blank range. return active_spell.on_melee_cast(A, src)
return active_spell.on_ranged_cast(A, src) else if(active_spell.cast_methods & CAST_RANGED) // Otherwise use ranged if possible. Will also work for point-blank range.
return ..() return active_spell.on_ranged_cast(A, src)
return ..()
/mob/living/simple_mob/mechanical/technomancer_golem/melee_pre_animation(atom/A)
if(active_spell && active_spell.cast_methods & CAST_MELEE|CAST_RANGED) // If they're trying to melee-cast a spell, use the special animation instead. /mob/living/simple_mob/mechanical/technomancer_golem/melee_pre_animation(atom/A)
special_pre_animation(A) if(active_spell && active_spell.cast_methods & CAST_MELEE|CAST_RANGED) // If they're trying to melee-cast a spell, use the special animation instead.
return special_pre_animation(A)
return
flick("golem_pre_melee", src) // To force the animation to restart.
icon_living = "golem_pre_melee" // The animation will hold after this point until melee_post_animation() gets called. flick("golem_pre_melee", src) // To force the animation to restart.
icon_state = "golem_pre_melee" icon_living = "golem_pre_melee" // The animation will hold after this point until melee_post_animation() gets called.
setClickCooldown(2) icon_state = "golem_pre_melee"
setClickCooldown(2)
/mob/living/simple_mob/mechanical/technomancer_golem/melee_post_animation(atom/A)
if(casting) // Some spells delete themselves when used, so we use a different variable set earlier instead. /mob/living/simple_mob/mechanical/technomancer_golem/melee_post_animation(atom/A)
special_post_animation(A) if(casting) // Some spells delete themselves when used, so we use a different variable set earlier instead.
return special_post_animation(A)
return
flick("golem_post_melee", src)
icon_living = "golem" flick("golem_post_melee", src)
icon_state = "golem" icon_living = "golem"
setClickCooldown(6) icon_state = "golem"
setClickCooldown(6)
/mob/living/simple_mob/mechanical/technomancer_golem/ranged_pre_animation(atom/A)
flick("golem_pre_ranged", src) /mob/living/simple_mob/mechanical/technomancer_golem/ranged_pre_animation(atom/A)
icon_living = "golem_pre_ranged" flick("golem_pre_ranged", src)
icon_state = "golem_pre_ranged" icon_living = "golem_pre_ranged"
setClickCooldown(5) icon_state = "golem_pre_ranged"
setClickCooldown(5)
/mob/living/simple_mob/mechanical/technomancer_golem/ranged_post_animation(atom/A)
flick("golem_post_ranged", src) /mob/living/simple_mob/mechanical/technomancer_golem/ranged_post_animation(atom/A)
icon_living = "golem" flick("golem_post_ranged", src)
icon_state = "golem" icon_living = "golem"
setClickCooldown(5) icon_state = "golem"
setClickCooldown(5)
/mob/living/simple_mob/mechanical/technomancer_golem/special_pre_animation(atom/A)
casting = TRUE /mob/living/simple_mob/mechanical/technomancer_golem/special_pre_animation(atom/A)
ranged_pre_animation(A) // Both have the same animation. casting = TRUE
ranged_pre_animation(A) // Both have the same animation.
/mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A)
casting = FALSE /mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A)
ranged_post_animation(A) casting = FALSE
ranged_post_animation(A)

View File

@@ -46,6 +46,7 @@
health = 1 LASERS_TO_KILL health = 1 LASERS_TO_KILL
melee_damage_lower = 8 melee_damage_lower = 8
melee_damage_upper = 8 melee_damage_upper = 8
attack_armor_pen = 5
/datum/ai_holder/simple_mob/hivebot /datum/ai_holder/simple_mob/hivebot
pointblank = TRUE pointblank = TRUE

View File

@@ -87,3 +87,9 @@
if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards
return TRUE return TRUE
return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3 return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3
// Variant that has high armor pen. Slightly slower attack speed and movement. Meant to be dispersed in groups with other ones
/mob/living/simple_mob/mechanical/viscerator/piercing.
attack_armor_pen = 20
base_attack_cooldown = 10 // One attack a second or so.
movement_cooldown = 0.5