Merge pull request #6395 from FluffMedic/BaseBlep

Base blep
This commit is contained in:
Raeschen
2023-07-13 16:07:11 +02:00
committed by GitHub
19 changed files with 140050 additions and 3 deletions

View 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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