mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Merge pull request #8984 from VOREStation/upstream-merge-7620
[MIRROR] Increase a bunch of mobs MELEE AP power.
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 25
|
||||
attack_armor_pen = 15
|
||||
|
||||
heat_resist = 0.75
|
||||
cold_resist = -0.50
|
||||
|
||||
@@ -1,252 +1,253 @@
|
||||
// Parrots can talk, and may repeat things it hears.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot
|
||||
name = "parrot"
|
||||
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."
|
||||
has_langs = list("Galactic Common", "Bird")
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot
|
||||
|
||||
// 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.
|
||||
var/obj/item/device/radio/headset/my_headset = null
|
||||
|
||||
// Say list
|
||||
/datum/say_list/bird/poly
|
||||
speak = list(
|
||||
"Poly wanna cracker!",
|
||||
"Check the singulo, you chucklefucks!",
|
||||
"Wire the solars, you lazy bums!",
|
||||
"WHO TOOK THE DAMN HARDSUITS?",
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE",
|
||||
"Danger! Crystal hyperstructure instability!",
|
||||
"CRYSTAL DELAMINATION IMMINENT.",
|
||||
"Tweet tweet, I'm a Teshari.",
|
||||
"Chitters.",
|
||||
"Meteors have been detected on a collision course with the station!"
|
||||
)
|
||||
|
||||
// Lets the AI use headsets.
|
||||
// Player-controlled parrots will need to do it manually.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/ISay(message)
|
||||
if(my_headset && prob(50))
|
||||
var/list/keys = list()
|
||||
for(var/channel in my_headset.channels)
|
||||
var/key = get_radio_key_from_channel(channel)
|
||||
if(key)
|
||||
keys += key
|
||||
if(keys.len)
|
||||
var/key_used = pick(keys)
|
||||
return say("[key_used] [message]")
|
||||
return say(message)
|
||||
|
||||
// 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)
|
||||
..()
|
||||
if(message_mode)
|
||||
if(my_headset && istype(my_headset, /obj/item/device/radio))
|
||||
my_headset.talk_into(src, message, message_mode, verb, speaking)
|
||||
used_radios += my_headset
|
||||
|
||||
// Clicked on while holding an object.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/device/radio/headset))
|
||||
give_headset(I, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
// Clicked on by empty hand.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L)
|
||||
if(L.a_intent == I_GRAB && my_headset)
|
||||
remove_headset(L)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/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))
|
||||
to_chat(user, span("warning", "\The [new_headset] isn't a headset."))
|
||||
return
|
||||
if(my_headset)
|
||||
to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset]."))
|
||||
return
|
||||
else
|
||||
user.drop_item(new_headset)
|
||||
my_headset = new_headset
|
||||
new_headset.forceMove(src)
|
||||
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."))
|
||||
return
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user)
|
||||
if(!my_headset)
|
||||
to_chat(user, "<span class='warning'>\The [src] doesn't have a headset to remove, thankfully.</span>")
|
||||
else
|
||||
ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
my_headset.forceMove(get_turf(src))
|
||||
user.put_in_hands(my_headset)
|
||||
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!"))
|
||||
my_headset = null
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user)
|
||||
. = ..()
|
||||
if(my_headset)
|
||||
. += "It is wearing \a [my_headset]."
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/Initialize()
|
||||
if(my_headset)
|
||||
my_headset = new my_headset(src)
|
||||
return ..()
|
||||
|
||||
// Subtypes.
|
||||
|
||||
// Best Bird
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/poly
|
||||
name = "Poly"
|
||||
desc = "It's a parrot. An expert on quantum cracker theory."
|
||||
icon_state = "poly"
|
||||
icon_rest = "poly-held"
|
||||
icon_dead = "poly-dead"
|
||||
tt_desc = "E Ara macao"
|
||||
//my_headset = /obj/item/device/radio/headset/headset_eng //VOREStation Removal
|
||||
say_list_type = /datum/say_list/bird/poly
|
||||
|
||||
// Best Bird with best headset.
|
||||
/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"
|
||||
desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \
|
||||
They are known to be intelligent and curious, which has made some consider them a pest."
|
||||
icon_state = "kea"
|
||||
icon_rest = "kea-held"
|
||||
icon_dead = "kea-dead"
|
||||
tt_desc = "E Nestor notabilis"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus
|
||||
name = "eclectus"
|
||||
desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \
|
||||
A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage."
|
||||
icon_state = "eclectus"
|
||||
icon_rest = "eclectus-held"
|
||||
icon_dead = "eclectus-dead"
|
||||
tt_desc = "E Eclectus roratus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
|
||||
gender = pick(MALE, FEMALE)
|
||||
if(gender == FEMALE)
|
||||
icon_state = "eclectusf"
|
||||
icon_rest = "eclectusf-held"
|
||||
icon_dead = "eclectusf-dead"
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
|
||||
name = "grey parrot"
|
||||
desc = "A species of parrot. This one is predominantly grey, but has red tail feathers."
|
||||
icon_state = "agrey"
|
||||
icon_rest = "agrey-held"
|
||||
icon_dead = "agrey-dead"
|
||||
tt_desc = "E Psittacus erithacus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
|
||||
name = "black-headed caique"
|
||||
desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques."
|
||||
icon_state = "bcaique"
|
||||
icon_rest = "bcaique-held"
|
||||
icon_dead = "bcaique-dead"
|
||||
tt_desc = "E Pionites melanocephalus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/white_caique
|
||||
name = "white-bellied caique"
|
||||
desc = "A species of parrot, they are also known as the Green-Thighed Parrot."
|
||||
icon_state = "wcaique"
|
||||
icon_rest = "wcaique-held"
|
||||
icon_dead = "wcaique-dead"
|
||||
tt_desc = "E Pionites leucogaster"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
|
||||
name = "budgerigar"
|
||||
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
|
||||
This one is has its natural colors of green and yellow."
|
||||
icon_state = "gbudge"
|
||||
icon_rest = "gbudge-held"
|
||||
icon_dead = "gbudge-dead"
|
||||
tt_desc = "E Melopsittacus undulatus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
|
||||
icon_state = "bbudge"
|
||||
icon_rest = "bbudge-held"
|
||||
icon_dead = "bbudge-dead"
|
||||
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"
|
||||
icon_rest = "bgbudge-held"
|
||||
icon_dead = "bgbudge-dead"
|
||||
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"
|
||||
desc = "A species of parrot. This one has a highly visible crest."
|
||||
icon_state = "tiel"
|
||||
icon_rest = "tiel-held"
|
||||
icon_dead = "tiel-dead"
|
||||
tt_desc = "E Nymphicus hollandicus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
|
||||
icon_state = "wtiel"
|
||||
icon_rest = "wtiel-held"
|
||||
icon_dead = "wtiel-dead"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
|
||||
icon_state = "luttiel"
|
||||
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.
|
||||
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
|
||||
name = "sulphur-crested cockatoo"
|
||||
desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow."
|
||||
icon_state = "too"
|
||||
icon_rest = "too-held"
|
||||
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
|
||||
name = "white cockatoo"
|
||||
desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest."
|
||||
icon_state = "utoo"
|
||||
icon_rest = "utoo-held"
|
||||
icon_dead = "utoo-dead"
|
||||
tt_desc = "E Cacatua alba"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
|
||||
name = "pink cockatoo"
|
||||
desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \
|
||||
in honor of a human surveyor and explorer who existed before humans fully explored their home planet."
|
||||
icon_state = "mtoo"
|
||||
icon_rest = "mtoo-held"
|
||||
icon_dead = "mtoo-dead"
|
||||
tt_desc = "E Lophochroa leadbeateri"
|
||||
|
||||
|
||||
// AI
|
||||
/datum/ai_holder/simple_mob/passive/parrot
|
||||
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)
|
||||
return
|
||||
var/datum/say_list/S = holder.say_list
|
||||
S.speak |= message
|
||||
// Parrots can talk, and may repeat things it hears.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot
|
||||
name = "parrot"
|
||||
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."
|
||||
has_langs = list("Galactic Common", "Bird")
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot
|
||||
|
||||
// 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.
|
||||
var/obj/item/device/radio/headset/my_headset = null
|
||||
|
||||
// Say list
|
||||
/datum/say_list/bird/poly
|
||||
speak = list(
|
||||
"Poly wanna cracker!",
|
||||
"Check the singulo, you chucklefucks!",
|
||||
"Wire the solars, you lazy bums!",
|
||||
"WHO TOOK THE DAMN HARDSUITS?",
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE",
|
||||
"Danger! Crystal hyperstructure instability!",
|
||||
"CRYSTAL DELAMINATION IMMINENT.",
|
||||
"Tweet tweet, I'm a Teshari.",
|
||||
"Chitters.",
|
||||
"Meteors have been detected on a collision course with the station!"
|
||||
)
|
||||
|
||||
// Lets the AI use headsets.
|
||||
// Player-controlled parrots will need to do it manually.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/ISay(message)
|
||||
if(my_headset && prob(50))
|
||||
var/list/keys = list()
|
||||
for(var/channel in my_headset.channels)
|
||||
var/key = get_radio_key_from_channel(channel)
|
||||
if(key)
|
||||
keys += key
|
||||
if(keys.len)
|
||||
var/key_used = pick(keys)
|
||||
return say("[key_used] [message]")
|
||||
return say(message)
|
||||
|
||||
// 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)
|
||||
..()
|
||||
if(message_mode)
|
||||
if(my_headset && istype(my_headset, /obj/item/device/radio))
|
||||
my_headset.talk_into(src, message, message_mode, verb, speaking)
|
||||
used_radios += my_headset
|
||||
|
||||
// Clicked on while holding an object.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/device/radio/headset))
|
||||
give_headset(I, user)
|
||||
return
|
||||
return ..()
|
||||
|
||||
// Clicked on by empty hand.
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L)
|
||||
if(L.a_intent == I_GRAB && my_headset)
|
||||
remove_headset(L)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/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))
|
||||
to_chat(user, span("warning", "\The [new_headset] isn't a headset."))
|
||||
return
|
||||
if(my_headset)
|
||||
to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset]."))
|
||||
return
|
||||
else
|
||||
user.drop_item(new_headset)
|
||||
my_headset = new_headset
|
||||
new_headset.forceMove(src)
|
||||
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."))
|
||||
return
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user)
|
||||
if(!my_headset)
|
||||
to_chat(user, "<span class='warning'>\The [src] doesn't have a headset to remove, thankfully.</span>")
|
||||
else
|
||||
ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
my_headset.forceMove(get_turf(src))
|
||||
user.put_in_hands(my_headset)
|
||||
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!"))
|
||||
my_headset = null
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user)
|
||||
. = ..()
|
||||
if(my_headset)
|
||||
. += "It is wearing \a [my_headset]."
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/Initialize()
|
||||
if(my_headset)
|
||||
my_headset = new my_headset(src)
|
||||
return ..()
|
||||
|
||||
// Subtypes.
|
||||
|
||||
// Best Bird
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/poly
|
||||
name = "Poly"
|
||||
desc = "It's a parrot. An expert on quantum cracker theory."
|
||||
icon_state = "poly"
|
||||
icon_rest = "poly-held"
|
||||
icon_dead = "poly-dead"
|
||||
tt_desc = "E Ara macao"
|
||||
attack_armor_pen = 20 //HE HAS THE B E A K
|
||||
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
|
||||
my_headset = /obj/item/device/radio/headset/omni
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/kea
|
||||
name = "kea"
|
||||
desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \
|
||||
They are known to be intelligent and curious, which has made some consider them a pest."
|
||||
icon_state = "kea"
|
||||
icon_rest = "kea-held"
|
||||
icon_dead = "kea-dead"
|
||||
tt_desc = "E Nestor notabilis"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus
|
||||
name = "eclectus"
|
||||
desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \
|
||||
A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage."
|
||||
icon_state = "eclectus"
|
||||
icon_rest = "eclectus-held"
|
||||
icon_dead = "eclectus-dead"
|
||||
tt_desc = "E Eclectus roratus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
|
||||
gender = pick(MALE, FEMALE)
|
||||
if(gender == FEMALE)
|
||||
icon_state = "eclectusf"
|
||||
icon_rest = "eclectusf-held"
|
||||
icon_dead = "eclectusf-dead"
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
|
||||
name = "grey parrot"
|
||||
desc = "A species of parrot. This one is predominantly grey, but has red tail feathers."
|
||||
icon_state = "agrey"
|
||||
icon_rest = "agrey-held"
|
||||
icon_dead = "agrey-dead"
|
||||
tt_desc = "E Psittacus erithacus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
|
||||
name = "black-headed caique"
|
||||
desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques."
|
||||
icon_state = "bcaique"
|
||||
icon_rest = "bcaique-held"
|
||||
icon_dead = "bcaique-dead"
|
||||
tt_desc = "E Pionites melanocephalus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/white_caique
|
||||
name = "white-bellied caique"
|
||||
desc = "A species of parrot, they are also known as the Green-Thighed Parrot."
|
||||
icon_state = "wcaique"
|
||||
icon_rest = "wcaique-held"
|
||||
icon_dead = "wcaique-dead"
|
||||
tt_desc = "E Pionites leucogaster"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
|
||||
name = "budgerigar"
|
||||
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
|
||||
This one is has its natural colors of green and yellow."
|
||||
icon_state = "gbudge"
|
||||
icon_rest = "gbudge-held"
|
||||
icon_dead = "gbudge-dead"
|
||||
tt_desc = "E Melopsittacus undulatus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
|
||||
icon_state = "bbudge"
|
||||
icon_rest = "bbudge-held"
|
||||
icon_dead = "bbudge-dead"
|
||||
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"
|
||||
icon_rest = "bgbudge-held"
|
||||
icon_dead = "bgbudge-dead"
|
||||
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"
|
||||
desc = "A species of parrot. This one has a highly visible crest."
|
||||
icon_state = "tiel"
|
||||
icon_rest = "tiel-held"
|
||||
icon_dead = "tiel-dead"
|
||||
tt_desc = "E Nymphicus hollandicus"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
|
||||
icon_state = "wtiel"
|
||||
icon_rest = "wtiel-held"
|
||||
icon_dead = "wtiel-dead"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
|
||||
icon_state = "luttiel"
|
||||
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.
|
||||
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
|
||||
name = "sulphur-crested cockatoo"
|
||||
desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow."
|
||||
icon_state = "too"
|
||||
icon_rest = "too-held"
|
||||
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
|
||||
name = "white cockatoo"
|
||||
desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest."
|
||||
icon_state = "utoo"
|
||||
icon_rest = "utoo-held"
|
||||
icon_dead = "utoo-dead"
|
||||
tt_desc = "E Cacatua alba"
|
||||
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
|
||||
name = "pink cockatoo"
|
||||
desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \
|
||||
in honor of a human surveyor and explorer who existed before humans fully explored their home planet."
|
||||
icon_state = "mtoo"
|
||||
icon_rest = "mtoo-held"
|
||||
icon_dead = "mtoo-dead"
|
||||
tt_desc = "E Lophochroa leadbeateri"
|
||||
|
||||
|
||||
// AI
|
||||
/datum/ai_holder/simple_mob/passive/parrot
|
||||
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)
|
||||
return
|
||||
var/datum/say_list/S = holder.say_list
|
||||
S.speak |= message
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
attack_armor_pen = 15 //It's a freaking alien.
|
||||
attack_sharp = TRUE
|
||||
attack_edge = TRUE
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Tac Knife damage
|
||||
melee_damage_upper = 15
|
||||
attack_armor_pen = 20
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
attack_armor_pen = 50
|
||||
attack_armor_pen = 30
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
attack_armor_pen = 15
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attacktext = list("punched")
|
||||
|
||||
@@ -1,152 +1,153 @@
|
||||
// The GOLEM is a spell-flinging synthetic.
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem
|
||||
name = "unknown synthetic"
|
||||
desc = "A rather unusual looking synthetic."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "golem"
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
|
||||
faction = "golem"
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "pushes away"
|
||||
response_harm = "punches"
|
||||
harm_intent_damage = 3
|
||||
friendly = "hugs"
|
||||
|
||||
melee_damage_lower = 30 // It has a built in esword.
|
||||
melee_damage_upper = 30
|
||||
attack_sound = 'sound/weapons/blade1.ogg'
|
||||
attacktext = list("slashed")
|
||||
melee_attack_delay = 0.5 SECONDS // Even has custom attack animations.
|
||||
ranged_attack_delay = 0.5 SECONDS
|
||||
special_attack_delay = 1 SECOND
|
||||
|
||||
special_attack_min_range = 0
|
||||
special_attack_max_range = 7
|
||||
|
||||
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/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,
|
||||
"chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning,
|
||||
"force missile" = /obj/item/weapon/spell/projectile/force_missile,
|
||||
"ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt,
|
||||
"lightning" = /obj/item/weapon/spell/projectile/lightning,
|
||||
"blink" = /obj/item/weapon/spell/blink,
|
||||
"dispel" = /obj/item/weapon/spell/dispel,
|
||||
"oxygenate" = /obj/item/weapon/spell/oxygenate,
|
||||
"mend life" = /obj/item/weapon/spell/modifier/mend_life,
|
||||
"mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
|
||||
"mend organs" = /obj/item/weapon/spell/mend_organs,
|
||||
"purify" = /obj/item/weapon/spell/modifier/purify,
|
||||
"resurrect" = /obj/item/weapon/spell/resurrect,
|
||||
"passwall" = /obj/item/weapon/spell/passwall,
|
||||
"repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
|
||||
"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)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/Destroy()
|
||||
qdel(core)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/unref_spell()
|
||||
active_spell = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/death()
|
||||
..()
|
||||
visible_message("\The [src] disintegrates!")
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/place_spell_in_hand(var/path)
|
||||
if(!path || !ispath(path))
|
||||
return FALSE
|
||||
if(active_spell)
|
||||
qdel(active_spell)
|
||||
|
||||
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
|
||||
if(choice)
|
||||
place_spell_in_hand(known_spells[choice])
|
||||
else
|
||||
qdel(active_spell)
|
||||
|
||||
/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.
|
||||
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/do_special_attack(atom/A)
|
||||
var/proximity = Adjacent(A)
|
||||
if(active_spell)
|
||||
if(proximity && active_spell.cast_methods & CAST_MELEE) // Use melee method if available and close enough.
|
||||
return active_spell.on_melee_cast(A, src)
|
||||
else if(active_spell.cast_methods & CAST_RANGED) // Otherwise use ranged if possible. Will also work for point-blank range.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
special_post_animation(A)
|
||||
return
|
||||
|
||||
flick("golem_post_melee", src)
|
||||
icon_living = "golem"
|
||||
icon_state = "golem"
|
||||
setClickCooldown(6)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/ranged_pre_animation(atom/A)
|
||||
flick("golem_pre_ranged", src)
|
||||
icon_living = "golem_pre_ranged"
|
||||
icon_state = "golem_pre_ranged"
|
||||
setClickCooldown(5)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/ranged_post_animation(atom/A)
|
||||
flick("golem_post_ranged", src)
|
||||
icon_living = "golem"
|
||||
icon_state = "golem"
|
||||
setClickCooldown(5)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/special_pre_animation(atom/A)
|
||||
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
|
||||
ranged_post_animation(A)
|
||||
// The GOLEM is a spell-flinging synthetic.
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem
|
||||
name = "unknown synthetic"
|
||||
desc = "A rather unusual looking synthetic."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "golem"
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
|
||||
faction = "golem"
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "pushes away"
|
||||
response_harm = "punches"
|
||||
harm_intent_damage = 3
|
||||
friendly = "hugs"
|
||||
|
||||
melee_damage_lower = 30 // It has a built in esword.
|
||||
melee_damage_upper = 30
|
||||
attack_armor_pen = 20
|
||||
attack_sound = 'sound/weapons/blade1.ogg'
|
||||
attacktext = list("slashed")
|
||||
melee_attack_delay = 0.5 SECONDS // Even has custom attack animations.
|
||||
ranged_attack_delay = 0.5 SECONDS
|
||||
special_attack_delay = 1 SECOND
|
||||
|
||||
special_attack_min_range = 0
|
||||
special_attack_max_range = 7
|
||||
|
||||
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/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,
|
||||
"chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning,
|
||||
"force missile" = /obj/item/weapon/spell/projectile/force_missile,
|
||||
"ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt,
|
||||
"lightning" = /obj/item/weapon/spell/projectile/lightning,
|
||||
"blink" = /obj/item/weapon/spell/blink,
|
||||
"dispel" = /obj/item/weapon/spell/dispel,
|
||||
"oxygenate" = /obj/item/weapon/spell/oxygenate,
|
||||
"mend life" = /obj/item/weapon/spell/modifier/mend_life,
|
||||
"mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
|
||||
"mend organs" = /obj/item/weapon/spell/mend_organs,
|
||||
"purify" = /obj/item/weapon/spell/modifier/purify,
|
||||
"resurrect" = /obj/item/weapon/spell/resurrect,
|
||||
"passwall" = /obj/item/weapon/spell/passwall,
|
||||
"repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
|
||||
"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)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/Destroy()
|
||||
qdel(core)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/unref_spell()
|
||||
active_spell = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/death()
|
||||
..()
|
||||
visible_message("\The [src] disintegrates!")
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/place_spell_in_hand(var/path)
|
||||
if(!path || !ispath(path))
|
||||
return FALSE
|
||||
if(active_spell)
|
||||
qdel(active_spell)
|
||||
|
||||
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
|
||||
if(choice)
|
||||
place_spell_in_hand(known_spells[choice])
|
||||
else
|
||||
qdel(active_spell)
|
||||
|
||||
/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.
|
||||
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/do_special_attack(atom/A)
|
||||
var/proximity = Adjacent(A)
|
||||
if(active_spell)
|
||||
if(proximity && active_spell.cast_methods & CAST_MELEE) // Use melee method if available and close enough.
|
||||
return active_spell.on_melee_cast(A, src)
|
||||
else if(active_spell.cast_methods & CAST_RANGED) // Otherwise use ranged if possible. Will also work for point-blank range.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
special_post_animation(A)
|
||||
return
|
||||
|
||||
flick("golem_post_melee", src)
|
||||
icon_living = "golem"
|
||||
icon_state = "golem"
|
||||
setClickCooldown(6)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/ranged_pre_animation(atom/A)
|
||||
flick("golem_pre_ranged", src)
|
||||
icon_living = "golem_pre_ranged"
|
||||
icon_state = "golem_pre_ranged"
|
||||
setClickCooldown(5)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/ranged_post_animation(atom/A)
|
||||
flick("golem_post_ranged", src)
|
||||
icon_living = "golem"
|
||||
icon_state = "golem"
|
||||
setClickCooldown(5)
|
||||
|
||||
/mob/living/simple_mob/mechanical/technomancer_golem/special_pre_animation(atom/A)
|
||||
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
|
||||
ranged_post_animation(A)
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
health = 1 LASERS_TO_KILL
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 8
|
||||
attack_armor_pen = 5
|
||||
|
||||
/datum/ai_holder/simple_mob/hivebot
|
||||
pointblank = TRUE
|
||||
|
||||
@@ -87,3 +87,9 @@
|
||||
if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards
|
||||
return TRUE
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user