mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
166
modular_chomp/code/modules/clothing/gateway/gateway.dm
Normal file
166
modular_chomp/code/modules/clothing/gateway/gateway.dm
Normal file
@@ -0,0 +1,166 @@
|
||||
//vr section
|
||||
/obj/item/clothing/head/vrwizard
|
||||
name = "wizard hat"
|
||||
desc = "A pointy pixelated-looking hat, 0s and 1s dancing off the fabric"
|
||||
icon_state = "redwizard"
|
||||
armor = list(melee = 30, bullet = 30, laser = 65, energy = 65, bomb = 70, bio = 100, rad = 100)
|
||||
siemens_coefficient = 0.1
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
min_pressure_protection = 0 * ONE_ATMOSPHERE
|
||||
max_pressure_protection = 3 * ONE_ATMOSPHERE
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
|
||||
/obj/item/clothing/suit/vrwizard
|
||||
name = "wizard robes"
|
||||
desc = "A silky robe with 0s and 1s flying off the seams."
|
||||
icon_state = "redwizard"
|
||||
armor = list(melee = 30, bullet = 30, laser = 65, energy = 65, bomb = 70, bio = 100, rad = 100)
|
||||
siemens_coefficient = 0.1
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
min_pressure_protection = 0 * ONE_ATMOSPHERE
|
||||
max_pressure_protection = 3 * ONE_ATMOSPHERE
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
|
||||
//Candy section
|
||||
/obj/item/clothing/head/psy_crown/candycrown
|
||||
name = "candy crown"
|
||||
desc = "A crown smelling oddly sweet"
|
||||
description_info = "It will occasionally give a momentary buff to offensive capablities."
|
||||
icon_state = "wrathcrown"
|
||||
cooldown_duration = 1 MINUTES // How long the cooldown should be.
|
||||
brainloss_cost = 0
|
||||
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/head/psy_crown/candycrown/activate_ability(var/mob/living/wearer)
|
||||
..()
|
||||
wearer.add_modifier(/datum/modifier/aura/candy_orange, 30 SECONDS)
|
||||
|
||||
/obj/item/clothing/gloves/stamina
|
||||
name = "gloves of stamina"
|
||||
desc = "A strange pair of gloves."
|
||||
description_info = "It has a strange property of restoring hunger."
|
||||
icon_state = "regen"
|
||||
item_state = "graygloves"
|
||||
siemens_coefficient = 0
|
||||
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/gloves/stamina/equipped(var/mob/living/carbon/human/H)
|
||||
if(H && H.gloves == src)
|
||||
wearer = H
|
||||
if(wearer.can_feel_pain())
|
||||
to_chat(H, "<span class='danger'>You feel strange as hunger vanishes!</span>")
|
||||
wearer.custom_pain("Your hands feel strange!",1)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/stamina/dropped(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(wearer)
|
||||
if(wearer.can_feel_pain())
|
||||
to_chat(wearer, "<span class='danger'>You feel hungry!</span>")
|
||||
wearer.custom_pain("Your hands feel strange",1)
|
||||
wearer = null
|
||||
|
||||
/obj/item/clothing/gloves/stamina/New()
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/stamina/Destroy()
|
||||
wearer = null
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/gloves/stamina/process()
|
||||
if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD)
|
||||
return // Robots and dead people don't have a metabolism.
|
||||
wearer.nutrition = max(wearer.nutrition + 8, 0)
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest
|
||||
name = "candy armor"
|
||||
desc = "A really strange armor made of a similar substance as the creatures near it."
|
||||
icon_state = "armor"
|
||||
blood_overlay_type = "armor"
|
||||
armor = list(melee = 70, bullet = 60, laser = 50, energy = 50, bomb = 0, bio = 0, rad = 0)
|
||||
var/tension_threshold = 125
|
||||
var/cooldown = null // world.time of when this was last triggered.
|
||||
var/cooldown_duration = 3 MINUTES // How long the cooldown should be.
|
||||
var/flavor_equip = null // Message displayed to someone who puts this on their head. Drones don't get a message.
|
||||
var/flavor_unequip = null // Ditto, but for taking it off.
|
||||
var/flavor_drop = null // Ditto, but for dropping it.
|
||||
var/flavor_activate = null // Ditto, for but activating.
|
||||
var/brainloss_cost = 0
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest/proc/activate_ability(var/mob/living/wearer)
|
||||
cooldown = world.time + cooldown_duration
|
||||
to_chat(wearer, flavor_activate)
|
||||
to_chat(wearer, "<span class='danger'>The inside of your head hurts...</span>")
|
||||
wearer.adjustBrainLoss(brainloss_cost)
|
||||
wearer.add_modifier(/datum/modifier/aura/candy_blue, 30 SECONDS)
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest/equipped(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(istype(H) && H.head == src && H.is_sentient())
|
||||
START_PROCESSING(SSobj, src)
|
||||
to_chat(H, flavor_equip)
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest/dropped(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
if(H.is_sentient())
|
||||
if(loc == H) // Still inhand.
|
||||
to_chat(H, flavor_unequip)
|
||||
else
|
||||
to_chat(H, flavor_drop)
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest/process()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
if(world.time >= cooldown && L.is_sentient() && L.get_tension() >= tension_threshold)
|
||||
activate_ability(L)
|
||||
|
||||
//vistor section
|
||||
/obj/item/clothing/suit/armor/alien/vistor
|
||||
name = "rocky suit"
|
||||
desc = "A strange set of armor made of rocky plates"
|
||||
description_info = "It always reduces all damage by the same amount, with a 12% chance to block."
|
||||
icon_state = "alien_tank"
|
||||
slowdown = 0
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
armorsoak = list( melee = 12, bullet = 12,laser = 12, energy = 12 , bomb = 0, bio = 0, rad = 0)
|
||||
block_chance = 12
|
||||
|
||||
/obj/item/clothing/suit/armor/tesla/vistor
|
||||
name = "zapping suit"
|
||||
desc = "A strange set of armor crackling with lighting"
|
||||
slowdown = 0
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/vistor
|
||||
name = "vibrating suit"
|
||||
desc = "A strange set of armor that crackles with energy"
|
||||
icon_state = "reactiveoff"
|
||||
slowdown = 0
|
||||
armor = list(melee = 35, bullet = 35, laser = 35, energy = 35, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/armor/protectionbubble
|
||||
name = "protective bubble"
|
||||
desc = "A strange set of armor that seems to coat your entire body in a thing protective bubble"
|
||||
icon_state = "armor"
|
||||
blood_overlay_type = "armor"
|
||||
armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 100, rad = 75)
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
min_pressure_protection = 0 * ONE_ATMOSPHERE
|
||||
max_pressure_protection = 15 * ONE_ATMOSPHERE
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
//scrap section which is on hold till I get foes
|
||||
@@ -0,0 +1,415 @@
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion
|
||||
name = "imperion"
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "imperion"
|
||||
icon_living = "imperion"
|
||||
desc = "A strange precursor mecha"
|
||||
maxHealth = 350
|
||||
health = 350
|
||||
movement_cooldown = -1
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/energy/gaussrifle
|
||||
melee_attack_delay = 4 SECOND
|
||||
damage_fatigue_mult = 0
|
||||
has_repair_droid = TRUE
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
ranged_attack_delay = 1.5 SECONDS
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
armor = list(
|
||||
"melee" = 35,
|
||||
"bullet" = 35,
|
||||
"laser" = 35,
|
||||
"energy" = 35,
|
||||
"bomb" = 35,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase1/do_special_attack(atom/A)
|
||||
. = TRUE // So we don't fire a bolt as well.
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Side gun
|
||||
electric_defense(A)
|
||||
if(I_HURT) // Rockets
|
||||
launch_rockets(A)
|
||||
if(I_GRAB) // Micro-singulo
|
||||
launch_microsingularity(A)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase2/do_special_attack(atom/A)
|
||||
. = TRUE // So we don't fire a bolt as well.
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Side gun
|
||||
electric_defense(A)
|
||||
if(I_HURT) // Rockets
|
||||
launch_rockets(A)
|
||||
if(I_GRAB) // Micro-singulo
|
||||
launch_microsingularity(A)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase3/do_special_attack(atom/A)
|
||||
. = TRUE // So we don't fire a bolt as well.
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Side gun
|
||||
electric_defense(A)
|
||||
if(I_HURT) // Rockets
|
||||
launch_rockets(A)
|
||||
if(I_GRAB) // Micro-singulo
|
||||
launch_microsingularity(A)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase4/do_special_attack(atom/A)
|
||||
. = TRUE // So we don't fire a bolt as well.
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Side gun
|
||||
electric_defense(A)
|
||||
if(I_HURT) // Rockets
|
||||
launch_rockets(A)
|
||||
if(I_GRAB) // Micro-singulo
|
||||
launch_microsingularity(A)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase5/do_special_attack(atom/A)
|
||||
. = TRUE // So we don't fire a bolt as well.
|
||||
switch(a_intent)
|
||||
if(I_DISARM) // Side gun
|
||||
electric_defense(A)
|
||||
if(I_HURT) // Rockets
|
||||
launch_rockets(A)
|
||||
if(I_GRAB) // Micro-singulo
|
||||
launch_microsingularity(A)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase1 //Simple phase that is mostly dodge rockects
|
||||
movement_cooldown = -1
|
||||
projectiletype = /obj/item/projectile/arc/explosive_rocket
|
||||
melee_attack_delay = 4 SECOND
|
||||
ranged_attack_delay = 2.5 SECONDS
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
wreckage = null
|
||||
pilot_type = /mob/living/simple_mob/mechanical/mecha/imperion/phase2
|
||||
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase1/proc/electric_defense(atom/target)
|
||||
set waitfor = FALSE
|
||||
|
||||
// Telegraph our next move.
|
||||
Beam(target, icon_state = "sat_beam", time = 3.5 SECONDS, maxdistance = INFINITY)
|
||||
visible_message(span("warning", "\The [src] deploys a missile rack!"))
|
||||
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
|
||||
sleep(0.5 SECONDS)
|
||||
|
||||
for(var/i = 1 to 3)
|
||||
if(target) // Might get deleted in the meantime.
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
visible_message(span("warning", "\The [src] fires a rocket into the air!"))
|
||||
playsound(src, 'sound/weapons/rpg.ogg', 70, 1)
|
||||
face_atom(T)
|
||||
var/obj/item/projectile/arc/explosive_rocket/rocket = new(loc)
|
||||
rocket.old_style_target(T, src)
|
||||
rocket.fire()
|
||||
sleep(1 SECOND)
|
||||
|
||||
visible_message(span("warning", "\The [src] retracts the missile rack."))
|
||||
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase1/proc/launch_rockets(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/energy/dart(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase1/proc/launch_microsingularity(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/bullet/pistol/medium/hp(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase2 //Boss uses crowd control.
|
||||
movement_cooldown = -1
|
||||
projectiletype = /obj/item/projectile/bola
|
||||
melee_attack_delay = 4 SECOND
|
||||
alpha = 215
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
wreckage = null
|
||||
pilot_type = /mob/living/simple_mob/mechanical/mecha/imperion/phase3
|
||||
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase2/proc/electric_defense(atom/target)
|
||||
var/turf/T = get_turf(target)
|
||||
visible_message(span("warning", "\The [src] fires an energetic sphere into the air!"))
|
||||
playsound(src, 'sound/weapons/Laser.ogg', 50, 1)
|
||||
face_atom(T)
|
||||
var/obj/item/projectile/arc/microsingulo/sphere = new(loc)
|
||||
sphere.old_style_target(T, src)
|
||||
sphere.fire()
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase2/proc/launch_rockets(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/arc/spore(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase2/proc/launch_microsingularity(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/ion/small(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase3 //DPS check
|
||||
movement_cooldown = -1
|
||||
projectiletype = /obj/item/projectile/energy/gaussrifle
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
wreckage = null
|
||||
pilot_type = /mob/living/simple_mob/mechanical/mecha/imperion/phase4
|
||||
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase3/proc/electric_defense(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/forcebolt(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase3/proc/launch_rockets(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/energy/homing_bolt/wizard/lighting(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase3/proc/launch_microsingularity(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/arc/radioactive(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase4 //Starts to slow down
|
||||
movement_cooldown = 0
|
||||
projectiletype = /obj/item/projectile/energy/plasma/vepr
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
wreckage = null
|
||||
pilot_type = /mob/living/simple_mob/mechanical/mecha/imperion/phase5
|
||||
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase4/proc/electric_defense(atom/target)
|
||||
set waitfor = FALSE
|
||||
|
||||
// Telegraph our next move.
|
||||
Beam(target, icon_state = "sat_beam", time = 3.5 SECONDS, maxdistance = INFINITY)
|
||||
visible_message(span("warning", "\The [src] deploys a missile rack!"))
|
||||
playsound(src, 'sound/effects/turret/move1.wav', 50, 1)
|
||||
sleep(0.5 SECONDS)
|
||||
|
||||
for(var/i = 1 to 3)
|
||||
if(target) // Might get deleted in the meantime.
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
visible_message(span("warning", "\The [src] fires a rocket into the air!"))
|
||||
playsound(src, 'sound/weapons/rpg.ogg', 70, 1)
|
||||
face_atom(T)
|
||||
var/obj/item/projectile/arc/explosive_rocket/rocket = new(loc)
|
||||
rocket.old_style_target(T, src)
|
||||
rocket.fire()
|
||||
sleep(1 SECOND)
|
||||
|
||||
visible_message(span("warning", "\The [src] retracts the missile rack."))
|
||||
playsound(src, 'sound/effects/turret/move2.wav', 50, 1)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase4/proc/launch_rockets(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/bullet/srmrocket(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase4/proc/launch_microsingularity(atom/target)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/bullet/pistol/medium/hp(get_turf(src))
|
||||
P.launch_projectile(target, BP_TORSO, src)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase5 //Final stand
|
||||
icon_state = "imperion-phase"
|
||||
icon_living = "imperion-phase"
|
||||
icon_dead = "imperion-phase"
|
||||
desc = "A precursor mecha on it's last legs, sparking, seeming vunerable up close"
|
||||
movement_cooldown = 45
|
||||
projectiletype = /obj/item/projectile/bullet/magnetic/fuelrod/tritium
|
||||
melee_attack_delay = 4 SECOND
|
||||
ranged_attack_delay = 1.5 SECONDS
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 9
|
||||
special_attack_cooldown = 15 SECONDS
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
var/grenade_type = /obj/item/weapon/grenade/shooter/energy/tesla
|
||||
var/grenade_timer = 10
|
||||
var/grenade_type2 = /obj/item/weapon/grenade/shooter/rubber
|
||||
var/grenade_type3 = /obj/item/weapon/grenade/shooter/laserpellet
|
||||
var/obj/item/shield_projector/shields = null
|
||||
|
||||
armor = list(
|
||||
"melee" = -300,
|
||||
"bullet" = 65,
|
||||
"laser" = 65,
|
||||
"energy" = 65,
|
||||
"bomb" = 65,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
loot_list = list(/obj/item/clothing/suit/armor/alien = 60,
|
||||
/obj/item/clothing/suit/armor/alien/tank = 60,
|
||||
/obj/item/prop/alien/junk = 60,
|
||||
/obj/item/prop/alien/junk = 60,
|
||||
/obj/item/prop/alien/junk = 60,
|
||||
/obj/item/prop/alien/junk = 60,
|
||||
/obj/item/prop/alien/junk = 60,
|
||||
/obj/item/weapon/gun/energy/alien = 60,
|
||||
/obj/item/weapon/gun/energy/alien = 60,
|
||||
/obj/random/tool/alien = 60,
|
||||
/obj/random/tool/alien = 60,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 60,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 60,
|
||||
/obj/item/clothing/suit/armor/alien = 60,
|
||||
/obj/item/clothing/suit/armor/alien/tank = 60,
|
||||
/obj/item/prop/alien/junk = 50,
|
||||
/obj/item/prop/alien/junk = 50,
|
||||
/obj/item/prop/alien/junk = 50,
|
||||
/obj/item/prop/alien/junk = 50,
|
||||
/obj/item/prop/alien/junk = 50,
|
||||
/obj/item/weapon/gun/energy/alien = 60,
|
||||
/obj/item/weapon/gun/energy/alien = 60,
|
||||
/obj/random/tool/alien = 60,
|
||||
/obj/random/tool/alien = 60,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 60,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 60,
|
||||
/obj/item/clothing/suit/armor/reactive/vistor = 50,
|
||||
/obj/item/clothing/suit/armor/reactive/vistor = 50,
|
||||
/obj/item/clothing/suit/armor/protectionbubble = 50,
|
||||
/obj/item/clothing/suit/armor/protectionbubble = 50,
|
||||
/obj/item/clothing/suit/armor/tesla/vistor = 60,
|
||||
/obj/item/clothing/suit/armor/tesla/vistor = 60,
|
||||
/obj/item/shield_projector/rectangle/automatic/orange = 10,
|
||||
/obj/item/shield_projector/rectangle/automatic/imperion = 1,
|
||||
/obj/item/clothing/head/vrwizard = 60,
|
||||
/obj/item/clothing/suit/vrwizard = 60,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/fire = 60,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/frost = 60,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/poison = 60,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/lighting = 60,
|
||||
/obj/item/clothing/head/psy_crown/candycrown = 60,
|
||||
/obj/item/clothing/gloves/stamina = 60,
|
||||
/obj/item/clothing/suit/armor/buffvest = 60,
|
||||
/obj/item/weapon/melee/cullingcane = 60
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase5/proc/electric_defense(atom/target)
|
||||
set waitfor = FALSE
|
||||
visible_message(span("warning", "\The [src] crackles with lighting!"))
|
||||
|
||||
var/obj/item/weapon/grenade/G = new grenade_type(get_turf(src))
|
||||
if(istype(G))
|
||||
G.throw_at(G.throw_range, G.throw_speed, src)
|
||||
G.det_time = grenade_timer
|
||||
G.activate(src)
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase5/proc/launch_rockets(atom/target)
|
||||
set waitfor = FALSE
|
||||
visible_message(span("warning", "\The [src] prepares lasers!"))
|
||||
|
||||
var/obj/item/weapon/grenade/G = new grenade_type2(get_turf(src))
|
||||
if(istype(G))
|
||||
G.throw_at(G.throw_range, G.throw_speed, src)
|
||||
G.det_time = grenade_timer
|
||||
G.activate(src)
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase5/proc/launch_microsingularity(atom/target)
|
||||
set waitfor = FALSE
|
||||
visible_message(span("warning", "\The [src] prepares it's machine gun!"))
|
||||
|
||||
var/obj/item/weapon/grenade/G = new grenade_type3(get_turf(src))
|
||||
if(istype(G))
|
||||
G.throw_at(G.throw_range, G.throw_speed, src)
|
||||
G.det_time = grenade_timer
|
||||
G.activate(src)
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase5/Initialize(mapload)
|
||||
shields = new /obj/item/shield_projector/rectangle/automatic/imperion(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/shield_projector/rectangle/automatic/imperion
|
||||
shield_health = 500
|
||||
max_shield_health = 500
|
||||
shield_regen_delay = 30 SECONDS
|
||||
shield_regen_amount = 50
|
||||
size_x = 2
|
||||
size_y = 2
|
||||
color = "#631644"
|
||||
high_color = "#631644"
|
||||
low_color = "#631644"
|
||||
|
||||
|
||||
//Cool boss visuals, auras, and me saying no to stun.
|
||||
|
||||
/obj/item/weapon/grenade/shooter/laserpellet
|
||||
name = "laser pellet grenade"
|
||||
desc = "Unleashes not hit scan lasers."
|
||||
projectile_types = list(/obj/item/projectile/energy/mob/midlaser)
|
||||
|
||||
|
||||
/datum/modifier/bossbuff
|
||||
name = "boss_buff"
|
||||
mob_overlay_state = "red_electricity_constant"
|
||||
|
||||
on_created_text = "<span class='critical'>You feel an intense and overwhelming rage overtake you as you go berserk!</span>"
|
||||
on_expired_text = "<span class='notice'>The blaze of rage inside you has ran out.</span>"
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
|
||||
disable_duration_percent = 0
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/Initialize()
|
||||
add_modifier(/datum/modifier/bossbuff, null, src) // Slime is always swole.
|
||||
return ..()
|
||||
|
||||
/datum/modifier/aura/despair
|
||||
name = "ruin"
|
||||
mob_overlay_state = "cult_aura"
|
||||
|
||||
aura_max_distance = 28
|
||||
|
||||
on_created_text = "<span class='critical'>You feel like you're falling into ruin!</span>"
|
||||
on_expired_text = "<span class='notice'>The ruin feeling is gone.</span>"
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
|
||||
/datum/modifier/aura/despair/tick()
|
||||
if(holder.stat == DEAD)
|
||||
expire()
|
||||
|
||||
if(ishuman(holder)) // Robolimbs need this code sadly.
|
||||
var/mob/living/carbon/human/H = holder
|
||||
for(var/obj/item/organ/external/E in H.organs)
|
||||
var/obj/item/organ/external/O = E
|
||||
O.heal_damage(-0.1, -0.1, 0, 0)
|
||||
else
|
||||
holder.adjustBruteLoss(0.1)
|
||||
holder.adjustFireLoss(0,1)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase3/proc/heal_aura()
|
||||
for(var/mob/living/L in view(src, 28))
|
||||
if(L.stat == DEAD)
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/aura/despair, null, src)
|
||||
@@ -0,0 +1,326 @@
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorblue/shielded
|
||||
name = "vistor blue"
|
||||
icon = 'icons/mob/animal_vg.dmi'
|
||||
icon_state = "drone3"
|
||||
icon_living = "drone3"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
wreckage = null
|
||||
pilot_type = /mob/living/simple_mob/mechanical/mecha/vistor/vistorblue
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorblue/shielded/bullet_act(var/obj/item/projectile/P)
|
||||
var/reflectchance = 100
|
||||
if(prob(reflectchance))
|
||||
var/damage_mod = rand(2,4)
|
||||
var/projectile_dam_type = P.damage_type
|
||||
var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3)))
|
||||
var/armorcheck = run_armor_check(null, P.check_armour)
|
||||
var/soakedcheck = get_armor_soak(null, P.check_armour)
|
||||
if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)))
|
||||
visible_message("<span class='danger'>The [P.name] bounces off of [src]'s shield!</span>", \
|
||||
"<span class='userdanger'>The [P.name] bounces off of [src]'s shield!</span>")
|
||||
new /obj/item/weapon/material/shard/shrapnel(src.loc)
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BRUTE
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect.
|
||||
else
|
||||
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shield!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shield!</span>")
|
||||
damage_mod = rand(3,5)
|
||||
incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3)))
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BURN
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/turf/curloc = get_turf(src)
|
||||
|
||||
// redirect the projectile
|
||||
P.redirect(new_x, new_y, curloc, src)
|
||||
P.reflected = 1
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
return (..(P))
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorblue
|
||||
name = "vistor blue"
|
||||
icon = 'icons/mob/animal_vg.dmi'
|
||||
icon_state = "drone0"
|
||||
icon_living = "drone0"
|
||||
|
||||
mob_class = MOB_CLASS_ABERRATION
|
||||
|
||||
faction = "vistor"
|
||||
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
armor = list(
|
||||
"melee" = 20,
|
||||
"bullet" = 20,
|
||||
"laser" = 20,
|
||||
"energy" = 10,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
var/grenade_type = /obj/item/weapon/grenade/shooter/energy/homing
|
||||
var/grenade_timer = 50 //CHOMPEdit
|
||||
special_attack_cooldown = 45 SECONDS
|
||||
special_attack_min_range = 2
|
||||
special_attack_max_range = 7
|
||||
|
||||
loot_list = list(/obj/item/clothing/suit/armor/protectionbubble = 100
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorblue/should_special_attack(atom/A)
|
||||
var/mob_count = 0 // Are there enough mobs to consider grenading?
|
||||
var/turf/T = get_turf(A)
|
||||
for(var/mob/M in range(T, 2))
|
||||
if(M.faction == faction) // Don't grenade our friends
|
||||
return FALSE
|
||||
if(M in oview(src, special_attack_max_range)) // And lets check if we can actually see at least two people before we throw a grenade
|
||||
if(!M.stat) // Dead things don't warrant a grenade
|
||||
mob_count ++
|
||||
if(mob_count < 2)
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
// Yes? Throw the grenade
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorblue/do_special_attack(atom/A)
|
||||
set waitfor = FALSE
|
||||
set_AI_busy(TRUE)
|
||||
|
||||
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.det_time = grenade_timer //CHOMPEdit
|
||||
G.activate(src) //CHOMPEdit
|
||||
special_attack_charges = max(special_attack_charges-1, 0)
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
|
||||
/obj/item/weapon/grenade/shooter/energy/homing //This is a horrid idea
|
||||
name = "homing grenade"
|
||||
desc = "A horrifically dangerous rave in a can."
|
||||
projectile_types = list(/obj/item/projectile/energy/homing_bolt)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorgreen
|
||||
name = "vistor green"
|
||||
icon = 'icons/mob/animal_vg.dmi'
|
||||
icon_state = "mushroom"
|
||||
icon_living = "mushroom"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/arc/spore
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
ai_holder_type = /datum/ai_holder/hostile/ranged/robust
|
||||
|
||||
special_attack_cooldown = 2 SECONDS
|
||||
special_attack_min_range = 2
|
||||
special_attack_max_range = 7
|
||||
|
||||
loot_list = list(/obj/item/clothing/suit/armor/reactive/vistor = 100
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorgreen/do_special_attack(atom/A)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/arc/spore(get_turf(src))
|
||||
P.launch_projectile(A, BP_TORSO, src)
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorpurple
|
||||
name = "vistor purple"
|
||||
icon = 'icons/mob/animal_vg.dmi'
|
||||
icon_state = "scarybat"
|
||||
icon_living = "scarybat"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = null
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
alpha = 15
|
||||
|
||||
loot_list = list(/obj/item/clothing/suit/armor/tesla/vistor = 100
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistoryellow
|
||||
name = "vistor yellow"
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
icon_state = "chick"
|
||||
icon_living = "chick"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = null
|
||||
melee_attack_delay = 6 SECOND
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
attack_armor_pen = 25
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 40
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
mob_size = MOB_MINISCULE
|
||||
density = 0
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistororange
|
||||
name = "vistor orange?"
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "honker"
|
||||
icon_living = "honker"
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/energy/gaussrifle
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
var/obj/item/shield_projector/shields = null
|
||||
|
||||
armor = list(
|
||||
"melee" = 30,
|
||||
"bullet" = 30,
|
||||
"laser" = 30,
|
||||
"energy" = 30,
|
||||
"bomb" = 30,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
ranged_attack_delay = 3 SECONDS
|
||||
loot_list = list(/obj/item/clothing/suit/armor/alien/vistor = 100
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistororange/Initialize(mapload)
|
||||
shields = new /obj/item/shield_projector/rectangle/automatic/orange(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/shield_projector/rectangle/automatic/orange
|
||||
shield_health = 10
|
||||
max_shield_health = 10
|
||||
shield_regen_delay = 3 SECONDS
|
||||
shield_regen_amount = 10
|
||||
size_x = 2
|
||||
size_y = 2
|
||||
color = "#FF6633"
|
||||
high_color = "#FF6633"
|
||||
low_color = "#FF6633"
|
||||
|
||||
//obj/item/clothing/suit/armor/alien/vistor
|
||||
//obj/item/clothing/suit/armor/tesla/vistor
|
||||
//obj/item/clothing/suit/armor/reactive/vistor
|
||||
//obj/item/clothing/suit/armor/protectionbubble
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/forgotten
|
||||
name = "Forgotten"
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "mime"
|
||||
icon_living = "mime"
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
movement_cooldown = 0
|
||||
damage_fatigue_mult = 0
|
||||
alpha = 175
|
||||
|
||||
armor = list(
|
||||
"melee" = 30,
|
||||
"bullet" = 30,
|
||||
"laser" = 30,
|
||||
"energy" = 30,
|
||||
"bomb" = 30,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
wreckage = /obj/structure/loot_pile/mecha/phazon/forgotten
|
||||
pilot_type = null
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/artillery
|
||||
|
||||
melee_attack_delay = 3 SECOND
|
||||
|
||||
melee_damage_lower = 35
|
||||
melee_damage_upper = 35
|
||||
|
||||
projectiletype = /obj/item/projectile/arc/fragmentation/mortar/forgotten
|
||||
|
||||
projectile_dispersion = 30
|
||||
projectile_accuracy = -100
|
||||
|
||||
/obj/item/projectile/arc/fragmentation/mortar/forgotten
|
||||
icon_state = "mortar"
|
||||
fragment_amount = 4
|
||||
spread_range = 5
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/death()
|
||||
..()
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/loot_pile/mecha/phazon/forgotten
|
||||
name = "forgotten wreckage"
|
||||
desc = "The ruins of some unfortunate forgoten mecha type. Perhaps something is salvageable."
|
||||
icon_state = "mime-broken"
|
||||
|
||||
/datum/ai_holder/simple_mob/ranged/kiting/artillery
|
||||
mauling = TRUE
|
||||
run_if_this_close = 2
|
||||
min_distance_to_destination = 3
|
||||
can_flee = TRUE
|
||||
base_wander_delay = 4
|
||||
@@ -0,0 +1,202 @@
|
||||
/mob/living/simple_mob/vr
|
||||
name = "vr creation"
|
||||
desc = "A digital creature"
|
||||
icon = 'icons/mob/animal_vg.dmi'
|
||||
icon_state = "bookbat_purple"
|
||||
icon_living = "bookbat_purple"
|
||||
icon_dead = "bookbat_purple_dead"
|
||||
|
||||
mob_class = MOB_CLASS_ABERRATION
|
||||
|
||||
faction = "vr"
|
||||
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
movement_cooldown = 1
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard
|
||||
melee_attack_delay = 4 SECOND
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 15
|
||||
size_multiplier = 1.50
|
||||
|
||||
loot_list = list(/obj/item/clothing/head/vrwizard = 10,
|
||||
/obj/item/clothing/suit/vrwizard = 10,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/fire = 10,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/frost = 10,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/poison = 10,
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/lighting = 10
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/vr/firewiz
|
||||
name = "vr creation"
|
||||
icon_state = "bookbat_red"
|
||||
icon_living = "bookbat_red"
|
||||
icon_dead = "bookbat_red_dead"
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard/fire
|
||||
|
||||
/mob/living/simple_mob/vr/poisonwiz
|
||||
name = "vr creation"
|
||||
icon_state = "bookbat_green"
|
||||
icon_living = "bookbat_green"
|
||||
icon_dead = "bookbat_green_dead"
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard/poison
|
||||
|
||||
/mob/living/simple_mob/vr/lightingwiz
|
||||
name = "vr creation"
|
||||
icon_state = "bookbat_woody"
|
||||
icon_living = "bookbat_woody"
|
||||
icon_dead = "bookbat_woody_dead"
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard/lighting
|
||||
|
||||
/mob/living/simple_mob/vr/frostwiz
|
||||
name = "vr creation"
|
||||
icon_state = "bookbat_blue"
|
||||
icon_living = "bookbat_blue"
|
||||
icon_dead = "bookbat_blue_dead"
|
||||
projectiletype = /obj/item/projectile/energy/homing_bolt/wizard/frost
|
||||
|
||||
/mob/living/simple_mob/vr/glitch
|
||||
name = "glitch"
|
||||
desc = "You shouldn't be seeing this, run"
|
||||
icon = 'icons/mob/fish.dmi'
|
||||
icon_state = ""
|
||||
icon_living = ""
|
||||
icon_dead = ""
|
||||
projectiletype = null
|
||||
|
||||
maxHealth = 20
|
||||
health = 20
|
||||
movement_cooldown = -3
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = null
|
||||
melee_attack_delay = 0 SECOND
|
||||
|
||||
melee_damage_lower = 6
|
||||
melee_damage_upper = 6
|
||||
|
||||
/mob/living/simple_mob/vr/glitch/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/digitizing, 60 SECONDS)
|
||||
|
||||
/mob/living/simple_mob/vr/doomknight
|
||||
name = "vr creation"
|
||||
projectiletype = null
|
||||
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
movement_cooldown = 4
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = null
|
||||
melee_attack_delay = 8 SECOND
|
||||
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
|
||||
/mob/living/simple_mob/vr/doomknight/apply_melee_effects(var/atom/A) //If you get hit by this slow thing, you have 5 minuites to live.
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/doomed, 300 SECONDS)
|
||||
|
||||
|
||||
//Spells
|
||||
/obj/item/projectile/energy/homing_bolt/wizard
|
||||
damage = 15
|
||||
|
||||
/obj/item/projectile/energy/homing_bolt/wizard/fire
|
||||
modifier_type_to_apply = /datum/modifier/wizfire
|
||||
modifier_duration = 6 SECONDS
|
||||
|
||||
/obj/item/projectile/energy/homing_bolt/wizard/lighting
|
||||
modifier_type_to_apply = /datum/modifier/wizfire/lighting
|
||||
modifier_duration = 6 SECONDS
|
||||
|
||||
/obj/item/projectile/energy/homing_bolt/wizard/poison
|
||||
modifier_type_to_apply = /datum/modifier/wizpoison
|
||||
modifier_duration = 6 SECONDS
|
||||
|
||||
/obj/item/projectile/energy/homing_bolt/wizard/frost
|
||||
modifier_type_to_apply = /datum/modifier/wizpoison/frost
|
||||
modifier_duration = 6 SECONDS
|
||||
|
||||
/datum/modifier/wizfire
|
||||
name = "wizfire"
|
||||
desc = "Can you even see this in game?"
|
||||
mob_overlay_state = "on_fire"
|
||||
|
||||
on_created_text = "<span class='warning'>You are on digital fire.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel better.</span>"
|
||||
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
|
||||
var/damage_per_tick = 0.2
|
||||
bleeding_rate_percent = 0.7
|
||||
|
||||
/datum/modifier/wizfire/tick()
|
||||
holder.inflict_heat_damage(damage_per_tick)
|
||||
|
||||
/datum/modifier/wizfire/lighting
|
||||
name = "wizlighting"
|
||||
desc = "Can you even see this in game?."
|
||||
mob_overlay_state = "blue_electricity_constant"
|
||||
|
||||
on_created_text = "<span class='warning'>You are filled with digital lighting.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel better.</span>"
|
||||
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
|
||||
damage_per_tick = 0.05
|
||||
incoming_fire_damage_percent = 1.1
|
||||
|
||||
/datum/modifier/wizpoison
|
||||
name = "wizpoison"
|
||||
desc = "Can you even see this in game?."
|
||||
mob_overlay_state = "poisoned"
|
||||
|
||||
on_created_text = "<span class='warning'>You are on digital poisoned.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel better.</span>"
|
||||
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
|
||||
var/damage_per_tick = 3
|
||||
|
||||
/datum/modifier/wizpoison/tick()
|
||||
if(holder.stat == DEAD)
|
||||
expire(silent = TRUE)
|
||||
holder.inflict_poison_damage(damage_per_tick)
|
||||
|
||||
/datum/modifier/wizpoison/frost
|
||||
name = "wizfrost"
|
||||
desc = "Can you even see this in game?."
|
||||
mob_overlay_state = "chilled"
|
||||
|
||||
on_created_text = "<span class='warning'>You are on freezing, digitally.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel better.</span>"
|
||||
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
|
||||
damage_per_tick = 1
|
||||
slowdown = 0.5
|
||||
|
||||
/datum/modifier/digitizing
|
||||
name = "digital"
|
||||
desc = "Can you even see this in game?."
|
||||
mob_overlay_state = "corana"
|
||||
|
||||
on_created_text = "<span class='warning'>You feel less real.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel real again.</span>"
|
||||
stacks = MODIFIER_STACK_ALLOWED //How does this stack?
|
||||
max_health_percent = 0.7
|
||||
|
||||
/datum/modifier/aura/crumbling
|
||||
name = "crumbling"
|
||||
desc = "Can you even see this in game?."
|
||||
mob_overlay_state = "cult_aura"
|
||||
|
||||
on_created_text = "<span class='warning'>You feel like the end is nigh.</span>"
|
||||
on_expired_text = "<span class='notice'>You feel safe for now.</span>"
|
||||
aura_max_distance = 4
|
||||
max_health_percent = 0.9
|
||||
disable_duration_percent = 1.2
|
||||
incoming_damage_percent = 1.2
|
||||
incoming_oxy_damage_percent = 2
|
||||
incoming_hal_damage_percent = 2
|
||||
incoming_healing_percent = 0.8
|
||||
|
||||
/datum/modifier/aura/crumbling/superboss
|
||||
aura_max_distance = 16
|
||||
@@ -18,12 +18,13 @@
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
var/grenade_type = /obj/item/weapon/grenade/shooter/energy/tesla
|
||||
var/grenade_timer = 10
|
||||
var/grenade_type2 = /obj/item/weapon/grenade/spawnboss/hivebot
|
||||
var/grenade_type2 = /obj/item/weapon/grenade/shooter/rubber
|
||||
size_multiplier = 1.75
|
||||
shock_resist = 3
|
||||
water_resist = 3
|
||||
attack_armor_pen = -50
|
||||
|
||||
armor = list(melee = -50, bullet = 40, laser = 40, energy = 40, bomb = 40, bio = 100, rad = 100)
|
||||
armor = list(melee = -150, bullet = 40, laser = 40, energy = 40, bomb = 40, bio = 100, rad = 100)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 0,
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/dot
|
||||
name = "ember hivebot"
|
||||
desc = "A robot that appears to utilize fire to cook their enemies."
|
||||
icon_state = "yellow"
|
||||
icon_living = "yellow"
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/declone
|
||||
name = "irradiating hivebot"
|
||||
desc = "A robot that appears to utilize radiation to destablize their foes."
|
||||
icon_state = "yellow"
|
||||
icon_living = "yellow"
|
||||
|
||||
projectiletype = /obj/item/projectile/energy/declone
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege
|
||||
projectiletype = /obj/item/projectile/arc //Polaris, don't make the same mob twice.
|
||||
@@ -0,0 +1,299 @@
|
||||
/mob/living/simple_mob/slime/feral
|
||||
cores = 3 // Xenobio will love getting their hands on these.
|
||||
maxHealth = 150
|
||||
movement_cooldown = 0
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
unity = 1
|
||||
|
||||
/mob/living/simple_mob/slime/feral/apply_melee_effects(mob/living/L)
|
||||
if(istype(L) && a_intent == I_HURT)
|
||||
// Pump them full of toxins, if able.
|
||||
if(L.reagents && L.can_inject() && reagent_injected)
|
||||
L.reagents.add_reagent(reagent_injected, injection_amount)
|
||||
|
||||
|
||||
/mob/living/simple_mob/slime/feral/purple
|
||||
desc = "This slime is rather toxic to handle, as it is poisonous."
|
||||
color = "#CC23FF"
|
||||
slime_color = "purple"
|
||||
coretype = /obj/item/slime_extract/purple
|
||||
reagent_injected = "toxin"
|
||||
|
||||
/mob/living/simple_mob/slime/feral/orange
|
||||
desc = "This slime is known to be flammable and can ignite enemies."
|
||||
color = "#FFA723"
|
||||
slime_color = "orange"
|
||||
coretype = /obj/item/slime_extract/orange
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
heat_resist = 1
|
||||
|
||||
/mob/living/simple_mob/slime/feral/orange/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/fire, 5 SECONDS)
|
||||
|
||||
|
||||
/mob/living/simple_mob/slime/feral/blue
|
||||
desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes."
|
||||
color = "#19FFFF"
|
||||
slime_color = "blue"
|
||||
coretype = /obj/item/slime_extract/blue
|
||||
reagent_injected = "cryotoxin"
|
||||
cold_resist = 0.50
|
||||
|
||||
/mob/living/simple_mob/slime/feral/metal
|
||||
desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface."
|
||||
color = "#5F5F5F"
|
||||
slime_color = "metal"
|
||||
shiny = TRUE
|
||||
coretype = /obj/item/slime_extract/metal
|
||||
maxHealth = 250
|
||||
armor = list(
|
||||
"melee" = 25,
|
||||
"bullet" = 25,
|
||||
"laser" = 25,
|
||||
"energy" = 50,
|
||||
"bomb" = 80,
|
||||
"bio" = 100,
|
||||
"rad" = 100
|
||||
)
|
||||
|
||||
armor_soak = list(
|
||||
"melee" = 5,
|
||||
"bullet" = 5,
|
||||
"laser" = 5,
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
)
|
||||
|
||||
|
||||
/mob/living/simple_mob/slime/feral/yellow
|
||||
desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes."
|
||||
color = "#FFF423"
|
||||
slime_color = "yellow"
|
||||
coretype = /obj/item/slime_extract/yellow
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
shock_resist = 1
|
||||
|
||||
projectiletype = /obj/item/projectile/energy/mob/electric_spider
|
||||
|
||||
/mob/living/simple_mob/slime/feral/yellow/apply_melee_effects(atom/A)
|
||||
..()
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.inflict_shock_damage(10)
|
||||
to_chat(src, span("span", "You shock \the [L]."))
|
||||
to_chat(L, span("danger", "You've been shocked by \the [src]!"))
|
||||
|
||||
/mob/living/simple_mob/slime/feral/dark_purple
|
||||
desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it."
|
||||
color = "#660088"
|
||||
slime_color = "dark purple"
|
||||
coretype = /obj/item/slime_extract/dark_purple
|
||||
reagent_injected = "phoron"
|
||||
|
||||
/mob/living/simple_mob/slime/feral/dark_purple/proc/ignite()
|
||||
visible_message(span("critical", "\The [src] erupts in an inferno!"))
|
||||
for(var/turf/simulated/target_turf in view(2, src))
|
||||
target_turf.assume_gas("phoron", 30, 1500+T0C)
|
||||
spawn(0)
|
||||
target_turf.hotspot_expose(1500+T0C, 400)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_mob/slime/feral/dark_purple/ex_act(severity)
|
||||
log_and_message_admins("[src] ignited due to a chain reaction with an explosion.")
|
||||
ignite()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume)
|
||||
log_and_message_admins("[src] ignited due to exposure to fire.")
|
||||
ignite()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
|
||||
log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
|
||||
ignite()
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
if(istype(W) && W.force && W.damtype == BURN)
|
||||
log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].")
|
||||
ignite()
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/silver
|
||||
desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it."
|
||||
color = "#AAAAAA"
|
||||
slime_color = "silver"
|
||||
coretype = /obj/item/slime_extract/silver
|
||||
shiny = TRUE
|
||||
|
||||
/mob/living/simple_mob/slime/feral/silver/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy))
|
||||
visible_message(span("danger", "\The [src] reflects \the [P]!"))
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
|
||||
var/turf/curloc = get_turf(src)
|
||||
|
||||
// redirect the projectile
|
||||
P.redirect(new_x, new_y, curloc, src)
|
||||
P.reflected = TRUE
|
||||
return PROJECTILE_CONTINUE // complete projectile permutation
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/bluespace
|
||||
desc = "Trapping this slime in a cell is generally futile, as it can teleport at will."
|
||||
color = null
|
||||
slime_color = "bluespace"
|
||||
icon_state_override = "bluespace"
|
||||
coretype = /obj/item/slime_extract/bluespace
|
||||
|
||||
special_attack_min_range = 3
|
||||
special_attack_max_range = 7
|
||||
special_attack_cooldown = 5 SECONDS
|
||||
|
||||
/mob/living/simple_mob/slime/feral/bluespace/do_special_attack(atom/A)
|
||||
// Teleport attack.
|
||||
if(!A)
|
||||
to_chat(src, span("warning", "There's nothing to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/list/nearby_things = range(1, A)
|
||||
var/list/valid_turfs = list()
|
||||
|
||||
// All this work to just go to a non-dense tile.
|
||||
for(var/turf/potential_turf in nearby_things)
|
||||
var/valid_turf = TRUE
|
||||
if(potential_turf.density)
|
||||
continue
|
||||
for(var/atom/movable/AM in potential_turf)
|
||||
if(AM.density)
|
||||
valid_turf = FALSE
|
||||
if(valid_turf)
|
||||
valid_turfs.Add(potential_turf)
|
||||
|
||||
if(!(valid_turfs.len))
|
||||
to_chat(src, span("warning", "There wasn't an unoccupied spot to teleport to."))
|
||||
return FALSE
|
||||
|
||||
var/turf/target_turf = pick(valid_turfs)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
|
||||
s1.set_up(5, 1, T)
|
||||
var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
|
||||
s2.set_up(5, 1, target_turf)
|
||||
|
||||
|
||||
T.visible_message(span("notice", "\The [src] vanishes!"))
|
||||
s1.start()
|
||||
|
||||
forceMove(target_turf)
|
||||
playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
|
||||
to_chat(src, span("notice", "You teleport to \the [target_turf]."))
|
||||
|
||||
target_turf.visible_message(span("warning", "\The [src] appears!"))
|
||||
s2.start()
|
||||
|
||||
if(Adjacent(A))
|
||||
attack_target(A)
|
||||
|
||||
|
||||
/mob/living/simple_mob/slime/feral/ruby
|
||||
desc = "This slime has great physical strength."
|
||||
color = "#FF3333"
|
||||
slime_color = "ruby"
|
||||
shiny = TRUE
|
||||
glow_toggle = TRUE
|
||||
coretype = /obj/item/slime_extract/ruby
|
||||
melee_attack_delay = 1 SECOND
|
||||
|
||||
/mob/living/simple_mob/slime/feral/ruby/Initialize()
|
||||
add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole.
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/ruby/apply_melee_effects(atom/A)
|
||||
..()
|
||||
|
||||
if(isliving(A) && a_intent == I_HURT)
|
||||
var/mob/living/L = A
|
||||
if(L.mob_size <= MOB_MEDIUM)
|
||||
visible_message(span("danger", "\The [src] sends \the [L] flying with the impact!"))
|
||||
playsound(src, "punch", 50, 1)
|
||||
L.Weaken(1)
|
||||
var/throwdir = get_dir(src, L)
|
||||
L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
|
||||
else
|
||||
to_chat(L, span("warning", "\The [src] hits you with incredible force, but you remain in place."))
|
||||
visible_message(span("danger", "\The [src] hits \the [L] with incredible force, to no visible effect!")) // CHOMPEdit: Visible/audible feedback for *resisting* the slam.
|
||||
playsound(src, "punch", 50, 1) // CHOMPEdit: Visible/audible feedback for *resisting* the slam.
|
||||
|
||||
/mob/living/simple_mob/slime/feral/red
|
||||
desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here."
|
||||
color = "#FF3333"
|
||||
slime_color = "red"
|
||||
coretype = /obj/item/slime_extract/red
|
||||
movement_cooldown = -1 // See above.
|
||||
|
||||
/mob/living/simple_mob/slime/feral/green
|
||||
desc = "This slime is radioactive."
|
||||
color = "#14FF20"
|
||||
slime_color = "green"
|
||||
coretype = /obj/item/slime_extract/green
|
||||
glow_toggle = TRUE
|
||||
reagent_injected = "radium"
|
||||
var/rads = 25
|
||||
|
||||
/mob/living/simple_mob/slime/feral/green/handle_special()
|
||||
if(stat != DEAD)
|
||||
irradiate()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/green/proc/irradiate()
|
||||
SSradiation.radiate(src, rads)
|
||||
|
||||
/mob/living/simple_mob/slime/feral/pink
|
||||
desc = "This slime has regenerative properties."
|
||||
color = "#FF0080"
|
||||
slime_color = "pink"
|
||||
coretype = /obj/item/slime_extract/pink
|
||||
glow_toggle = TRUE
|
||||
|
||||
/mob/living/simple_mob/slime/feral/pink/handle_special()
|
||||
if(stat != DEAD)
|
||||
heal_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/pink/proc/heal_aura()
|
||||
for(var/mob/living/L in view(src, 2))
|
||||
if(L.stat == DEAD || !IIsAlly(L))
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/aura/slime_heal, null, src)
|
||||
|
||||
/mob/living/simple_mob/slime/feral/emerald
|
||||
desc = "This slime is faster than usual, even more so than the red slimes."
|
||||
color = "#22FF22"
|
||||
shiny = TRUE
|
||||
glow_toggle = TRUE
|
||||
slime_color = "emerald"
|
||||
coretype = /obj/item/slime_extract/emerald
|
||||
|
||||
/mob/living/simple_mob/slime/feral/emerald/handle_special()
|
||||
if(stat != DEAD)
|
||||
zoom_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/slime/feral/emerald/proc/zoom_aura()
|
||||
for(var/mob/living/L in view(src, 2))
|
||||
if(L.stat == DEAD || !IIsAlly(L))
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src)
|
||||
@@ -0,0 +1,14 @@
|
||||
/mob/living/simple_mob/vore/ashy
|
||||
name = "ashy"
|
||||
icon = 'icons/mob/ashspawn.dmi'
|
||||
icon_state = "ash_whelp"
|
||||
icon_living = "ash_whelp"
|
||||
icon_dead = "ash_welp"
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive
|
||||
damage_fatigue_mult = 0
|
||||
movement_cooldown = 0
|
||||
maxHealth = 300
|
||||
see_in_dark = 8
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 30000
|
||||
min_oxy = 0
|
||||
@@ -0,0 +1,266 @@
|
||||
//Someone remind me to get someone to make actual sprites for this things.
|
||||
/mob/living/simple_mob/vore/candy
|
||||
name = "candy critter"
|
||||
desc = "A creature made of candy"
|
||||
icon = 'modular_chomp/icons/mob/candy.dmi'
|
||||
icon_state = "drone0"
|
||||
icon_living = "drone0"
|
||||
icon_dead = "drone0"
|
||||
|
||||
mob_class = MOB_CLASS_ABERRATION
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee
|
||||
|
||||
faction = "candy"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
movement_cooldown = 2
|
||||
melee_attack_delay = 3 SECOND
|
||||
can_be_drop_prey = TRUE
|
||||
unsuitable_atoms_damage = 0
|
||||
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 15
|
||||
|
||||
/mob/living/simple_mob/vore/candy
|
||||
vore_active = 1
|
||||
vore_capacity = 6
|
||||
vore_max_size = RESIZE_HUGE
|
||||
vore_min_size = RESIZE_SMALL
|
||||
vore_pounce_chance = 0 // Beat them into crit before eating.
|
||||
vore_icons = null
|
||||
|
||||
can_be_drop_prey = TRUE //CHOMP Add
|
||||
|
||||
/mob/living/simple_mob/vore/candy/Login()
|
||||
. = ..()
|
||||
if(!riding_datum)
|
||||
riding_datum = new /datum/riding/simple_mob(src)
|
||||
verbs |= /mob/living/simple_mob/proc/animal_mount
|
||||
verbs |= /mob/living/proc/toggle_rider_reins
|
||||
movement_cooldown = 1
|
||||
|
||||
/mob/living/simple_mob/vore/candy/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
return
|
||||
|
||||
/mob/living/simple_mob/vore/candy/init_vore()
|
||||
if(!voremob_loaded)
|
||||
return
|
||||
.=..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "stomach"
|
||||
B.desc = "The fearsome preadtor gets a firm grip upon you, before dunking you into it's maw, then with a powerful swift gulp you're sent tumbling into it's stomach.."
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Your surroundings are momentarily filled with tour predator's pleased rumbling, its hands stroking over the taut swell you make in its belly.",)
|
||||
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"Every clench of the predator's stomach grinds powerful digestive fluids into your body, forcibly churning away your strength!")
|
||||
|
||||
/mob/living/simple_mob/vore/candy/bluecabold //Adds protection
|
||||
name = "gummy kobold"
|
||||
desc = "A creature made of candy"
|
||||
icon_state = "blue"
|
||||
icon_living = "blue"
|
||||
icon_dead = "blue"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
melee_damage_lower = 7
|
||||
melee_damage_upper = 12
|
||||
|
||||
/mob/living/simple_mob/vore/candy/bluecabold/handle_special()
|
||||
if(stat != DEAD)
|
||||
buff_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/candy/bluecabold/proc/buff_aura()
|
||||
for(var/mob/living/L in view(src, 2))
|
||||
if(L.stat == DEAD || !IIsAlly(L))
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/aura/candy_blue, null, src)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/redcabold //Tanky boi
|
||||
name = "gummy kobold"
|
||||
desc = "A creature made of candy"
|
||||
icon_state = "red"
|
||||
icon_living = "red"
|
||||
icon_dead = "red"
|
||||
|
||||
maxHealth = 125
|
||||
health = 125
|
||||
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 2
|
||||
|
||||
/mob/living/simple_mob/vore/candy/redcabold/apply_melee_effects(atom/A)
|
||||
..()
|
||||
|
||||
if(isliving(A) && a_intent == I_HURT)
|
||||
var/mob/living/L = A
|
||||
if(L.mob_size <= MOB_MEDIUM)
|
||||
visible_message(span("danger", "\The [src] sends \the [L] flying with the impact!"))
|
||||
playsound(src, "punch", 50, 1)
|
||||
L.Weaken(1)
|
||||
var/throwdir = get_dir(src, L)
|
||||
L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
|
||||
else
|
||||
to_chat(L, span("warning", "\The [src] hits you with incredible force, but you remain in place."))
|
||||
visible_message(span("danger", "\The [src] hits \the [L] with incredible force, to no visible effect!")) // CHOMPEdit: Visible/audible feedback for *resisting* the slam.
|
||||
playsound(src, "punch", 50, 1)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/yellowcabold //Speeds folks
|
||||
name = "gummy kobold"
|
||||
desc = "A creature made of candy"
|
||||
icon_state = "yellow"
|
||||
icon_living = "yellow"
|
||||
icon_dead = "yellow"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 15
|
||||
|
||||
/mob/living/simple_mob/vore/candy/yellowcabold/handle_special()
|
||||
if(stat != DEAD)
|
||||
buff_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/candy/yellowcabold/proc/buff_aura()
|
||||
for(var/mob/living/L in view(src, 2))
|
||||
if(L.stat == DEAD || !IIsAlly(L))
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/aura/candy_yellow, null, src)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/orangecabold //Increase melee damage
|
||||
name = "gummy kobold"
|
||||
desc = "A creature made of candy"
|
||||
icon_state = "orange"
|
||||
icon_living = "orange"
|
||||
icon_dead = "orange"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
melee_damage_lower = 7
|
||||
melee_damage_upper = 12
|
||||
|
||||
/mob/living/simple_mob/vore/candy/orangecabold/handle_special()
|
||||
if(stat != DEAD)
|
||||
buff_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/candy/orangecabold/proc/buff_aura()
|
||||
for(var/mob/living/L in view(src, 2))
|
||||
if(L.stat == DEAD || !IIsAlly(L))
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/aura/candy_orange, null, src)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/purplecabold //Heals folks
|
||||
name = "gummy kobold"
|
||||
desc = "A creature made of candy"
|
||||
icon_state = "purple"
|
||||
icon_living = "purple"
|
||||
icon_dead = "purple"
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
melee_damage_lower = 7
|
||||
melee_damage_upper = 12
|
||||
|
||||
/mob/living/simple_mob/vore/candy/purplecabold/handle_special()
|
||||
if(stat != DEAD)
|
||||
buff_aura()
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/candy/purplecabold/proc/buff_aura()
|
||||
for(var/mob/living/L in view(src, 2))
|
||||
if(L.stat == DEAD || !IIsAlly(L))
|
||||
continue
|
||||
L.add_modifier(/datum/modifier/aura/candy_purple, null, src)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/marshmellowserpent //Long range grab
|
||||
name = "marshmellow serpent"
|
||||
desc = "A creature made of candy"
|
||||
icon_state = "marshmellow"
|
||||
icon_living = "marshmellow"
|
||||
icon_dead = "marshmellow"
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
|
||||
melee_damage_lower = 4
|
||||
melee_damage_upper = 8
|
||||
|
||||
special_attack_min_range = 1
|
||||
special_attack_max_range = 14
|
||||
special_attack_cooldown = 10
|
||||
|
||||
loot_list = list(/obj/item/clothing/head/psy_crown/candycrown = 30,
|
||||
/obj/item/clothing/gloves/stamina = 30,
|
||||
/obj/item/clothing/suit/armor/buffvest = 30,
|
||||
/obj/item/weapon/melee/cullingcane = 30
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/marshmellowserpent/do_special_attack(atom/A)
|
||||
set_AI_busy(TRUE)
|
||||
do_windup_animation(A, 20)
|
||||
addtimer(CALLBACK(src, .proc/chargeend, A), 20)
|
||||
|
||||
/mob/living/simple_mob/vore/candy/marshmellowserpent/proc/chargeend(atom/A)
|
||||
if(stat) //you are dead
|
||||
set_AI_busy(FALSE)
|
||||
return
|
||||
playsound(src, 'sound/vore/sunesound/pred/schlorp.ogg', 25)
|
||||
var/obj/item/projectile/beam/appendage/appendage_attack = new /obj/item/projectile/beam/appendage(get_turf(loc))
|
||||
appendage_attack.old_style_target(A, src)
|
||||
appendage_attack.launch_projectile(A, BP_TORSO, src)
|
||||
set_AI_busy(FALSE)
|
||||
|
||||
//Modifiers
|
||||
/datum/modifier/aura/candy_purple //Healz
|
||||
name = "candy_purple"
|
||||
desc = "You feel somewhat gooey."
|
||||
stacks = MODIFIER_STACK_FORBID
|
||||
aura_max_distance = 5
|
||||
|
||||
/datum/modifier/aura/candy_purple/tick()
|
||||
if(holder.stat == DEAD)
|
||||
expire()
|
||||
|
||||
if(ishuman(holder)) // Robolimbs need this code sadly.
|
||||
var/mob/living/carbon/human/H = holder
|
||||
for(var/obj/item/organ/external/E in H.organs)
|
||||
var/obj/item/organ/external/O = E
|
||||
O.heal_damage(2, 2, 0, 1)
|
||||
else
|
||||
holder.adjustBruteLoss(-2)
|
||||
holder.adjustFireLoss(-2)
|
||||
|
||||
holder.adjustToxLoss(-1)
|
||||
|
||||
/datum/modifier/aura/candy_orange //melee+
|
||||
name = "candy orange"
|
||||
desc = "You feel somewhat gooey."
|
||||
stacks = MODIFIER_STACK_FORBID
|
||||
aura_max_distance = 5
|
||||
outgoing_melee_damage_percent = 1.5
|
||||
|
||||
/datum/modifier/aura/candy_yellow //speed
|
||||
name = "candy yellow"
|
||||
desc = "You feel somewhat gooey."
|
||||
stacks = MODIFIER_STACK_FORBID
|
||||
aura_max_distance = 5
|
||||
slowdown = -1
|
||||
|
||||
/datum/modifier/aura/candy_blue //defense
|
||||
name = "candy blue"
|
||||
desc = "You feel somewhat gooey."
|
||||
stacks = MODIFIER_STACK_FORBID
|
||||
aura_max_distance = 5
|
||||
incoming_damage_percent = 0.9
|
||||
36
modular_chomp/code/modules/projectiles/guns/staffs.dm
Normal file
36
modular_chomp/code/modules/projectiles/guns/staffs.dm
Normal file
@@ -0,0 +1,36 @@
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard
|
||||
name = "vr staff"
|
||||
desc = "A magical staff brimming with energy."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "staffoffire"
|
||||
item_state = "staff"
|
||||
fire_sound = 'sound/weapons/emitter.ogg'
|
||||
w_class = ITEMSIZE_HUGE
|
||||
checks_antimagic = TRUE
|
||||
max_charges = 10
|
||||
charges = 0
|
||||
recharge_rate = 2
|
||||
charge_tick = 0
|
||||
can_charge = TRUE
|
||||
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/fire
|
||||
description_info = "It will burn the target along with reducing their bleeding."
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/fire
|
||||
color = "#FF0000"
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/lighting
|
||||
description_info = "It will lightly burn targets and open them up to energy based attacks."
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/lighting
|
||||
color = "#C1F20B"
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/poison
|
||||
description_info = "It will heavly poison targets."
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/poison
|
||||
color = "#003300"
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/frost
|
||||
description_info = "Will slow down and minorly poison targets."
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/frost
|
||||
color = "#00CCFF"
|
||||
12
modular_chomp/code/modules/weapons/melee.dm
Normal file
12
modular_chomp/code/modules/weapons/melee.dm
Normal file
@@ -0,0 +1,12 @@
|
||||
/obj/item/weapon/melee/cullingcane
|
||||
name = "culling cane"
|
||||
defend_chance = 15 // The base chance for the weapon to parry.
|
||||
projectile_parry_chance = 15
|
||||
sharp = TRUE
|
||||
edge = TRUE
|
||||
w_class = ITEMSIZE_LARGE
|
||||
slot_flags = SLOT_BACK
|
||||
force = 35
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
can_cleave = TRUE
|
||||
icon_state = "scythe0"
|
||||
Reference in New Issue
Block a user