Merge pull request #3203 from BlackMajor/cit-mobs

Porting a hefty chunk of Citadel mobs.
This commit is contained in:
Nadyr
2022-01-29 17:09:18 -05:00
committed by GitHub
49 changed files with 3799 additions and 21 deletions

View File

@@ -15,3 +15,19 @@
suit = /obj/item/clothing/suit/pirate
back = /obj/item/weapon/tank/jetpack/oxygen
flags = OUTFIT_HAS_JETPACK
//CHOMPAdd
/decl/hierarchy/outfit/pirate/vox
name = "Vox Raider"
uniform = /obj/item/clothing/under/color/black
suit = /obj/item/clothing/suit/armor/vox_scrap
shoes = /obj/item/clothing/shoes/magboots/vox
gloves = /obj/item/clothing/gloves/light_brown
mask = /obj/item/clothing/mask/breath
back = /obj/item/weapon/tank/vox
l_hand = /obj/item/weapon/melee/energy/sword/pirate
r_hand = /obj/item/weapon/gun/projectile/shotgun/pump/rifle/vox_hunting
l_pocket = /obj/item/ammo_magazine/clip/c762
r_pocket = /obj/item/ammo_magazine/clip/c762
var/faction = "voxpirate"

View File

@@ -1,3 +1,39 @@
//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_ch.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)
w_class = ITEMSIZE_HUGE
can_cleave = 1
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)
..()

View File

@@ -0,0 +1,108 @@
//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/mob/animal_ch.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_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_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"

View File

@@ -0,0 +1,116 @@
//Vox Pirate Saylist
/datum/say_list/merc/voxpirate
speak = list("Lookings for scrap, yaya.",
"Tank is lookings low.",
"Knowings should haves stayed on the Ark.",
"Quills itchings...",
"Cravings Teshari on stick.",
"Plates locking up. Not good.")
emote_see = list("sniffs", "coughs", "taps his foot", "looks around", "checks his equipment")
say_understood = list("Yayaya!")
say_cannot = list("Skreking negatives!", "Can't do that.")
say_maybe_target = list("Who's theres?", "Is hearing things?")
say_got_target = list("Dust!", "Easy loot!")
say_threaten = list("Gets out of heres!")
say_stand_down = list("Yaya, runs!", "Kikikiki!")
say_escalate = list("Skrek!", "Bringings it!", "Takings shot", "Lock claws!")
//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")
//Roach Saylists Woo Hoo
/datum/say_list/roach
speak = list("Chitter!","Chk chk!","Tchk?")
emote_hear = list("chitters","chirps","shuffles")
emote_see = list("rubs its antennae", "skitters", "clacks across the floor")
/datum/say_list/possessed
speak = list("Where am I?",
"Why am I here?",
"Where did everyone go?")
emote_hear = list("lets out a mournful cry.", "can be heard sobbing.", "groans out in pain.")
emote_see = list("kneels down for a moment, picking something up before casting it away.","stands as still as a statue.", "looks to be doing some kind of work.")
say_maybe_target = list("Is there someone there?", "Who's there?")
say_got_target = list("You! You help people!", "Can you help me?", "I'm lost!")
say_threaten = list("Help me!", "Please help!", "Hey, who turned out the lights?", "Allonsy!", "Geronimo!")
say_stand_down = list("Please. Anyone. Help!", "Where is everyone?", "Where am I?")
say_escalate = list("Help!", "I'm sorry!", "I can't stop!", "I don't want to do this!", "I don't want to go!")
/datum/say_list/merc/elite // colder. also, actually just assholes.
speak = list("I got better pay on my last job.",
"So, y'think we'll get to shoot anyone today?",
"Fuck, I hate those guys.",
"Would be nice for something to happen, for once.",
"Think those NT shits'll rear their heads?",
"Any of you see anything recently?")
emote_see = list("taps his foot", "looks around coldly", "checks his equipment", "rummages in his webbing")
say_understood = list("Aff.", "Affirmative.", "Copy.", "Understood.")
say_cannot = list("Neg.", "Negative.")
say_maybe_target = list("I heard something.")
say_got_target = list("Oh, good, I needed more range fodder.", "I'm going to enjoy this.", "I see you.", "Not quiet enough.")
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.")
/datum/say_list/possessed
speak = list("Where am I?",
"Why am I here?",
"Where did everyone go?")
emote_hear = list("lets out a mournful cry.", "can be heard sobbing.", "groans out in pain.")
emote_see = list("kneels down for a moment, picking something up before casting it away.","stands as still as a statue.", "looks to be doing some kind of work.")
say_maybe_target = list("Is there someone there?", "Who's there?")
say_got_target = list("You! You help people!", "Can you help me?", "I'm lost!")
say_threaten = list("Help me!", "Please help!", "Hey, who turned out the lights?", "Allonsy!", "Geronimo!")
say_stand_down = list("Please. Anyone. Help!", "Where is everyone?", "Where am I?")
say_escalate = list("Help!", "I'm sorry!", "I can't stop!", "I don't want to do this!", "I don't want to go!")

View 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

View 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

View File

@@ -0,0 +1,462 @@
/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_ch.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 = 0
/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(!ruptured)
visible_message("<span class='critical'>\The [src]'s tank ruptures!</span>")
ruptured = 1
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(explosion_delay_lower, explosion_delay_upper)
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, explosion_dev_range, explosion_heavy_range, explosion_light_range, explosion_flash_range)
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
var/cloaked_bonus_damage = 20
var/cloaked_weaken_amount = 3
var/cloak_cooldown = 10 SECONDS
var/last_uncloak = 0
/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
/mob/living/simple_mob/animal/space/mouse_army/stealth/uncloak()
last_uncloak = world.time
if(!cloaked)
return
animate(src, alpha = initial(alpha), time = 1 SECOND)
cloaked = FALSE
/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
/mob/living/simple_mob/animal/space/mouse_army/stealth/handle_special()
if(!cloaked && can_cloak())
cloak()
/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 ..()
/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()
..()
/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/mob/animal_ch.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/dragonflame
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

View File

@@ -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.

View File

@@ -5,8 +5,8 @@
// Probably shouldn't use this directly, there are a bunch of sub-classes that are more complete.
/mob/living/simple_mob/humanoid/merc
name = "mercenary"
desc = "A tough looking heavily-armed individual."
tt_desc = "E Homo sapiens"
desc = "A tough looking individual armed with only a knife." //CHOMPEdit
icon_state = "syndicate"
icon_living = "syndicate"
icon_dead = "syndicate_dead"
@@ -24,8 +24,7 @@
harm_intent_damage = 5
melee_damage_lower = 15 //Tac Knife damage
melee_damage_upper = 15
attack_armor_pen = 20
attack_sharp = TRUE
attack_sharp = 1 //CHOMPEdit
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities
@@ -38,6 +37,7 @@
// Grenade special attack vars
var/grenade_type = /obj/item/weapon/grenade/concussion
var/grenade_timer = 50 //CHOMPEdit
special_attack_cooldown = 45 SECONDS
special_attack_min_range = 2
special_attack_max_range = 7
@@ -71,7 +71,8 @@
var/obj/item/weapon/grenade/G = new grenade_type(get_turf(src))
if(istype(G))
G.throw_at(A, G.throw_range, G.throw_speed, src)
G.attack_self(src)
G.det_time = grenade_timer //CHOMPEdit
G.activate(src) //CHOMPEdit
special_attack_charges = max(special_attack_charges-1, 0)
set_AI_busy(FALSE)
@@ -112,7 +113,7 @@
melee_damage_lower = 30
melee_damage_upper = 30
attack_armor_pen = 50
attack_sharp = TRUE
attack_sharp = 1 //CHOMPEdit
attack_edge = 1
attacktext = list("slashed")

View File

@@ -0,0 +1,513 @@
/datum/category_item/catalogue/fauna/mercenary
name = "Mercenaries"
desc = "Life on the Frontier is hard, and unregulated. Unlike life in \
more 'civlized' areas of the Galaxy, violence and piracy remain common \
this far out. The Megacorporations keep a tight grip on their holdings, \
but there are always small bands or aspiring companies looking to make a \
thaler. From simple pirates to legitimate PMCs, Frontier mercs come in \
all shapes and sizes."
value = CATALOGUER_REWARD_TRIVIAL
unlocked_by_any = list(/datum/category_item/catalogue/fauna/mercenary)
// Obtained by scanning all X.
/datum/category_item/catalogue/fauna/all_mercenaries
name = "Collection - Mercenaries"
desc = "You have scanned a large array of different types of mercenary, \
and therefore you have been granted a large sum of points, through this \
entry."
value = CATALOGUER_REWARD_HARD
unlocked_by_all = list(
/datum/category_item/catalogue/fauna/mercenary/human,
/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper,
/datum/category_item/catalogue/fauna/mercenary/human/grenadier,
/datum/category_item/catalogue/fauna/mercenary/human/space,
/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor,
/datum/category_item/catalogue/fauna/mercenary/vox,
/datum/category_item/catalogue/fauna/mercenary/vox/boarder,
/datum/category_item/catalogue/fauna/mercenary/vox/technician,
/datum/category_item/catalogue/fauna/mercenary/vox/suppressor,
/datum/category_item/catalogue/fauna/mercenary/vox/captain
)
/datum/category_item/catalogue/fauna/mercenary/human
name = "Mercenaries - Human"
desc = "Human Mercenary bands are extremely common on the Frontier. Many \
of the modern outfits operating on the fringe today are veterans of the \
Phoron Wars. After the dissolution of the Syndicate, these operatives were \
left without a place to call home. Those who have survived have leveraged \
their experience into a viable trade."
value = CATALOGUER_REWARD_EASY
/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper
name = "Mercenaries - Solar Peacekeeper"
desc = "Activist groups in Civlized Space often raise moral concerns about \
conditions on the Frontier. The more organized groups will sometimes gather \
bands of mercenaries from the core worlds together under the belief that they \
can come out to the Frontier to enforce their way of life. Due to the Frontier \
Act, these 'humanitarian operations' are quickly demolished."
value = CATALOGUER_REWARD_EASY
/datum/category_item/catalogue/fauna/mercenary/human/grenadier
name = "Mercenaries - Grenadier"
desc = "After the Phoron Wars, many deniable operatives on both sides of \
the conflict found that there was no place for them within their home companies \
any more. Left without options, these highly motivated and trained specialists \
often seek revenge, or attempt to carve out their own fiefdoms. Well equipped \
and well trained, these outcasts are not to be taken lightly."
value = CATALOGUER_REWARD_EASY
/datum/category_item/catalogue/fauna/mercenary/human/space
name = "Mercenaries - Commando"
desc = "Commandos, much like their less equipped brethren, are experts in \
wet work. Honing their skills over years of training, the Commando's iconic \
equipment summons memories of the bad old days in any survivor who sees them. \
These mercs make a statement with their equipment - 'I was there. Come get me.' \
It is usually not an idle boast."
value = CATALOGUER_REWARD_EASY
/mob/living/simple_mob/humanoid/merc
icon = 'icons/mob/animal_ch.dmi'
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human)
/mob/living/simple_mob/humanoid/merc/ranged
desc = "A tough looking individual armed with an pistol."
/mob/living/simple_mob/humanoid/merc/ranged/smg
name = "mercenary soldier"
desc = "A tough looking individual armed with an submachine gun."
/mob/living/simple_mob/humanoid/merc/ranged/smg/sol
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/peacekeeper)
/mob/living/simple_mob/humanoid/merc/ranged/laser
name = "mercenary marksman"
desc = "A tough looking individual armed with an laser rifle."
/mob/living/simple_mob/humanoid/merc/ranged/ionrifle
name = "mercenary anti-technical"
desc = "A tough looking individual armed with an ion rifle."
//Garand
/mob/living/simple_mob/humanoid/merc/ranged/garand
name = "mercenary rifleman"
desc = "A tough looking individual armed with a semiautomatic rifle."
icon_state = "syndicateranged_veteran"
icon_living = "syndicateranged_veteran"
projectiletype = /obj/item/projectile/bullet/rifle/a762
projectilesound = 'sound/weapons/Gunshot_heavy.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/garand = 100)
reload_max = 8
reload_time = 2 // It takes a bit to jam a stripper clip into the rifle.
//Hand Cannon
/mob/living/simple_mob/humanoid/merc/ranged/deagle
name = "mercenary officer"
desc = "A tough looking individual armed with an handcannon."
icon_state = "syndicate_handcannon"
icon_living = "syndicate_handcannon"
projectiletype = /obj/item/projectile/bullet/pistol/strong
projectilesound = 'sound/weapons/Gunshot_deagle.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/deagle = 100)
needs_reload = TRUE
reload_max = 7 // Deagle Reload
/mob/living/simple_mob/humanoid/merc/ranged/grenadier
name = "mercenary grenadier"
desc = "A tough looking individual armed with a shotgun and a belt of grenades."
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/grenadier)
/mob/living/simple_mob/humanoid/merc/melee/sword/space
name = "mercenary commando"
desc = "A tough looking individual, armred with an energy sword and shield."
icon_state = "syndicatespace-melee"
icon_living = "syndicatespace-melee"
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/space)
/mob/living/simple_mob/humanoid/merc/ranged/space
name = "armored mercenary"
desc = "A tough looking individual, armed with a submachine gun."
icon_state = "syndicatespace-ranged"
icon_living = "syndicatespceace-ranged"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit.
base_attack_cooldown = 5 // Two attacks a second or so.
reload_max = 20
loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100)
//Combat Shotgun Merc
/mob/living/simple_mob/humanoid/merc/ranged/space/shotgun
name = "mercenary tactical"
desc = "A tough looking individual armed with a combat shotgun."
icon_state = "syndicatespace-shotgun"
icon_living = "syndicatespace-shotgun"
base_attack_cooldown = 10
reload_max = 7
reload_time = 2 SECONDS //Takes a While to load all those shells.
projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot
projectilesound = 'sound/weapons/Gunshot_shotgun.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/pump/combat = 100)
//Auto-Shotgun Space Merc
/mob/living/simple_mob/humanoid/merc/ranged/space/shotgun/auto
name = "mercenary sweeper"
desc = "A tough looking individual armed with an automatic shotgun."
icon_state = "syndicatespace-ashotgun"
icon_living = "syndicatespace-ashotgun"
base_attack_cooldown = 5 // Two attacks a second or so.
reload_max = 24
projectiletype = /obj/item/projectile/bullet/pellet/shotgun // Buckshot
projectilesound = 'sound/weapons/Gunshot_shotgun.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/automatic/as24 = 100)
ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor
//Machine Gun Merc
/mob/living/simple_mob/humanoid/merc/ranged/space/heavy
name = "mercenary heavy gunner"
desc = "A tough looking individual armed with an light machinegun."
icon_state = "syndicatespace-heavy"
icon_living = "syndicatespace-heavy"
base_attack_cooldown = 2.5 // Four Attacks a Second. MOAR DAKKA
reload_max = 50
projectiletype = /obj/item/projectile/bullet/rifle/a545
projectilesound = 'sound/weapons/Gunshot_light.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/automatic/l6_saw = 100)
ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor
//Tommy-Las Merc
/mob/living/simple_mob/humanoid/merc/ranged/space/tommylas
name = "mercenary light burster"
desc = "A tough looking individual armed with an automatic laser."
icon_state = "syndicatespace-tommylas"
icon_living = "syndicatespace-tommylas"
base_attack_cooldown = 2.5 // Four Attacks a Second. MOAR DAKKA
reload_max = 3
reload_time = 0.5 // Meant to Simulate controlled Supressive Bursts
projectiletype = /obj/item/projectile/beam/weaklaser
projectilesound = 'sound/weapons/Laser.ogg'
loot_list = list(/obj/item/weapon/gun/energy/tommylaser = 100)
ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor
/mob/living/simple_mob/humanoid/merc/ranged/space/fal
name = "mercenary commando"
desc = "A tough looking individual armed with a assault rifle."
icon_state = "syndicatespace-commando"
icon_living = "syndicatespace-commando"
projectiletype = /obj/item/projectile/bullet/rifle/a762
projectilesound = 'sound/weapons/Gunshot_heavy.ogg'
loot_list = list(/obj/item/weapon/gun/projectile/automatic/fal = 100)
reload_max = 20
// suppressors are just assholes and are intended to be a piss poor experience for everyone on both sides
/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor
name = "Mercenaries - Suppressor"
desc = "Just because the Phoron Wars are over, it doesn't mean that covert \
actions and corporate espionage ended too. When you encounter mercs with \
the latest gear and the best training, you can bet your bottom Thaler that \
they've got a Corporate sponsor backing them up."
value = CATALOGUER_REWARD_MEDIUM
/datum/ai_holder/simple_mob/merc/ranged/suppressor
respect_alpha = FALSE // he really just shoots you
vision_range = 10 // plutonia experience
conserve_ammo = FALSE
/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor // adminspawn only, and also Probably Going To Kill The Unprepared
name = "mercenary suppressor"
desc = "Geeze, weren't shotgun ops bad enough? At least when you fade these jerks you get a flashbang to the face."
icon_state = "syndi-ranged-space-sup"
icon_living = "syndi-ranged-space-sup"
armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 100) // this is the merc rig's stats
ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/suppressor
say_list_type = /datum/say_list/merc/elite
projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/suppressor // it's high velocity
projectilesound = 'sound/weapons/doompistol.ogg' // converted from .wavs extracted from doom 2
base_attack_cooldown = 3 // three? attacks a second
reload_max = 30 // extended mags
special_attack_charges = 5
loot_list = list() // oh, you killed him?
corpse = null // well, sorry, buddy, he doesn't drop shit
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/human/space/suppressor)
// var/deathnade_path = /obj/item/grenade/flashbang/stingbang
/* far too fun for the codebase at the moment
/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/death()
// you thought killing him would be the least of your worries?
// think again
var/obj/item/grenade/banger = new deathnade_path(get_turf(src))
banger.throw_at(ai_holder.target, 9, 9, null)
banger.det_time = 25
banger.activate(null)
..()
*/
/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/elite // really reconsider why you're spawning this dude
name = "mercenary elite suppressor"
desc = "Geeze, weren't normal suppressors bad enough? At least if you fade this jerk, you'll have an awful time anyway."
icon_state = "syndi-ranged-space-sup-elite"
icon_living = "syndi-ranged-space-sup-elite"
armor = list(melee = 80, bullet = 70, laser = 55, energy = 15, bomb = 80, bio = 100, rad = 100) // see code for military hardsuit
projectiletype = /obj/item/projectile/bullet/pistol/medium/ap/suppressor/turbo // fuck it, fast bullets
grenade_type = /obj/item/weapon/grenade/shooter/rubber // don't group up
grenade_timer = 30 // well, look what you've done, you've grouped up
// deathnade_path = /obj/item/grenade/flashbang/stingbang/shredbang // REALLY don't group up
// being Actual Professionals, they have better (read: player-level) blocking chances
/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/attackby(var/obj/item/O, var/mob/user)
if(O.force)
if(prob(50))
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
visible_message("<span class='warning'>\The [user] gently taps [src] with \the [O].</span>")
/mob/living/simple_mob/humanoid/merc/ranged/space/suppressor/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(50))
visible_message("<span class='warning'>[src] blocks [Proj] with its shield!</span>")
if(Proj.firer)
ai_holder.react_to_attack(Proj.firer)
return
else
////////////////////////////////
// Vox Pirates
////////////////////////////////
//Classifying these as Mercs, due to the general power level I want them at.
/datum/category_item/catalogue/fauna/mercenary/vox
name = "Mercenaries - Vox"
desc = "For centuries the Vox have inflicted their way of life upon the \
Galaxy. Regarded with distrust due to their tendency to engage in piracy \
and violence, the Vox are equally feared for their robust physiology and \
curiously advanced xenotech. Due to ancient compacts, Vox pirates try to \
avoid bloodshed, but will react to violence in kind."
value = CATALOGUER_REWARD_MEDIUM
unlocked_by_any = list(/datum/category_item/catalogue/fauna/mercenary/vox)
/mob/living/simple_mob/humanoid/merc/voxpirate //Don't use this one.
name = "vox mannequin"
desc = "You shouldn't be seeing this one."
icon = 'icons/mob/animal_ch.dmi'
icon_state = "voxpirate"
icon_living = "voxpirate"
icon_dead = "voxpirate_dead"
faction = "voxpirate"
movement_cooldown = 4
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 20 //Vox Hunting rifle blade damage
melee_damage_upper = 20
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Matching Merc voidsuit stats to represent toughness.
min_oxy = 0 //Vox are spaceproof.
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
corpse = /obj/effect/landmark/mobcorpse/vox/pirate
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/pump/rifle/vox_hunting = 100,
/obj/item/ammo_magazine/clip/c762 = 30,
/obj/item/ammo_magazine/clip/c762 = 30
)
ai_holder_type = /datum/ai_holder/simple_mob/merc
say_list_type = /datum/say_list/merc/voxpirate
/mob/living/simple_mob/humanoid/merc/voxpirate/pirate
name = "vox pirate"
desc = "A desperate looking Vox. Get your gun."
projectiletype = /obj/item/projectile/bullet/rifle/a762
projectilesound = 'sound/weapons/riflebolt.ogg'
needs_reload = TRUE
reload_max = 20
////////////////////////////////
// Vox Melee
////////////////////////////////
/datum/category_item/catalogue/fauna/mercenary/vox/boarder
name = "Mercenaries - Vox Boarder"
desc = "Vox are squat creatures, with powerful muscles and tough, scaly \
hides. Their dense bones and sharp talons make them a formidable threat in \
close quarters combat. Low level Vox weaponry generally emphasizes closing \
the distance to exploit these facts."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/merc/voxpirate/boarder
name = "vox melee boarder"
desc = "A howling Vox with a sword. Run."
icon_state = "voxboarder_m"
icon_living = "voxboarder_m"
icon_dead = "voxboarder_m_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/boarder)
melee_damage_lower = 30 //Energy sword damage
melee_damage_upper = 30
attack_sharp = 1
attack_edge = 1
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
corpse = /obj/effect/landmark/mobcorpse/vox/boarder_m
loot_list = list(/obj/item/weapon/melee/energy/sword = 100)
// They're good with the swords? I dunno. I like the idea they can deflect.
/mob/living/simple_mob/humanoid/merc/voxpirate/boarder/attackby(var/obj/item/O, var/mob/user)
if(O.force)
if(prob(20))
visible_message("<span class='danger'>\The [src] blocks \the [O] with its sword!</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/voxpirate/boarder/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(35))
visible_message("<span class='warning'>[src] blocks [Proj] with its sword!</span>")
if(Proj.firer)
ai_holder.react_to_attack(Proj.firer)
return
else
..()
////////////////////////////////
// Vox Ranged
////////////////////////////////
/mob/living/simple_mob/humanoid/merc/voxpirate/boarder
name = "vox ranged boarder"
desc = "A howling Vox with a shotgun. Get to cover!"
icon_state = "voxboarder_r"
icon_living = "voxboarder_r"
icon_dead = "voxboarder_r_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/boarder)
projectiletype = /obj/item/projectile/bullet/pellet/shotgun
projectilesound = 'sound/weapons/Gunshot_shotgun.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive
corpse = /obj/effect/landmark/mobcorpse/vox/boarder_r
loot_list = list(/obj/item/weapon/gun/projectile/shotgun/pump/combat = 100,
/obj/item/ammo_magazine/m12gdrum = 30,
/obj/item/ammo_magazine/m12gdrum = 30
)
needs_reload = TRUE
reload_max = 10
/datum/category_item/catalogue/fauna/mercenary/vox/technician
name = "Mercenaries - Vox Technician"
desc = "The belief that Vox are unintelligent comes largely from a kind \
of anthrochauvanism. Due to their difficulty speaking GalCom and their tendency \
to resort to underhanded methods, the Galaxy sees Vox as brutal, unintelligent \
aliens. In reality, Vox are just as intelligent as everyone else, as the state \
of their technology shows. Vox Technicians maintain ancient vessels and tools \
with scraps and odd bits, often recieving no external recognition for their work."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/merc/voxpirate/technician
name = "vox salvage technician"
desc = "A screeching Vox with an ion rifle. Usually sent on scrapping operations."
icon_state = "voxboarder_t"
icon_living = "voxboarder_t"
icon_dead = "voxboarder_t_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/technician)
projectiletype = /obj/item/projectile/ion
projectilesound = 'sound/weapons/Laser.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
corpse = /obj/effect/landmark/mobcorpse/vox/boarder_t
loot_list = list(/obj/item/weapon/gun/energy/ionrifle)
needs_reload = TRUE
reload_max = 25 //Suppressive tech weapon.
/datum/category_item/catalogue/fauna/mercenary/vox/suppressor
name = "Mercenaries - Vox Suppressor"
desc = "Among Vox bands, Suppressors are an even more motley crew. \
Staying true to the name, Suppressors are veteran Vox pirates who have \
faced hundreds of engagements. Tough and well suited for violence, these \
Vox wear bright, mismatching colors into battle to draw attention. Serving \
as a beacon to draw eyes away from their companions, Suppressors wield the \
fearsome Sonic Cannon - a booming directed frequency device capable of \
wreaking havoc all its own. It doesn't sound half bad either, when it isn't \
pointed at you."
value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/humanoid/merc/voxpirate/ranged/suppressor
name = "vox suppressor"
desc = "Come on, feel the noise!"
icon_state = "voxsuppressor"
icon_living = "voxsuppressor"
icon_dead = "voxsuppresor_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/suppressor)
armor = list(melee = 30, bullet = 50, laser = 60, energy = 30, bomb = 35, bio = 100, rad = 100) // Boosted armor to represent Tank role.
projectiletype = /obj/item/projectile/sonic/weak
projectilesound = 'sound/effects/basscannon.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/destructive
corpse = /obj/effect/landmark/mobcorpse/vox/suppressor
loot_list = list(/obj/item/weapon/gun/energy/sonic = 100)
base_attack_cooldown = 5 // Two attacks a second or so.
needs_reload = TRUE
reload_max = 30 //Gotta lay down that fire, son.
/datum/category_item/catalogue/fauna/mercenary/vox/captain
name = "Mercenaries - Vox Captain"
desc = "Accomplished Vox who bring in scrap reliably eventually become the \
'Quills' of their own expeditions. This Vox term is considered analagous to \
the word 'Captain'. As such, any Vox who has attained this rank has certainly \
earned the powerful equipment they carry into combat: Dark Matter cannons, \
advanced armor, proper Hunting Rifles - the list goes on. The Vox Captain \
is a formidable opponent, honed by years of hard living and harder fighting. \
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/ranged/captain
name = "vox pirate captain"
desc = "Walkings the plank, dustlung! Yayaya."
icon_state = "voxcaptain"
icon_living = "voxcaptain"
icon_dead = "voxcaptain_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/mercenary/vox/captain)
armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 100, rad = 100) // Vox RIG armor values.
projectiletype = /obj/item/projectile/beam/darkmatter
projectilesound = 'sound/weapons/eLuger.ogg'
ai_holder_type = /datum/ai_holder/simple_mob/destructive
corpse = /obj/effect/landmark/mobcorpse/vox/captain
loot_list = list(/obj/item/weapon/gun/energy/darkmatter = 100)
needs_reload = TRUE
reload_max = 15 //Other Vox should be carrying ammo.

View File

@@ -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
*/

View File

@@ -0,0 +1,502 @@
///////////////////////////////
// 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"
movement_cooldown = 3
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
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
/mob/living/simple_mob/mechanical/mecha/ripley/pirate
name = "Hull Ripper"
desc = "A Ripley modified by pirates. Sports additional riveted armor plating and a jury rigged machine gun in addition to its hull piercing drill."
catalogue_data = list(/datum/category_item/catalogue/technology/ripley)
icon = 'icons/mob/animal_ch.dmi'
icon_state = "pirate"
faction = "pirate"
wreckage = /obj/structure/loot_pile/mecha/ripley/pirate
maxHealth = 250
heat_resist = 1
armor = list(
"melee" = 30,
"bullet" = 40,
"laser" = 50,
"energy" = 5,
"bomb" = 50,
"bio" = 100,
"rad" = 100
)
projectiletype = /obj/item/projectile/bullet/pistol
base_attack_cooldown = 0.5 SECONDS
needs_reload = TRUE
reload_max = 30
reload_time = 3
/mob/living/simple_mob/mechanical/mecha/ripley/pirate/manned
pilot_type = /mob/living/simple_mob/humanoid/pirate/mate/ranged/bosun
/mob/living/simple_mob/mechanical/mecha/ripley/pirate/last_stand_merc //Special version used as a quasi boss fight
name = "Xeno Ripper"
desc = "A Ripley modified by a desperate merc. It sports additional riveted armor plating splattered with dried xeno blood and a jury rigged machine gun in addition to its drill.\
A repair drone flits around the intimidating mech."
ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive
maxHealth = 170 //Less Health
has_repair_droid = TRUE //But has repair drone
pilot_type = /mob/living/simple_mob/humanoid/possessed/merc/feral //Possessed rig suit piloting a mech. Tremble in fear
movement_shake_radius = 5

View File

@@ -0,0 +1,157 @@
//Rig-Suits with AI or supernatural forces controlling them, a dead person inside.
//The base is based off of the EVA Rig.
//todo: Add catalogue data.
/mob/living/simple_mob/humanoid/possessed
name = "old EVA RIG suit"
desc = "A light hardsuit for repairs and maintenance to the outside of habitats and vessels. Seems to be worn down and damaged. But it seems to still be moving. Is someone in it?"
icon = 'icons/mob/animal_ch.dmi'
icon_state = "eva-rig"
faction = "Possessed"
movement_cooldown = 10
health = 200
maxHealth = 200
taser_kill = 0
var/idle = 4 //how long between the breathing sounds, in seconds.
var/silenced = 0 //Wither or not the sounds and speaking will play.
//It's a RIG. It's spaceproof.
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
harm_intent_damage = 1
melee_damage_lower = 10
melee_damage_upper = 25
attacktext = list("punched", "kicked", "smacked")
attack_sound = "punch"
armor = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100) //This should be the same as the base RIG.
has_hands = 1
humanoid_hands = 1
grab_resist = 100
movement_sound = 'sound/effects/footstep/floor1.ogg'
//Simple mob merc so it stops, says something, then charges.
ai_holder_type = /datum/ai_holder/simple_mob/merc
say_list_type = /datum/say_list/possessed //Set to Null on silenced.
// corpse = /obj/effect/landmark/mobcorpse/possessed
// Will eventually leave a full corpse with an activated RIG on it. But not yet.
//Miasma Cloud "Item"
/obj/item/weapon/grenade/chem_grenade/miasma
name = "Miasma Bomb"
desc = "You probably shouldn't be able to see this."
stage = 2
path = 1
/obj/item/weapon/grenade/chem_grenade/miasma/Initialize(mapload)
. = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
B1.reagents.add_reagent("miasma", 30)
B1.reagents.add_reagent("potassium", 5)
B2.reagents.add_reagent("sugar", 5)
B2.reagents.add_reagent("phosphorus", 5)
beakers += B1
beakers += B2
icon_state = null
detonate()
//Has a chance to play one of the listed sounds when it moves.
/mob/living/simple_mob/humanoid/possessed/Moved()
. = ..()
if(prob(5) && silenced == 0)
playsound(src, pick('sound/h_sounds/headcrab.ogg', 'sound/h_sounds/holla.ogg', 'sound/h_sounds/lynx.ogg', 'sound/h_sounds/mumble.ogg', 'sound/h_sounds/yell.ogg'), 50, 1)
//Plays the sound every ~4 seconds.
/mob/living/simple_mob/humanoid/possessed/Life()
if(idle <= 0 && silenced == 0)
playsound(src, 'sound/h_sounds/breathing.ogg', 60, 1)
idle = 4
idle--
//Dies with a variety of messages, a disgusting sound, then drops the control module, bones, blood, gibs, and a cloud of miasma.
/mob/living/simple_mob/humanoid/possessed/Destroy()
var/droploc = get_turf(src)
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
visible_message(span("critical", pick("\The The horrid screech of metal grating metal cuts through the air as the suit's interlocking joints grind and fold inwards upon itself. A putrid wash of decayed flesh spills forwards, staining the ground dark with the contents of the collapsing RIG's long expired pilot.",
"\The The [src] shudders as some hurt living thing, reeling as screaming servos overcompensate beneath the weight of that debilitating strike - the horrid sounds of shattered metal resonate as the RIG rips itself apart. Limbs flung about in distinctly inhuman motions in a final failed effort at balance before buckling inwards at the joints, hydraulic fluid jettisoned as blood from a severed artery as the long liquidized contents of the suit's ex-pilot spill from its chassis in a thick slurry.",
"\The Hissing atmosphereic valves pop and snap, breaking the ageless seal as the putrid stench of rot and carrion assaults the senses in debilitating waves. The damaged RIG's visor alight with warnings of hazardous atmospheric conditions as a final distorted scream echos from within the damaged chassis. The fetid miasma that breeches through those wheezing seals overtaken by a wet burble and plop as the suit is bathed in the liquid contents of its passenger, blackened flesh fed through those narrow seals as rotten grounds.",
"\The The timeworn suit's seals finally crack open with a hiss - spilling forth a thick fungal mist. The control module ejects from the rig as it loses all control impulses - leaving behind but a pile of bones and the rotten sludge it had been swimming in for heaven knows how long.",
"\The The [src]'s emergency protocols kick in, retracting around the former-person, who's now little more than a disgusting pile of parts not even a vulture would want. The control module appears to be intact, however.",
"\The The suit finally lets go of the prisoner it had held for so long. Unfortunately, this guy reminds you of that news report of someone who forgot that Ganymede rock lobster in a fridge for a year, the thick miasma of fungi and rotten gasses visibly pouring out, pushing out rancid bits of meat and slimy bones. The only salvageable bit appears to be the Control Module.",
"\The A few last desperate seals give out with a weary series of pops, and the suit contorts with the final pressure differentials resolved: the suit tangles and leaks, and finally compacts back into it's rightful shape.",
"\The Tightening, the suit re-attempts to remain it's current form, before it collapses under the stress, supporting mechanisms closing in on themselves like a noose with nothing left to catch on.",
"\The The suit makes a noise akin to clockwork binding, and shutters, before something imperceptible gives with an abysmal noise and the suit returns to it's default form.")))
gib()
/* Nah
if(rand(1,2) == 1)
new rig1(droploc)
else
new rig2(droploc)
*/
new /obj/effect/decal/remains/human(droploc)
new /obj/item/weapon/grenade/chem_grenade/miasma(droploc)
/*Broken smoke spawn code. Above line is a bandaid.
var/datum/reagents/R = new/datum/reagents(30)
reagents.add_reagent("miasma", 30)
var/datum/effect_system/smoke_spread/chem/S = new /datum/effect_system/smoke_spread/chem
S.attach(droploc)
S.set_up(R, 30, 0, droploc)
spawn(0)
S.start()*/
..()
//What about if someone's in it? Well here you go.
/mob/living/simple_mob/humanoid/possessed/Login()
to_chat(src,"<b>Why are you in this [src]? Why can't you say more than a few phrases? Why. What. Kill. Kill. Kill. Kill. KILL! KILL! KILL!</b> [player_msg]")
/obj/item/weapon/rig/eva/old
name = "old EVA suit control module"
desc = "A light hardsuit for repairs and maintenance to the outside of habitats and vessels. It appears to be pretty old and worn down."
//Now let's make some more!
/mob/living/simple_mob/humanoid/possessed/industrial
name = "old industrial RIG suit"
desc = "A heavy, powerful hardsuit used by construction crews and mining corporations. Seems to be worn down and damaged. But it seems to still be moving. Is someone in it?"
icon_state = "industrial-rig"
loot_list = list(/obj/item/weapon/rig/industrial/old = 100)
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
/obj/item/weapon/rig/industrial/old
name = "old Industrial hardsuit"
desc = "A heavy, powerful hardsuit used by construction crews and mining corporations. It appears to be pretty old and worn down."
/mob/living/simple_mob/humanoid/possessed/merc
name = "old crimson hardsuit"
desc = "A blood-red hardsuit featuring some fairly illegal technology. Seems to be worn down and damaged. But it seems to still be moving. Is someone in it?"
icon_state = "merc-rig"
loot_list = list(/obj/item/weapon/rig/merc/old = 100)
armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60)
/obj/item/weapon/rig/merc/old
name = "old crimson hardsuit control module"
desc = "A blood-red hardsuit featuring some fairly illegal technology. It appears to be pretty old and worn down."
/mob/living/simple_mob/humanoid/possessed/merc/feral // Special one that moves faster attacks faster. Intended as a special mech pilot
desc = "A blood-red hardsuit featuring some fairly illegal technology. Seems to be worn down and damaged but moving with surprising speed!"
movement_cooldown = 3 //You can try running
base_attack_cooldown = 3 //You will just die tired
melee_miss_chance = 25 //Not very coordinated though

View File

@@ -0,0 +1,343 @@
//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 struck", "lunged against", "battered")
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 = "splattered 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
var/cloaked_alpha = 30
var/cloaked_bonus_damage = 30
var/cloaked_weaken_amount = 3
var/cloak_cooldown = 10 SECONDS
var/last_uncloak = 0
/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
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/uncloak()
last_uncloak = world.time
if(!cloaked)
return
animate(src, alpha = initial(alpha), time = 1 SECOND)
cloaked = FALSE
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/break_cloak()
uncloak()
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/is_cloaked()
return cloaked
/mob/living/simple_mob/mechanical/cyber_horror/tajaran/handle_special()
if(!cloaked && can_cloak())
cloak()
/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 ..()
/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()
..()
/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

View File

@@ -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

View File

@@ -7,11 +7,11 @@
real_name = "Artificer"
construct_type = "artificer"
desc = "A bulbous construct dedicated to building and maintaining temples to their otherworldly lords."
icon = 'icons/mob/mob.dmi'
//icon = 'icons/mob/mob.dmi' //CHOMPEdit
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.

View File

@@ -7,11 +7,11 @@
real_name = "Harvester"
construct_type = "harvester"
desc = "A tendril-laden construct piloted by a chained mind."
icon = 'icons/mob/mob.dmi'
//icon = 'icons/mob/mob.dmi' CHOMPEdit
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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -36,7 +36,7 @@
new_mimic.real_crate = src
new_mimic.name = name
new_mimic.desc = desc
new_mimic.icon = icon
//new_mimic.icon = icon CHOMPEdit
new_mimic.icon_state = "open"
new_mimic.icon_living = "open"
else
@@ -77,7 +77,7 @@
icon_state = "crate"
icon_living = "crate"
icon = 'icons/obj/storage.dmi'
icon = 'icons/mob/animal_ch.dmi' //CHOMPEdit
faction = "mimic"

View File

@@ -0,0 +1,353 @@
/obj/structure/closet/crate/mimic/airlock
name = "Dusty Airlock"
desc = "It opens and closes. Though it appears it has been a while since it opened."
icon = 'icons/mob/animal_ch.dmi'
icon_state = "amimic"
mimic_chance = 30
anchored = 1 //You will not be able to push back the airlock mimic
density = 1
opacity = 1
/obj/structure/closet/crate/mimic/airlock/open()
if(src.opened)
return 0
if(!src.can_open())
return 0
if(mimic_active)
mimic_active = FALSE
if(prob(mimic_chance))
var/mob/living/simple_mob/vore/aggressive/mimic/airlock/new_mimic = new(loc, src)
visible_message("<font color='red'><b>The [new_mimic] suddenly growls as it turns out to be a mimic!</b></font>") //Controls the vars of the mimic that spawns
forceMove(new_mimic)
new_mimic.real_crate = src
new_mimic.name = name
new_mimic.desc = desc
new_mimic.icon_state = "amimicopen"
new_mimic.icon_living = "amimicopen"
else
qdel(src.loc)
new/obj/machinery/door/airlock/maintenance/common (src.loc) //Places the Airlock
qdel(src)//Deletes the "mimic"
return ..()
else
return ..()
/obj/structure/closet/crate/mimic/airlock/ex_act(severity) //Stores Mimic Contents for later
for(var/obj/O in src.contents)
qdel(O)
qdel(src)
return
/obj/structure/closet/crate/mimic/airlock/damage(var/damage)
if(contents.len)
visible_message("<font color='red'><b>The [src] let's out an enraged screach!</b></font>")
for(var/obj/O in src.contents)
qdel(O)
..()
/obj/structure/closet/crate/mimic/airlock/safe
mimic_chance = 0
/obj/structure/closet/crate/mimic/airlock/guaranteed
mimic_chance = 100
/obj/structure/closet/crate/mimic/airlock/dangerous
mimic_chance = 70
/obj/structure/closet/crate/mimic/airlock/cointoss
mimic_chance = 50
/mob/living/simple_mob/vore/aggressive/mimic/airlock
name = "Maintnence Access"
desc = "It opens and closes."
icon_state = "amimicopen"
icon_living = "amimicopen"
maxHealth = 250
health = 250
movement_cooldown = 10
melee_damage_lower = 15
melee_damage_upper = 30
attack_armor_pen = 50 //Its jaw is an airlock. Its got enough bite strength.
armor = list(
"melee" = 70,
"bullet" = 30,
"laser" = 30,
"energy" = 30,
"bomb" = 10,
"bio" = 100,
"rad" = 100) //Its an airlock.
/mob/living/simple_mob/vore/aggressive/mimic/airlock/will_show_tooltip()
return FALSE
/mob/living/simple_mob/vore/aggressive/mimic/airlock/death()
new/obj/machinery/door/airlock/maintenance/common (src.loc)
real_crate = null
qdel(src)
//Less Terrifying Closet Mimic
/obj/structure/closet/crate/mimic/closet
name = "old closet"
desc = "It's a basic storage unit. It seems awfully rickety."
icon = 'icons/mob/animal_ch.dmi'
icon_state = "cmimic"
mimic_chance = 30
mimic_active = TRUE
/obj/structure/closet/crate/mimic/closet/update_icon()
if(opened)
icon_state = "copen"
else
icon_state = "cmimic"
/obj/structure/closet/crate/mimic/closet/open()
if(src.opened)
return 0
if(!src.can_open())
return 0
if(mimic_active)
mimic_active = FALSE
if(prob(mimic_chance))
var/mob/living/simple_mob/vore/aggressive/mimic/closet/new_mimic = new(loc, src)
visible_message("<font color='red'><b>The [new_mimic] suddenly growls as it turns out to be a mimic!</b></font>") //Controls the mimic that spawns
forceMove(new_mimic)
new_mimic.real_crate = src
new_mimic.name = name
new_mimic.desc = desc
new_mimic.icon_state = "cmimicopen"
new_mimic.icon_living = "cmimicopen"
else
return ..()
else
return ..()
/obj/structure/closet/crate/mimic/closet/ex_act(severity) //Stores Mimic Contents for later
for(var/obj/O in src.contents)
qdel(O)
qdel(src)
return
/obj/structure/closet/crate/mimic/closet/damage(var/damage)
if(contents.len)
visible_message("<font color='red'><b>The [src] makes out a crunchy noise as its contents are destroyed!</b></font>")
for(var/obj/O in src.contents)
qdel(O)
..()
/obj/structure/closet/crate/mimic/closet/safe
mimic_chance = 0
mimic_active = FALSE
/obj/structure/closet/crate/mimic/closet/guaranteed
mimic_chance = 100
/obj/structure/closet/crate/mimic/closet/dangerous
mimic_chance = 70
/obj/structure/closet/crate/mimic/closet/cointoss
mimic_chance = 50
/mob/living/simple_mob/vore/aggressive/mimic/closet
name = "old closet"
desc = "It's a basic storage unit. It seems awfully rickety."
icon_state = "cmimicopen"
icon_living = "cmimicopen"
maxHealth = 150
health = 150
movement_cooldown = 7
melee_damage_lower = 10
melee_damage_upper = 20
attack_armor_pen = 25 // NOM NOM
armor = list(
"melee" = 10,
"bullet" = 20,
"laser" = 20,
"energy" = 20,
"bomb" = 20,
"bio" = 100,
"rad" = 100)
/mob/living/simple_mob/vore/aggressive/mimic/closet/will_show_tooltip()
return FALSE
/mob/living/simple_mob/vore/aggressive/mimic/closet/death()
..()
if(real_crate)
real_crate.forceMove(loc)
real_crate = null
qdel(src)
//Floor Mimics... Because mimics you have to interact with to activate was not enough...
/obj/effect/floormimic //As Floor Mimics are triggered by bumps rather than click interaction... They are effects rather than structures
name = "loose wooden floor"
desc = "The boards here look rather loose."
density = 0
anchored = 1
icon = 'icons/mob/animal_ch.dmi'
icon_state = "wmimic"
var/mimic_chance = 30
var/mimic_active = TRUE
var/mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor
/obj/effect/floormimic/Crossed(atom/movable/AM)
. = ..()
tryTrigger(AM)
/obj/effect/floormimic/Bumped(atom/movable/AM)
. = ..()
tryTrigger(AM)
/obj/effect/floormimic/proc/tryTrigger(atom/movable/victim)
if(!isliving(victim))
return
var/mob/living/L = victim
if(L.hovering)
return
awaken(L)
/obj/effect/floormimic/proc/awaken(mob/living/L)
if(!mimic_active)
qdel(src)
return
mimic_active = FALSE
if(!prob(mimic_chance))
qdel(src)
return
var/mob/living/simple_mob/vore/aggressive/mimic/floor/new_mimic = new mimic_type(drop_location())
visible_message("<span class='boldwarning'>The [new_mimic] suddenly growls beneath you as it turns out to be a mimic!</span>")
qdel(src)
/obj/effect/floormimic/attackby(obj/item/I, mob/living/L)
if(mimic_active)
awaken(L)
else
return ..()
/obj/effect/floormimic/ex_act(severity)
qdel(src)
/obj/effect/floormimic/safe
mimic_chance = 0
/obj/effect/floormimic/guaranteed
mimic_chance = 100
/obj/effect/floormimic/dangerous
mimic_chance = 70
/obj/effect/floormimic/cointoss
mimic_chance = 50
/mob/living/simple_mob/vore/aggressive/mimic/floor
name = "loose wooden floor"
desc = "The boards here look rather loose."
icon_state = "wmimicopen"
icon_living = "wmimicopen"
faction = "mimic"
maxHealth = 100
health = 100
movement_cooldown = 5
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
melee_damage_lower = 5
melee_damage_upper = 5
base_attack_cooldown = 5
/mob/living/simple_mob/vore/aggressive/mimic/floor/death()
qdel(src)
/obj/effect/floormimic/tile
name = "loose floor tiles"
desc = "The tiles here look rather loose."
density = FALSE
anchored = TRUE
icon_state = "tmimic"
mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor/tile
/obj/effect/floormimic/tile/safe
mimic_chance = 0
/obj/effect/floormimic/tile/guaranteed
mimic_chance = 100
/obj/effect/floormimic/tile/dangerous
mimic_chance = 70
/obj/effect/floormimic/tile/cointoss
mimic_chance = 50
/mob/living/simple_mob/vore/aggressive/mimic/floor/tile
name = "loose floor tiles"
desc = "The tiles here look rather loose."
icon_state = "tmimicopen"
icon_living = "tmimicopen"
faction = "mimic"
maxHealth = 125
health = 125
movement_cooldown = 7
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
melee_damage_lower = 15
melee_damage_upper = 15
base_attack_cooldown = 10
/obj/effect/floormimic/plating
name = "loose plating"
desc = "The plating here looks rather loose."
density = FALSE
anchored = TRUE
icon_state = "pmimic"
mimic_type = /mob/living/simple_mob/vore/aggressive/mimic/floor/plating
/obj/effect/floormimic/plating/safe
mimic_chance = 0
/obj/effect/floormimic/plating/guaranteed
mimic_chance = 100
/obj/effect/floormimic/plating/dangerous
mimic_chance = 70
/obj/effect/floormimic/plating/cointoss
mimic_chance = 50
/mob/living/simple_mob/vore/aggressive/mimic/floor/plating
name = "loose plating"
desc = "The plating here look rather loose."
icon_state = "pmimicopen"
icon_living = "pmimicopen"
faction = "mimic"
maxHealth = 150
health = 150
movement_cooldown = 7
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
melee_damage_lower = 15
melee_damage_upper = 15
base_attack_cooldown = 10
attack_armor_pen = 50

View 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)

View File

@@ -0,0 +1,2 @@
/obj/item/weapon/gun
var/holy = 0 //For Divinely blessed guns

View File

@@ -80,3 +80,33 @@
matter = list("metal" = 350, "glass" = 50)
preserve_item = 1
origin_tech = list(TECH_POWER = 6)
/obj/item/weapon/gun/energy/tommylaser
name = "M-2421 'Tommy-Laser'"
desc = "A automatic laser weapon resembling a Tommy-Gun. Designed by Cybersun Industries to be a man portable supressive fire laser weapon."
icon_state = "tommylas"
item_state = "tommylas"
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
charge_cost = 60 // 40 shots, lay down the firepower
projectile_type = /obj/item/projectile/beam/weaklaser
cell_type = /obj/item/weapon/cell/device/weapon
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 5, TECH_ILLEGAL = 3)
firemodes = list(
list(mode_name="single shot", burst = 1, fire_delay=4, move_delay=null, burst_accuracy = null, dispersion = null),
list(mode_name="three shot bursts", burst=3, fire_delay=10 , move_delay=4, burst_accuracy=list(65,65,65), dispersion=list(1,1,1)),
list(mode_name="short bursts", burst=5, fire_delay=10 ,move_delay=6, burst_accuracy = list(65,65,65,65,65), dispersion = list(4,4,4,4,4)),
)
/obj/item/weapon/gun/energy/zip
name = "Zip-Las"
desc = "A homemade (and somehow safe) laser gun designed around shooting single powerful laser beam draining the cell entirely. Better not miss and better have spare cells."
icon = 'icons/obj/gun_ch.dmi'
icon_state = "ziplas"
item_state = "ziplas"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT|SLOT_BACK
charge_cost = 1500 //You got 1 shot...
projectile_type = /obj/item/projectile/beam/heavylaser //But it hurts a lot
cell_type = /obj/item/weapon/cell/device/weapon

View File

@@ -0,0 +1,27 @@
/obj/item/weapon/gun/projectile/automatic/fal
name = "FN-FAL"
desc = "A 20th century Assault Rifle originally designed by Fabrique National. Famous for its use by mercs in grinding proxy wars in backwater nations. This reproduction was probably made for similar purposes."
icon = 'icons/obj/gun_ch.dmi'
icon_state = "fal"
item_state = "fal"
w_class = ITEMSIZE_LARGE
force = 10
caliber = "7.62mm"
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4)
slot_flags = SLOT_BACK
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/m762m
allowed_magazines = list(/obj/item/ammo_magazine/m762, /obj/item/ammo_magazine/m762m)
projectile_type = /obj/item/projectile/bullet/rifle/a762
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="2-round bursts", burst=2, fire_delay=null, move_delay=6, burst_accuracy=list(60,35), dispersion=list(0.0, 0.6))
)
/obj/item/weapon/gun/projectile/automatic/fal/update_icon(var/ignore_inhands)
..()
if(ammo_magazine)
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-empty"

View File

@@ -0,0 +1,8 @@
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/vox_hunting
name = "vox hunting rifle"
desc = "This ancient rifle bears traces of an assembly meant to house power cells, implying it used to fire energy beams. It has since been crudely modified to fire standard 7.62mm rounds."
icon_state = "vox_hunting"
item_state = "vox_hunting"
ammo_type = /obj/item/ammo_casing/a762
throwforce = 10
force = 20

View File

@@ -0,0 +1,35 @@
/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 = 'icons/obj/gun_ch.dmi'
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
sawn_off = 1
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
sawn_off = 1
icon = 'icons/obj/gun_ch.dmi'
icon_state = "shotpistol"
accuracy = 40
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn/alt/holy
ammo_type = /obj/item/ammo_casing/a12g/silver
holy = 1

View File

@@ -412,3 +412,16 @@ only use the hollow_point and armor_penetration values.*/
/obj/item/projectile/bullet/gyro
old_bullet_act = TRUE
/obj/item/projectile/bullet/pistol/medium/ap/suppressor // adminspawn only
name = "suppressor bullet" // this guy is Important and also Hates You
fire_sound = 'sound/weapons/doompistol.ogg' // converted from .wavs extracted from doom 2
damage = 10 // high rof kinda fucked up lets be real
agony = 10 // brute easily heals, agony not so much
armor_penetration = 30 // reduces shield blockchance
accuracy = -20 // he do miss actually
speed = 0.4 // if the pathfinder gets a funny burst rifle, they deserve a rival
// that's 2x projectile speed btw
/obj/item/projectile/bullet/pistol/medium/ap/suppressor/turbo // spicy boys
speed = 0.2 // this is 4x projectile speed

View File

@@ -0,0 +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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1557,6 +1557,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"
@@ -1868,6 +1869,7 @@
#include "code\modules\ai\ai_holder_targeting_vr.dm"
#include "code\modules\ai\interfaces.dm"
#include "code\modules\ai\say_list.dm"
#include "code\modules\ai\say_list_ch.dm"
#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm"
#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_ch.dm"
#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm"
@@ -2067,6 +2069,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"
@@ -2824,6 +2827,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"
@@ -3213,6 +3217,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"
@@ -3231,14 +3236,19 @@
#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\posessed_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"
@@ -3277,6 +3287,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"
@@ -3317,6 +3328,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\leopardmander_ch.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\lizardman.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic_ch.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm"
@@ -3732,12 +3744,15 @@
#include "code\modules\projectiles\broken.dm"
#include "code\modules\projectiles\dnalocking.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\gun_ch.dm"
#include "code\modules\projectiles\projectile.dm"
#include "code\modules\projectiles\projectile_ch.dm"
#include "code\modules\projectiles\ammunition\magazines.dm"
#include "code\modules\projectiles\ammunition\magazines_vr.dm"
#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"
@@ -3802,9 +3817,11 @@
#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_ch.dm"
#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm"
#include "code\modules\projectiles\guns\projectile\automatic.dm"
#include "code\modules\projectiles\guns\projectile\automatic_ch.dm"
#include "code\modules\projectiles\guns\projectile\automatic_vr.dm"
#include "code\modules\projectiles\guns\projectile\automatic_yw.dm"
#include "code\modules\projectiles\guns\projectile\boltaction.dm"
#include "code\modules\projectiles\guns\projectile\boltaction_ch.dm"
#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm"
#include "code\modules\projectiles\guns\projectile\caseless.dm"
#include "code\modules\projectiles\guns\projectile\contender.dm"
@@ -3818,6 +3835,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"