mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
more progress
This commit is contained in:
@@ -1,3 +1,38 @@
|
||||
//CHOMP Specific overrides
|
||||
/obj/item/weapon/material/whip
|
||||
icon = 'icons/obj/weapons_ch.dmi'
|
||||
|
||||
/obj/item/weapon/material/butterfly/saw //This Saw Cleaver is in here since I do not know where else to put it
|
||||
name = "Saw Cleaver"
|
||||
desc = "A weapon consisting of a long handle and a heavy serrated blade. Using centrifrical force the blade extends outword allowing it to slice it long cleaves. The smell of blood hangs in the air around it."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "sawcleaver"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/64x64_lefthand_ch.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/64x64_righthand_ch.dmi',
|
||||
)
|
||||
item_state = "cleaving_saw"
|
||||
active = 0
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
w_class = ITEMSIZE_LARGE
|
||||
edge = 1
|
||||
sharp = 1
|
||||
force_divisor = 0.7 //42 When Wielded in line with a sword
|
||||
thrown_force_divisor = 0.1 // 2 when thrown with weight 20 (steel) since frankly its too bulk to throw
|
||||
//holy = 1
|
||||
|
||||
/obj/item/weapon/material/butterfly/saw/update_force()
|
||||
if(active)
|
||||
..() //Updates force.
|
||||
w_class = ITEMSIZE_HUGE
|
||||
can_cleave = TRUE
|
||||
force_divisor = 0.4 //24 when wielded, Gains cleave and is better than a machete
|
||||
icon_state = "sawcleaver_open"
|
||||
item_state = "cleaving_saw_open"
|
||||
else
|
||||
w_class = initial(w_class)
|
||||
can_cleave = initial(can_cleave)
|
||||
force_divisor = initial(force_divisor)
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
110
code/game/objects/structures/loot_piles_ch.dm
Normal file
110
code/game/objects/structures/loot_piles_ch.dm
Normal file
@@ -0,0 +1,110 @@
|
||||
//Micro mecha loot.
|
||||
/obj/structure/loot_pile/mecha/mouse_tank
|
||||
name = "\improper Whisker wreckage"
|
||||
desc = "The ruins of a small tank. Perhaps some child's toy?"
|
||||
icon = 'icons/mecha/micro.dmi'
|
||||
icon_state = "whisker-broken"
|
||||
density = TRUE
|
||||
anchored = FALSE // In case a dead mecha-mob dies in a bad spot.
|
||||
|
||||
chance_uncommon = 20
|
||||
chance_rare = 10
|
||||
|
||||
loot_depletion = TRUE
|
||||
loot_left = 5
|
||||
|
||||
common_loot = list(
|
||||
/obj/random/tool,
|
||||
/obj/random/tool,
|
||||
/obj/item/stack/cable_coil/random,
|
||||
/obj/random/tank,
|
||||
/obj/random/tech_supply/component,
|
||||
/obj/random/tech_supply/component,
|
||||
/obj/effect/decal/remains/mouse,
|
||||
/obj/item/stack/material/steel{amount = 20}
|
||||
)
|
||||
|
||||
uncommon_loot = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rigged,
|
||||
/obj/item/mecha_parts/mecha_equipment/generator
|
||||
)
|
||||
|
||||
rare_loot = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/mouse_tank/livewire
|
||||
name = "\improper Livewire wreckage"
|
||||
desc = "The smoldering ruins of a small tank. Perhaps some child's toy?"
|
||||
icon = 'icons/mecha/micro.dmi'
|
||||
icon_state = "livewire-broken"
|
||||
density = TRUE
|
||||
anchored = FALSE // In case a dead mecha-mob dies in a bad spot.
|
||||
|
||||
chance_uncommon = 20
|
||||
chance_rare = 10
|
||||
|
||||
loot_depletion = TRUE
|
||||
loot_left = 5
|
||||
|
||||
common_loot = list(
|
||||
/obj/random/tool,
|
||||
/obj/random/tool,
|
||||
/obj/item/stack/cable_coil/random,
|
||||
/obj/random/tank,
|
||||
/obj/random/tech_supply/component,
|
||||
/obj/random/tech_supply/component,
|
||||
/obj/effect/decal/remains/mouse,
|
||||
/obj/item/stack/material/steel{amount = 20}
|
||||
)
|
||||
|
||||
uncommon_loot = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged,
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher
|
||||
)
|
||||
|
||||
rare_loot = list(
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer,
|
||||
/obj/item/mecha_parts/mecha_equipment/generator
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/mouse_tank/eraticator
|
||||
name = "\improper Eraticator wreckage"
|
||||
desc = "The blasted ruins of a small tank. Perhaps some child's toy?"
|
||||
icon = 'icons/mecha/micro.dmi'
|
||||
icon_state = "eraticator-broken"
|
||||
density = TRUE
|
||||
anchored = FALSE // In case a dead mecha-mob dies in a bad spot.
|
||||
|
||||
chance_uncommon = 20
|
||||
chance_rare = 10
|
||||
|
||||
loot_depletion = TRUE
|
||||
loot_left = 5
|
||||
|
||||
common_loot = list(
|
||||
/obj/random/tool,
|
||||
/obj/random/tool,
|
||||
/obj/item/stack/cable_coil/random,
|
||||
/obj/random/tank,
|
||||
/obj/random/tech_supply/component,
|
||||
/obj/random/tech_supply/component,
|
||||
/obj/item/clothing/head/helmet/eraticator,
|
||||
/obj/effect/decal/remains/mouse,
|
||||
/obj/item/stack/material/steel{amount = 20}
|
||||
)
|
||||
|
||||
uncommon_loot = list(
|
||||
/obj/item/ammo_magazine/m75,
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mortar
|
||||
)
|
||||
|
||||
rare_loot = list(
|
||||
/obj/item/weapon/gun/projectile/gyropistol,
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/mecha/ripley/pirate
|
||||
icon = 'icons/mob/animal_ch.dmi'
|
||||
icon_state = "pirate-broken"
|
||||
@@ -66,3 +66,36 @@
|
||||
say_threaten = list("Hoy, private property, fuck off.", "You're acting mighty bold for a bullet sponge.", "First and last warning; find somewhere else to be.", "I wouldn't do that if I were you.", "Back off or your field medic's getting a bonus.")
|
||||
say_stand_down = list("Damn it, I was hoping you'd push your luck.", "What, that's it? Pussy.", "And don't come back.", "Good call. Don't do it again.", "Harrumph.", "That'll teach 'ya.")
|
||||
say_escalate = list("Oh, I'm gonna enjoy this.", "I'm going to enjoy making you regret that.", "Last mistake you'll make.")
|
||||
|
||||
|
||||
//Synth Horror Saylist
|
||||
|
||||
/datum/say_list/cyber_horror
|
||||
speak = list("H@!#$$P M@!$#",
|
||||
"GHAA!@@#",
|
||||
"KR@!!N",
|
||||
"K!@@##L!@@ %!@#E",
|
||||
"G@#!$ H@!#%",
|
||||
"H!@%%@ @!E")
|
||||
emote_hear = list("emits", "groans", "wails", "pleads")
|
||||
emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.")
|
||||
say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#")
|
||||
say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS")
|
||||
|
||||
|
||||
// This one's pretty dumb, but pirates are dumb anyways.
|
||||
/datum/say_list/pirate
|
||||
speak = list("Yarr!",
|
||||
"Yohoho and a bottle of rum...",
|
||||
"Getting tried of hardtack.",
|
||||
"What do you do with a drunken sailor...",
|
||||
"One day We'll get that big score.",
|
||||
"They ain't catching this pirate no-sir-ree")
|
||||
|
||||
say_understood = list("Alright, matey.")
|
||||
say_cannot = list("No, matey.")
|
||||
say_maybe_target = list("Eh?", "Who goes there?")
|
||||
say_got_target = list("Yarrrr!", "Just drop your loot and run")
|
||||
say_threaten = list("You best leave, this booty is mine.", "No plank to walk on, just walk away.")
|
||||
say_stand_down = list("Good.", "That's right run you lilly livers.")
|
||||
say_escalate = list("Yarr! The booty is mine!", "Going to gut you landlubber.")
|
||||
9
code/modules/clothing/head/helmet_ch.dm
Normal file
9
code/modules/clothing/head/helmet_ch.dm
Normal file
@@ -0,0 +1,9 @@
|
||||
/obj/item/clothing/head/helmet/eraticator
|
||||
name = "Eraticator Head"
|
||||
desc = "The 'head' of an Eraticator Artillery Platform, ripped off of the chassis. May be worn for totemic purposes."
|
||||
icon_state = "eraticator-head"
|
||||
item_state_slots = list(slot_r_hand_str = "helmet", slot_l_hand_str = "helmet")
|
||||
armor = list(melee = 10, bullet = 80, laser = 10 ,energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR
|
||||
siemens_coefficient = 0.7
|
||||
valid_accessory_slots = null
|
||||
@@ -168,124 +168,3 @@
|
||||
|
||||
/obj/effect/landmark/mobcorpse/russian/ranged
|
||||
corpsehelmet = /obj/item/clothing/head/ushanka
|
||||
|
||||
//CHOMPAdd start
|
||||
//////////////////////////
|
||||
// Vox Bodies
|
||||
//////////////////////////
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox
|
||||
name = "vox"
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/New()
|
||||
createvoxCorpse()
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/proc/createvoxCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
|
||||
var/mob/living/carbon/human/vox/M = new /mob/living/carbon/human/vox (src.loc)
|
||||
M.real_name = src.name
|
||||
M.stat = 2 //Kills the new mob
|
||||
if(src.corpseuniform)
|
||||
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
|
||||
if(src.corpsesuit)
|
||||
M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
|
||||
if(src.corpseshoes)
|
||||
M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
|
||||
if(src.corpsegloves)
|
||||
M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
|
||||
if(src.corpseradio)
|
||||
M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
|
||||
if(src.corpseglasses)
|
||||
M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
|
||||
if(src.corpsemask)
|
||||
M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
|
||||
if(src.corpsehelmet)
|
||||
M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
|
||||
if(src.corpsebelt)
|
||||
M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
|
||||
if(src.corpsepocket1)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
|
||||
if(src.corpsepocket2)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
|
||||
if(src.corpseback)
|
||||
M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
|
||||
if(src.corpseid == 1)
|
||||
var/obj/item/weapon/card/id/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
var/datum/job/jobdatum
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
if(J.title == corpseidaccess)
|
||||
jobdatum = J
|
||||
break
|
||||
if(src.corpseidicon)
|
||||
W.icon_state = corpseidicon
|
||||
if(src.corpseidaccess)
|
||||
if(jobdatum)
|
||||
W.access = jobdatum.get_access()
|
||||
else
|
||||
W.access = list()
|
||||
if(corpseidjob)
|
||||
W.assignment = corpseidjob
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
delete_me = 1
|
||||
qdel(src)
|
||||
|
||||
|
||||
//Types of Vox corpses:
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/pirate
|
||||
name = "vox pirate"
|
||||
corpseuniform = /obj/item/clothing/under/color/black
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vox_scrap
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsegloves = /obj/item/clothing/gloves/light_brown
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/boarder_m
|
||||
name = "vox melee boarder"
|
||||
corpseuniform = /obj/item/clothing/under/vox/vox_casual
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vox_scrap
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsegloves = /obj/item/clothing/gloves/light_brown
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/boarder_r
|
||||
name = "vox ranged boarder"
|
||||
corpseuniform = /obj/item/clothing/under/rank/bartender
|
||||
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/boarder_t
|
||||
name = "vox salvage technician"
|
||||
corpseuniform = /obj/item/clothing/under/rank/bartender
|
||||
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/suppressor
|
||||
name = "vox suppressor"
|
||||
corpseuniform = /obj/item/clothing/under/color/red
|
||||
corpsesuit = /obj/item/clothing/suit/storage/toggle/fr_jacket
|
||||
corpseshoes = /obj/item/clothing/shoes/orange
|
||||
corpsegloves = /obj/item/clothing/gloves/red
|
||||
corpsemask = /obj/item/clothing/mask/gas/half
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/captain
|
||||
name = "vox captain"
|
||||
corpseuniform = /obj/item/clothing/under/color/black
|
||||
corpsesuit = /obj/item/clothing/suit/space/vox/carapace
|
||||
corpseshoes = /obj/item/clothing/shoes/magboots/vox
|
||||
corpsegloves = /obj/item/clothing/gloves/light_brown
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/riot
|
||||
corpseid = 0
|
||||
|
||||
//CHOMPAdd end
|
||||
117
code/modules/mob/dead/corpse_ch.dm
Normal file
117
code/modules/mob/dead/corpse_ch.dm
Normal file
@@ -0,0 +1,117 @@
|
||||
//////////////////////////
|
||||
// Vox Bodies
|
||||
//////////////////////////
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox
|
||||
name = "vox"
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/New()
|
||||
createvoxCorpse()
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/proc/createvoxCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
|
||||
var/mob/living/carbon/human/vox/M = new /mob/living/carbon/human/vox (src.loc)
|
||||
M.real_name = src.name
|
||||
M.stat = 2 //Kills the new mob
|
||||
if(src.corpseuniform)
|
||||
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
|
||||
if(src.corpsesuit)
|
||||
M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
|
||||
if(src.corpseshoes)
|
||||
M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
|
||||
if(src.corpsegloves)
|
||||
M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
|
||||
if(src.corpseradio)
|
||||
M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
|
||||
if(src.corpseglasses)
|
||||
M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
|
||||
if(src.corpsemask)
|
||||
M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
|
||||
if(src.corpsehelmet)
|
||||
M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
|
||||
if(src.corpsebelt)
|
||||
M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
|
||||
if(src.corpsepocket1)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
|
||||
if(src.corpsepocket2)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
|
||||
if(src.corpseback)
|
||||
M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
|
||||
if(src.corpseid == 1)
|
||||
var/obj/item/weapon/card/id/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
var/datum/job/jobdatum
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
if(J.title == corpseidaccess)
|
||||
jobdatum = J
|
||||
break
|
||||
if(src.corpseidicon)
|
||||
W.icon_state = corpseidicon
|
||||
if(src.corpseidaccess)
|
||||
if(jobdatum)
|
||||
W.access = jobdatum.get_access()
|
||||
else
|
||||
W.access = list()
|
||||
if(corpseidjob)
|
||||
W.assignment = corpseidjob
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
delete_me = 1
|
||||
qdel(src)
|
||||
|
||||
|
||||
//Types of Vox corpses:
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/pirate
|
||||
name = "vox pirate"
|
||||
corpseuniform = /obj/item/clothing/under/color/black
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vox_scrap
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsegloves = /obj/item/clothing/gloves/light_brown
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/boarder_m
|
||||
name = "vox melee boarder"
|
||||
corpseuniform = /obj/item/clothing/under/vox/vox_casual
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vox_scrap
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsegloves = /obj/item/clothing/gloves/light_brown
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/boarder_r
|
||||
name = "vox ranged boarder"
|
||||
corpseuniform = /obj/item/clothing/under/rank/bartender
|
||||
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/boarder_t
|
||||
name = "vox salvage technician"
|
||||
corpseuniform = /obj/item/clothing/under/rank/bartender
|
||||
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
|
||||
corpseshoes = /obj/item/clothing/shoes/boots/workboots
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/suppressor
|
||||
name = "vox suppressor"
|
||||
corpseuniform = /obj/item/clothing/under/color/red
|
||||
corpsesuit = /obj/item/clothing/suit/storage/toggle/fr_jacket
|
||||
corpseshoes = /obj/item/clothing/shoes/orange
|
||||
corpsegloves = /obj/item/clothing/gloves/red
|
||||
corpsemask = /obj/item/clothing/mask/gas/half
|
||||
corpseid = 0
|
||||
|
||||
/obj/effect/landmark/mobcorpse/vox/captain
|
||||
name = "vox captain"
|
||||
corpseuniform = /obj/item/clothing/under/color/black
|
||||
corpsesuit = /obj/item/clothing/suit/space/vox/carapace
|
||||
corpseshoes = /obj/item/clothing/shoes/magboots/vox
|
||||
corpsegloves = /obj/item/clothing/gloves/light_brown
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/riot
|
||||
corpseid = 0
|
||||
@@ -0,0 +1,466 @@
|
||||
/mob/living/simple_mob/animal/space/mouse_army
|
||||
name = "mouse"
|
||||
real_name = "mouse"
|
||||
desc = "It's a small militarized rodent."
|
||||
tt_desc = "E Mus musculus"
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
icon_state = "mouse_gray"
|
||||
item_state = "mouse_gray"
|
||||
icon_living = "mouse_gray"
|
||||
icon_dead = "mouse_gray_dead"
|
||||
icon_rest = "mouse_gray_sleep"
|
||||
faction = "mouse_army"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
universal_understand = 1
|
||||
|
||||
taser_kill = 0
|
||||
|
||||
mob_size = MOB_MINISCULE
|
||||
pass_flags = PASSTABLE
|
||||
// can_pull_size = ITEMSIZE_TINY
|
||||
// can_pull_mobs = MOB_PULL_NONE
|
||||
layer = MOB_LAYER
|
||||
density = 0
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "stamps on"
|
||||
|
||||
min_oxy = 0 //Require atleast 16kPA oxygen
|
||||
minbodytemp = 0 //Below -50 Degrees Celcius
|
||||
maxbodytemp = 5000 //Above 50 Degrees Celcius
|
||||
|
||||
//Mob melee settings
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
list/attacktext = list("attacked", "chomped", "gnawed on")
|
||||
list/friendly = list("baps", "nuzzles")
|
||||
attack_armor_type = "melee"
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
|
||||
//Damage resistances
|
||||
shock_resist = 1
|
||||
armor = list(
|
||||
"melee" = 30,
|
||||
"bullet" = 20,
|
||||
"laser" = 20,
|
||||
"energy" = 10,
|
||||
"bomb" = 10,
|
||||
"bio" = 0,
|
||||
"rad" = 0) //Standard armor vest stats, slightly dropped due to scale.
|
||||
|
||||
has_langs = list("Mouse")
|
||||
|
||||
holder_type = /obj/item/weapon/holder/mouse
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
|
||||
say_list_type = /datum/say_list/mouse
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
var/rank //pyro, operative, ammo, stealth. more to come. Do not leave blank.
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/New()
|
||||
..()
|
||||
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
|
||||
if(name == initial(name))
|
||||
name = "[name] ([rand(1, 1000)])"
|
||||
real_name = name
|
||||
|
||||
if(!rank)
|
||||
rank = pick( list("operative","pyro", "ammo", "stealth") )
|
||||
icon_state = "mouse_[rank]"
|
||||
item_state = "mouse_[rank]"
|
||||
icon_living = "mouse_[rank]"
|
||||
icon_dead = "mouse_[rank]_dead"
|
||||
icon_rest = "mouse_[rank]_sleep"
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/Crossed(AM as mob|obj)
|
||||
var/mob/SK = AM
|
||||
if(SK.is_incorporeal())
|
||||
return
|
||||
if( ishuman(AM) )
|
||||
if(!stat)
|
||||
var/mob/M = AM
|
||||
M.visible_message("<font color='blue'>\icon[src] Squeek!</font>")
|
||||
playsound(src, 'sound/effects/mouse_squeak.ogg', 35, 1)
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/death()
|
||||
layer = MOB_LAYER
|
||||
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 35, 1)
|
||||
if(client)
|
||||
client.time_died_as_mouse = world.time
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/cannot_use_vents()
|
||||
return
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/proc/splat()
|
||||
src.health = 0
|
||||
src.stat = DEAD
|
||||
src.icon_dead = "mouse_[rank]_splat"
|
||||
src.icon_state = "mouse_[rank]_splat"
|
||||
layer = MOB_LAYER
|
||||
if(client)
|
||||
client.time_died_as_mouse = world.time
|
||||
|
||||
//Base ported from vgstation. Operative Mice.
|
||||
//Icon artists: DeityLink and plosky1
|
||||
/mob/living/simple_mob/animal/space/mouse_army/operative
|
||||
name = "operative mouse"
|
||||
desc = "Where did it get that? Oh no..."
|
||||
tt_desc = "E Mus sinister"
|
||||
rank = "operative"
|
||||
|
||||
shock_resist = 1
|
||||
armor = list(
|
||||
"melee" = 40,
|
||||
"bullet" = 40,
|
||||
"laser" = 30,
|
||||
"energy" = 15,
|
||||
"bomb" = 35,
|
||||
"bio" = 100,
|
||||
"rad" = 100) //Mercenary Voidsuit Resistances, slightly downscaled, due to size.
|
||||
|
||||
//Pyro Mouse
|
||||
/mob/living/simple_mob/animal/space/mouse_army/pyro
|
||||
name = "pyro mouse"
|
||||
desc = "What kind of madman would strap this to a mouse?"
|
||||
tt_desc = "E Mus phlogiston"
|
||||
rank = "pyro"
|
||||
|
||||
maxHealth = 30
|
||||
health = 30
|
||||
|
||||
//Mob melee settings
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
attack_sharp = 0
|
||||
attack_edge = 0
|
||||
|
||||
//Damage resistances
|
||||
shock_resist = 0.6
|
||||
armor = list(
|
||||
"melee" = 20,
|
||||
"bullet" = 20,
|
||||
"laser" = 20,
|
||||
"energy" = 20,
|
||||
"bomb" = 90,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/incendiary/flamethrower
|
||||
base_attack_cooldown = 10
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged
|
||||
|
||||
var/ruptured = FALSE
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/pyro/death()
|
||||
visible_message("<span class='critical'>\The [src]'s tank groans!</span>")
|
||||
var/delay = rand(1, 3)
|
||||
spawn(0)
|
||||
// Flash black and red as a warning.
|
||||
for(var/i = 1 to delay)
|
||||
if(i % 2 == 0)
|
||||
color = "#000000"
|
||||
else
|
||||
color = "#FF0000"
|
||||
sleep(1)
|
||||
|
||||
spawn(rand (1,5))
|
||||
if(src && !ruptured)
|
||||
visible_message("<span class='critical'>\The [src]'s tank ruptures!</span>")
|
||||
ruptured = 1
|
||||
qdel(src)
|
||||
adjust_fire_stacks(2)
|
||||
IgniteMob()
|
||||
return ..()
|
||||
|
||||
//Ammo Mouse
|
||||
/mob/living/simple_mob/animal/space/mouse_army/ammo
|
||||
name = "ammo mouse"
|
||||
desc = "Aww! It's carrying a bunch of tiny bullets!"
|
||||
tt_desc = "E Mus tela"
|
||||
rank = "ammo"
|
||||
|
||||
maxHealth = 30
|
||||
health = 30
|
||||
|
||||
//Mob melee settings
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 5
|
||||
attack_sharp = 0
|
||||
attack_edge = 0
|
||||
|
||||
//Damage resistances
|
||||
shock_resist = 0.6
|
||||
armor = list(
|
||||
"melee" = 40,
|
||||
"bullet" = 30,
|
||||
"laser" = 10,
|
||||
"energy" = 10,
|
||||
"bomb" = 15,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
var/exploded = FALSE
|
||||
var/explosion_dev_range = 0
|
||||
var/explosion_heavy_range = 0
|
||||
var/explosion_light_range = 2
|
||||
var/explosion_flash_range = 4 // This doesn't do anything iirc.
|
||||
|
||||
var/explosion_delay_lower = 1 SECOND // Lower bound for explosion delay.
|
||||
var/explosion_delay_upper = 3 SECONDS // Upper bound.
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/ammo/death()
|
||||
visible_message("<span class='critical'>\The [src]'s body begins to rupture!</span>")
|
||||
var/delay = rand(1, 3)
|
||||
spawn(0)
|
||||
// Flash black and red as a warning.
|
||||
for(var/i = 1 to delay)
|
||||
if(i % 2 == 0)
|
||||
color = "#000000"
|
||||
else
|
||||
color = "#FF0000"
|
||||
sleep(1)
|
||||
|
||||
spawn(rand(1,5))
|
||||
if(src && !exploded)
|
||||
visible_message("<span class='critical'>\The [src]'s body detonates!</span>")
|
||||
exploded = 1
|
||||
explosion(src.loc, 0, 0, 2, 4)
|
||||
qdel(src)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth
|
||||
name = "stealth mouse"
|
||||
desc = "I bet you thought the normal ones were scary!"
|
||||
tt_desc = "E Mus insidiis"
|
||||
rank = "stealth"
|
||||
|
||||
//Mob melee settings
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
|
||||
//Damage resistances
|
||||
shock_resist = 0.6
|
||||
armor = list(
|
||||
"melee" = 50,
|
||||
"bullet" = 10,
|
||||
"laser" = 10,
|
||||
"energy" = 10,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
player_msg = "You have an imperfect, but automatic stealth. If you attack something while 'hidden', then \
|
||||
you will do bonus damage, stun the target, and unstealth for a period of time.<br>\
|
||||
Getting attacked will also break your stealth."
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
|
||||
|
||||
var/cloaked_alpha = 45 // Lower = Harder to see.
|
||||
var/cloaked_bonus_damage = 20 // This is added on top of the normal melee damage.
|
||||
var/cloaked_weaken_amount = 3 // How long to stun for.
|
||||
var/cloak_cooldown = 10 SECONDS // Amount of time needed to re-cloak after losing it.
|
||||
var/last_uncloak = 0 // world.time
|
||||
|
||||
|
||||
// Check if cloaking if possible.
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/proc/can_cloak()
|
||||
if(stat)
|
||||
return FALSE
|
||||
if(last_uncloak + cloak_cooldown > world.time)
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
// Called by things that break cloaks, like Technomancer wards.
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/break_cloak()
|
||||
uncloak()
|
||||
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/is_cloaked()
|
||||
return cloaked
|
||||
|
||||
|
||||
// Cloaks the spider automatically, if possible.
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/handle_special()
|
||||
if(!cloaked && can_cloak())
|
||||
cloak()
|
||||
|
||||
|
||||
// Applies bonus base damage if cloaked.
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/apply_bonus_melee_damage(atom/A, damage_amount)
|
||||
if(cloaked)
|
||||
return damage_amount + cloaked_bonus_damage
|
||||
return ..()
|
||||
|
||||
// Applies stun, then uncloaks.
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/apply_melee_effects(atom/A)
|
||||
if(cloaked)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.Weaken(cloaked_weaken_amount)
|
||||
to_chat(L, span("danger", "\The [src] ambushes you!"))
|
||||
playsound(L, 'sound/weapons/spiderlunge.ogg', 75, 1)
|
||||
uncloak()
|
||||
..() // For the poison.
|
||||
|
||||
// Force uncloaking if attacked.
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
break_cloak()
|
||||
|
||||
/mob/living/simple_mob/animal/space/mouse_army/stealth/hit_with_weapon(obj/item/O, mob/living/user, effective_force, hit_zone)
|
||||
. = ..()
|
||||
break_cloak()
|
||||
|
||||
|
||||
// Mouse noises
|
||||
/datum/say_list/mouse
|
||||
speak = list("Squeek!","SQUEEK!","Squeek?")
|
||||
emote_hear = list("squeeks","squeaks","squiks")
|
||||
emote_see = list("runs in a circle", "shakes", "scritches at something")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////
|
||||
// Mouse Tanks
|
||||
////////////////////
|
||||
|
||||
// Tiny mecha.
|
||||
// Designed for ranged attacks.
|
||||
|
||||
/datum/category_item/catalogue/technology/mouse_tank
|
||||
name = "Whisker Tank"
|
||||
desc = "Unofficially dubbed the 'Whisker Tank', this micro mecha is not unfamiliar \
|
||||
in several neighboring sectors. Known for its speed and small size, theories \
|
||||
on the origin of these devices cover a wide array of probabilities. The general \
|
||||
consensus is that these tanks were designed as weapons of sabotage that never saw wide\
|
||||
deployment. Since that theoretical time, others may have discovered and modified this \
|
||||
technology for their own twisted ends."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/mouse_tank
|
||||
name = "\improper Whisker Tank"
|
||||
desc = "A shockingly functional, miniaturized tank. Its inventor is unknown, but widely reviled."
|
||||
catalogue_data = list(/datum/category_item/catalogue/technology/mouse_tank)
|
||||
icon = 'icons/mecha/micro.dmi'
|
||||
icon_state = "whisker"
|
||||
wreckage = /obj/structure/loot_pile/mecha/mouse_tank
|
||||
faction = "mouse_army"
|
||||
|
||||
maxHealth = 150
|
||||
armor = list(
|
||||
"melee" = 25,
|
||||
"bullet" = 20,
|
||||
"laser" = 30,
|
||||
"energy" = 15,
|
||||
"bomb" = 0,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pistol/medium
|
||||
|
||||
movement_cooldown = 2
|
||||
base_attack_cooldown = 8
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/mouse_tank/manned
|
||||
pilot_type = /mob/living/simple_mob/animal/space/mouse_army/operative
|
||||
|
||||
// Immune to heat damage, resistant to lasers, and it spits fire.
|
||||
/datum/category_item/catalogue/technology/mouse_tank/livewire
|
||||
name = "Livewire Assault Tank"
|
||||
desc = "Dubbed the 'Livewire Assault Tank', this pattern of the 'standard' Whisker \
|
||||
tank has been condemned by multiple governments and corporations due to the \
|
||||
infamous brutality of its armaments. The utilization of this kind of technology would \
|
||||
spark a major scandal if its origins could ever be proven."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/mouse_tank/livewire
|
||||
name = "\improper Livewire Assault Tank"
|
||||
desc = "A scorched, miniaturized light tank. It is mentioned only in hushed whispers."
|
||||
catalogue_data = list(/datum/category_item/catalogue/technology/mouse_tank/livewire)
|
||||
icon_state = "livewire"
|
||||
wreckage = /obj/structure/loot_pile/mecha/mouse_tank/livewire
|
||||
|
||||
maxHealth = 200
|
||||
heat_resist = 1
|
||||
armor = list(
|
||||
"melee" = 0,
|
||||
"bullet" = 20,
|
||||
"laser" = 50,
|
||||
"energy" = 0,
|
||||
"bomb" = 50,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/incendiary/flamethrower/large
|
||||
|
||||
movement_cooldown = 3
|
||||
base_attack_cooldown = 15
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/mouse_tank/livewire/manned
|
||||
pilot_type = /mob/living/simple_mob/animal/space/mouse_army/pyro
|
||||
|
||||
//Rockets? Rockets.
|
||||
/datum/category_item/catalogue/technology/mouse_tank/eraticator
|
||||
name = "Eraticator Artillery Platform"
|
||||
desc = "Rare and fearsome weapons platforms, 'Eraticators', as they have come to be \
|
||||
known, are frighteningly powerful long ranged tanks built entirely around exotic \
|
||||
gyrojet technology. The raw cost and specialized nature of its design makes it a rare \
|
||||
but formidable foe. It is often accompanied by mechanized reinforcements."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/mouse_tank/eraticator
|
||||
name = "\improper Eraticator Artillery Platform"
|
||||
desc = "A heavy, miniaturized artillery platform. If you can hear it squeaking, you're too close."
|
||||
catalogue_data = list(/datum/category_item/catalogue/technology/mouse_tank/eraticator)
|
||||
icon_state = "eraticator"
|
||||
wreckage = /obj/structure/loot_pile/mecha/mouse_tank/eraticator
|
||||
|
||||
maxHealth = 300
|
||||
heat_resist = 1
|
||||
armor = list(
|
||||
"melee" = 20,
|
||||
"bullet" = 50,
|
||||
"laser" = 50,
|
||||
"energy" = 20,
|
||||
"bomb" = 80,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/gyro
|
||||
|
||||
movement_cooldown = 5
|
||||
base_attack_cooldown = 15
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/mouse_tank/eraticator/manned
|
||||
pilot_type = /mob/living/simple_mob/animal/space/mouse_army/ammo
|
||||
@@ -0,0 +1,678 @@
|
||||
////////////////////////////
|
||||
// Basic Cultist
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist
|
||||
name = "Cultists"
|
||||
desc = "The Galactic Awakening unlocked the psionic potential of many \
|
||||
from rim to rim. The first to notice this font of power were those who \
|
||||
were already the faithful devotees of esoteric religions. The rise of Blood \
|
||||
Cultists in service to the Geometer quickly became an intergalactic incident. \
|
||||
Although NanoTrasen and other entities have risen to combat these foes, a \
|
||||
vast array of Hermetic Orders now command frightening power."
|
||||
value = CATALOGUER_REWARD_TRIVIAL
|
||||
unlocked_by_any = list(/datum/category_item/catalogue/fauna/cultist)
|
||||
|
||||
// Obtained by scanning all X.
|
||||
/datum/category_item/catalogue/fauna/all_cultists
|
||||
name = "Collection - Cultists"
|
||||
desc = "You have scanned a large array of different types of Cultist, \
|
||||
and therefore you have been granted a large sum of points, through this \
|
||||
entry."
|
||||
value = CATALOGUER_REWARD_SUPERHARD
|
||||
unlocked_by_all = list(
|
||||
/datum/category_item/catalogue/fauna/cultist/human,
|
||||
/datum/category_item/catalogue/fauna/cultist/tesh,
|
||||
/datum/category_item/catalogue/fauna/cultist/lizard,
|
||||
/datum/category_item/catalogue/fauna/cultist/caster,
|
||||
/datum/category_item/catalogue/fauna/cultist/initiate,
|
||||
/datum/category_item/catalogue/fauna/cultist/castertesh,
|
||||
/datum/category_item/catalogue/fauna/cultist/elite,
|
||||
/datum/category_item/catalogue/fauna/cultist/magus,
|
||||
/datum/category_item/catalogue/fauna/cultist/hunter
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist //Do not spawn this on in directly it is simply a base for the rest namely the unique death animations.
|
||||
name = "Cultist"
|
||||
desc = "An awfully frail and ghastly looking individual"
|
||||
tt_desc = "NULL"
|
||||
icon = 'icons/mob/animal_ch.dmi'
|
||||
icon_state = "initiate"
|
||||
faction = "cult"
|
||||
mob_class = MOB_CLASS_DEMONIC
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/human
|
||||
name = "Cultists - Human"
|
||||
desc = "The first wave of zealots faced by many on the Frontier were \
|
||||
human. For a short while it was assumed that humans were somehow more \
|
||||
susecptible to Paracausal influence. Although this belief has long since \
|
||||
been disproven, the large Human population on the Frontier has ensured \
|
||||
that the species is overrepresented amongst the ranks of Cult aggressors."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/human
|
||||
name = "cultist"
|
||||
desc = "A fanatical zealot armed with a darkly colored sword."
|
||||
icon_state = "cultist"
|
||||
icon_living = "cultist"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/human)
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 30 //Cult Sword Damage
|
||||
melee_damage_upper = 30
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 80, bomb = 30, bio = 100, rad = 100) // Same armor are cult armor, may nerf since DAMN THAT IS GOOD ARMOR
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
movement_cooldown = 3
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/human/death()
|
||||
new /obj/effect/decal/remains/human (src.loc)
|
||||
..(null,"let's out a maddening laugh as his body crumbles away.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt //Teleporting Cultists
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
var/jaunt_warning = 0.5 SECONDS // How long the jaunt telegraphing is.
|
||||
var/jaunt_tile_speed = 20 // How long to wait between each tile. Higher numbers result in an easier to dodge tunnel attack.
|
||||
|
||||
// In Theory this Jury Rigged Code form Tunneler Spiders Should Allow Wraiths to Jaunt
|
||||
special_attack_min_range = 2
|
||||
special_attack_max_range = 6
|
||||
special_attack_cooldown = 10 SECONDS
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/do_special_attack(atom/A)
|
||||
set waitfor = FALSE
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
// Save where we're gonna go soon.
|
||||
var/turf/destination = get_turf(A)
|
||||
var/turf/starting_turf = get_turf(src)
|
||||
|
||||
// Telegraph to give a small window to dodge if really close.
|
||||
flick("bloodout",A)
|
||||
icon_state = "bloodout"
|
||||
sleep(jaunt_warning) // For the telegraphing.
|
||||
|
||||
// Do the dig!
|
||||
visible_message(span("danger","\The [src] sinks into a puddle of blood \the [A]!"))
|
||||
new /obj/effect/decal/cleanable/blood (src.loc)
|
||||
flick("blood_out",A)
|
||||
icon_state = "bloodout"
|
||||
|
||||
if(handle_jaunt(destination) == FALSE)
|
||||
set_AI_busy(FALSE)
|
||||
flick("bloodin",A)
|
||||
icon_state = "bloodin"
|
||||
return FALSE
|
||||
|
||||
// Did we make it?
|
||||
if(!(src in destination))
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "bloodin"
|
||||
flick("bloodin",A)
|
||||
return FALSE
|
||||
|
||||
var/overshoot = TRUE
|
||||
|
||||
// Test if something is at destination.
|
||||
for(var/mob/living/L in destination)
|
||||
if(L == src)
|
||||
continue
|
||||
|
||||
visible_message(span("danger","\The [src] suddenly rises from a pool of blood \the [L]!"))
|
||||
new /obj/effect/decal/cleanable/blood (src.loc)
|
||||
playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1)
|
||||
L.Weaken(3)
|
||||
overshoot = FALSE
|
||||
|
||||
if(!overshoot) // We hit the target, or something, at destination, so we're done.
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "bloodin"
|
||||
flick("bloodin",A)
|
||||
return TRUE
|
||||
|
||||
// Otherwise we need to keep going.
|
||||
to_chat(src, span("warning", "You overshoot your target!"))
|
||||
playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1)
|
||||
var/dir_to_go = get_dir(starting_turf, destination)
|
||||
for(var/i = 1 to rand(2, 4))
|
||||
destination = get_step(destination, dir_to_go)
|
||||
|
||||
if(handle_jaunt(destination) == FALSE)
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "bloodin"
|
||||
flick("bloodin",A)
|
||||
return FALSE
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "bloodin"
|
||||
flick("bloodin",A)
|
||||
return FALSE
|
||||
|
||||
// Does the jaunt movement
|
||||
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/proc/handle_jaunt(turf/destination)
|
||||
var/turf/T = get_turf(src) // Hold our current tile.
|
||||
|
||||
// Regular tunnel loop.
|
||||
for(var/i = 1 to get_dist(src, destination))
|
||||
if(stat)
|
||||
return FALSE // We died or got knocked out on the way.
|
||||
if(loc == destination)
|
||||
break // We somehow got there early.
|
||||
|
||||
// Update T.
|
||||
T = get_step(src, get_dir(src, destination))
|
||||
if(T.check_density(ignore_mobs = TRUE))
|
||||
to_chat(src, span("critical", "You hit something really solid!"))
|
||||
playsound(src, "punch", 75, 1)
|
||||
Weaken(5)
|
||||
add_modifier(/datum/modifier/tunneler_vulnerable, 10 SECONDS)
|
||||
return FALSE // Hit a wall.
|
||||
|
||||
// Get into the tile.
|
||||
forceMove(T)
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/should_special_attack(atom/A)
|
||||
// Make sure its possible for the wraith to reach the target so it doesn't try to go through a window.
|
||||
var/turf/destination = get_turf(A)
|
||||
var/turf/starting_turf = get_turf(src)
|
||||
var/turf/T = starting_turf
|
||||
for(var/i = 1 to get_dist(starting_turf, destination))
|
||||
if(T == destination)
|
||||
break
|
||||
|
||||
T = get_step(T, get_dir(T, destination))
|
||||
if(T.check_density(ignore_mobs = TRUE))
|
||||
return FALSE
|
||||
return T == destination
|
||||
|
||||
////////////////////////////
|
||||
// Teshari Cultist
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/tesh
|
||||
name = "Cultists - Teshari"
|
||||
desc = "Teshari cultists project a curiously sinister air. Perhaps \
|
||||
due to their diminutive stature, these creatures are sometimes not \
|
||||
regarded as genuine threats when compared to their more imposing companions. \
|
||||
To ignore a Teshari fanatic is a fool's errand. Fast, hard to hit, and \
|
||||
tenacious, Teshari form the vanguard of many fanatical assaults."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/tesh
|
||||
name = "cultist"
|
||||
desc = "A sinister looking hooded Teshari armed with a curved knife."
|
||||
icon_state = "culttesh"
|
||||
icon_living = "culttesh"
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/tesh)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Ritual Knife
|
||||
melee_damage_upper = 15
|
||||
attack_armor_pen = 25
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 45, bullet = 40, laser = 30, energy = 80, bomb = 20, bio = 100, rad = 100) // Reduced Resistance to Approximate increased Tesh damage.
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
movement_cooldown = 2
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/tesh/death()
|
||||
new /obj/effect/decal/cleanable/ash (src.loc)
|
||||
..(null,"let's out a shrill chirp as his body turns to dust.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
////////////////////////////
|
||||
// Lizard Cultist
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/lizard
|
||||
name = "Cultists - Lizard"
|
||||
desc = "The Unathi Kingdom of Moghes has stamped down heavily on the \
|
||||
heretical activities of religious sects not approved by the State. Due \
|
||||
to this, many Unathi seeking religious freedom have fled to the Frontier. \
|
||||
Unfortunately, some of those who took this path have fallen prey to true \
|
||||
evil. Possessing the zeal of the oppressed, Unathi cultists are deadly \
|
||||
fanatics, eager to shred their enemies apart in close quarters, regardless \
|
||||
of what damage they themselves incur."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/lizard
|
||||
name = "cultist"
|
||||
desc = "With a knife in each hand, this lizard looks ready to disect you."
|
||||
icon_state = "cultliz"
|
||||
icon_living = "cultliz"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/lizard)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Ritual Knife
|
||||
melee_damage_upper = 15
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 70, bullet = 60, laser = 30, energy = 80, bomb = 35, bio = 100, rad = 100) // Better Armor to match lizard brute resist
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 4
|
||||
base_attack_cooldown = 7.5 //Two knives mean double stab.
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/lizard/death()
|
||||
new /obj/effect/decal/remains/unathi (src.loc)
|
||||
..(null,"hisses as he collapses into a pile of bones.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
////////////////////////////
|
||||
// Blood Mage
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/caster
|
||||
name = "Cultists - Blood Mage"
|
||||
desc = "For those servants of a Cult who possess enough latent ability, \
|
||||
the channelling of Paracausal power is a very real skill to be honed and \
|
||||
exploited. Blood Mages learn to fuel paranatural assaults using their own \
|
||||
life force. Necessarily short lived, these cultists believe that bleeding \
|
||||
themselves dry is a statement of faith. Able to fire beams of dark energy \
|
||||
at their foes, these fanatics should be primarily engaged by PMD response \
|
||||
teams."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/caster
|
||||
name = "Blood Mage"
|
||||
desc = "A Robed individual whose hands pulsate with unnatural power."
|
||||
icon_state = "caster"
|
||||
icon_living = "caster"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/caster)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Ritual Knife
|
||||
melee_damage_upper = 15
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 50, bullet = 30, laser = 50, energy = 80, bomb = 25, bio = 100, rad = 100) //Armor Rebalanced for Cult Robes.
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 4
|
||||
projectiletype = /obj/item/projectile/beam/inversion
|
||||
projectilesound = 'sound/weapons/spiderlunge.ogg'
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/caster/death()
|
||||
new /obj/effect/decal/remains/human (src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/gibs (src.loc)
|
||||
..(null,"melts into a pile of blood and bones.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
////////////////////////////
|
||||
// Blood Initiate
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/initiate
|
||||
name = "Cultists - Initiate"
|
||||
desc = "After the Awakening, some who thirst for power or belonging \
|
||||
saw an opportunity to have their darker desires fulfilled. These converts \
|
||||
are accepted into the ranks of Cults across the galaxy regardless of whether \
|
||||
they possess psionic potential are not. Those that do ascend through the \
|
||||
ranks, whereas those that don't may still serve as cannon fodder and sacrifices."
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/initiate
|
||||
name = "Blood Intiate"
|
||||
desc = "A Novice Amongst his betters, he still seems determined to slice you to bits."
|
||||
icon_state = "initiate"
|
||||
icon_living = "initiate"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/initiate)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Ritual Knife
|
||||
melee_damage_upper = 15
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 50, bullet = 30, laser = 50, energy = 80, bomb = 25, bio = 100, rad = 100) //Armor Rebalanced for Cult Robes.
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 4
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/initiate/death()
|
||||
new /obj/effect/decal/remains/human (src.loc)
|
||||
..(null,"lets out a horrified scream as his body crumbles away.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
////////////////////////////
|
||||
// Teshari Mage
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/castertesh
|
||||
name = "Cultists - Teshari Mage"
|
||||
desc = "Similar in skill to their human counter parts, Teshari mages \
|
||||
are regarded as more ferocious combatants. Able to cast paracausal beams \
|
||||
at a rapid pace with ease, Teshari Mages are a priority target of any \
|
||||
response team, and any who discount their threat are quickly shown the \
|
||||
error of their ways."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/castertesh
|
||||
name = "Teshari Mage"
|
||||
desc = "This Teshari seems to have forsoken weapons for unfanthomable power."
|
||||
icon_state = "castertesh"
|
||||
icon_living = "castertesh"
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/castertesh)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Ritual Knife
|
||||
melee_damage_upper = 15
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 35, bullet = 20, laser = 35, energy = 60, bomb = 20, bio = 100, rad = 100) //Rebalanced for Robes and Tesh damage
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 2
|
||||
base_attack_cooldown = 7.5
|
||||
projectiletype = /obj/item/projectile/beam/inversion
|
||||
projectilesound = 'sound/weapons/spiderlunge.ogg'
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/castertesh/death()
|
||||
new /obj/effect/decal/cleanable/ash (src.loc)
|
||||
..(null,"burns away into nothing.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
////////////////////////////
|
||||
// Elite Cultist
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/elite
|
||||
name = "Cultists - Elite"
|
||||
desc = "Cultists who preceded the Great Awakening are often regarded \
|
||||
with immense respect. Truly devoted, these adherents learned many rites \
|
||||
and rituals before they ever bore true power. As such, Elite Cultists \
|
||||
possess a working knowledge of many arcane arts, and are trusted with \
|
||||
the rare Paracausal artifacts possessed by their orders. From mirror \
|
||||
shields to arcane sets of armor, Elites command fear, and inspire the \
|
||||
fanaticism of their subordinates."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/elite
|
||||
name = "Elite Cultist"
|
||||
desc = "A heavily armed cultist with a mirror shield that hurts to look at."
|
||||
icon_state = "cult_elite"
|
||||
icon_living = "cult_elite"
|
||||
faction = "cult"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/elite)
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 30 //Cult Sword Damage
|
||||
melee_damage_upper = 30
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 80, bomb = 30, bio = 100, rad = 100) // Same armor are cult armor, may nerf since DAMN THAT IS GOOD ARMOR
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
movement_cooldown = 3
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/elite/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
if(prob(30))
|
||||
visible_message("<span class='danger'>\The [src] blocks \the [O] with its shield!</span>")
|
||||
if(user)
|
||||
ai_holder.react_to_attack(user)
|
||||
return
|
||||
else
|
||||
..()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
|
||||
visible_message("<span class='warning'>\The [user] gently taps [src] with \the [O].</span>")
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/elite/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj) return
|
||||
if(prob(50))
|
||||
visible_message("<font color='red'><B>[Proj] disappears into the mirror world as it hits the shield.</B></font>")
|
||||
if(Proj.firer)
|
||||
ai_holder.react_to_attack(Proj.firer)
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/elite/death()
|
||||
new /obj/effect/decal/remains/human (src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/gibs (src.loc)
|
||||
new /obj/item/weapon/material/shard (src.loc)
|
||||
..(null,"shatters into bone and blood like pieces like the now shattered mirror.")
|
||||
playsound(src, 'sound/effects/Glassbr2.ogg', 100, 1)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
////////////////////////////
|
||||
// Cult Magus
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/magus
|
||||
name = "Cultists - Blood Magus"
|
||||
desc = "The Blood Magus commands their local chapter with total authority. \
|
||||
These religious leaders possess an unparalleled knowledge of their cult's \
|
||||
secrets, rituals, and tenets. To attain the rank of Magus, a Cultist must \
|
||||
possess great psionic power. Their ability to channel Paracausal energy is \
|
||||
unparalled amongst their peers. Wielding dark gifts granted by darker gods, \
|
||||
the Magus is a priority target in any engagement."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/magus
|
||||
name = "Blood Magus"
|
||||
desc = "A leader of the bloody cult and master of the forbidden arts, wielding powers beyond that of mortal men."
|
||||
icon_state = "magus"
|
||||
icon_living = "magus"
|
||||
maxHealth = 300 //Boss Mobs should be tanky.
|
||||
health = 300
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/magus)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 30 //Ritual Knife
|
||||
melee_damage_upper = 30
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 100, rad = 100) //Super Armor since Boss Mob
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
movement_cooldown = 4
|
||||
|
||||
projectiletype = /obj/item/projectile/beam/inversion
|
||||
base_attack_cooldown = 5
|
||||
projectilesound = 'sound/weapons/spiderlunge.ogg'
|
||||
var/obj/item/shield_projector/shields = null
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/magus/death()
|
||||
new /obj/effect/decal/cleanable/blood/gibs (src.loc)
|
||||
..(null,"let's out a dark laugh as it collapses into a puddle of blood.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/magus/Initialize(mapload)
|
||||
shields = new /obj/item/shield_projector/rectangle/automatic/magus(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/shield_projector/rectangle/automatic/magus
|
||||
name = "cult shield stone"
|
||||
desc = "A stone wielded by only the most powerful of cult leaders. It projects a shield around the user."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant_melted"
|
||||
shield_health = 200
|
||||
max_shield_health = 200
|
||||
shield_regen_delay = 10 SECONDS
|
||||
shield_regen_amount = 10
|
||||
size_x = 1
|
||||
size_y = 1
|
||||
color = "#f50202"
|
||||
high_color = "#ff0404"
|
||||
low_color = "#690000"
|
||||
////////////////////////////
|
||||
// Blood Hunter
|
||||
////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/cultist/hunter
|
||||
name = "Cultists - Blood Hunter"
|
||||
desc = "Whether the Blood Hunter may be considered human still remains \
|
||||
a hotly contested topic. There is further debate regarding whether every \
|
||||
instance of the Blood Hunter is the same entity, or whether this condition \
|
||||
is some manner of Paranatural affliction or status. It is speculated that \
|
||||
the Blood Hunter was once a mortal devotee of the Geometer, and has somehow \
|
||||
ascended to the rank of Paracausal Being. The Blood Hunter is a killer without \
|
||||
peer. If encountered, retreat and contact the PMD immediately."
|
||||
value = CATALOGUER_REWARD_HARD
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/hunter // This Mob is not meant to be fair, he is not meant to fight regular crew he is to be pitted against heavily armed explo teams to see if he can wipe them out.
|
||||
name = "Blood Hunter" // TO BE CLEAR: DO NOT SPAWN THIS GUY ON THE SHIP/STATION HE WILL MURDER EVERYTHING.
|
||||
desc = "The smell of blood fills the air, how delicious it tastes. Let the hunt begin." // He is a horrifying lovechild of Caleb and a blooborne hunter.
|
||||
icon_state = "hunterb" // He probably shouldn't even have other mobs supporting him.
|
||||
icon_living = "hunterb"
|
||||
maxHealth = 300 //Boss Mobs should be tanky.
|
||||
health = 300
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/cultist/hunter)
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 42 //Saw Cleaver Brutality
|
||||
melee_damage_upper = 42
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 60, bullet = 50, laser = 50, energy = 80, bomb = 30, bio = 100, rad = 100) //Super Armor since Boss Mob
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
movement_cooldown = 0 //This is so he can't be kited well
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pellet/shotgun
|
||||
|
||||
base_attack_cooldown = 7.5
|
||||
|
||||
loot_list = list(/obj/item/weapon/material/butterfly/saw = 100, /obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn/alt = 100)
|
||||
|
||||
needs_reload = TRUE
|
||||
reload_max = 2
|
||||
projectilesound = 'sound/weapons/Gunshot_shotgun.ogg'
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/blood_hunter
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/hunter/death()
|
||||
new /obj/effect/decal/cleanable/blood/gibs (src.loc)
|
||||
..(null,"laughs as he melts away. His laughs echo through the air even after only a dense red goo remains.")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
|
||||
////////////////////////////
|
||||
// Hunter AI
|
||||
////////////////////////////
|
||||
|
||||
/datum/ai_holder/simple_mob/ranged/aggressive/blood_hunter //This directs the AI to charge while shooting at its victim then entering Glorious melee combat.
|
||||
pointblank = FALSE
|
||||
closest_distance = 0
|
||||
|
||||
////////////////////////////
|
||||
// Ash Hunter
|
||||
////////////////////////////
|
||||
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/hunter/surt // This Mob is not meant to be fair, he is not meant to fight regular crew he is to be pitted against heavily armed explo teams to see if he can wipe them out.
|
||||
name = "Itinerant Blood Hunter"
|
||||
desc = "This Blood Hunter is far from home. Strange energies course around him, protecting him from the environment. What eldritch influence drew him to this place?" // Blood Hunter on vacation.
|
||||
|
||||
heat_resist = 1 //Might make this 0.75 if 1 is too much resistance for a boss monster. This guy's just a placeholder until we get the Miner in anyways.
|
||||
@@ -460,7 +460,7 @@
|
||||
pointed at you."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/humanoid/merc/voxpirate/suppressor
|
||||
/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/suppressor
|
||||
name = "vox suppressor"
|
||||
desc = "Come on, feel the noise!"
|
||||
icon_state = "voxsuppressor"
|
||||
@@ -492,7 +492,7 @@
|
||||
If you are unable to negotiate, expect to face their entire crew head on."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/humanoid/merc/voxpirate/captain
|
||||
/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/captain
|
||||
name = "vox pirate captain"
|
||||
desc = "Walkings the plank, dustlung! Yayaya."
|
||||
icon_state = "voxcaptain"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* CHOMPEdit - Overridden basically everything in pirates_ch.dm
|
||||
/mob/living/simple_mob/humanoid/pirate
|
||||
name = "Pirate"
|
||||
desc = "Does what he wants cause a pirate is free."
|
||||
@@ -38,3 +39,5 @@
|
||||
loot_list = list(/obj/item/weapon/gun/energy/laser = 100)
|
||||
|
||||
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
|
||||
|
||||
*/
|
||||
@@ -0,0 +1,460 @@
|
||||
///////////////////////////////
|
||||
// Yargh Yargh Fiddle De Di
|
||||
///////////////////////////////
|
||||
|
||||
/datum/category_item/catalogue/fauna/pirate
|
||||
name = "Pirates"
|
||||
desc = "Life on the Frontier is often harsh, and there are many \
|
||||
natural hazards which must be navigated and accounted for. In the \
|
||||
face of such constant adversity, some colonists will resort to crime \
|
||||
and piracy to try and make their way. From misguided attempts at \
|
||||
survival to malicious profiteering, Piracy is a constant concern \
|
||||
on the Frontier, and is punished harshly by every Megacorporation."
|
||||
value = CATALOGUER_REWARD_TRIVIAL
|
||||
|
||||
///////////////////////////////
|
||||
// Knife Priate
|
||||
///////////////////////////////
|
||||
/mob/living/simple_mob/humanoid/pirate
|
||||
name = "Pirate"
|
||||
desc = "Does what he wants cause a pirate is free."
|
||||
tt_desc = "E Homo sapiens"
|
||||
icon = 'icons/mob/animal_ch.dmi'
|
||||
icon_state = "piratemelee"
|
||||
icon_living = "piratemelee"
|
||||
icon_dead = "piratemelee_dead"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/pirate)
|
||||
|
||||
faction = "pirate"
|
||||
|
||||
response_help = "pushes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
movement_cooldown = 2
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //Tac Knife damage
|
||||
melee_damage_upper = 15
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
|
||||
attacktext = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/material/knife/tacknife = 100)
|
||||
|
||||
corpse = /obj/effect/landmark/mobcorpse/pirate
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/merc
|
||||
say_list_type = /datum/say_list/pirate
|
||||
|
||||
//Armored Variant
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/armored
|
||||
name = "Armored Pirate"
|
||||
desc = "Does what he wants cause a pirate is free. This one wears crude armor."
|
||||
icon_state = "piratemelee-armor"
|
||||
icon_living = "piratemelee-armor"
|
||||
movement_cooldown = 4
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/tacknife = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Machete Priate
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/machete
|
||||
name = "Pirate Brush Cutter"
|
||||
desc = "Does what he wants cause a pirate is free. This one has got a machete."
|
||||
tt_desc = "E Homo sapiens"
|
||||
icon = 'icons/mob/animal_ch.dmi'
|
||||
icon_state = "piratemelee-machete"
|
||||
icon_living = "piratemelee-machete"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
response_help = "pushes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
|
||||
melee_damage_lower = 25 //Macehte damage
|
||||
melee_damage_upper = 25
|
||||
|
||||
attacktext = list("slashed", "chopped", "gouged", "ripped", "cut")
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/material/knife/machete = 100)
|
||||
|
||||
corpse = /obj/effect/landmark/mobcorpse/pirate
|
||||
|
||||
//Armored Variant
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/machete/armored
|
||||
name = "Armored Brush Cutter"
|
||||
desc = "Does what he wants cause a pirate is free. This one has got a machete and wears crude armor."
|
||||
icon_state = "piratemelee-machete-armor"
|
||||
icon_living = "piratemelee-machete-armor"
|
||||
movement_cooldown = 3
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/machete = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// E-Sword Priate
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/las
|
||||
name = "Pirate Duelist"
|
||||
desc = "Does what he wants cause a pirate is free. This one has a energy sword."
|
||||
tt_desc = "E Homo sapiens"
|
||||
icon_state = "piratemelee-las"
|
||||
icon_living = "piratemelee-las"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
melee_damage_lower = 30 //E-Sword Damage
|
||||
melee_damage_upper = 30
|
||||
attack_armor_pen = 50
|
||||
|
||||
attack_sound = 'sound/weapons/blade1.ogg'
|
||||
|
||||
|
||||
loot_list = list(/obj/item/weapon/melee/energy/sword/pirate = 100)
|
||||
|
||||
//Armored Variant
|
||||
/mob/living/simple_mob/humanoid/pirate/las/armored
|
||||
name = "Armored Duelist"
|
||||
desc = "Does what he wants cause a pirate is free. This one has an energy sword."
|
||||
icon_state = "piratemelee-las-armor"
|
||||
icon_living = "piratemelee-las-armor"
|
||||
movement_cooldown = 4
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/melee/energy/sword/pirate = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
// Shield Pirate
|
||||
///////////////////////////////
|
||||
/mob/living/simple_mob/humanoid/pirate/shield
|
||||
name = "Pirate Buckler"
|
||||
desc = "Does what he wants cause a pirate is free. This one carries a shield for added protection."
|
||||
icon_state = "piratemelee-shield"
|
||||
icon_living = "piratemelee-shield"
|
||||
|
||||
//This Should Allow all childs of the shield priate to block
|
||||
/mob/living/simple_mob/humanoid/pirate/shield/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
if(prob(15))
|
||||
visible_message("<span class='danger'>\The [src] blocks \the [O] with its shield!</span>")
|
||||
if(user)
|
||||
ai_holder.react_to_attack(user)
|
||||
return
|
||||
else
|
||||
..()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
|
||||
visible_message("<span class='warning'>\The [user] gently taps [src] with \the [O].</span>")
|
||||
|
||||
/mob/living/simple_mob/humanoid/merc/melee/sword/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj) return
|
||||
if(prob(25))
|
||||
visible_message("<font color='red'><B>[src] blocks [Proj] with its shield!</B></font>")
|
||||
if(Proj.firer)
|
||||
ai_holder.react_to_attack(Proj.firer)
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
// Armored Variant
|
||||
/mob/living/simple_mob/humanoid/pirate/shield/armored
|
||||
name = "Armored Buckler"
|
||||
desc = "Does what he wants cause a pirate is free. This carries a shield and wears crude armor."
|
||||
icon_state = "piratemelee-shield-armor"
|
||||
icon_living = "piratemelee-shield-armor"
|
||||
movement_cooldown = 3
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/tacknife = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Shield Machete Pirate
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/shield/machete
|
||||
name = "Pirate Sword and Boarder"
|
||||
desc = "Does what he wants cause a pirate is free. This one has got a machete and a shield."
|
||||
icon_state = "piratemelee-shield-machete"
|
||||
icon_living = "piratemelee-shield-machete"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
response_help = "pushes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
|
||||
melee_damage_lower = 25 //Macehte damage
|
||||
melee_damage_upper = 25
|
||||
|
||||
attacktext = list("slashed", "chopped", "gouged", "ripped", "cut")
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/material/knife/machete = 100)
|
||||
|
||||
// Armored Variant
|
||||
/mob/living/simple_mob/humanoid/pirate/shield/machete/armored
|
||||
name = "Armored Sword and Boarder"
|
||||
desc = "Does what he wants cause a pirate is free. This one is equipped old fashioned sword and shield along with crude armor."
|
||||
icon_state = "piratemelee-shield-machete-armor"
|
||||
icon_living = "piratemelee-shield-machete-armor"
|
||||
movement_cooldown = 4
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/machete = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
// Pirate Pistolier
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged
|
||||
name = "Pirate Pistolier"
|
||||
desc = "Does what he wants since a pirate is free. This one is armed with a zip gun."
|
||||
icon_state = "pirateranged"
|
||||
icon_living = "pirateranged"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
reload_time = 4 SECONDS // ZipGuns are finicky an hard to load
|
||||
needs_reload = TRUE
|
||||
reload_max = 1
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/shotgun
|
||||
projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/pirate = 100, /obj/item/weapon/material/knife/tacknife = 100)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged
|
||||
|
||||
|
||||
//Armored Variant
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged/armored
|
||||
name = "Armored Pistolier"
|
||||
desc = "Does what he wants cause a pirate is free. This is armed with a zip gun and wears crude armor."
|
||||
icon_state = "pirateranged-armor"
|
||||
icon_living = "pirateranged-armor"
|
||||
movement_cooldown = 4
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/tacknife = 100, /obj/item/weapon/gun/projectile/pirate = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Pirate Blunderbuster
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged/shotgun
|
||||
name = "Pirate Blunderbuster"
|
||||
desc = "Does what he wants since a pirate is free. This one has a sawn off shotgun."
|
||||
icon_state = "pirateranged-blunder"
|
||||
icon_living = "pirateranged-blunder"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
reload_time = 3 SECONDS // Shotgun Reload
|
||||
needs_reload = TRUE
|
||||
reload_max = 2
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pellet/shotgun
|
||||
projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn = 100, /obj/item/weapon/material/knife/tacknife = 100)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive
|
||||
|
||||
//Armored Variant
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged/shotgun/armored
|
||||
name = "Armored Blunderbuster"
|
||||
desc = "Does what he wants cause a pirate is free. This is armed with a sawn off shotgun and wears crude armor."
|
||||
icon_state = "pirateranged-blunder-armor"
|
||||
icon_living = "pirateranged-blunder-armor"
|
||||
movement_cooldown = 4
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/tacknife = 100, /obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Pirate Ziplas
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged/handcannon
|
||||
name = "Pirate Handcannon"
|
||||
desc = "Does what he wants since a pirate is free. This one has an improvised laser pistol."
|
||||
icon_state = "pirateranged-handcannon"
|
||||
icon_living = "pirateranged-handcannon"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
reload_time = 6 SECONDS //Zip-Las takes a real long time to reload.
|
||||
needs_reload = TRUE
|
||||
reload_max = 1
|
||||
|
||||
projectiletype = /obj/item/projectile/beam/heavylaser
|
||||
projectilesound = 'sound/weapons/weaponsounds_laserstrong.ogg'
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/energy/zip = 100, /obj/item/weapon/material/knife/tacknife = 100)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive
|
||||
|
||||
//Armored Variant
|
||||
/mob/living/simple_mob/humanoid/pirate/ranged/handcannon/armored
|
||||
name = "Armored Handcannon"
|
||||
desc = "Does what he wants cause a pirate is free. This one has a improvised laser pistol and crude armor."
|
||||
icon_state = "pirateranged-handcannon-armor"
|
||||
icon_living = "pirateranged-handcannon-armor"
|
||||
movement_cooldown = 4
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
loot_list = list(/obj/item/weapon/material/knife/tacknife = 100, /obj/item/weapon/gun/energy/zip = 100, /obj/item/clothing/suit/armor/material/makeshift = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// First Mate
|
||||
///////////////////////////////
|
||||
/mob/living/simple_mob/humanoid/pirate/mate
|
||||
name = "First Mate"
|
||||
desc = "A leading figure amongst the pirate hoards. This one is armed with a laser cutlass"
|
||||
tt_desc = "E Homo sapiens"
|
||||
icon_state = "mate"
|
||||
icon_living = "mate"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
melee_damage_lower = 30 //E-Sword Damage
|
||||
melee_damage_upper = 30
|
||||
attack_armor_pen = 50
|
||||
|
||||
attack_sound = 'sound/weapons/blade1.ogg'
|
||||
|
||||
armor = list(melee = 30, bullet = 20, laser = 20, energy = 5, bomb = 5, bio = 100, rad = 100)
|
||||
|
||||
loot_list = list(/obj/item/weapon/melee/energy/sword/pirate = 100, /obj/item/clothing/suit/pirate = 100)
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
// Mate Pistolier
|
||||
///////////////////////////////
|
||||
/mob/living/simple_mob/humanoid/pirate/mate/ranged
|
||||
name = "Mate Pistolier"
|
||||
desc = "A leading figure amongst the pirate hoards. This one is armed with a obsolete laser pistol."
|
||||
icon_state = "mate-pistoler"
|
||||
icon_living = "mate-pistoler"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
reload_time = 2 SECONDS //Retro Energy Pistol is far easier to reload than Zip-Las
|
||||
needs_reload = TRUE
|
||||
reload_max = 5
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
|
||||
projectiletype = /obj/item/projectile/beam/midlaser
|
||||
projectilesound = 'sound/weapons/weaponsounds_lasermid.ogg'
|
||||
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
base_attack_cooldown = 10
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/energy/retro = 100, /obj/item/clothing/suit/pirate = 100)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/mate/ranged/bosun /// Special Mech Pilot Pirate
|
||||
name = "Bosun"
|
||||
desc = "An oily pirate mechanist. Thankfully he has but an old laser to defend himself with."
|
||||
icon_state = "bosun"
|
||||
icon_living = "bosun"
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/blood_hunter // This is for use in the Pirate Ripley Mecha
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/energy/retro = 100, /obj/item/clothing/head/welding = 100, /obj/item/clothing/suit/pirate = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Mate Sweeper
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/mate/ranged/shotgun
|
||||
name = "Mate Blunderbuster"
|
||||
desc = "A leading figure amongst the pirate hoards. This one is armed with a four barreled shotgun"
|
||||
icon_state = "mate-shotgun"
|
||||
icon_living = "mate-shotgun"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
reload_time = 4 SECONDS //Assume use of speedloaders
|
||||
needs_reload = TRUE
|
||||
reload_max = 4
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/pellet/shotgun
|
||||
projectilesound = 'sound/weapons/weaponsounds_shotgunshot.ogg'
|
||||
base_attack_cooldown = 5
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/doublebarrel/quad = 100, /obj/item/clothing/suit/pirate = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Mate Marksman
|
||||
///////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/mate/ranged/rifle
|
||||
name = "Mate Marksman"
|
||||
desc = "A leading figure amongst the pirate hoards. This one is armed with a rifle."
|
||||
icon_state = "mate-rifle"
|
||||
icon_living = "mate-rifle"
|
||||
icon_dead = "piratemelee_dead"
|
||||
|
||||
reload_time = 1.5 SECONDS //Assume use of speedloaders
|
||||
needs_reload = TRUE
|
||||
reload_max = 5
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
projectiletype = /obj/item/projectile/bullet/rifle/a762
|
||||
projectilesound = 'sound/weapons/weaponsounds_heavyrifleshot.ogg'
|
||||
base_attack_cooldown = 10
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 100, /obj/item/clothing/suit/pirate = 100)
|
||||
|
||||
///////////////////////////////
|
||||
// Pirate Captain
|
||||
///////////////////////////////
|
||||
/mob/living/simple_mob/humanoid/pirate/captain
|
||||
name = "Pirate Captain"
|
||||
desc = "Leader of a Pirate Vessel armed with an entire belt of improvised laser pistols. A true villian indeed."
|
||||
icon_state = "captain"
|
||||
icon_living = "captain"
|
||||
icon_dead = "pirateranged_dead"
|
||||
|
||||
reload_time = 10 SECONDS // I mean its a belt of pistols not exactly easy to reload. Especially with how much damage the barage does.
|
||||
needs_reload = TRUE
|
||||
reload_max = 4 // More than capable to shredding explo's shield especially when backed up by a few mates.
|
||||
|
||||
projectiletype = /obj/item/projectile/beam/heavylaser
|
||||
projectilesound = 'sound/weapons/weaponsounds_laserstrong.ogg'
|
||||
base_attack_cooldown = 5
|
||||
|
||||
corpse = /obj/effect/landmark/mobcorpse/pirate/ranged
|
||||
|
||||
loot_list = list(/obj/item/weapon/gun/energy/zip = 100, /obj/item/weapon/gun/energy/zip = 100, /obj/item/weapon/gun/energy/zip = 100, /obj/item/weapon/gun/energy/zip = 100) //Belt of pistols
|
||||
|
||||
var/obj/item/shield_projector/shields = null
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/captain/Initialize(mapload)
|
||||
shields = new /obj/item/shield_projector/rectangle/automatic/drone(src)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/humanoid/pirate/captain/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/obj/item/shield_projector/rectangle/automatic/drone
|
||||
shield_health = 150
|
||||
max_shield_health = 150
|
||||
shield_regen_delay = 10 SECONDS
|
||||
shield_regen_amount = 10
|
||||
size_x = 1
|
||||
size_y = 1
|
||||
@@ -0,0 +1,350 @@
|
||||
//Fodder
|
||||
/mob/living/simple_mob/mechanical/cyber_horror
|
||||
name = "Cyber horror"
|
||||
desc = "What was once a man, twisted and warped by machine."
|
||||
icon = 'icons/mob/animal_ch.dmi'
|
||||
icon_state = "cyber_horror"
|
||||
icon_dead = "cyber_horror_dead"
|
||||
icon_gib = "cyber_horror_dead"
|
||||
|
||||
faction = "synthtide"
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
maxHealth = 175
|
||||
health = 175
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
|
||||
movement_cooldown = 3
|
||||
movement_sound = 'sound/effects/houndstep.ogg'
|
||||
// To promote a more diverse weapon selection.
|
||||
armor = list(melee = 25, bullet = 25, laser = -20, bio = 100, rad = 100)
|
||||
hovering = FALSE
|
||||
|
||||
say_list_type = /datum/say_list/cyber_horror
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "hits"
|
||||
attacktext = list ("wildly strikes", "swings", "batters")
|
||||
attack_sound = 'sound/weapons/punch3.ogg'
|
||||
|
||||
var/emp_damage = 0
|
||||
var/nanobot_chance = 40
|
||||
|
||||
/datum/say_list/cyber_horror
|
||||
speak = list("H@!#$$P M@!$#",
|
||||
"GHAA!@@#",
|
||||
"KR@!!N",
|
||||
"K!@@##L!@@ %!@#E",
|
||||
"G@#!$ H@!#%",
|
||||
"H!@%%@ @!E")
|
||||
emote_hear = list("sparks!", "groans.", "wails.", "sobs.")
|
||||
emote_see = list ("stares unblinkingly.", "jitters and twitches.", "emits a synthetic scream.", "rapidly twitches.", "convulses.", "twitches uncontrollably.", "goes stock still.")
|
||||
say_threaten = list ("FR@#DOM","EN@ T#I$-$","N0$ M^> B@!#")
|
||||
say_got_target = list("I *#@ Y@%","!E@#$P","F#RR @I","D0@#$ ##OK %","IT $##TS")
|
||||
|
||||
// Fragile but dangerous
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror
|
||||
name = "Nanite husk"
|
||||
desc = "What was once a phoronoid, now a empty shell of malfunctioning nanites."
|
||||
icon_state = "plasma_cyber_horror"
|
||||
icon_dead = "plasma_cyber_horror_dead"
|
||||
|
||||
armor = list(melee = 40, bullet = -10, laser = 40, bio = 100, rad = 100)
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
attacktext = "splatters on"
|
||||
attack_sound = 'sound/effects/slime_squish.ogg'
|
||||
|
||||
// Do y'like brain damage?
|
||||
var/poison_chance = 100
|
||||
var/poison_per_bite = 3
|
||||
var/poison_type = "neurophage_nanites"
|
||||
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(L.reagents)
|
||||
var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD)
|
||||
if(L.can_inject(src, null, target_zone))
|
||||
inject_poison(L, target_zone)
|
||||
|
||||
// Does actual poison injection, after all checks passed.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/plasma_cyber_horror/proc/inject_poison(mob/living/L, target_zone)
|
||||
if(prob(poison_chance))
|
||||
to_chat(L, "<span class='warning'>You feel nanites digging into your skin!</span>")
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
// Mech Shredder
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror
|
||||
name = "Nanite abomination"
|
||||
desc = "What was once something, now an exposed shell with lashing cables."
|
||||
icon_state = "ling_cyber_horror"
|
||||
icon_dead = "ling_cyber_horror_dead"
|
||||
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
// Four attacks per second.
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
attack_armor_pen = 50
|
||||
base_attack_cooldown = 2.5
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
attacktext = list ("sliced", "diced", "lashed", "shredded")
|
||||
// Slow as all sin
|
||||
movement_cooldown = 9
|
||||
movement_sound = 'sound/effects/houndstep.ogg'
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
// You do NOT Want to get in touchy range of this thing.
|
||||
armor = list(melee = 75, bullet = -10, laser = -25, bio = 100, rad = 100)
|
||||
hovering = FALSE
|
||||
|
||||
|
||||
// Leaping is a special attack, so these values determine when leap can happen.
|
||||
// Leaping won't occur if its on cooldown, set to a minute due to it purely break formations.
|
||||
special_attack_min_range = 2
|
||||
special_attack_max_range = 7
|
||||
special_attack_cooldown = 60 SECONDS
|
||||
// How long the leap telegraphing is.
|
||||
var/leap_warmup = 2 SECOND
|
||||
var/leap_sound = 'sound/weapons/spiderlunge.ogg'
|
||||
|
||||
// Multiplies damage if the victim is stunned in some form, including a successful leap.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror/apply_bonus_melee_damage(atom/A, damage_amount)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(L.incapacitated(INCAPACITATION_DISABLED))
|
||||
return damage_amount * 2.5
|
||||
return ..()
|
||||
|
||||
|
||||
// The actual leaping attack.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/ling_cyber_horror/do_special_attack(atom/A)
|
||||
set waitfor = FALSE
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
// Telegraph, since getting stunned suddenly feels bad.
|
||||
do_windup_animation(A, leap_warmup)
|
||||
// For the telegraphing.
|
||||
sleep(leap_warmup)
|
||||
|
||||
// Do the actual leap.
|
||||
// Lets us pass over everything.
|
||||
status_flags |= LEAPING
|
||||
visible_message(span("danger","\The [src] leaps at \the [A]!"))
|
||||
throw_at(get_step(get_turf(A), get_turf(src)), special_attack_max_range+1, 1, src)
|
||||
playsound(src, leap_sound, 75, 1)
|
||||
// For the throw to complete. It won't hold up the AI SSticker due to waitfor being false.
|
||||
sleep(5)
|
||||
|
||||
// Revert special passage ability.
|
||||
if(status_flags & LEAPING)
|
||||
status_flags &= ~LEAPING
|
||||
// Where we landed. This might be different than A's turf.
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
. = FALSE
|
||||
|
||||
// Now for the stun.
|
||||
var/mob/living/victim = null
|
||||
// So player-controlled cyber horrors only need to click the tile to stun them.
|
||||
for(var/mob/living/L in T)
|
||||
if(L == src)
|
||||
continue
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(damage = 0, damage_source = src, attacker = src, def_zone = null, attack_text = "the leap"))
|
||||
// We were blocked.
|
||||
continue
|
||||
|
||||
victim = L
|
||||
break
|
||||
|
||||
if(victim)
|
||||
victim.Weaken(2)
|
||||
victim.visible_message(span("danger","\The [src] knocks down \the [victim]!"))
|
||||
to_chat(victim, span("critical", "\The [src] jumps on you!"))
|
||||
. = TRUE
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
//Slightly more durable fodder
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/vox
|
||||
name = "Vox shambles"
|
||||
desc = "Once a Vox now torn and changed, peices of a Durand has been grafted onto it."
|
||||
icon_state = "vox_cyber_horror"
|
||||
icon_dead = "vox_cyber_horror_dead"
|
||||
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, bio = 100, rad = 100)
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
// Hit and run mob
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran
|
||||
name = "Tajaran cyber stalker"
|
||||
desc = "A mangled mess of machine and fur, light seems to bounce off it."
|
||||
icon_state = "tajaran_cyber_horror"
|
||||
icon_dead = "tajaran_cyber_horror_dead"
|
||||
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
|
||||
|
||||
// Lower = Harder to see.
|
||||
var/cloaked_alpha = 30
|
||||
// This is added on top of the normal melee damage.
|
||||
var/cloaked_bonus_damage = 30
|
||||
// How long to stun for.
|
||||
var/cloaked_weaken_amount = 3
|
||||
// Amount of time needed to re-cloak after losing it.
|
||||
var/cloak_cooldown = 10 SECONDS
|
||||
// world.time
|
||||
var/last_uncloak = 0
|
||||
|
||||
// Check if cloaking if possible.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/proc/can_cloak()
|
||||
if(stat)
|
||||
return FALSE
|
||||
if(last_uncloak + cloak_cooldown > world.time)
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
// Called by things that break cloaks, like Technomancer wards.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/break_cloak()
|
||||
uncloak()
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/is_cloaked()
|
||||
return cloaked
|
||||
|
||||
|
||||
// Cloaks the tajaran automatically, if possible.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/handle_special()
|
||||
if(!cloaked && can_cloak())
|
||||
cloak()
|
||||
|
||||
|
||||
// Applies bonus base damage if cloaked.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/apply_bonus_melee_damage(atom/A, damage_amount)
|
||||
if(cloaked)
|
||||
return damage_amount + cloaked_bonus_damage
|
||||
return ..()
|
||||
|
||||
// Applies stun, then uncloaks.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/apply_melee_effects(atom/A)
|
||||
if(cloaked)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.Weaken(cloaked_weaken_amount)
|
||||
to_chat(L, span("danger", "\The [src] tears into you!"))
|
||||
playsound(L, 'sound/weapons/spiderlunge.ogg', 75, 1)
|
||||
uncloak()
|
||||
..() // For the poison.
|
||||
|
||||
// Force uncloaking if attacked.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
break_cloak()
|
||||
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/hit_with_weapon(obj/item/O, mob/living/user, effective_force, hit_zone)
|
||||
. = ..()
|
||||
break_cloak()
|
||||
|
||||
//Arcing Ranged Mob
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/grey
|
||||
name = "Twisted cyber horror"
|
||||
desc = "A mess of machine and organic, it's hard to even know what it was before."
|
||||
icon_state = "grey_cyber_horror"
|
||||
icon_dead = "grey_cyber_horror_dead"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
|
||||
projectiletype = /obj/item/projectile/arc/blue_energy
|
||||
projectilesound = 'sound/weapons/Laser.ogg'
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
armor = list(melee = -30, bullet = 10, laser = 10, bio = 100, rad = 100)
|
||||
|
||||
/obj/item/projectile/arc/blue_energy
|
||||
name = "energy missle"
|
||||
icon_state = "force_missile"
|
||||
damage = 12
|
||||
damage_type = BURN
|
||||
|
||||
//Direct Ranged Mob
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/corgi
|
||||
name = "Malformed Corgi"
|
||||
desc = "Pieces of metal and technology is embedded in this Ian."
|
||||
icon_state = "corgi_cyber_horror"
|
||||
icon_dead = "corgi_cyber_horror_dead"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
base_attack_cooldown = 4
|
||||
projectiletype = /obj/item/projectile/beam/drone
|
||||
projectilesound = 'sound/weapons/laser3.ogg'
|
||||
movement_sound = 'sound/effects/servostep.ogg'
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening
|
||||
|
||||
//Cats and mayhem
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror
|
||||
name = "Twisted cat"
|
||||
desc = "While most things are acceptable, putting cat legs on this - only made it worse."
|
||||
|
||||
icon_state = "cat_cyber_horror"
|
||||
icon_dead = "cat_cyber_horror_dead"
|
||||
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
movement_cooldown = 0
|
||||
movement_sound = 'sound/effects/servostep.ogg'
|
||||
|
||||
pass_flags = PASSTABLE
|
||||
mob_swap_flags = 0
|
||||
mob_push_flags = 0
|
||||
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 2
|
||||
// Four attacks per second.
|
||||
base_attack_cooldown = 2.5
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
|
||||
attacktext = list("jabbed", "injected")
|
||||
|
||||
// Do y'like drugs?
|
||||
var/poison_chance = 75
|
||||
var/poison_per_bite = 3
|
||||
var/poison_type = "mindbreaker"
|
||||
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
if(L.reagents)
|
||||
var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD)
|
||||
if(L.can_inject(src, null, target_zone))
|
||||
inject_poison(L, target_zone)
|
||||
|
||||
// Does actual poison injection, after all checks passed.
|
||||
/mob/living/simple_mob/mechanical/cyber_horror/cat_cyber_horror/proc/inject_poison(mob/living/L, target_zone)
|
||||
if(prob(poison_chance))
|
||||
to_chat(L, "<span class='warning'>You feel an uncomfortable prick!</span>")
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
//These are the projectiles mobs use
|
||||
/obj/item/projectile/beam/drone
|
||||
damage = 3
|
||||
/obj/item/projectile/arc/blue_energy
|
||||
name = "energy missle"
|
||||
icon_state = "force_missile"
|
||||
damage = 12
|
||||
damage_type = BURN
|
||||
@@ -0,0 +1,209 @@
|
||||
////////////////////////////
|
||||
// Construct AI
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct
|
||||
icon = 'icons/mob/animal_ch.dmi'
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
/mob/living/simple_mob/construct/artificer
|
||||
ai_holder_type = /datum/ai_holder/mimic
|
||||
|
||||
/mob/living/simple_mob/construct/harvester
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
attack_edge = 1
|
||||
|
||||
/mob/living/simple_mob/construct/juggernaut
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/destructive
|
||||
|
||||
////////////////////////////
|
||||
// Wraith special attack stuff
|
||||
////////////////////////////
|
||||
|
||||
|
||||
/mob/living/simple_mob/construct/wraith
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
var/jaunt_warning = 0.5 SECONDS // How long the jaunt telegraphing is.
|
||||
var/jaunt_tile_speed = 20 // How long to wait between each tile. Higher numbers result in an easier to dodge tunnel attack.
|
||||
special_attack_min_range = 2
|
||||
special_attack_max_range = 6
|
||||
special_attack_cooldown = 10 SECONDS
|
||||
|
||||
/mob/living/simple_mob/construct/wraith/jaunt_spam
|
||||
special_attack_cooldown = 5 SECONDS
|
||||
|
||||
/mob/living/simple_mob/construct/wraith/fast_jaunt //Teleports behind you
|
||||
jaunt_tile_speed = 2
|
||||
|
||||
/mob/living/simple_mob/construct/wraith/do_special_attack(atom/A)
|
||||
set waitfor = FALSE
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
// Save where we're gonna go soon.
|
||||
var/turf/destination = get_turf(A)
|
||||
var/turf/starting_turf = get_turf(src)
|
||||
|
||||
// Telegraph to give a small window to dodge if really close.
|
||||
flick("phase_shift",A)
|
||||
icon_state = "phase_shift"
|
||||
sleep(jaunt_warning) // For the telegraphing.
|
||||
|
||||
// Do the dig!
|
||||
visible_message(span("danger","\The [src] vanishes into thin air \the [A]!"))
|
||||
flick("phase_shift",A)
|
||||
icon_state = "phase_shift"
|
||||
|
||||
if(handle_jaunt(destination) == FALSE)
|
||||
set_AI_busy(FALSE)
|
||||
flick("phase_shift2",A)
|
||||
icon_state = "phase_shift2"
|
||||
return FALSE
|
||||
|
||||
// Did we make it?
|
||||
if(!(src in destination))
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "phase_shift2"
|
||||
flick("phase_shift2",A)
|
||||
return FALSE
|
||||
|
||||
var/overshoot = TRUE
|
||||
|
||||
// Test if something is at destination.
|
||||
for(var/mob/living/L in destination)
|
||||
if(L == src)
|
||||
continue
|
||||
|
||||
visible_message(span("danger","\The [src] appears in a flurry of slashes \the [L]!"))
|
||||
playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1)
|
||||
L.Weaken(3)
|
||||
overshoot = FALSE
|
||||
|
||||
if(!overshoot) // We hit the target, or something, at destination, so we're done.
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "phase_shift2"
|
||||
flick("phase_shift2",A)
|
||||
return TRUE
|
||||
|
||||
// Otherwise we need to keep going.
|
||||
to_chat(src, span("warning", "You overshoot your target!"))
|
||||
playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1)
|
||||
var/dir_to_go = get_dir(starting_turf, destination)
|
||||
for(var/i = 1 to rand(2, 4))
|
||||
destination = get_step(destination, dir_to_go)
|
||||
|
||||
if(handle_jaunt(destination) == FALSE)
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "phase_shift2"
|
||||
flick("phase_shift2",A)
|
||||
return FALSE
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
icon_state = "phase_shift2"
|
||||
flick("phase_shift2",A)
|
||||
return FALSE
|
||||
|
||||
// Does the jaunt movement
|
||||
/mob/living/simple_mob/construct/wraith/proc/handle_jaunt(turf/destination)
|
||||
var/turf/T = get_turf(src) // Hold our current tile.
|
||||
|
||||
// Regular tunnel loop.
|
||||
for(var/i = 1 to get_dist(src, destination))
|
||||
if(stat)
|
||||
return FALSE // We died or got knocked out on the way.
|
||||
if(loc == destination)
|
||||
break // We somehow got there early.
|
||||
|
||||
// Update T.
|
||||
T = get_step(src, get_dir(src, destination))
|
||||
if(T.check_density(ignore_mobs = TRUE))
|
||||
to_chat(src, span("critical", "You hit something really solid!"))
|
||||
playsound(src, "punch", 75, 1)
|
||||
Weaken(5)
|
||||
add_modifier(/datum/modifier/tunneler_vulnerable, 10 SECONDS)
|
||||
return FALSE // Hit a wall.
|
||||
|
||||
// Get into the tile.
|
||||
forceMove(T)
|
||||
|
||||
|
||||
/mob/living/simple_mob/construct/wraith/should_special_attack(atom/A)
|
||||
// Make sure its possible for the wraith to reach the target so it doesn't try to go through a window.
|
||||
var/turf/destination = get_turf(A)
|
||||
var/turf/starting_turf = get_turf(src)
|
||||
var/turf/T = starting_turf
|
||||
for(var/i = 1 to get_dist(starting_turf, destination))
|
||||
if(T == destination)
|
||||
break
|
||||
|
||||
T = get_step(T, get_dir(T, destination))
|
||||
if(T.check_density(ignore_mobs = TRUE))
|
||||
return FALSE
|
||||
return T == destination
|
||||
|
||||
|
||||
////////////////////////////
|
||||
// Ranged Artificer
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/artificer/caster
|
||||
name = "Artificer"
|
||||
real_name = "Artificer"
|
||||
construct_type = "artificer"
|
||||
desc = "A bulbous construct dedicated to building and maintaining temples to their otherworldly lords. Its central eye glows with unknowable power."
|
||||
icon_state = "caster_artificer"
|
||||
icon_living = "caster_artificer"
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
projectiletype = /obj/item/projectile/beam/inversion
|
||||
projectilesound = 'sound/weapons/spiderlunge.ogg'
|
||||
|
||||
////////////////////////////
|
||||
// Greater Harvester
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/harvester/greater
|
||||
name = "Greater Harvester"
|
||||
real_name = "Chosen"
|
||||
construct_type = "Chosen"
|
||||
desc = "A infanthomable mass of tentacles and claws ripping and tearing through all that oppose it."
|
||||
icon_state = "chosen"
|
||||
icon_living = "chosen"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
melee_damage_lower = 40 //Glass Cannon Mini-Boss/Semi-Boss large. Few hits is enough to end you.
|
||||
melee_damage_upper = 50
|
||||
attack_armor_pen = 60 //No Armor Shall Save you
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("violently stabbed")
|
||||
friendly = list("caresses")
|
||||
movement_cooldown = 0
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
|
||||
// environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things
|
||||
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
////////////////////////////
|
||||
// Artificer
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/proteon //Weak Swarm Attacker can be safely dumped on players in large numbers without too many injuries
|
||||
name = "Proteon"
|
||||
real_name = "proton"
|
||||
construct_type = "artificer"
|
||||
desc = "A weak but speedy construction designed to assist other constructs rather than fight. Still seems bloodthirtsy though."
|
||||
icon_state = "proteon"
|
||||
icon_living = "proteon"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
response_harm = "viciously beaten"
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 8 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you.
|
||||
melee_damage_upper = 10
|
||||
attack_armor_pen = 50 // Does so little damage already, that this can be justified.
|
||||
attacktext = list("rammed")
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 0
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
@@ -10,8 +10,8 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "artificer"
|
||||
icon_living = "artificer"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
maxHealth = 100 //CHOMPEdit - Adjusting values since they have AI now
|
||||
health = 100 //CHOMPEdit
|
||||
response_harm = "viciously beaten"
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you.
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "harvester"
|
||||
icon_living = "harvester"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
maxHealth = 100 //CHOMPEdit
|
||||
health = 100 //CHOMPEdit
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 25
|
||||
attack_sharp = TRUE
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "behemoth"
|
||||
icon_living = "behemoth"
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
maxHealth = 200 //CHOMPEdit
|
||||
health = 200 //CHOMPEdit
|
||||
response_harm = "harmlessly punches"
|
||||
harm_intent_damage = 0
|
||||
melee_damage_lower = 30
|
||||
@@ -98,8 +98,8 @@
|
||||
name = "Behemoth"
|
||||
real_name = "Behemoth"
|
||||
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
|
||||
maxHealth = 750
|
||||
health = 750
|
||||
maxHealth = 600 //CHOMPEdit
|
||||
health = 600 //CHOMPEdit
|
||||
speak_emote = list("rumbles")
|
||||
melee_damage_lower = 50
|
||||
melee_damage_upper = 50
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
name = "Shade"
|
||||
real_name = "Shade"
|
||||
desc = "A bound spirit"
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
//icon = 'icons/mob/mob.dmi' CHOMPRemove
|
||||
icon_state = "shade"
|
||||
icon_living = "shade"
|
||||
icon_dead = "shade_dead"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
real_name = "Wraith"
|
||||
construct_type = "wraith"
|
||||
desc = "A wicked bladed shell contraption piloted by a bound spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
//icon = 'icons/mob/mob.dmi' //CHOMPRemove
|
||||
icon_state = "floating"
|
||||
icon_living = "floating"
|
||||
maxHealth = 200
|
||||
|
||||
7
code/modules/projectiles/ammunition/rounds_ch.dm
Normal file
7
code/modules/projectiles/ammunition/rounds_ch.dm
Normal file
@@ -0,0 +1,7 @@
|
||||
/obj/item/ammo_casing/a12g/silver
|
||||
name = " Silver shotgun shell"
|
||||
desc = "A 12 gauge slug. Bless and Sancitfied to banish otherworlds entities."
|
||||
icon_state = "agshell"
|
||||
caliber = "12g"
|
||||
projectile_type = /obj/item/projectile/bullet/pellet/shotgun/silver
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 360, "silver" = 240)
|
||||
31
code/modules/projectiles/guns/projectile/shotgun_ch.dm
Normal file
31
code/modules/projectiles/guns/projectile/shotgun_ch.dm
Normal file
@@ -0,0 +1,31 @@
|
||||
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/quad
|
||||
name = "quad-barreled shotgun"
|
||||
desc = "A shotgun pattern designed to make the most out of the limited machining capability of the frontier. 4 Whole barrels of death, loads using 12 gauge rounds."
|
||||
icon_state = "shotgun_q"
|
||||
item_state = "qshotgun"
|
||||
recoil = 2
|
||||
load_method = SINGLE_CASING|SPEEDLOADER
|
||||
handle_casings = CYCLE_CASINGS
|
||||
max_shells = 4
|
||||
w_class = ITEMSIZE_LARGE
|
||||
force = 5
|
||||
accuracy = 40
|
||||
slot_flags = SLOT_BACK
|
||||
ammo_type = /obj/item/ammo_casing/a12g/pellet
|
||||
caliber = "12g"
|
||||
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 1)
|
||||
ammo_type = /obj/item/ammo_casing/a12g/pellet
|
||||
|
||||
burst_delay = 0
|
||||
|
||||
firemodes = list(
|
||||
list(mode_name="fire one barrel at a time", burst=1),
|
||||
)
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn/alt
|
||||
icon_state = "shotpistol"
|
||||
accuracy = 40
|
||||
|
||||
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn/alt/holy // A Special Skin for the sawn off,makes it look like the sawn off from Blood.
|
||||
ammo_type = /obj/item/ammo_casing/a12g/silver
|
||||
holy = 1
|
||||
@@ -1,3 +1,15 @@
|
||||
/obj/item/projectile
|
||||
/// If this projectile is holy. Silver bullets, etc. Currently no effects.
|
||||
var/holy = 0
|
||||
|
||||
/obj/item/projectile/bullet/pellet/shotgun/silver
|
||||
name = "shrapnel"
|
||||
fire_sound = 'sound/weapons/weaponsounds_shotgunshot.ogg'
|
||||
damage = 10
|
||||
SA_bonus_damage = 16 // Potential 156 Damage against demons at point blank.
|
||||
SA_vulnerability = MOB_CLASS_DEMONIC | MOB_CLASS_ABERRATION
|
||||
embed_chance = -1
|
||||
pellets = 6
|
||||
range_step = 1
|
||||
spread_step = 20
|
||||
holy = 1
|
||||
BIN
icons/mob/items/64x64_lefthand_ch.dmi
Normal file
BIN
icons/mob/items/64x64_lefthand_ch.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 918 B |
BIN
icons/mob/items/64x64_righthand_ch.dmi
Normal file
BIN
icons/mob/items/64x64_righthand_ch.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 925 B |
BIN
sound/weapons/weaponsounds_alienlaser.ogg
Normal file
BIN
sound/weapons/weaponsounds_alienlaser.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_heavypistolshot.ogg
Normal file
BIN
sound/weapons/weaponsounds_heavypistolshot.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_heavyrifleshot.ogg
Normal file
BIN
sound/weapons/weaponsounds_heavyrifleshot.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_lasermid.ogg
Normal file
BIN
sound/weapons/weaponsounds_lasermid.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_laserstrong.ogg
Normal file
BIN
sound/weapons/weaponsounds_laserstrong.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_laserstrongALT.ogg
Normal file
BIN
sound/weapons/weaponsounds_laserstrongALT.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_laserweak.ogg
Normal file
BIN
sound/weapons/weaponsounds_laserweak.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_pistolshot.ogg
Normal file
BIN
sound/weapons/weaponsounds_pistolshot.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_rifleshot.ogg
Normal file
BIN
sound/weapons/weaponsounds_rifleshot.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_shotgunshot.ogg
Normal file
BIN
sound/weapons/weaponsounds_shotgunshot.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/weaponsounds_smallpistolshot.ogg
Normal file
BIN
sound/weapons/weaponsounds_smallpistolshot.ogg
Normal file
Binary file not shown.
@@ -1555,6 +1555,7 @@
|
||||
#include "code\game\objects\structures\ledges.dm"
|
||||
#include "code\game\objects\structures\lightpost.dm"
|
||||
#include "code\game\objects\structures\loot_piles.dm"
|
||||
#include "code\game\objects\structures\loot_piles_ch.dm"
|
||||
#include "code\game\objects\structures\low_wall.dm"
|
||||
#include "code\game\objects\structures\map_blocker_vr.dm"
|
||||
#include "code\game\objects\structures\medical_stand_vr.dm"
|
||||
@@ -2065,6 +2066,7 @@
|
||||
#include "code\modules\clothing\head\flowercrowns.dm"
|
||||
#include "code\modules\clothing\head\hardhat.dm"
|
||||
#include "code\modules\clothing\head\helmet.dm"
|
||||
#include "code\modules\clothing\head\helmet_ch.dm"
|
||||
#include "code\modules\clothing\head\helmet_vr.dm"
|
||||
#include "code\modules\clothing\head\hood.dm"
|
||||
#include "code\modules\clothing\head\hood_vr.dm"
|
||||
@@ -2820,6 +2822,7 @@
|
||||
#include "code\modules\mob\_modifiers\traits_phobias.dm"
|
||||
#include "code\modules\mob\_modifiers\unholy.dm"
|
||||
#include "code\modules\mob\dead\corpse.dm"
|
||||
#include "code\modules\mob\dead\corpse_ch.dm"
|
||||
#include "code\modules\mob\dead\corpse_vr.dm"
|
||||
#include "code\modules\mob\dead\death.dm"
|
||||
#include "code\modules\mob\dead\observer\free_vr.dm"
|
||||
@@ -3202,6 +3205,7 @@
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\mouse_army_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm"
|
||||
@@ -3220,15 +3224,18 @@
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\cultist_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\cyber_horror_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm"
|
||||
@@ -3267,6 +3274,7 @@
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct_ch.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm"
|
||||
#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm"
|
||||
@@ -3730,6 +3738,7 @@
|
||||
#include "code\modules\projectiles\ammunition\magazines_yw.dm"
|
||||
#include "code\modules\projectiles\ammunition\magnetic.dm"
|
||||
#include "code\modules\projectiles\ammunition\rounds.dm"
|
||||
#include "code\modules\projectiles\ammunition\rounds_ch.dm"
|
||||
#include "code\modules\projectiles\ammunition\rounds_yw.dm"
|
||||
#include "code\modules\projectiles\ammunition\smartmag.dm"
|
||||
#include "code\modules\projectiles\ammunition\zz_autolathe_ch.dm"
|
||||
@@ -3812,6 +3821,7 @@
|
||||
#include "code\modules\projectiles\guns\projectile\revolver_yw.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\semiauto.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\shotgun_ch.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\shotgun_yw.dm"
|
||||
#include "code\modules\projectiles\guns\projectile\smartgun.dm"
|
||||
|
||||
Reference in New Issue
Block a user