mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
MORE GATWAYS
Not going to lie, I have done minimal testing. Code should work.
This commit is contained in:
@@ -126,7 +126,9 @@ but they don't actually change anything about the load order
|
||||
|
||||
//CHOMPStation Addition End
|
||||
lateload_gateway = list(
|
||||
list("Snow Field")
|
||||
list("Snow Field"),
|
||||
list("Maddness Lab"),
|
||||
list("Base Blep")
|
||||
) //CHOMPedit: Gateway maps. For now nothing fancy, just some already existing maps while we make our own.
|
||||
|
||||
lateload_gateway = null
|
||||
|
||||
@@ -42,6 +42,20 @@
|
||||
mappath = 'gateway/snowfield.dmm'
|
||||
associated_map_datum = /datum/map_z_level/sc_lateload/gateway_destination
|
||||
|
||||
#include "gateway/BaseBlep.dm"
|
||||
/datum/map_template/sc_lateload/gateway/baseblep
|
||||
name = "Base Blep"
|
||||
desc = "A brand new but already lost base at the end of a squishy caynon"
|
||||
mappath = 'gateway/BaseBlep.dmm'
|
||||
associated_map_datum = /datum/map_z_level/sc_lateload/gateway_destination
|
||||
|
||||
#include "gateway/maddnesslab.dm"
|
||||
/datum/map_template/sc_lateload/gateway/maddnesslab
|
||||
name = "Maddness Lab"
|
||||
desc = "An ancient base brimming with creations of maddness"
|
||||
mappath = 'gateway/maddnesslab.dmm'
|
||||
associated_map_datum = /datum/map_z_level/sc_lateload/gateway_destination
|
||||
|
||||
#include "gateway/carpfarm.dm"
|
||||
/datum/map_template/sc_lateload/gateway/carpfarm
|
||||
name = "Carp Farm"
|
||||
|
||||
28
maps/southern_cross/submaps/gateway/BaseBlep.dm
Normal file
28
maps/southern_cross/submaps/gateway/BaseBlep.dm
Normal file
@@ -0,0 +1,28 @@
|
||||
/area/awaymission/baseblep
|
||||
icon_state = "green"
|
||||
base_turf = /turf/simulated/floor/outdoors/dirt
|
||||
ambience = AMBIENCE_OTHERWORLDLY
|
||||
|
||||
/area/awaymission/baseblep/base
|
||||
icon_state = "green"
|
||||
|
||||
/area/awaymission/baseblep/cavern
|
||||
icon_state = "blue"
|
||||
ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/music/LRRMenu.ogg', 'sound/music/LRRTrack3.ogg', \
|
||||
'sound/ambience/cave/AmbCaveDebriA.ogg', 'sound/ambience/cave/AmbCaveDebriB.ogg', 'sound/ambience/cave/AmbCaveDebriC.ogg', \
|
||||
'sound/ambience/cave/AmbCaveDebriD.ogg')
|
||||
outdoors = 1
|
||||
|
||||
/area/awaymission/baseblep/caynon
|
||||
icon_state = "red"
|
||||
ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg', 'sound/music/LRRMenu.ogg', 'sound/music/LRRTrack3.ogg', \
|
||||
'sound/ambience/cave/AmbCaveDebriA.ogg', 'sound/ambience/cave/AmbCaveDebriB.ogg', 'sound/ambience/cave/AmbCaveDebriC.ogg', \
|
||||
'sound/ambience/cave/AmbCaveDebriD.ogg')
|
||||
dynamic_lighting = 1
|
||||
outdoors = 1
|
||||
|
||||
/area/awaymission/baseblep/hivebotsphere
|
||||
requires_power = 0
|
||||
|
||||
/area/awaymission/baseblep/finale
|
||||
requires_power = 0
|
||||
67289
maps/southern_cross/submaps/gateway/BaseBlep.dmm
Normal file
67289
maps/southern_cross/submaps/gateway/BaseBlep.dmm
Normal file
File diff suppressed because it is too large
Load Diff
90
maps/southern_cross/submaps/gateway/maddnesslab.dm
Normal file
90
maps/southern_cross/submaps/gateway/maddnesslab.dm
Normal file
@@ -0,0 +1,90 @@
|
||||
/area/awaymission/mol
|
||||
name = "Strange Place"
|
||||
icon_state = "red"
|
||||
base_turf = /turf/simulated/floor/outdoors/dirt
|
||||
outdoors = 0
|
||||
requires_power = 0
|
||||
|
||||
/area/awaymission/mol/outside
|
||||
dynamic_lighting = 1
|
||||
outdoors = 1
|
||||
|
||||
/area/awaymission/mol/entrancetunnel
|
||||
|
||||
/area/awaymission/mol/security
|
||||
|
||||
/area/awaymission/mol/medical
|
||||
|
||||
/area/awaymission/mol/vr
|
||||
|
||||
/area/awaymission/mol/vr/observation
|
||||
|
||||
/area/awaymission/mol/vr/shattered
|
||||
|
||||
/area/awaymission/mol/vr/observationroom
|
||||
|
||||
/area/awaymission/mol/vistortunnel
|
||||
|
||||
/area/awaymission/mol/vistortunnel/red
|
||||
|
||||
/area/awaymission/mol/vistortunnel/blue
|
||||
|
||||
/area/awaymission/mol/vistortunnel/yellow
|
||||
|
||||
/area/awaymission/mol/vistortunnel/orange
|
||||
|
||||
/area/awaymission/mol/vistortunnel/green
|
||||
|
||||
/area/awaymission/mol/vistortunnel/purple
|
||||
|
||||
/area/awaymission/mol/scraptunnels
|
||||
|
||||
/area/awaymission/mol/scraptunnels/room1
|
||||
|
||||
/area/awaymission/mol/scraptunnels/room2
|
||||
|
||||
/area/awaymission/mol/scraptunnels/room3
|
||||
|
||||
/area/awaymission/mol/scraptunnels/room4
|
||||
|
||||
/area/awaymission/mol/kitchen
|
||||
|
||||
/area/awaymission/mol/kitchen/chamberA
|
||||
|
||||
/area/awaymission/mol/kitchen/chamberB
|
||||
|
||||
/area/awaymission/mol/kitchen/chamberC
|
||||
|
||||
/area/awaymission/mol/kitchen/ChamberD
|
||||
|
||||
/area/awaymission/mol/mines
|
||||
|
||||
/area/awaymission/mol/realitycore
|
||||
|
||||
/obj/structure/prop/blackbox/maddnesslab
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/maddnesslab)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/maddnesslab
|
||||
name = "Black Box Data - Farewell"
|
||||
desc = {"Testing, testing.<BR>
|
||||
Well, this is akward.<BR>
|
||||
Lab is finnally closed.<BR>
|
||||
Everyone but boss man is gone.<BR>
|
||||
Which I mean dead, quite, fired, or some combination of them.<BR>
|
||||
And well the labs are a mess, and boss man well...that strange place did things to him.<BR>
|
||||
So, I took charge and did things. I locked boss up firmly in that sphere he so fondly likes.<BR>
|
||||
Locked the armory and hid the switches within the chais we made.<BR>,
|
||||
If someone goes looky for boss, they'll need to clear up the carnage we made <BR>
|
||||
Nothing is getting out of there. Except Ashy, they're the one sane thing left. <BR>
|
||||
Not really sure what else to do for my confession.<BR>
|
||||
We did some really messed up stuff man, and planned on doing worse.<BR>
|
||||
I think boss belivives themselves to be god.<BR>
|
||||
And with that strange mecha, I don't blame them. Not sure the expirmental janus desgins I've seen<BR>
|
||||
surpass it.<BR>
|
||||
Soo uhhh, yeah we messed up. Imma walk off aimlessly into the desert<BR>
|
||||
Or maybe go home myself if I can bypass my own security measures<BR>
|
||||
Didn't want anyone coming in or out of the teleporter but couldn't break it<BR>
|
||||
So locked it behind a buttons in our research wings<BR>
|
||||
And hey if you're hearing this, take care of my drake please.<BR>
|
||||
Ashy is a good one.<BR>
|
||||
"}
|
||||
67962
maps/southern_cross/submaps/gateway/maddnesslab.dmm
Normal file
67962
maps/southern_cross/submaps/gateway/maddnesslab.dmm
Normal file
File diff suppressed because it is too large
Load Diff
163
modular_chomp/code/modules/clothing/gateway/gateway.dm
Normal file
163
modular_chomp/code/modules/clothing/gateway/gateway.dm
Normal file
@@ -0,0 +1,163 @@
|
||||
//vr section
|
||||
/obj/item/clothing/head/vrwizard
|
||||
name = "wizard hat"
|
||||
desc = "A pointy hat looking pixelate, 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 seems."
|
||||
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"
|
||||
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."
|
||||
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 hungery!</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 + 20, 0)
|
||||
|
||||
/obj/item/clothing/suit/armor/buffvest
|
||||
name = "camdy armor"
|
||||
desc = "A really strange armor amde of similiar 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"
|
||||
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"
|
||||
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"
|
||||
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 = "strange suit"
|
||||
desc = "A strange set of armor"
|
||||
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,293 @@
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion
|
||||
name = "imperion"
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "imperion"
|
||||
icon_living = "imperion"
|
||||
icon_dead = "imperion"
|
||||
maxHealth = 400
|
||||
health = 400
|
||||
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
|
||||
|
||||
wreckage = null
|
||||
pilot_type = null
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/imperion/phase1 //Simple phase that is mostly dodge rockects
|
||||
movement_cooldown = -1
|
||||
projectiletype = /obj/item/projectile/bullet/srmrocket
|
||||
melee_attack_delay = 4 SECOND
|
||||
ranged_attack_delay = 1.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
|
||||
|
||||
var/pull_radius = 1
|
||||
var/pull_strength = STAGE_THREE
|
||||
|
||||
/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)
|
||||
visible_message(span("warning", "\The [src] activates gravity generators!"))
|
||||
for(var/atom/A in range(pull_radius, src))
|
||||
A.singularity_pull(src, pull_strength)
|
||||
|
||||
/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
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
|
||||
wreckage = null
|
||||
pilot_type = /mob/living/simple_mob/mechanical/mecha/imperion/phase3
|
||||
|
||||
/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
|
||||
|
||||
/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
|
||||
|
||||
/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"
|
||||
movement_cooldown = 8
|
||||
projectiletype = /obj/item/projectile/bullet/magnetic/fuelrod/tritium
|
||||
melee_attack_delay = 4 SECOND
|
||||
ranged_attack_delay = 1.5 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
|
||||
|
||||
//This is a place holder loot list
|
||||
loot_list = list(/obj/item/clothing/suit/armor/alien = 30,
|
||||
/obj/item/clothing/suit/armor/alien/tank = 30,
|
||||
/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 = 30,
|
||||
/obj/item/weapon/gun/energy/alien = 30,
|
||||
/obj/random/tool/alien = 30,
|
||||
/obj/random/tool/alien = 30,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 30,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 30,
|
||||
/obj/item/clothing/suit/armor/alien = 30,
|
||||
/obj/item/clothing/suit/armor/alien/tank = 30,
|
||||
/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 = 30,
|
||||
/obj/item/weapon/gun/energy/alien = 30,
|
||||
/obj/random/tool/alien = 30,
|
||||
/obj/random/tool/alien = 30,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 30,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 30,
|
||||
)
|
||||
|
||||
/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)
|
||||
|
||||
|
||||
//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,242 @@
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistorblue/shielded
|
||||
name = "vistor blue"
|
||||
icon = 'icons/mob/animal_vg.dmi'
|
||||
icon_state = "drone3"
|
||||
icon_living = "drone3"
|
||||
icon_dead = "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 sheild!</span>", \
|
||||
"<span class='userdanger'>The [P.name] bounces off of [src]'s sheild!</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 sheild!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [src]'s sheild!</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"
|
||||
icon_dead = "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
|
||||
|
||||
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,
|
||||
/obj/item/clothing/suit/armor/protectionbubble = 50,
|
||||
/obj/item/clothing/suit/armor/protectionbubble = 50
|
||||
)
|
||||
|
||||
/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"
|
||||
icon_dead = "mushroom_dead"
|
||||
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/simple_mob/ranged/kiting
|
||||
|
||||
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,
|
||||
/obj/item/clothing/suit/armor/reactive/vistor = 50,
|
||||
/obj/item/clothing/suit/armor/reactive/vistor = 50
|
||||
)
|
||||
|
||||
/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"
|
||||
icon_dead = "scary_dead"
|
||||
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 = 50
|
||||
|
||||
loot_list = list(/obj/item/clothing/suit/armor/tesla/vistor = 100,
|
||||
/obj/item/clothing/suit/armor/tesla/vistor = 50,
|
||||
/obj/item/clothing/suit/armor/tesla/vistor = 50
|
||||
)
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistoryellow
|
||||
name = "vistor yellow"
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
icon_state = "chick"
|
||||
icon_living = "chick"
|
||||
icon_dead = "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
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/vistor/vistororange
|
||||
name = "vistor orange?"
|
||||
icon = 'icons/mecha/mecha.dmi'
|
||||
icon_state = "honker"
|
||||
icon_living = "honker"
|
||||
icon_dead = "honker"
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
movement_cooldown = 0
|
||||
unsuitable_atoms_damage = 0
|
||||
projectiletype = /obj/item/projectile/energy/gaussrifle
|
||||
melee_attack_delay = 4 SECOND
|
||||
|
||||
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,
|
||||
/obj/item/clothing/suit/armor/alien/vistor = 50,
|
||||
/obj/item/clothing/suit/armor/alien/vistor = 50
|
||||
)
|
||||
|
||||
//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
|
||||
@@ -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 = 125
|
||||
health = 125
|
||||
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 = 8
|
||||
melee_damage_upper = 8
|
||||
|
||||
/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 = 10
|
||||
|
||||
/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
|
||||
@@ -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,298 @@
|
||||
/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
|
||||
|
||||
/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,13 @@
|
||||
/mob/living/simple_mob/vore/ashy
|
||||
name = "ashy"
|
||||
icon = 'icons/mob/ashspawn.dmi'
|
||||
icon_state = "ash_welp"
|
||||
icon_living = "ash_welp"
|
||||
icon_dead = "ash_welp"
|
||||
damage_fatigue_mult = 0
|
||||
movement_cooldown = 0
|
||||
maxHealth = 300
|
||||
see_in_dark = 8
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 30000
|
||||
min_oxy = 0
|
||||
@@ -0,0 +1,231 @@
|
||||
//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 = 5 SECOND
|
||||
can_be_drop_prey = TRUE
|
||||
unsuitable_atoms_damage = 0
|
||||
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 15
|
||||
|
||||
/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 = 0
|
||||
melee_damage_upper = 0
|
||||
|
||||
/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
|
||||
32
modular_chomp/code/modules/projectiles/guns/staffs.dm
Normal file
32
modular_chomp/code/modules/projectiles/guns/staffs.dm
Normal file
@@ -0,0 +1,32 @@
|
||||
/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
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/fire
|
||||
color = "#FF0000"
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/lighting
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/lighting
|
||||
color = "#C1F20B"
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/poison
|
||||
projectile_type = /obj/item/projectile/energy/homing_bolt/wizard/poison
|
||||
color = "#003300"
|
||||
|
||||
/obj/item/weapon/gun/magic/firestaff/vrwizard/frost
|
||||
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"
|
||||
BIN
modular_chomp/icons/mob/candy.dmi
Normal file
BIN
modular_chomp/icons/mob/candy.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -4588,6 +4588,7 @@
|
||||
#include "modular_chomp\code\modules\client\preference_setup\loadout\loadout_xeno.dm"
|
||||
#include "modular_chomp\code\modules\clothing\clothing.dm"
|
||||
#include "modular_chomp\code\modules\clothing\clothing_icons.dm"
|
||||
#include "modular_chomp\code\modules\clothing\gateway\gateway.dm"
|
||||
#include "modular_chomp\code\modules\clothing\spacesuits\rig\.behemoth.dm"
|
||||
#include "modular_chomp\code\modules\clothing\spacesuits\rig\clockwork_ch.dm"
|
||||
#include "modular_chomp\code\modules\clothing\spacesuits\rig\precursor.dm"
|
||||
@@ -4666,6 +4667,9 @@
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\animal\spider.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\animal\space\mouse_army_ch.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\gateway\imperion.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\gateway\vistors.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\gateway\wizards.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\horror\Master.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\humanoid\cultboss.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\humanoid\cultist_ch.dm"
|
||||
@@ -4678,6 +4682,7 @@
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\boss.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\orginalAlts.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\precusor_hivebots.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat.dm"
|
||||
@@ -4686,12 +4691,15 @@
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\meteroid\metTypes.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\occult\constructs\construct.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\slimess\feral.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\ashy.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\desert_planet_mobs.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\greatwolf.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\swoopie.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\vore.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\gateway\candy.dm"
|
||||
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm"
|
||||
#include "modular_chomp\code\modules\mob\new_player\sprite_accessories_extra.dm"
|
||||
#include "modular_chomp\code\modules\mob\new_player\sprite_accessories_tail.dm"
|
||||
@@ -4708,6 +4716,7 @@
|
||||
#include "modular_chomp\code\modules\projectiles\mob.dm"
|
||||
#include "modular_chomp\code\modules\projectiles\clockwork\clockwork_guns_ch.dm"
|
||||
#include "modular_chomp\code\modules\projectiles\guns\phase.dm"
|
||||
#include "modular_chomp\code\modules\projectiles\guns\staffs.dm"
|
||||
#include "modular_chomp\code\modules\reagents\machinery\dispenser\chem_synthesizer_ch.dm"
|
||||
#include "modular_chomp\code\modules\reagents\reactions\instant\drinks.dm"
|
||||
#include "modular_chomp\code\modules\reagents\reactions\instant\instant.dm"
|
||||
@@ -4723,6 +4732,7 @@
|
||||
#include "modular_chomp\code\modules\shieldgen\shield_gen.dm"
|
||||
#include "modular_chomp\code\modules\vore\eating\exportpanel_ch.dm"
|
||||
#include "modular_chomp\code\modules\vore\resizing\resize.dm"
|
||||
#include "modular_chomp\code\modules\weapons\melee.dm"
|
||||
#include "modular_chomp\code\modules\xenobio\machinery\monkey_processor.dm"
|
||||
#include "modular_chomp\maps\overmap\space_pois\space_pois.dm"
|
||||
// END_INCLUDE
|
||||
|
||||
Reference in New Issue
Block a user